在人工智能领域,尤其是大型语言模型(LLM)的应用中,幻觉(Hallucination)现象一直是影响模型可靠性和准确性的关键问题。幻觉(如何消除大型语言模型(LLM)中的幻觉现象)指的是LLM生成的文本要么毫无意义,要么与输入数据相矛盾。这不仅降低了用户体验,还可能导致严重的误解和错误决策。为了应对这一挑战,研究者们提出了多种策略,其中Agentic方法以其独特的逻辑链条和验证机制,在减少LLM幻觉方面展现出了显著的效果。
一、LLM幻觉现象概述
在深入讨论Agentic方法之前,我们有必要先了解LLM幻觉(LLM 幻觉:现象剖析、影响与应对策略)现象的三种主要类型:
(一)内在幻觉
内在幻觉指的是 LLM 的响应与用户提供的上下文相矛盾。在当前给定的上下文中,其响应可以被明确证实是错误的。例如,当用户提供了关于某个特定历史事件的准确描述,而 LLM 给出的答案与这些已知事实不符时,就属于内在幻觉。这可能是由于模型对知识的理解不准确或在训练过程中获取了错误的信息关联。
(二)外在幻觉
外在幻觉是指 LLM 的响应无法通过用户提供的上下文进行验证。虽然该响应可能正确也可能错误,但仅依据当前的上下文无法确定其真实性。这种情况常见于模型尝试超出给定信息进行推断,但缺乏足够的依据来证实其推断的合理性。例如,当被问及一个未在上下文中提及的未来事件的预测时,模型的回答就难以从现有上下文中得到验证。
(三)不连贯幻觉
不连贯幻觉表现为 LLM 的响应没有回答问题或者毫无意义。这意味着模型未能遵循指令,无法生成与问题相关且逻辑连贯的答案。比如,对于一个明确的数学计算问题,模型却给出了一段与数学无关的文字描述,这就是不连贯幻觉的体现。这种情况可能是由于模型对问题的理解出现偏差,或者在生成答案时未能遵循正确的逻辑路径。
这些幻觉现象的存在,严重影响了LLM在问答、信息抽取、文本生成等任务中的性能。因此,寻找有效的方法来减少甚至消除这些幻觉现象,成为当前人工智能研究的重要课题。
二、Agentic方法原理
Agentic方法是一种基于代理(Agent)的工作流程,旨在通过一系列步骤来验证LLM生成的答案,从而减少幻觉现象(基于验证链(Chain of Verification)的大语言模型幻觉问题解决方案)。该方法的核心思想是利用LLM自身的逻辑判断能力,对生成的答案进行自我验证。具体步骤如下:
-
包含上下文并提问:首先,将问题及其相关上下文提供给LLM,以获得初步的答案和LLM用于生成答案的相关上下文。这一步的目的是获取一个初步的候选答案以及支持该答案的上下文信息。
-
将问题和答案重新表述为声明性语句:接下来,将问题和初步答案重新表述为一个单一的声明性语句。这一步的目的是将问题和答案整合为一个易于验证的陈述,为后续的验证步骤做准备。
-
验证陈述:最后,要求LLM分析提供的上下文和声明性语句,并判断上下文是否蕴含该声明。这一步是验证过程的核心,通过LLM的逻辑判断能力来确认答案的正确性。
三、减少幻觉的技巧
(一)使用基础设定
基础设定是在向 LLM 提出任务时,在输入中提供领域内相关的额外上下文。这为 LLM 提供了正确回答问题所需的信息,从而降低了产生幻觉的可能性。例如,在询问一个数学问题时,仅提供问题本身和同时提供相关数学书籍的章节内容,会得到不同的结果,后者更有可能得出正确答案。在实际应用中,如在处理文档相关的任务时,通过提供文档中提取的上下文,可以帮助 LLM 更好地理解问题并给出准确的回答。这也是检索增强生成(RAG)技术的核心原理之一,通过从外部知识库中检索相关信息来补充输入,使模型的回答更有依据。
(二)使用结构化输出
强制 LLM 输出有效的 JSON 或 YAML 文本属于使用结构化输出的方式。这样做可以减少无用的冗长表述,直接获取符合需求的 “直切要点” 的答案。同时,结构化输出有助于后续对 LLM 响应的验证。以 Gemini 的 API 为例,可以定义一个 Pydantic 模式,并将其作为查询的一部分发送到 “response_schema” 字段中。这使得 LLM 在响应时必须遵循该模式,从而更易于解析其输出。例如,在询问 LLM 关于 LLM 产生幻觉的原因时,通过定义特定的模式,让 LLM 按照该模式输出答案,如 {"answer": "LLM 产生幻觉的原因包括训练数据中的偏差、模型对现实世界理解的固有局限性以及模型倾向于优先考虑流畅性和连贯性而非准确性。"},这样可以清晰地获取所需信息,并且方便对答案进行验证和处理。
(三)使用思维链和更好的提示
- 思维链(Chain-of-thoughts)
给予 LLM 在给出最终答案之前思考其响应的空间,有助于产生更高质量的回答,这就是思维链技术。它广泛应用且易于实施。例如,对于一个简单的问题,如 “托马斯・杰斐逊(Thomas Jefferson)于哪一年去世?”,如果采用朴素的方法,可能会因为上下文提到了杰斐逊(Jefferson)而错误地回答为 1826 年,而实际上上下文提及的是托马斯・杰斐逊,与问题中的 “戴维斯・杰斐逊(Davis Jefferson)” 无关。但如果采用思维链方法,先让 LLM 提供推理过程,它会认识到上下文讨论的是托马斯・杰斐逊,而未提及戴维斯・杰斐逊,从而给出 “N/A” 的答案,避免了错误的产生。
- 明确要求回答 “N/A”
当 LLM 无法找到足够的上下文来生成高质量的响应时,明确要求其回答 “N/A”。这为模型提供了一种简单的退出方式,而不是强行回答它无法回答的问题。这有助于减少因模型盲目猜测而导致的幻觉。例如,在上述关于戴维斯・杰斐逊去世年份的问题中,当模型意识到无法从给定上下文中获取答案时,按照要求回答 “N/A”,避免了给出错误的年份答案。
(四)代理方法(Agentic Approach)
- 三步流程概述
代理方法通过构建一个简单的代理来实现,该代理包含三个步骤。
1)首先,将上下文和问题提供给 LLM,以获取第一个候选答案以及它用于回答的相关上下文。
2)然后,将问题和第一个候选答案重新表述为声明性陈述。
3)最后,要求 LLM 验证相关上下文是否蕴含候选答案,这一过程称为 “自我验证”。
- 具体实现步骤定义三个节点,第一个节点将在包含上下文的同时提出问题,第二个节点将使用 LLM,第三个节点将检查语句与输入上下文相关的含义。第一个节点:
def answer_question(self, state: DocumentQAState):
logger.info(f"Responding to question '{state.question}'")
assert (
state.pages_as_base64_jpeg_images or state.pages_as_text
), "Input text or images"
messages = (
[
{"mime_type": "image/jpeg", "data": base64_jpeg}
for base64_jpeg in state.pages_as_base64_jpeg_images
]
+ state.pages_as_text
+ [
f"Answer this question: {state.question}",
]
+ [
f"Use this schema for your answer: {self.answer_cot_schema}",
]
)
response = self.model.generate_content(
messages,
generation_config={
"response_mime_type": "application/json",
"response_schema": self.answer_cot_schema,
"temperature": 0.0,
},
)
answer_cot = AnswerChainOfThoughts(**json.loads(response.text))
return {"answer_cot": answer_cot}
第二个节点
def reformulate_answer(self, state: DocumentQAState):
logger.info("Reformulating answer")
if state.answer_cot.answer == "N/A":
return
messages = [
{
"role": "user",
"parts": [
{
"text": "Reformulate this question and its answer as a single assertion."
},
{"text": f"Question: {state.question}"},
{"text": f"Answer: {state.answer_cot.answer}"},
]
+ [
{
"text": f"Use this schema for your answer: {self.declarative_answer_schema}"
}
],
}
]
response = self.model.generate_content(
messages,
generation_config={
"response_mime_type": "application/json",
"response_schema": self.declarative_answer_schema,
"temperature": 0.0,
},
)
answer_reformulation = AnswerReformulation(**json.loads(response.text))
return {"answer_reformulation": answer_reformulation}
第三个节点
def verify_answer(self, state: DocumentQAState):
logger.info(f"Verifying answer '{state.answer_cot.answer}'")
if state.answer_cot.answer == "N/A":
return
messages = [
{
"role": "user",
"parts": [
{
"text": "Analyse the following context and the assertion and decide whether the context "
"entails the assertion or not."
},
{"text": f"Context: {state.answer_cot.relevant_context}"},
{
"text": f"Assertion: {state.answer_reformulation.declarative_answer}"
},
{
"text": f"Use this schema for your answer: {self.verification_cot_schema}. Be Factual."
},
],
}
]
response = self.model.generate_content(
messages,
generation_config={
"response_mime_type": "application/json",
"response_schema": self.verification_cot_schema,
"temperature": 0.0,
},
)
verification_cot = VerificationChainOfThoughts(**json.loads(response.text))
return {"verification_cot": verification_cot}
(五)使用更强的模型(Bonus Tip)
虽然由于预算或延迟限制,这一技巧并不总是容易应用,但更强的 LLM 确实更不容易产生幻觉(RELAI验证代理:开创LLM幻觉检测新思路)。在对幻觉进行基准测试中可以发现,表现最佳(幻觉最少)的模型在传统的自然语言处理排行榜上也名列前茅。因此,对于最敏感的用例,如果可能的话,应选择更强大的 LLM。例如,在一些对准确性要求极高的领域,如医疗诊断、法律文件处理等,使用性能更强的模型可以降低因幻觉导致的风险。
Agentic方法作为一种减少LLM幻觉的有效策略,在人工智能领域具有广泛的应用前景。通过自我验证机制,该方法能够显著降低LLM生成的答案中的幻觉现象,提高答案的准确性和可靠性。然而,该方法也存在一些局限性和挑战,如对LLM模型的要求较高、处理复杂问题的能力有限以及成本效益问题等。
为了克服这些局限性和挑战,未来的研究可以从以下几个方面进行探索:
- 开发更强大的LLM模型
通过改进模型结构和训练算法,提高LLM的逻辑判断能力和上下文理解能力,从而使其更好地适应Agentic方法的需求。
- 优化验证机制
研究更高效的验证方法和算法,以减少验证步骤所需的计算资源和时间,提高Agentic方法的成本效益。
- 拓展应用领域
将Agentic方法应用于更多的任务和场景中,如对话系统、推荐系统、知识图谱构建等,以验证其泛化能力和实用性。
总之,Agentic方法为减少LLM幻觉(RAG(Retrieval-Augmented Generation)评测:评估LLM中的幻觉现象)提供了一种有效的解决方案,并在实际应用中展现出了显著的效果。
代码地址:https://github.com/CVxTz/document_ai_agents
标签:cot,文末,state,LLM,answer,幻觉,上下文,Agentic From: https://blog.csdn.net/llm_way/article/details/144844564