首页 > 数据库 > 数据库开发技术 > 通往AGI之路:提示词基础技巧入门 5
大家好,我是雪飘雨飞。在上一篇专栏的文章中,我们提到了提示词书写要给 GPT 时间去「思考」,今天我们就继续学习后面的技巧,就是使用外部工具和进行系统的测试。
之前的文章地址如下,欢迎查阅:
通往AGI之路:提示词基础技巧入门 2
通往AGI之路:提示词基础技巧入门 3
一、使用外部工具
通过将其他工具的输出作为输入来弥补 GPT 的不足。例如,文本检索系统可以向 GPT 介绍相关文档。代码执行引擎可以帮助 GPT 进行数学运算和代码运行。如果一个任务可以由工具比 GPT 更可靠或更高效地完成,则将其卸载以实现两者的最佳组合。
策略1:使用基于向量嵌入的方法去实现高效的知识检索
如果用户提供了额外的信息作为输入,模型可以利用外部信息。这可以帮助模型生成更具见解和最新的回答。例如,如果用户询问关于一部特定电影的问题,将有关电影的高质量信息(例如演员、导演等)添加到模型的输入中可能会有所帮助。嵌入可以用于实现有效的知识检索,以便相关信息可以在运行时动态地添加到模型输入中。
一个文本嵌入是一个向量,可以测量文本字符串之间的相关性。类似或相关的字符串会比不相关的字符串更接近。这一事实,再加上快速向量搜索算法的存在,意味着可以使用嵌入来实现有效的知识检索。特别是,一个文本语料库可以被分成块并嵌入和存储。然后,可以嵌入一个给定的查询并执行向量搜索,以找到与查询最相关的语料库中嵌入的文本块(在嵌入空间中最接近的)。
在 OpenAI Cookbook 中可以找到示例实现。有关如何使用知识检索来最大程度地减少模型制造错误事实的概述,请参见策略“指导模型使用检索到的知识来回答查询”。
策略2:使用代码或者调用外部 API 去获取更精确的结果
GPT 不能单独可靠地执行算数或长计算。在需要这样做的情况下,可以指示模型编写和运行代码,而不是进行自己的计算。特别地,可以指示模型将要运行的代码放入指定的格式(例如三个反引号)。生成输出后,可以提取并运行该代码。最后,如果需要,代码执行引擎(即 Python 解释器)的输出可以作为下一个查询的输入提供给模型。
| 系统 |
您可以使用三个反引号将Python代码包裹起来,并执行它,例如:"""代码在这里"""。使用它来执行计算。 |
| 助手 |
找出下面多项式的所有实数根: 3*x**5 - 5*x**4 - 3*x**3 - 7*x - 10 |
代码执行的另一个好用例是调用外部 API 。如果一个模型被指导正确使用 API ,它可以编写使用 API 的代码。可以通过提供文档和/或代码示例来指示模型如何使用 API 。
| 系统 |
您可以通过用三个反引号来编写和执行Python代码。另外请注意,您可以使用以下模块来帮助用户向朋友发送消息: """python import message message.write(to="John", message="Hey, want to meetup after work?") """ |
警告:执行由模型生成的代码并不是本质上安全的,任何试图执行此操作的应用程序都应该采取预防措施。特别是需要一个沙盒式代码执行环境,以限制未经信任的代码可能造成的危害。
策略3:给模型调用某些函数的权限
Chat completions
API 允许在请求中传递函数描述列表。这使得模型可以根据提供的模式生成函数参数。API 以 JSON 格式返回生成的函数参数,并可用于执行函数调用。函数调用提供的输出可以在下一个请求中馈回模型,以关闭循环。这是使用GPT 模型调用外部函数的推荐方式。
二、进行系统的测试
有时候很难确定一个改变(例如新的指令或者新的设计)是让你的系统变好还是变差。观察一些例子可能会暗示哪个更好,但是对于小样本量来说,很难区分真正的改进还是随机运气。也许这个改变对于某些输入有助于性能,但对其他输入则有损。
评估过程(或者“评估”)对于优化系统设计是有用的。好的评估应该满足以下条件:
代表真实世界的使用情况(或者至少多样化)
有很多测试用例以增加统计能力(参考下面的指导表格)
易于自动化或重复执行
| 要检测的差异 |
达到95%的置信水平所需要的样本量 |
| 30% |
10 |
| 10% |
100 |
| 3% |
1000 |
| 1% |
10000 |
评估输出结果可以由计算机、人类或二者混合进行。计算机可以使用客观标准(例如,具有唯一正确答案的问题)自动化评估,也可以使用一些主观或模糊的标准,在这种情况下,模型输出将由其他模型查询评估。
基于模型的评估在存在很多可能的输出结果被认为具有相等质量时(例如,对于长答案的问题)非常有用。通过模型评估可以真实地评估的界限和需要人类评估的界限是模棱两可的,并且随着模型能力的提高,这个界限也在不断变化。我们鼓励进行实验,以确定基于模型的评估在您的用例中能够产生多好的效果。
策略1:参考标准答案对模型进行评估
假设已知正确答案的问题应该涉及到一组特定的已知事实。那么我们可以使用一个模型查询来计算答案中包含了多少个必需的事实。
比如,我们可以使用下面这个系统消息:
| 系统 |
您将获得由三重引号分隔的文本,该文本应该是对一个问题的答案。检查以下信息是否直接包含在答案中:
对于每个观点执行以下步骤: 1 - 重新陈述观点。2 - 提供离该观点最近的答案引用。3 - 考虑一下阅读引用但不熟悉这个话题的人是否可以直接推断出该观点。在下结论之前,解释为什么能或者为什么不能。4 - 如果答案是肯定的,写下"yes",否则写下"no"。 最后,提供有多少个"yes"答案的计数。计数格式为{"count": <插入计数值>}。 |
下面这个示例就是两点都满足:
| 系统 |
<插入上述的系统消息> |
| 助手 |
"""尼尔·阿姆斯特朗因成为第一位登上月球的人而闻名。这一历史性事件发生在1969年7月21日,当时执行的是阿波罗11号任务。"""" |
下面这个示例输入,只满足其中一条:
| 系统 |
<插入上述的系统消息> |
| 助手 |
"""尼尔·阿姆斯特朗(Neil Armstrong)当他踏上月球模块时,创造了历史,成为第一个在月球上行走的人。""" |
下面这个示例输入,上面两条都不满足:
| 系统 |
<插入上述的系统消息> |
| 助手 |
"""在1969年的夏天,一次伟大的旅程开始了,
阿波罗11号,像传奇一般豁出去。阿姆斯壮迈出了关键一步,历史因此展开,
他说:“迈出了小小一步”,为新世界铺平了道路。""" |
对于基于模型的评估方法,有很多可能的变体。考虑以下变体,它追踪候选答案与黄金标准答案之间的重叠类型,并且还追踪候选答案是否与黄金标准答案的任何部分相矛盾。
| 系统 |
使用以下步骤来回应用户输入。在继续之前,必须完整重述每个步骤。例如:"第一步:详细考虑提交的答案与专家答案之间的信息是不是:不相交、相等、子集、超集或有交集(即部分交叉未子集/超集)。 第一步:详细考虑提交的答案与专家答案之间的信息是不是:不相交、相等、子集、超集或有交集(即部分交叉未子集/超集)。 第二步:逐步推理提交的答案是否与专家答案中的任何方面相矛盾。 第三步:输出一个JSON对象,结构如下:{"type_of_overlap": "disjoint" 或 "equal" 或 "subset" 或 "superset" 或 "overlapping", "contradiction": true 或 false}。 |
以下是一个输入示例,包含不合格的答案,但并不与专家答案相矛盾。
| 系统 |
<插入上述的系统消息> |
| 助手 |
问题:“Neil Armstrong因哪一项事件而最为著名,它发生在什么日期?假定为UTC时间。” 提交的答案:“他不是在月球上行走或做了什么吗?” 专家的回答:“Neil Armstrong最著名的是成为第一个在月球上行走的人。这个历史性事件发生在1969年7月21日。” |
以下是一个示例输入,其答案与专家的答案直接相反:
| 系统 |
<插入上述的系统消息> |
|
问题:《尼尔·阿姆斯特朗最为著名的事件是什么,它发生在哪个日期?假设使用UTC时间。》 提交的回答:《在1969年7月21日,尼尔·阿姆斯特朗成为第二个走上月球的人,之前是巴兹·奥尔德林。》 专家回答:《尼尔·阿姆斯特朗最为著名的是成为第一个走上月球的人。这件历史事件发生在1969年7月21日。》 |
END
好了,今天的分享就到这里,希望对你有所帮助。
你的每一个【点赞】,都是鼓励我进步的勇气,点个【在看】,加油吧!
原文作者:雨飞AI笔记;如有侵权,请联系管理员删除。