审校 | 重楼
大语言模型(LLM)的基本原理非常简单:根据训练数据中的统计模式预测单词序列中的下一个单词(或标记)。然而,当这种看似简单的功能可以执行许多令人惊叹的任务(例如文本摘要、创意生成、头脑风暴、代码生成、信息处理和内容创建)时,它就变得异常复杂。话虽如此,LLM没有任何记忆,它们实际上并不“理解”任何东西,除了坚持其基本功能:预测下一个单词。
下一个单词预测的过程是概率性的:LLM必须从概率分布中选择每个单词。在此过程中,它们通常会生成虚假、捏造或不一致的内容,以试图产生连贯的响应并用看似合理但不正确的信息填补空白。这种现象称为幻觉(Hallucination),这是LLM不可避免的众所周知的特征,需要对其输出进行验证和证实。
检索增强生成(RAG)方法使LLM与外部知识源协同工作,在一定程度上减少了幻觉,但无法完全消除幻觉。尽管高级RAG可以提供文内引用和URL,但验证这些引用可能非常繁琐且耗时。因此,我们需要一个客观标准来评估LLM响应的可靠性或可信度,无论它是由其自身知识还是外部知识库(RAG)生成的。
在本文中,我们将讨论如何通过可信语言模型评估LLM输出的可信度,该模型为LLM的输出分配分数。我们将首先讨论如何使用可信语言模型为LLM的答案分配分数并解释可信度。随后,我们将使用LlamaParse和Llamaindex开发一个示例RAG,以评估RAG答案的可信度。
本文的完整代码可在GitHub上的Jupyter笔记本中找到。
为LLM的答案分配可信度分数
为了演示如何为LLM的回复分配可信度分数,我将使用Cleanlab的可信语言模型(TLM)。此类TLM结合使用不确定性量化和一致性分析来计算LLM响应的可信度分数和解释。
Cleanlab提供免费试用API,可通过在其网站上创建账户获取。我们首先需要安装Cleanlab的Python客户端:
Cleanlab支持多种专有模型,例如“gpt-4o”、“gpt-4o-mini”、“o1-preview”、“claude-3-sonnet”、“claude-3.5-sonnet”、“claude-3.5-sonnet-v2”等。以下是TLM为GPT-4o的答案分配可信度分数的方式。可信度分数范围从0到1,其中值越高表示可信度越高。
上述代码测试了GPT-4o对“‘Abracadabra’这个词中有多少个元音?”这个问题的响应。TLM的输出包含模型的答案(响应)、可信度分数和解释。以下是此代码的输出。
可以看出,最先进的语言模型对于如此简单的任务会产生幻觉并产生错误的输出。以下是claude-3.5-sonnet-v2对同一问题的回答和可信度分数。
claude-3.5-sonnet-v2产生了正确的输出。让我们比较一下这两个模型对另一个问题的回答。
以下是两个模型的响应:
GPT-4o和Claude-3.5-Sonnet-V2生成的错误输出,以低可信度分数表示
我们还可以为开源LLM生成可信度分数。让我们来看看最近大肆宣传的开源LLM:DeepSeek-R1。我将使用DeepSeek-R1-Distill-Llama-70B,它基于Meta的Llama-3.3–70B-Instruct模型,并从DeepSeek更大的6710亿参数混合专家(MoE)模型中提炼而来。知识提炼(也称为“知识蒸馏”)是一种机器学习技术,旨在将大型预训练模型“教师模型”的学习成果转移到较小的“学生模型”。
下面是deepseek-r1-distill-llama-70b模型的输出。
deepseek-r1-distill-llama-70b模型的正确输出,具有较高的可信度得分
开发可信的RAG
我们现在将开发一个RAG来演示如何在RAG中衡量LLM响应的可信度。此RAG将通过从给定的链接中抓取数据、以MarkDown格式解析数据并创建向量存储来开发。
接下来的代码需要安装以下库:
要将HTML渲染为PDF格式,我们还需要从他们的网站安装wkhtmltopdf命令行工具。
将导入以下库:
接下来的步骤将涉及使用Python的BeautifulSoup库从给定的URL抓取数据,使用pdfkit将抓取的数据保存为PDF文件,然后使用LlamaParse(这是一个用LLM构建且专为LLM用例设计的原生AI文档解析平台)将PDF中的数据解析为Markdown文件。
我们将首先配置CleanlabTLM要使用的LLM和嵌入模型(HuggingFace嵌入模型BAAI/bge-small-en-v1.5),该嵌入模型将用于计算抓取数据的嵌入,以创建向量存储。
现在,我们将定义一个自定义事件处理程序GetTrustworthinessScore,它继承自一个基础事件处理程序类。该处理程序在LLM(大语言模型)完成时被触发,并从响应元数据中提取可信度评分。我们创建了一个辅助函数display_response用于显示LLM的响应及其可信度评分。
接下来,我们将通过从给定的URL抓取数据来生成PDF。为了演示目的,我们仅从这篇关于大语言模型的维基百科文章(遵循Creative Commons Attribution-ShareAlike 4.0许可)抓取数据。
注意:建议读者始终仔细检查即将抓取的内容和数据的状态,并确保他们被允许这样做。
下面的代码片段通过发出HTTP请求并使用Python的BeautifulSoup库解析HTML内容来从给定的URL抓取数据。HTML内容通过将协议相对URL转换为绝对URL进行清理。随后,抓取的内容使用pdfkit转换为PDF文件。
在从抓取的数据生成PDF后,我们使用LlamaParse解析这些PDF。我们设置解析指令以提取MarkDown格式的内容,并按页以及文档名称和页码解析文档。这些提取的实体(页面)被称为节点。解析器遍历提取的节点,并通过附加引用标题来更新每个节点的元数据,以便于后续引用。
现在,我们创建一个向量存储和一个查询引擎。我们定义一个自定义提示模板来指导LLM在回答问题时的行为。最后,我们创建一个查询引擎,使用创建的索引来回答问题。对于每个查询,我们根据节点与查询的语义相似性从向量存储中检索前3个节点。LLM使用这些检索到的节点来生成最终答案。
现在,让我们测试一些查询及其对应的可信度评分。
回答“何时使用专家混合方法?”的问题(图片来自作者本人)
回答“How do you compare the Deepseek model with OpenAI’s models?(您如何将Deepseek模型与OpenAI的模型进行比较?)”的问题(作者提供的图片)
总之,为LLM的响应分配可信度分数(无论是通过直接推理还是RAG生成)有助于定义AI输出的可靠性并在需要时优先考虑人工验证。这对于关键领域尤其重要,因为错误或不可靠的响应可能会造成严重后果。
译者介绍
朱先忠,51CTO社区编辑,51CTO专家博客、讲师,潍坊一所高校计算机教师,自由编程界老兵一枚。
原文标题:How to Measure the Reliability of a Large Language Model’s Response,作者:Umair Ali Khan