大模型幻觉及其应对策略
AI 产生幻觉是指大型语言模型(LLM)生成虚假、误导或无关的答案。这是使用 AI 过程中经常遇到的情况,例如大模型生成虚假的新闻信息。这通常是因为大模型缺乏相关训练数据或者误解了训练数据。
AI 幻觉的危险在于,它们生成的信息往往连贯、可信且有说服力,很容易让人信以为真。如果这些信息被用于关键决策(例如保险公司评估风险、分配或拒绝消费者贷款等),危险性非常大。虽然模型提供商定期用新数据重新训练模型可以降低幻觉可能性,但频繁重新训练模型因时间、人力和金钱成本而不可行。因此,寻找无需重新训练模型就能减轻幻觉的方法至关重要。
幻觉的类型
大模型中的幻觉有多种形式,有些容易检测到,有些则较难。我们可以通过对幻觉进行分类,根据其检测难度来组织,从而应对这些限制。通过了解大模型偏离预期输出的不同方式,可以克服其局限性。常见的幻觉类型包括:
- 无意义输出:LLM 生成的响应缺乏逻辑一致性、可理解性或内容合理性。这种幻觉使 LLM 无用。
- 无关或随机输出:LLM 生成的输出与输入毫无关系。这种幻觉削弱了 LLM 生成文本的实用性。
- 提示矛盾:LLM 生成的响应与用于生成它的提示矛盾,令人质疑其可靠性和对预期意义或背景的遵从性。
- 句子矛盾:这种幻觉类似于前一种,但它在同一响应中与之前的陈述矛盾,引入了破坏内容整体连贯性的矛盾。
- 事实矛盾:这种幻觉导致生成虚构、不准确和误导性的陈述,并以事实的形式呈现。作为可靠信息呈现的事实矛盾有深远影响,因为它们助长了错误信息的传播,削弱了 LLM 生成内容的可信度。
需要注意的是,一种幻觉的存在并不排除其他类型共现的可能性。同样,严重类型的存在也不一定意味着较轻类型的共现。
用 RAG 减轻幻觉
为了解决这些不同类型的幻觉,一种被研究人员观察到既有效又易于实施的策略是检索增强生成(RAG)。检索增强生成(RAG)是通过从知识库中检索相关信息,增强响应生成的技术。RAG 可以用于为特定应用自定义 LLM 响应,显著减轻幻觉和不实陈述的风险。
RAG 的工作原理
假设用户希望通过 LLM 了解上一届世界杯的冠军。根据模型的最新知识,可能会指出缺乏该信息,或者更糟糕的是,即使没有重新训练,模型也会产生虚假或误导性的陈述。RAG 过程包括三个关键步骤:
第一步:检索
这一步涉及根据用户输入提示从知识源中检索相关信息。这意味着查询一个特定领域的数据库,根据输入查询的相似性(从最相似到最不相似)返回相关结果。例如,一个想知道上一届世界杯冠军的用户可以查询包含足球队和比赛信息的知识库,并检索最相似的比赛信息。
第二步:增强
在这里,输入查询会被检索到的信息增强。如果回到足球的例子,用户的初始查询'谁赢得了世界杯?'会在提示 LLM 生成响应之前,被增强为'阿根廷赢得了世界杯'。这一步增强了 LLM 对用户请求的理解。
第三步:生成
最后一步包括基于增强后的输入生成更有信息量和上下文丰富的响应,并利用模型的生成能力。在足球的例子中,这意味着模型会基于增强后的提示生成一个类似人类的响应。这最后一步使 LLM 生成的响应根植于检索到的额外上下文,从而减轻输出中的幻觉风险。
如何设计一个有效的 RAG
基于 RAG 的原理,我们可以尝试优化 RAG。我们需要四个关键组件:
- 提示词(Prompt):最佳的提示工程实践能最大限度地提高获取准确、相关和连贯的 LLM 响应的可能性。
- 知识库:用户管理的特定领域的资源库(如词典、文本文档、指南、代码、图片、视频等)。
- 嵌入模型(Embedding Model):一个设计用于创建用户提示和知识库资源在高维空间中的向量表示的模型。嵌入能够有效捕捉对象和实体的句法和语义关系(如文档中的词和短语)。具有相似含义或在类似上下文中使用的对象,其向量表示在向量空间中会更接近。利用嵌入可以识别用户提示和知识库资源之间的语义相似性并进行检索。
- 向量存储(Vector Store):与传统数据库通常以行和列组织不同,向量数据库专门用于在多维空间中存储和管理对象的向量表示。其结构允许快速有效地查找与特定对象相关的向量,便于检索。
有了这四个组件,让我们看看它们如何交互:
- 加载源数据:这个步骤从导入、转换、清理和处理用户管理的特定领域知识库开始。接下来,创建知识库资源的嵌入并加载到向量存储中(如 Chroma 或 FAISS)。
- 查询向量存储:用户通过提示查询向量存储。为了有效处理查询,需要它的向量表示。
- 检索'最相似':利用知识库资源和用户提示的嵌入,识别对象之间的关系和相似性。最终,向量存储检索出与用户提示最相似的资源。
from langchain.vectorstores import FAISS
from langchain.embeddings import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings()
vector_store = FAISS.load_local("path/to/index", embeddings)
query = "上一届世界杯冠军是谁?"
docs = vector_store.similarity_search(query, k=3)
context = "\n\n".join([doc.page_content for doc in docs])
prompt = f"基于以下信息回答问题:{context}\n问题:{query}"
response = llm.generate(prompt)
降低大模型的幻觉
如果你想提高大模型在回答个人知识库中的准确性,可以怎么做呢?你可以优化提示词、提高知识库中的数据质量、选择恰当的嵌入模型、设置好相似性相关参数。
比如,优化提示词。在检索阶段,可能会返回空结果或需要进一步澄清的结果,尽管用户尽最大努力创建了一个管理良好的知识库。这可能导致 LLM 为了生成答案,胡说八道。在返回空结果或模糊结果的情况下,可以通过提示工程指示模型回答基于事实和知识库中的数据。
其次是,优化知识库。包括更细致的资源也可能提高准确性。一个更昂贵的解决方案是对检索数据进行注释,对于给定的'查询 - 文档'对,确定文档是否与查询相关。有了注释的检索数据,就可以制定定量指标来评估检索器的好坏并针对性调整。
需要注意的是,随着技术发展,大模型的能力越来越强。对个人而言,我们更应该积累个人数据,建立私有知识库,以便在特定领域获得更准确的 AI 辅助。