tl;dr: 与其进行微调,我们采用了提示链式和预/后处理的结合,将幻觉的发生率降低了几个数量级,不过这确实需要向OpenAI发出3到4倍的API调用。仍然有很大的改进空间!
使用像GPT这样的大型语言模型的一个最大挑战是它们倾向于编造信息。这在生成创意写作或头脑风暴会议文本等用例中可能没问题,但在用于业务应用(如客户服务)时可能会造成灾难。在这些情况下,生成虚假信息(即幻觉)尤其有害,并可能导致严重后果。即使是生成一次虚假信息,也可能损害公司的声誉,导致法律责任,并伤害客户。
有几种方法可以应对这一挑战。一种常见的方法是通过微调来提高模型在特定领域数据集上的准确性。微调的问题在于,当你有一个多租户的SaaS产品时,收集特定领域的数据集很困难,因为每个客户的需求和用户角色都略有不同。因此,我们不得不寻找其他方法来解决问题。
这里是我们迄今为止所做的工作
提示链式反应我们首先尝试使用提示链技术将一个复杂的提示分解成几个部分,并让GPT在每一步都“检查其答案”。
例如,我们不再只是通过用户输入和注入的内容进行一次 GPT 调用,而是首先让 GPT 评估它是否能够回答该问题,并对其回答进行解释。我们目前有 3 个步骤——一个 预处理 步骤,一个 评估 步骤,以及一个 响应 步骤。
这里是一个我们在评估步骤中使用的提示示例。它简单地要求GPT根据提供的内容来判断是否可以回答一个问题。
"""system:您通过查阅文档找到了以下内容。仅使用这些内容来构建您的回答。{content}
user:首先,确定找到的内容是否足以解决该问题。其次,以以下格式返回JSON:
{
"content_contains_answer": boolean, // true或false。内容中的信息是否足以解决该问题。
"justification": string // 您认为找到的内容是否足以解决该问题的原因。
}
问题:{inquiry}assistant {
"content_contains_answer":"""
注意,我们要求GPT以JSON格式返回答案,并提供了预期的结构作为提示。这确保了我们可以解析响应,并且这种方法几乎100%有效。我们还发现,仅仅要求模型提供理由就能提高其预测content_contains_answer
准确性的表现,即使我们没有使用这些理由。你只需要让GPT对自己的胡说八道负责!
这种方法将幻觉的发生率从20%降低到可能的5%。
后处理接下来帮助我们将准确率从5%提高到2%的是对GPT输出进行后处理。这包括几个步骤:
- 检查
true
令牌的 e^(logprob) 是否低于 90%。如果是,则重新运行评估提示,并强制content_contains_answer
为 false。我们发现这可以减少假阳性,而对假阴性的影响不大。 - 如果
content_contains_answer
为 false,我们将使用返回的理由,并通过第二次调用 GPT API 来重新表述理由,使其更符合用户的理解。这可以减少最终输出中出现类似“用户应该…”这种奇怪措辞的可能性。这虽然不是幻觉,但也不是最佳体验。
这是最近我们添加的步骤,使幻觉率降至2%以下。首先,我们让GPT对用户的查询意图进行分类。根据不同的意图,我们会使用不同的提示来进行评估和响应步骤。
我们还在用户输入上进行额外的预处理,以使其在搜索步骤中更有可能找到相关结果。这可以通过从用户的查询中提取实体并使用更高的权重运行向量搜索来实现,特别是在处理技术性问题和涉及特定令牌组合(如 keras.save_model
)的问题时,关键字搜索比语义搜索更有用。这一切都是通过 Pinecone 的新 混合搜索 功能实现的。
一个有用的最后提示是将内容包裹在 <Content></Content> 标签中。这有助于 GPT 区分不同的来源,甚至返回占位符(例如 Content1),你可以稍后使用 str.replace()
将其替换为链接。你也可以对注入提示中的任何其他数据执行此操作。
总体而言,我们发现通过结合提示链、预处理和后处理可以很好地减轻幻觉风险并提高GPT的准确性。缺点是这需要更多的API调用,但随着最近价格降低了90%,这现在变得非常可行。
我们也 开源! 如果你觉得这很有用,或者有关于如何更好地防止幻觉的建议,可以通过 [email protected] 邮件联系我们。
共同學習,寫下你的評論
評論加載中...
作者其他優質文章