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

一、LLM幻觉现象概述

在深入讨论Agentic方法之前,我们有必要先了解LLM幻觉现象的三种主要类型:

(一)内在幻觉

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

(二)外在幻觉

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

(三)不连贯幻觉

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

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

二、Agentic方法原理

Agentic方法是一种基于代理(Agent)的工作流程,旨在通过一系列步骤来验证LLM生成的答案,从而减少幻觉现象。该方法的核心思想是利用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 确实更不容易产生幻觉。在对幻觉进行基准测试中可以发现,表现最佳(幻觉最少)的模型在传统的自然语言处理排行榜上也名列前茅。因此,对于最敏感的用例,如果可能的话,应选择更强大的 LLM。例如,在一些对准确性要求极高的领域,如医疗诊断、法律文件处理等,使用性能更强的模型可以降低因幻觉导致的风险。

Agentic方法作为一种减少LLM幻觉的有效策略,在人工智能领域具有广泛的应用前景。通过自我验证机制,该方法能够显著降低LLM生成的答案中的幻觉现象,提高答案的准确性和可靠性。然而,该方法也存在一些局限性和挑战,如对LLM模型的要求较高、处理复杂问题的能力有限以及成本效益问题等。

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

  1. 开发更强大的LLM模型

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

  2. 优化验证机制

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

  3. 拓展应用领域

    将Agentic方法应用于更多的任务和场景中,如对话系统、推荐系统、知识图谱构建等,以验证其泛化能力和实用性。

总之,Agentic方法为减少LLM幻觉提供了一种有效的解决方案,并在实际应用中展现出了显著的效果。

代码地址:https://github.com/CVxTz/document_ai_agents

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐