1.7 提示词工程(三)

 

目录

3.5  使用外部工具

3.5.1 使用基于嵌入的搜索实现高效知识检索​

3.5.2 利用代码执行进行精确计算或调用外部 API​

3.5.3 使模型能够访问特定功能​

3.6 系统地对变更进行测试

3.6.1 以标准答案为基准评估模型输出​

四,结尾


 

3.5  使用外部工具

3.5.1 使用基于嵌入的搜索实现高效知识检索

模型可以通过利用作为输入的一部分提供的外部信息,生成更加准确和及时的回应。例如,如果用户提问有关某部特定电影的问题,将该电影的高质量信息(如演员、导演等)添加到模型输入中可能很有帮助。嵌入技术可以用于高效地检索知识,因此可以在运行时动态地将相关信息添加到模型输入中。

文本嵌入是一种向量,能够衡量文本字符串之间的相关性。相关或相似的字符串在嵌入空间中会比不相关的字符串更靠近。这一事实,加上快速向量搜索算法的存在,意味着可以使用嵌入来实现高效的知识检索。具体而言,可以将文本语料库分割成多个块,对每个块进行嵌入处理并存储。然后,可以对特定查询进行嵌入处理,并进行向量搜索,以找到语料库中与查询最相关的嵌入文本块(即在嵌入空间中位置最接近的)。

3.5.2 利用代码执行进行精确计算或调用外部 API

仅凭语言模型自身,我们不能指望它准确完成算术或复杂计算。在需要精确计算的场合,我们可以让模型编写并运行代码,而不是自行计算。特别是,我们可以让模型将要执行的代码放在特定的格式里,比如三个反引号。代码运行后产生的输出可以被提取并执行。必要时,还可以将代码执行引擎(比如 Python 解释器)的输出作为下一步查询的输入。

系统你可以通过用三个反引号包裹 Python 代码来编写并执行代码,例如 ```code goes here```。这种方式适用于需要进行计算的情况。
用户求解以下多项式的所有实数解: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.5.3 使模型能够访问特定功能

Chat Completions API 允许在请求中传递函数的描述。这样,模型就可以生成符合这些描述的函数参数。这些参数以 JSON 格式由 API 返回,并可以用于执行函数调用。函数调用的结果可以再次输入到模型中,形成一个闭环。这是利用 OpenAI 模型来执行外部函数调用的推荐方法。

3.6 系统地对变更进行测试

如果能对性能进行量化,那么就能更好地提高性能。有时,对提示词的修改在少数特定例子上可能表现更佳,但在更具普遍性的样本集上可能会导致整体性能下降。因此,为了确保改动对总体性能产生积极的影响,可能需要设计一份全方位的测试(也被称为"评估")。

有时,很难确定某个更改,比如新的指令或设计,是否真的改善了系统。观察几个案例可能会有所帮助,但在样本量较小的情况下,很难判断这是真正的改进还是偶然的幸运。可能某些更改在特定输入上提高了性能,但在其他情况下则降低了性能。

评估程序对于优化系统设计非常有用。有效的评估特点是:

  • 能够代表现实世界中的使用情况(或至少具有多样性)
  • 包含众多测试案例,从而拥有更强的统计能力(参见下表中的指南)
  • 可以轻松自动化或重复
需要检测的差异为了达到 95% 的置信度所需的样本量
30%约 10
10%约 100
3%约 1,000
1%约 10,000

评估可以由计算机、人工或两者结合进行。计算机可以自动化那些具有客观标准的评估(例如,有唯一正确答案的问题),也可以用于某些主观或模糊标准的评估,在这种情况下,模型输出由其他模型查询进行评估。OpenAI Evals 是一个开源软件框架,提供创建自动化评估的工具。

当涉及到一系列可能的答案,且这些答案都被视为高质量时,基于模型的评估方法会非常有帮助,比如在回答需要较长解答的问题时。判断何时使用基于模型的评估和何时需要人工评估之间的界限并不明确,随着模型能力的提升,这一界限也在不断变化。我们鼓励大家进行实验,以探索基于模型的评估在特定应用场景下的实际效果。

3.6.1 以标准答案为基准评估模型输出

假设我们已经知道对某个问题的正确回答应当涉及一组特定的已知事实。在这种情况下,我们可以通过模型查询来检查回答中包含了哪些必要的事实。

例如,可以使用以下系统提示:

系统你将接收到用三个引号界定的文本,这些文本应当是对某个问题的回答。请检查答案中是否直接包含以下信息:

- 尼尔·阿姆斯特朗是第一个踏上月球的人。- 尼尔·阿姆斯特朗首次登月的日期是 1969 年 7 月 21 日。

对每一点进行以下操作:

1 - 重申该信息点。
2 - 提供一个与该信息点最接近的答案引用。
3 - 考虑一个不熟悉该话题的人是否能从引用中直接理解该信息点。在做出判断之前,解释为什么能或不能。
4 - 如果第 3 步的答案是肯定的,就写“是”,否则写“否”。

最后,统计“是”的答案数量,并以 {"count": <插入数量>} 的形式呈现。

以下是一个示例输入,满足两个信息点:

系统<插入上述系统消息>
用户"""尼尔·阿姆斯特朗因为成为第一个登上月球的人而闻名。这一历史性事件发生在 1969 年 7 月 21 日的阿波罗 11 号任务中。"""

以下是一个示例输入,仅满足一个信息点:

系统<插入上述系统消息>
用户"""尼尔·阿姆斯特朗在他走出登月舱时创造了历史,成为第一个登上月球的人。"""

以下是一个示例输入,两个信息点都不满足:

系统<插入上述系统消息>
用户"""在 1969 年那个炎热的夏天,阿波罗 11 号启程了一次宏大的旅行,其勇气如同传说中的英雄。当阿姆斯特朗迈出那历史性的一步时,他宣告了一个崭新世界的开端,他说的那句“一个小小的步伐”,铭记在了历史上。"""

在这类型的基于模型的评估中,有多种可能的变体。其中一个变体是追踪候选答案与标准答案之间的相似性,以及候选答案是否与标准答案有任何矛盾。

系统按照以下步骤回应用户输入。在执行每一步前,需要完整地重述每一步,例如“步骤 1: 分析……”。

步骤 1: 逐步分析提交的答案与专家答案相比,信息是不是完全不相关、完全相同、是部分包含、完全包含或部分重叠(即有交集但不是子集或超集)。

步骤 2: 逐步分析提交的答案是否与专家答案有任何矛盾。

步骤 3: 输出一个如下结构的 JSON 对象:{"type_of_overlap": "disjoint", "equal", "subset", "superset", "overlapping" 中的一种,"contradiction": true 或 false}

以下是一个例子,展示了一个答案虽不完全符合标准,但并未与专家答案相矛盾的情况:

系统<插入上述系统消息>
用户问题:"""尼尔·阿姆斯特朗最著名的是什么事迹,具体日期是什么时候?以协调世界时为准。"""

提交答案:"""他不是在月球上走了一段吗?"""

专家答案:"""尼尔·阿姆斯特朗最著名的是成为第一个踏上月球的人。这一历史性事件发生在 1969 年 7 月 21 日。"""

以下是另一个例子,显示了一个与专家答案直接相矛盾的答案:

系统<插入上述系统消息>
用户问题:"""尼尔·阿姆斯特朗最著名的是什么事迹,具体日期是什么时候?以协调世界时为准。"""

提交答案:"""1969 年 7 月 21 日,尼尔·阿姆斯特朗成为继巴兹·奥尔德林之后的第二个踏上月球的人。"""

专家答案:"""尼尔·阿姆斯特朗最著名的是成为第一个踏上月球的人。这一历史性事件发生在 1969 年 7 月 21 日。"""

这是一个正确答案的例子,它提供了比必要更多的细节:

系统<插入上述系统消息>
用户问题:"""尼尔·阿姆斯特朗最为人所知的成就是什么,具体日期是哪一天?请以协调世界时(UTC)为准。"""

提交的答案:"""在 1969 年 7 月 21 日,大约凌晨 02:56(UTC 时间),尼尔·阿姆斯特朗成为了第一个登上月球的人,这一壮举标志着人类历史上的一个巨大飞跃。"""

专家答案:"""尼尔·阿姆斯特朗最为世人瞩目的壮举是成为第一个在月球上行走的人。这一划时代的事件发生于 1969 年 7 月 21 日。"""

四,结尾

好的提示词是通过持续迭代而来的,我们需要对提示词进行不断的调优。在设计 提示词时尽可能确保提示词准确,丰富,无歧义。

当然如果有训练数据,通过训练数据构造提示词示最好的。

不过这部分是模型训练中最核心的财富,一般情况下是很少有训练数据开源的。

并且,提示词不是一成不变的,如果我们调用的模型发生了变化,提示词也要重新调优,甚至大模型版本进行了更新,我们的提示词引导的结果也会发生变化,这就回答了我们在开始提到的,为什么有些情况下提示词指令有效,有些情况下提示词指令无效。以及为什么相同的提示词,在有些情况下有效,有些情况下无效。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高桐@BILL

分享快乐,快乐分享...

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值