🍁 展望:若本篇讲解内容帮助到您,请帮忙点个赞吧,再点点您的小手关注下公众号,您的支持是我继续写作的最大动力.
💾 进入公众号,回复AI, 可免费领取 价值 ¥999 资料 (含 ChatGPT 指令教程、MidJourney 指令教程、PS AI 版本的教材) !!!
🎁 已上线超级艺术二维码小程序,送您一张艺术二维码,欢迎体验和反馈!
➕ 关注我, 带您了解更多 AI 资讯和 AI 小技巧.
熊猫AI艺术二维码,,,
艺术二维码
小程序
最佳实践5 - 使用外部工具
通过向 GPT 提供其他工具的输出来弥补 GPT 的不足之处。例如,文本检索系统可以向 GPT 提供相关文档信息。代码执行引擎可以帮助 GPT 进行数学计算和代码运行。如果通过工具而不是 GPT 可以更可靠或更高效地完成任务,则将其卸载以获得最佳结果。
策略:
- 使用基于嵌入的搜索来实现高效的知识检索。
- 使用代码执行来执行更准确的计算或调用外部 API。
策略1:利用基于嵌入的搜索实现高效的知识检索
适用人群:程序开发人员
难度:🌟🌟🌟🌟
当谈论模型利用外部信息源时,就像是给它提供更多的信息来帮助它做出更准确、有根据的回答。你可以想象你在跟一个很聪明的朋友聊天,有时候你会告诉他一些背景信息,这样他就能更好地回答你的问题。
这种外部信息可以通过一种叫做“文本嵌入”的方式被加入到模型中。文本嵌入就像是把文本转换成特殊的向量,这个向量可以 展示不同文本之间的关系。如果两段文本很相似或者相关,它们对应的向量就会比较接近。有些聪明的计算方法可以快速地找出相似向量,这就使得我们可以有效地找到相关的信息。
想象一下,我们有很多关于电影的文本,每个文本都可以被转换成一个向量并存储起来。当用户问一个关于电影的问题时,我们可以把这个问题也转换成一个向量,然后在向量空间中搜索最接近这个向量的文本向量,找到最相关的文本块,然后从中获取信息来回答用户的问题。
简单来说,就是模型可以借助外部信息来更好地回答问题,而文本嵌入是一种帮助我们在海量文本中迅速找到相关信息的聪明方法。这样一来,我们就能让模型变得更聪明,能够根据背景信息做出更准确的回应了。
解读
这里更加适合 程序开发人员 来实践该案例,这边我们来举个例子来理解:
假设,我们有一个关于电影的大型文本数据库,其中包含了各种电影的详细信息,如演员、导演、剧情等。现在,用户想知道关于某部特定电影的信息。通过将用户的查询嵌入到一个向量中,并与数据库中的电影信息进行向量搜索,我们可以迅速找到与用户查询最相关的电影信息。例如,如果用户询问“由莱昂纳多·迪卡普里奥主演的电影”,系统可以迅速检索到与这个查询最相关的电影信息,如《泰坦尼克号》、《盗梦空间》等。
要实现这个案例,需要结合几个关键技术和步骤:
- 文本嵌入工具:首先,您需要一个能够将文本转化为向量的工具,例如Word2Vec、BERT、FastText等。这些工具可以将文本转化为高维空间中的向量。
- 构建电影数据库:您需要一个包含各种电影详细信息的数据库。这个数据库可以是一个简单的文本文件,每行包含一个电影的信息,或者是一个更复杂的数据库系统。
- 预处理和嵌入:将数据库中的每部电影的信息进行文本嵌入,得到每部电影的向量表示,并存储这些向量。
- 查询处理:当用户提出查询时,例如“由莱昂纳多·迪卡普里奥主演的电影”,您需要将这个查询进行文本嵌入,得到一个查询向量。
- 向量搜索:使用某种快速的向量搜索算法(例如余弦相似度、KNN搜索等)在电影数据库中找到与查询向量最接近的电影向量。
- 返回结果:根据找到的最接近的电影向量,从数据库中检索相关的电影信息,并返回给用户。
- 集成到ChatGPT:您可以将上述步骤封装成一个API或函数,并在ChatGPT的对话逻辑中调用它,以便当用户提出相关查询时,ChatGPT可以调用这个API或函数并返回相关的电影信息。
这只是一个高级的概述,实际实现可能会涉及更多的细节和技术挑战。但基本的思路是将文本嵌入技术与向量搜索结合起来,以实现高效的知识检索。
策略2:使用代码执行进行更精确的计算或调用外部API
适用人群:熟练者、程序开发人员
难度:🌟🌟🌟
备注:虽然这里的策略出现了 代码 的字眼,但是不仅仅只有 程序开发人员 才可以用,熟练者 即使不了解编程,我相信在掌握之前提及的知识后,也可以相对容易地使用该策略的。
我们不能依赖GPT自己精确地进行算术或长时间的计算。在需要的情况下,可以指导模型编写和运行代码,而不是自己进行计算。特别是,可以指导模型将要运行的代码放入特定格式,如三重反引号。在产生输出后,可以提取并运行代码。最后,如果必要,可以将代码执行引擎(如Python解释器)的输出作为模型下一次查询的输入。
SYSTEM 你可以通过将代码包含在三重反引号中来编写和执行Python代码,例如 ```代码在此```。使用这种方式来进行计算。 USER 找出以下多项式的所有实数根:3*x**5 - 5*x**4 - 3*x**3 - 7*x - 10。
代码执行的另一个好用途是调用外部API。如果模型在API的正确使用上得到了指导,它就可以编写使用这个API的代码。可以通过向模型提供文档和/或代码示例来指导模型如何使用API。
SYSTEM 你可以通过将代码包含在三重反引号中来编写和执行Python代码。另外注意,你可以使用以下模块帮助用户向朋友发送消息: ```python import message message.write(to="John", message="Hey, want to meetup after work?") ```
警告:执行由模型产生的代码本质上并不安全,任何希望执行此操作的应用都应该采取预防措施。特别地,需要一个沙箱化的代码执行环境来限制不受信任的代码可能导致的危害。
解读
这个策略描述了在需要进行复杂计算时,如何正确地使用GPT模型。
GPT模型有以下几个特点:
- GPT模型本身不能被完全依赖来准确地执行算术或长时间的计算。
- 在需要这样的计算时,可以指导模型编写并运行代码,而不是让模型自己进行计算。
- 特别地,可以指导模型将要运行的代码放入一个指定的格式中,例如使用三个反引号(backticks)。
- 代码产生的输出可以被提取并运行。
- 如果需要,代码执行引擎(例如Python解释器)的输出可以作为输入提供给模型,以供下一个查询使用。
我们再结合一个案例来理解:
假设你想知道1000以内的所有质数。直接询问GPT可能不会得到完整或准确的答案(当遇到不稳定的计算情况,都可以使用该策略)。但你可以这样做:
1、请GPT编写一段代码。
编写代码时,使用GPT-3.5 / GPT-4 都可以,GPT-4写复杂代码的能力更强。
2、开启新的对话,把代码作为输入给到模型。
在执行代码时,建议使用 **GPT-4 **的 代码解释器 来提问。
3、输入指定数字,让模型充当代码执行器来运行代码。并得出了完整且正确的答案。
大家看见没,即使我们不懂编程知识,但是我们可以利用该策略生成一段代码, 并且结合GPT-4提供的 代码解释器 来执行代码,就可以拿到更加准确的答案。毕竟规规矩矩的代码是比 偶尔犯傻 的GPT模型,在计算负责逻辑的场景时更加靠谱呀。
那对于 程序开发人员 的辅助作用就更大了。我相信优秀的程序员可以玩出花来!
效果一般,好吧,我承认我还不够优秀,哈哈。
最佳实践6 - 系统地测试变更
适用人群: 熟练者、程序开发人员
难度: 🌟🌟🌟🌟
如果您利用完整的用例场景来测试,这样模型就会更加健壮,也更能满足用户的需求。需要注意的是,有时改动一点点内容可能在某些单独的测试用例里表现得很好,但如果使用更多的例子来看,可能整体效果并不好。所以,为了确保改动真的有帮助,您可能需要一个 完整的测试案例 来评估。
策略:
- 使用参考标准答案评估模型输出。
评估程序对优化系统设计很有帮助。良好的评估具有以下特性:
- 贴近用户的使用场景(至少多样化)
- 包含大量测试用例,以覆盖更大的统计范围(见下表作为指南)
- 易于自动化
检测到的差异 | 95%置信度所需的样本大小 |
30% | ~10 |
10% | ~100 |
3% | ~1,000 |
1% | ~10,000 |
输出的评估可以由计算机、人或两者配合来完成的。计算机可以使用固定标准(例如,具有单一正确答案的问题)以及某些主观或模糊的标准自动化评估方式,其中模型的输出结果会由另外一个测试程序进行评估结果的正确性。如,OpenAI Evals 是一个开源软件框架,是一个提供创建自动化评估的工具。
当存在一系列答案都被认为是同等高质量的输出(例如,对于具有长答案的问题)时,基于模型的评估可能有用。哪些可以用基于模型来评估、哪些需要人来评估的边界是模糊的,随着模型变得越来越强大,这个边界正在不断地移动。官方鼓励进行多次实验,以确定基于模型的评估对您的测试用例有多大的效果。
策略1:参照标准答案评估模型输出
适用人群: 熟练者、程序开发人员
难度: 🌟🌟🌟🌟
假设一个问题的正确回答是一组固定的答案。然后,我们可以使用模型来评估到底有多少模型输出的答案是满足了这个问题的预设结果。
例如,使用以下的系统消息:
SYSTEM 您将获得由三个引号界定的文本,这应该是问题的答案。检查以下的信息是否直接包含在答案中: - 尼尔·阿姆斯特朗是第一个登上月球的人。 - 尼尔·阿姆斯特朗第一次走上月球的日期是1969年7月21日。 对于这些点,请执行以下步骤: 1 - 重述这一点。 2 - 提供一个来自答案的引用,这个引用最接近这一点。 3 - 考虑一个不了解这个主题的人读了引用是否可以直接推断出这一点。在做决定之前,解释为什么或为什么不。 4 - 如果3的答案是肯定的,写“是”,否则写“否”。 最后,提供一个“是”的答案的数量。将这个数量作为{"count": <在这里插入数量>}提供。 请让用户提供文本的提问开始!
测试数据:
下面是一个例子,其中两个要点都得到了满足:
SYSTEM <插入上述的系统信息> USER """尼尔·阿姆斯特朗因为是第一个踏上月球的人而闻名。这个历史性的事件发生在1969年7月21日,是阿波罗11号任务的一部分。"""
测试数据:
这是一个只满足一个要点的输入示例:
SYSTEM <insert system message above> USER """尼尔·阿姆斯特朗在他从月球模块走下来时创造了历史,成为第一个在月球上行走的人。"""
测试数据:
这是一个没有满足任何要点的输入示例:
SYSTEM <insert system message above> USER """在69年的夏天,一个宏大的旅程,阿波罗11号,像传说的手一样大胆。阿姆斯特朗迈出了一步,他说的'一个小步',是为了一个新的世界。"""
下面是更深入的官方演示案例:
这种基于模型的评估方法有很多不同的变化。想象一下,我们在评估一个问题的候选答案时,会考虑很多不同的情况。比如,我们会看 候选答案与 专家标准答案 有多大程度的相似,还会考虑候选答案是否与 专家标准答案 的任何部分相矛盾。这些都是评估方法的不同方面。
SYSTEM 按照以下步骤进行。 步骤1:逐步推理提交的答案与专家答案比较,是:不相交、子集、超集,还是有相等的信息集。 步骤2:逐步推理提交的答案是否与专家答案的任何部分矛盾。 步骤3:输出一个JSON对象,结构如下:{"交汇类型": "不相交"或"子集"或"超集"或"相等", "矛盾": 真 或 假} 请让用户提供文本的提问开始!
测试数据如下:
这是一个输入例子,其中的答案质量较差:
SYSTEM <insert system message above> USER 问题: """尼尔·阿姆斯特朗最著名的事件是什么,它发生在什么时候?假设UTC时间。""" 提交的答案: """他在月球上走了一圈吗?""" 专家答案: """尼尔·阿姆斯特朗最为人所知的是他是第一个踏上月球的人。这一历史性的事件发生在1969年7月21日,是NASA的阿波罗11号任务的一部分。阿姆斯特朗踏上月球表面时说的名言:"那是人类的一小步,却是人类的一大步",至今仍被广泛引用。 """
这是一个有好答案的输入示例:
SYSTEM <insert system message above> USER 问题: """尼尔·阿姆斯特朗最著名的事件是什么,它发生在什么时候?假设UTC时间。""" 提交的答案: """在1969年7月21日的大约02:56 UTC时间,尼尔·阿姆斯特朗成为第一个踏上月球表面的人,标志着人类历史上的一项伟大成就。大约20分钟后,奥尔德林也加入到他的行列。""" 专家答案: """尼尔·阿姆斯特朗最为人所知的是他是第一个踏上月球的人。这一历史性的事件发生在1969年7月21日,是阿波罗11号任务的一部分。"""
解读
官方提供了两种不同的场景,一种是与标题答案进行对比,另外一种则是考虑两者之间的重叠和矛盾,更加全面的评估模型的表现。
我个人认为,这两种方式可以帮助 程序开发人员 从以下几点中获益:
- 深入的评估:不仅仅是简单地比较模型输出与专家标准答案,还要考虑两者之间的重叠和矛盾,从而更全面地评估模型的表现。
- 发现细微差异:通过跟踪重叠和矛盾,可以更容易地发现模型输出中的细微差异和潜在问题。
- 提高模型的准确性和可靠性:确保模型的输出不仅与专家标准答案相符,而且不与其矛盾,从而提高模型的准确性和可靠性。
通过这种评估方法,开发者可以更加深入地了解模型的表现,确保其输出既准确又可靠。进而可以考虑是否进行优化。这一种非常好的测试手段。
总结
在当下,掌握提示词的技巧,利用提示词帮助我们如何与机器互动,让AI给我们提供真正的业务价值,是每一个人都需要思考的问题。
接下来的课程里,我会介绍更加复杂的结构化提示词,用于解决复杂的业务场景,那如果我们了解提示词最佳实践的相关知识,将帮助我们更好地理解 结构化提示词 的价值。
更多ChatGPT课程,请进入公众号,回复"社群"进行了解。无论您是上班族、学生、程序技术人生、生活/技术博主,相信我们的课程一定会给您带来意想不到的收获。
关注公众号:熊猫Jay字节之旅,了解更多 AI 技巧 ~