这是 GPTs 系列指南的第二集,包含大量实操内容。文字所能呈现的信息有限,因此文章末尾附带了视频版作为补充。
相信各位小伙伴或多或少都有技术背景,说到 “开发” 大家应该都不陌生。但和我们以前 “写代码” 的开发途径相比,GPTs 的开发模式还是有着很大区别。
我们先来看看 GPTs 的开发界面。我们在 ChatGPT 界面左下角点击自己的用户名,再点击 “My GPTs” 菜单。在打开的页面中,列出了我们创建的所有 GPTs。
在这里,我们可以编辑已有 GPTs,也可以点 “Create a GPT” 创建一个新的。让我们进入创建界面继续探索。
这个界面分为左右两部分:左侧是工作区,右侧则是预览区。这样的布局允许我们在左侧进行配置和指令编写,而在右侧立刻尝试这些更改的效果,十分高效。(值得注意的是,我们在预览区的所有对话记录不会保存。)
在工作区,我们可以在 “Create” 和 “Configure” 两种模式之间切换。如果是第一次创建,我们会默认进入 “Create” 模式。这种模式是一个对话界面,我们与一个名为 “GPT Builder” 的机器人对话,通过自然语言对话的方式完成 GPTs 的创建。
对于新手而言,这种对话式的创建过程是一个极好的入门方式。而对于经验丰富的老鸟来说,可能会更倾向于采用 “Configure” 模式——通过填写详细的表单来完成配置,这种方式往往更直接、更高效。
在进入创建界面之后,我们首先要做的就是配置 GPTs 的基本信息。
首先,每个 GPTs 都需要一个名字和描述。这不只是为了标识,更是为了让使用者一目了然地知道这个 GPTs 可以做什么,它的主要功能和特点是什么。
对 GPTs 来说,提示词就是核心工作逻辑。通过精心设计的提示词,你可以引导 GPTs 执行一系列复杂的任务,从简单的问答到复杂的逻辑处理。
在编写提示词时,建议使用结构化的方式来组织语言。其中包括角色设定、任务描述、执行条件、预期的输出格式等段落。关于这种结构化提示词的写法和好处,可以参考《ChatGPT 定制化进阶:四步成为 AI 对话高手》这篇文章。
还记得我们在上一集里体验过的快捷启动词吗?在这里可以详细配置它。这些快捷启动词可以引导用户更有效地使用 GPTs,让对话从一开始就走上正轨。
在配置好这些基本信息之后,我们将探索 GPTs 所具备的基础能力及其五大扩展工具。
首先,GPTs 拥有流畅的对话能力,这是依托于底层的大型语言模型实现的。它能够理解自然语言的输入,给出合理且连贯的回答,这是所有高级功能的基础。
此外,GPTs 的真正魅力在于,它拥有五大扩展工具;而且,它能够根据不同的上下文情境,决策使用哪个工具来进行下一步工作。从这个意义上来说,GPTs 已经具备了类似 “Agent” 的工具调度能力。
我们来看看 GPTs 内置的这五大工具:
外挂知识库(Knowledge):这允许 GPTs 访问超出其训练数据集时间范围的信息,或者访问特定的私有数据。这对于需要定制化信息回答的场景极其有用。
网页浏览(Web Browsing):这一工具使 GPTs 能够在回答查询时实时访问互联网信息,突破了模型训练数据的时间限制,获取最新的信息。
绘图功能(DALL·E Image Generation):借助 OpenAI 自家的 DALL·E 3 模型,GPTs 可以生成图像。某些时候它可以直接为用户生成想要的图片,而有些时候 GPTs 可以通过图片为对话增添更多的沉浸感。
代码解释器(Code Interpreter):这一高级功能允许 GPTs 生成代码、运行代码,甚至帮助用户操作上传的文件、分析数据。这对于创建一个专业场景的 GPTs 非常有用。
外部 API(Actions):通过定义和调用外部 API,GPTs 的功能可以无限扩展,连接到各种外部服务和数据源,实现更复杂的任务。
这些工具的集成使得 GPTs 不仅仅是一个问答机器人,而是一个多功能的 AI 智能体。接下来我们将逐一深入这些工具的应用场景和调用方法。
为了更清晰地演示外挂知识库的配置和效果,魔法哥单独创建了一个演示用的 GPTs。它的系统提示词很简单:
当用户提出问题时,仅在已上传的文件中寻找答案。如果在文件中找不到答案,请回复 “知识库里没有包含相关信息”。请严格遵守这一要求。
根据这个设定,它的回答只会基于这个特定的知识库来进行,而不是依赖模型的内在知识或网络搜索。
而它的知识库也很简单,取自魔法哥在《我悄悄建了一个 AI 网址导航,相信对你也有用》这篇文章里提到的开源项目 “Awesome AI”。
同时我也配置了一些快捷启动词,可以更方便地开始对话演示。
特别提醒:如果知识库内容是 Markdown 格式,把文件命名为
*.md
似乎并不能让 GPTs 很好地理解。魔法哥调试了很多次,最终发现把它改成.txt
扩展名才能正常工作。
接下来,我们点击一个快捷启动词,可以看到 GPTs 查询知识库并回答问题的过程。
当遇到知识库中不存在的信息时,这个 GPTs 也可以按照设定,直接告诉用户 “知识库里没有包含相关信息”。
当然,如果需要,我们可以让 GPTs 在这种情况下自动调用其他工具,比如网页浏览,以获取更多信息。
我们经常说,ChatGPT 比较让人困扰的一点就是大模型的 “幻觉”,会给出一些并不属实的信息。所以我们一直期望大模型拥有检索线上真实信息的能力。GPTs 就提供了这项重要能力。
当然这个功能也是有一定限制的,并不可以浏览任意网页,它的所有浏览行为实际上都是借助 Bing 搜索来实现的。
在接下来的演示中,魔法哥需要引入另一个 Demo GPTs。我们来看看它的系统提示词:
* 如果用户发来一串英文单词,请查询维基百科,并基于维基百科的解释总结为一段 50 字左右的描述,回复给用户。
* ……
* ……
这段提示词描述了三种任务类型。我们先看第一行,很显然,它演示了网页浏览的调用方法。
实际对话效果如下:
接下来看看这个 Demo GPTs 的第二种任务类型。它演示了绘画能力的调用方法。
* ……
* 如果用户要求画一张图:
* 如果用户已经提供了作图的主题或描述,请执行该要求。画完以后不需要解释或总结。
* 否则,向用户询问作图的主题或描述,得到答案后执行该要求。画完以后不需要解释或总结。
* ……
这里还进一步增强了与用户交互的宽容度。如果用户提供了明确的作图主题或描述,就直接执行;如果没有提供,那就向用户询问,得到答案之后再执行。这其实也算是一个比较简单的多轮对话的提示词案例。
单轮对话的效果如下:
多轮对话的效果如下:
代码解释器最早是 ChatGPT 提供的一项高级功能。它的原理大致相当于在每次和用户对话的时候,创建一个沙箱环境。
在这个沙箱环境里,用户可以上传一些待处理的文件。我们可以基于这些文件向 ChatGPT 提出要求,比如改名、转换格式、对数据做统计分析等等,最后还可以让它把处理结果打包以便下载。
这整个过程是由 ChatGPT 自己生成代码、执行代码、根据执行结果不断迭代来实现的。我们可以设想一下,当 GPTs 具备这种能力会是多么灵活而强大!
关于代码解释器的具体用法,我们在往期直播中演示过,这里就不再赘述了。
如果前四项工具都无法满足你的需求,怎么办?没关系,我们还有最后一项终极武器——外部 API 的调用能力。通过调用外部 API,GPTs 不仅可以访问大量的在线服务和数据,还能与其他应用交互,极大提升实用性和灵活性。
在 GPTs 中,调用 API 的能力是通过一种叫 “Action” 的概念来实现的。Action 实际上就是对外部 API 的定义和封装,便于我们在提示词中对这些 API 进行调用。同时 GPTs 也有能力根据调用结果来进行后续的操作和输出。
我这里有一个特别简单的 API,它是我的某台服务器的 status 接口。调用它可以看到服务器的实时状态。如果返回的 data.status
字段为 true
,那就说明服务器正常运行;如果不为 true
,那就说明有故障,并且 message
字段会输出故障的详细信息。
{
"code": 200,
"message": "请求成功",
"data": {
"status": true,
"env": true
}
}
我们还是通过这个 Demo GPTs 来逐步了解 Action 的定义和调用。在配置界面,我们看到这个 Action 已经配置好了,我们点击齿轮图标可以查看详情。
这里的最核心的字段是 “Schema”,它实际上就是 OpenAI 所定义的一种接口描述格式。当一个外部接口按照这种方式描述之后,就可以成为 GPTs 可以识别的 Action。
手写 Schema 显然是不够优雅的,于是 OpenAI 专门提供了一个叫 “ActionsGPT” 的 GPTs 来帮助我们生成 Schema。我们可以把外部接口的 API 文档丢给它,也可以把接口的实际输入输出样例喂给它,它就可以整理出可用的 Schema 了。
我们把 Schema 粘贴过来,系统会自动解析出可用的 Action。比如我的这个 Schema 中就包含了一个叫 getStatus
的 Action。点 “Test” 就可以在预览区测试它的调用过程是否正常。
在这个页面中,我们还需要提供一个隐私条款页面(Privacy policy)。如果说你调用的是第三方服务的话,那你就在第三方服务的官网找到它的隐私协议,把 URL 贴过来就可以了。另外如果接口需要 API key,则可以在 “Authentication” 这里配置。
我们来看看这个 Demo GPTs 的系统提示词。它的第三种类型的任务就用到了 Action,并根据调用结果返回不同内容:
* ……
* ……
* 如果用户询问服务器状态如何,请调用 Action `getStatus`,并根据响应结果回复:
* 如果请求失败,则回复 “服务器连不上”。
* 如果成功响应,查看响应体中的 `data.status` 字段:
* 如果为 `true`,回复 “服务器正常运行”。
* 如果不为 `true`,则回复 “服务器故障”,并附上 `message` 的值。
最后看看效果,我们可以通过对话来查询服务器的实时状态了:
我们用来演示的这个 Action 是比较简单的,仅仅作为跑通功能的演示。理论上,几乎所有提供开放 API 的在线服务都可以被 GPTs 调用,这意味着 GPTs 的功能可以根据我们的需求无限扩展。
在今天的文章里,我们一步步探索了 GPTs 的开发模式,实践了五大扩展工具的调用技巧。我们不仅见证了 GPTs 的强大功能和灵活性,也体会到它在解决实际问题中的巨大潜力。
在下一集里,魔法哥将讲解 如何为 GPTs 做好安全防护,并把 GPTs 上架到 GPTs 商店。敬请期待!