首页 > 其他分享 >Agentic方法减少LLM幻觉:深度解析与实践(文末含代码)

Agentic方法减少LLM幻觉:深度解析与实践(文末含代码)

时间:2025-01-02 10:26:22浏览次数:3  
标签:cot 文末 state LLM answer 幻觉 上下文 Agentic

在人工智能领域,尤其是大型语言模型(LLM)的应用中,幻觉(Hallucination)现象一直是影响模型可靠性和准确性的关键问题。幻觉(如何消除大型语言模型(LLM)中的幻觉现象)指的是LLM生成的文本要么毫无意义,要么与输入数据相矛盾。这不仅降低了用户体验,还可能导致严重的误解和错误决策。为了应对这一挑战,研究者们提出了多种策略,其中Agentic方法以其独特的逻辑链条和验证机制,在减少LLM幻觉方面展现出了显著的效果。

一、LLM幻觉现象概述

在深入讨论Agentic方法之前,我们有必要先了解LLM幻觉(LLM 幻觉:现象剖析、影响与应对策略)现象的三种主要类型:

(一)内在幻觉

内在幻觉指的是 LLM 的响应与用户提供的上下文相矛盾。在当前给定的上下文中,其响应可以被明确证实是错误的。例如,当用户提供了关于某个特定历史事件的准确描述,而 LLM 给出的答案与这些已知事实不符时,就属于内在幻觉。这可能是由于模型对知识的理解不准确或在训练过程中获取了错误的信息关联。

(二)外在幻觉

外在幻觉是指 LLM 的响应无法通过用户提供的上下文进行验证。虽然该响应可能正确也可能错误,但仅依据当前的上下文无法确定其真实性。这种情况常见于模型尝试超出给定信息进行推断,但缺乏足够的依据来证实其推断的合理性。例如,当被问及一个未在上下文中提及的未来事件的预测时,模型的回答就难以从现有上下文中得到验证。

(三)不连贯幻觉

不连贯幻觉表现为 LLM 的响应没有回答问题或者毫无意义。这意味着模型未能遵循指令,无法生成与问题相关且逻辑连贯的答案。比如,对于一个明确的数学计算问题,模型却给出了一段与数学无关的文字描述,这就是不连贯幻觉的体现。这种情况可能是由于模型对问题的理解出现偏差,或者在生成答案时未能遵循正确的逻辑路径。

这些幻觉现象的存在,严重影响了LLM在问答、信息抽取、文本生成等任务中的性能。因此,寻找有效的方法来减少甚至消除这些幻觉现象,成为当前人工智能研究的重要课题。

二、Agentic方法原理

Agentic方法是一种基于代理(Agent)的工作流程,旨在通过一系列步骤来验证LLM生成的答案,从而减少幻觉现象(基于验证链(Chain of Verification)的大语言模型幻觉问题解决方案)。该方法的核心思想是利用LLM自身的逻辑判断能力,对生成的答案进行自我验证。具体步骤如下:

  1. 包含上下文并提问:首先,将问题及其相关上下文提供给LLM,以获得初步的答案和LLM用于生成答案的相关上下文。这一步的目的是获取一个初步的候选答案以及支持该答案的上下文信息。

  2. 将问题和答案重新表述为声明性语句:接下来,将问题和初步答案重新表述为一个单一的声明性语句。这一步的目的是将问题和答案整合为一个易于验证的陈述,为后续的验证步骤做准备。

  3. 验证陈述:最后,要求LLM分析提供的上下文和声明性语句,并判断上下文是否蕴含该声明。这一步是验证过程的核心,通过LLM的逻辑判断能力来确认答案的正确性。

三、减少幻觉的技巧

(一)使用基础设定

基础设定是在向 LLM 提出任务时,在输入中提供领域内相关的额外上下文。这为 LLM 提供了正确回答问题所需的信息,从而降低了产生幻觉的可能性。例如,在询问一个数学问题时,仅提供问题本身和同时提供相关数学书籍的章节内容,会得到不同的结果,后者更有可能得出正确答案。在实际应用中,如在处理文档相关的任务时,通过提供文档中提取的上下文,可以帮助 LLM 更好地理解问题并给出准确的回答。这也是检索增强生成(RAG)技术的核心原理之一,通过从外部知识库中检索相关信息来补充输入,使模型的回答更有依据。

(二)使用结构化输出

强制 LLM 输出有效的 JSON 或 YAML 文本属于使用结构化输出的方式。这样做可以减少无用的冗长表述,直接获取符合需求的 “直切要点” 的答案。同时,结构化输出有助于后续对 LLM 响应的验证。以 Gemini 的 API 为例,可以定义一个 Pydantic 模式,并将其作为查询的一部分发送到 “response_schema” 字段中。这使得 LLM 在响应时必须遵循该模式,从而更易于解析其输出。例如,在询问 LLM 关于 LLM 产生幻觉的原因时,通过定义特定的模式,让 LLM 按照该模式输出答案,如 {"answer": "LLM 产生幻觉的原因包括训练数据中的偏差、模型对现实世界理解的固有局限性以及模型倾向于优先考虑流畅性和连贯性而非准确性。"},这样可以清晰地获取所需信息,并且方便对答案进行验证和处理。

(三)使用思维链和更好的提示

  1. 思维链(Chain-of-thoughts)

    给予 LLM 在给出最终答案之前思考其响应的空间,有助于产生更高质量的回答,这就是思维链技术。它广泛应用且易于实施。例如,对于一个简单的问题,如 “托马斯・杰斐逊(Thomas Jefferson)于哪一年去世?”,如果采用朴素的方法,可能会因为上下文提到了杰斐逊(Jefferson)而错误地回答为 1826 年,而实际上上下文提及的是托马斯・杰斐逊,与问题中的 “戴维斯・杰斐逊(Davis Jefferson)” 无关。但如果采用思维链方法,先让 LLM 提供推理过程,它会认识到上下文讨论的是托马斯・杰斐逊,而未提及戴维斯・杰斐逊,从而给出 “N/A” 的答案,避免了错误的产生。

  2. 明确要求回答 “N/A”

    当 LLM 无法找到足够的上下文来生成高质量的响应时,明确要求其回答 “N/A”。这为模型提供了一种简单的退出方式,而不是强行回答它无法回答的问题。这有助于减少因模型盲目猜测而导致的幻觉。例如,在上述关于戴维斯・杰斐逊去世年份的问题中,当模型意识到无法从给定上下文中获取答案时,按照要求回答 “N/A”,避免了给出错误的年份答案。

(四)代理方法(Agentic Approach)

  1. 三步流程概述

    代理方法通过构建一个简单的代理来实现,该代理包含三个步骤。

    1)首先,将上下文和问题提供给 LLM,以获取第一个候选答案以及它用于回答的相关上下文。

    2)然后,将问题和第一个候选答案重新表述为声明性陈述。

    3)最后,要求 LLM 验证相关上下文是否蕴含候选答案,这一过程称为 “自我验证”。

  2. 具体实现步骤定义三个节点,第一个节点将在包含上下文的同时提出问题,第二个节点将使用 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模型的要求较高、处理复杂问题的能力有限以及成本效益问题等。

为了克服这些局限性和挑战,未来的研究可以从以下几个方面进行探索:

  1. 开发更强大的LLM模型

    通过改进模型结构和训练算法,提高LLM的逻辑判断能力和上下文理解能力,从而使其更好地适应Agentic方法的需求。

  2. 优化验证机制

    研究更高效的验证方法和算法,以减少验证步骤所需的计算资源和时间,提高Agentic方法的成本效益。

  3. 拓展应用领域

    将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

相关文章

  • LLM2Vec: 解锁大语言模型的隐藏能力
    LLM2Vec:重新定义大语言模型在自然语言处理中的应用一种名为**LLM2Vec**的新方法正在改变我们对大语言模型(LLMs)在自然语言处理(NLP)中的使用方式。研究人员提出了一种创新方法,将通常仅用于生成文本的大型语言模型转化为更强大的文本理解和组织工具。这项技术有可能颠覆我们......
  • 【LLM大模型】2025年最新字节内网流传的大模型面试真题揭秘!
    随着人工智能技术的迅猛发展,计算机视觉(CV)、自然语言处理(NLP)、搜索、推荐、广告推送和风险控制等领域的岗位越来越受欢迎,而_对于大型模型技术的掌握成为了这些岗位的标配_。但目前公开的大模型资源还是很少很少,面试真题就更不用多说了。为了让大家能够应对大模型面试,整理了......
  • 低精度只适用于未充分训练的LLM?腾讯提出LLM量化的scaling laws
    本文来自腾讯AILab,介绍了一套针对于低比特量化的scalinglaws。论文标题:Low-BitQuantizationFavorsUndertrainedLLMs:ScalingLawsforQuantizedLLMswith100TTrainingTokens论文链接:https://arxiv.org/abs/2411.17691低比特量化(low-bitquantization)和低......
  • 【大语言模型/LLM】全网最全!持续更新!147个大语言模型评估数据集分类归纳整理,内含数据
    大语言模型评估数据集综述论文题目:AcomprehensiveSurveyofDatasetsforLargelanguagemodelevaluationGithub:https://github.com/lyt719/LLM-evaluation-datasets摘要自然语言处理是人工智能的一个重要分支。在过去的几年里,我们见证了大语言模型的显著进步,......
  • Bellman-Ford\SPFA单源最短路算法
    Bellman-Ford单源最短路算法不采用SPFA实现的Bellman-Ford算法"题目中的图没有特殊性质时,若SPFA是标算的一部分,题目不应当给出Bellman–Ford算法无法通过的数据范围"Bellman-Ford的原理如下先枚举节点,在枚举边,每进行一轮循环,对图上所有的边都尝试进行一次松弛操作,当......
  • AirLLM: 分层推理在低内存硬件上的应用
    AirLLM:分层推理在低内存硬件上的应用在大规模语言模型(LLM)的发展中,如何在低内存硬件上实现高效推理始终是一个挑战。AirLLM作为一种新兴的分层推理方法,为这一问题提供了创新的解决方案,使得在普通消费硬件上可以运行高达70B参数的模型,如Llama270B,而无需进行量化处理。分......
  • 全面深入了解大模型(LLM)
    一、了解大模型大模型初识AIGC指什么?AIGC指内容生成式人工智能,指的是一种AI的类型,包括图像,文本,音频等内容生成式AI。所以这里包括了目前比较火热的AI绘画以及基于大语言模型的AI对话。2.大模型到底指什么?其实我们目前讨论最多的大模型主要是指大语言模型(LLM),但是大模型......
  • 解密Prompt45. 再探LLM Scalable Oversight -辩论、博弈哪家强
    之前我们已经介绍过几个针对ScalableOversight的解法,也就是当模型能力在部分领域超越人类标注者后,我们该如何继续为模型提供监督信号,包括持续提升Verifier的能力,辅助人类提供监督信号:self-Critic持续提升模型在弱监督下的泛化性:weak-to-strongGeneralization以上两个方向相......
  • 【论文带读】LLMs as Zero-shot Graph Learners: Alignment of GNN Representations w
    目录:TEA-GLM(TokenEmbedding-AlignedGraphLanguageModel)(NeurlPS2024)1背景介绍1.1GNN的局限性1.2LLM解决Graph问题的方案1.3LLMs与GNN结合中的关键问题1.4文章贡献2方法2.1模型框架2.2GNN的对比学习2.2.1GNN的实例对比学习2.2.2GNN的特征对比学习2.3......
  • [GPT] LangChain : `LLM` 编程框架
    概述:LangChain:LLM(大语言模型)编程框架基本介绍:LangChainLangChain就是一个LLM(大语言模型)编程框架你想开发一个基于LLM应用,需要什么组件它都有,直接使用就行;甚至针对常规的应用流程,它利用链(LangChain中Chain的由来)这个概念已经内置标准化方案了。本文我们从新......