我们没有进行微调,而是结合使用提示链接和预处理/后处理来将幻觉率降低一个数量级,但它确实需要 3-4 倍的 OpenAI 调用次数。还有很多需要改进的地方!
使用 GPT 等大型语言模型的最大挑战之一是它们倾向于伪造信息。这对于生成用于创意写作或头脑风暴会议的文本等用例来说可能很好,但当输出用于客户支持等业务应用程序时,它可能是灾难性的。在这些情况下,幻觉或虚假信息的产生可能特别有害,并可能导致严重后果。即使产生一处虚假信息,也可能损害公司声誉、承担法律责任并损害客户利益。
有几种方法可以应对这一挑战。一种常见的方法是使用微调来提高模型在特定领域数据集上的准确性。微调的问题在于,当您拥有多租户 SaaS 产品时,收集特定于领域的数据集很困难,其中每个客户的用例和用户角色都略有不同。所以我们必须寻找其他方法来解决这个问题。
这是我们迄今为止所做的.
1、提示链
我们尝试的第一件事是使用提示链技术将复杂的提示分解为多个部分,并让 GPT 在每一步“检查其答案”。
例如,我们首先要求 GPT 评估它是否可以回答问题,并证明其响应的合理性,而不是使用用户输入和注入的内容对 GPT 进行一次调用。我们目前有 3 个步骤——预处理步骤、评估步骤和响应步骤。
这是我们在评估步骤中使用的提示的示例。它只是要求 GPT 回答是否可以根据所提供的内容回答问题。
"""<|im_start|>system 您通过搜索文档找到了以下内容。仅使用此内容来构建您的响应。{content}<|im_end|> <|im_start|>user 首先,确定找到的内容是否
是其次,以 JSON 格式进行响应:
{
"content_contains_answer": boolean, // true 或
false。内容中的信息是否足以解决问题。
"justification": string // Why您认为您找到的内容足以或不足以解决问题。
}
查询:{inquiry}<|im_end|><|im_start|>assistant
{
"content_contains_answer":<|im_end|>"""
请注意,我们要求 GPT 以 JSON 格式返回其答案,并以预期的结构为助手的答案提供种子。这确保了我们能够解析响应,并且几乎 100% 的时间都有效。我们还注意到,简单地要求模型提供理由就可以提高其预测的准确性content_contains_answer
,即使我们没有将其用于任何用途。你必须斥责 GPT 是狗屎!
这种方法将幻觉发生率从 20% 降低到大约 5%。
2、后期处理
接下来帮助我们从 5% 提高到 2% 的是 GPT 输出的后处理。为此有几个步骤:
1.
检查令牌的 e^(logprob) 是否true
低于 90%。如果是这样,我们重新运行评估提示并强制content_contains_answer
为 false。我们发现这可以减少误报,而不会对误报产生太大影响。
2.
3.
如果content_contains_answer
为 false,我们将使用返回的理由并再次调用 GPT API 来重写理由,以将其定位到用户。这减少了我们的最终输出出现奇怪的措辞(例如“用户应该……”)的可能性。不完全是幻觉,但也不是最佳体验。
4.
3、预处理
这是我们添加的最新步骤,我们的幻觉率低于
2%。我们做的第一件事是让 GPT 对用户查询的意图进行分类。根据意图,我们将使用不同的提示来进行评估和响应步骤。
我们还尝试对用户输入进行额外的预处理,以使其更有可能在搜索步骤中找到相关结果。这可以通过从用户的查询中提取实体并在稀疏嵌入上运行更高权重的向量搜索来完成。这有助于解决技术性问题并涉及特定标记组合(例如
)keras.save_model
,因为对于这些情况,关键字搜索比语义搜索更有用。这一切都是通过 Pinecone 的新混合搜索功能实现的。
4、最后的想法
最后一个可能有用的技巧是将内容包装在
<Content></Content> 标记中。这有助于 GPT 了解不同来源之间的差异,甚至返回占位符(例如 Content1),您稍后可以str.replace()
通过链接返回占位符。您还可以使用注入到提示中的任何其他数据来执行此操作。
总的来说,我们发现即时链接、预处理和后处理的结合可以很好地降低幻觉风险并提高 GPT 的准确性。缺点是需要更多的 API 调用,但随着最近chatGPT价格下降 90%,现在这是非常可行的。
出自:https://mp.weixin.qq.com/s/G2v740fkCTZlRaccEMIOpQ