摘要:
在提升领域特定的大语言模型(LLMs)的方法中,检索增强生成(RAG)技术作为一种有前景的解决方案,可以缓解诸如幻觉、知识过时以及在高度专业化查询中专业知识有限等问题。然而,现有的RAG方法忽视了系统状态变量的引入,而系统状态变量对于确保自适应控制、检索停止和系统收敛至关重要。本文通过严格的理论证明,提出了图灵完备的RAG(TC-RAG)框架,通过引入图灵完备的系统来管理状态变量,从而实现更高效、准确的知识检索。通过利用具有自适应检索、推理和计划能力的内存堆栈系统,TC-RAG不仅确保了检索过程的受控停止,还通过Push和Pop操作减轻了错误知识的积累。在医疗领域的案例研究中,我们在真实世界的医疗数据集上进行了广泛的实验,结果表明,TC-RAG在准确性上比现有方法提高了7.20%以上。
医学场景案例研究
在真实医学场景中,是否检索/怎样检索/如何规划检索/如何处理检索过程中的瑕疵 是非常重要的四个难点:
(1) 是否检索:如下图的真实场景的例子所示,使用检索后由于大量的无关噪声被检索到,因此模型的回答反而被误导了。这时候是不需要检索的!
图1. 使用RAG检索到的噪声知识导致回答错误的例子
(2) 怎样准确检索:在真实场景下,一个懂医学的医生查阅资料的过程和普通人问诊是完全不一样的, 不会一股脑的将全部知识点拿去检索。
图2. 真实场景中医生去检索的例子
(3) 如何规划检索: 在真实场景下,一个懂医学的医生查阅资料的过程是有规划的,并且能够灵活的使用多种医学工具。
图3. 医生规划检索的例子
(4) 如何处理检索过程中的瑕疵:在检索过程中,检索到的错误知识(例如过时知识)或任务无关的噪声知识是很常见的,然而医生大多数时候是能够根据自己的认知来纠正错误重新检索的。
图4. 医生处理检索过程的瑕疵的例子
因此,现目前的研究大多都采用RAG+LLM的方法,但很少有工作解决以上问题。
引言
大语言模型(LLMs),如ChatGPT(OpenAI 2022)和GPT-4(OpenAI 2023),在许多关键领域取得了显著进展,并在各种下游任务中表现出了卓越的性能。在医疗领域,这些医疗LLMs展示了巨大的潜力,尤其是在健康护理领域,责任感和可信度至关重要。通过全面的医学知识预训练,这些模型不仅可以支持医生进行精确的诊断和制定治疗计划,还可以改善医疗资源的分配。然而,尽管医疗LLMs取得了重大进展,仍然存在一些关键挑战,包括难以避免的事实错误(如幻觉)、知识的过时,以及缺乏高度专业化的知识。为了解决这些问题,检索增强生成(RAG)技术被提出,该技术利用外部知识库提供的医疗知识作为上下文信息来增强内容生成,这被认为是解决上述问题的一个有前景且必要的解决方案。
然而,尽管现有通过RAG增强LLMs的方法显示出一定的前景,但它们始终忽略了系统状态变量的引入,而这些变量对于确保自适应控制、检索停止和系统收敛至关重要。此外,这些现有的RAG方法并非图灵完备,缺乏动态管理和监控检索过程的能力,无法保证在复杂的医疗场景中得出可靠的结论。在这些复杂的医疗场景中,决策通常需要复杂的多步骤推理和自适应响应,图灵完备性的缺失显著限制了系统的有效性和可靠性。这一差距促使我们提出一种新的方法:构建一个图灵完备的系统来有效管理状态变量,利用有限的逻辑框架来增强RAG过程。然而,如何有效地构建一个图灵完备的RAG系统仍然未被充分探索,并且面临着重大的挑战:
挑战1: **设计具有监控状态变量的图灵完备RAG系统:**设计一个图灵完备的RAG系统需要整合能够动态跟踪和控制检索过程的监控状态变量,这是现有RAG方法所缺乏的。当前的方法并没有明确的机制来评估系统是否已经收敛到一个可靠的结论,这是一个重要的缺口。一个显著的挑战在于如何利用大模型的前向传播过程,实时准确地计算这些状态变量,并确保这些变量能够有效反映系统的演变上下文,从而指导是否继续、停止或改进检索过程的关键决策。如何在模型的前向传递过程中管理这些变量,同时保持对复杂多变的医疗查询的适应性,是实现效率和准确性的关键。
挑战2:动态规划检索以维持最佳状态:一旦能够评估状态,如何动态管理状态以达到预期的状态是一个重要的问题。在现实生活中的咨询中,医生通常会根据他们对问题的掌握程度决定是否进行检索以及检索什么,而不是盲目地进行检索,这可能导致模型已经具备的冗余信息,从而可能导致混淆甚至误导LLMs。如何系统地分析和计划进一步的步骤,并有效利用LLMs内部参数化知识来维持最佳状态,是一个重要的挑战。
挑战3: 避免无关噪声影响系统状态:由于传统RAG的检索过程通常是由查询关键词驱动的,而不是根据模型的具体需求,这可能会引入大量无关和噪声的上下文。而错误的知识会随着检索和推理过程的积累而持续增加,从而浪费token资源、积累无效记忆并遇到“lost in middle”(即大模型不遵循指令)的问题。因此,如何有效地消除错误知识对于维持系统状态至关重要。
为了解决这些挑战,我们提出了图灵完备的RAG(TC-RAG),这是一个为领域特定LLMs提供可靠且可信的医疗分析的图灵完备系统。首先,对于挑战1,我们设计了一个具有内存堆栈的图灵完备RAG系统,该系统监控中间状态,确保检索过程可靠地收敛到最佳结论。其次,为了应对挑战2,我们广泛收集了医疗数据,并预训练了一个医疗LLM,从而提高了它的推理和规划能力。最后,对于挑战3,TC-RAG结合了内存堆栈系统,利用回溯和总结操作及时删除错误并压缩冗余知识,从而减轻了错误信息和噪声的积累。
相关工作
检索增强生成(RAG)最早由Lewis等人提出,通过将外部知识库的信息整合到LLMs的提示工程中,增强了LLMs在知识密集型任务中的表现。RAG不仅在LLMs推理过程中减少了幻觉问题,还提供了最新的、任务特定的知识,从而显著提升了下游任务的可解释性和性能。在生物医学领域,RAG被广泛应用于通过利用医学论文、指南、教科书、维基百科、知识图谱等外部医学知识,来提高LLMs的推理和分析能力。
(1) Naive & Advanced RAG: Naive RAG通常采用简单的检索-阅读方法,其中相关信息是基于用户初始查询进行检索的,然后使用这些内容生成答案。Advanced RAG则结合了更复杂的组件,如检索器、重新排序器、过滤器和阅读器,以提高检索和生成的质量。然而,无论是Naive RAG还是Advanced RAG,都没有考虑LLMs是否已经具备了必要的知识。这常常导致检索过多冗余信息,可能会误导模型,造成所谓的“中途丢失”困境。我们的方法通过基于模型的内部参数化知识来决定是否检索以及检索什么,从而实现更高效、准确的检索。
(2) Adaptive RAG: 最近的研究重点开发了自适应RAG策略,使得LLMs能够决定是否以及何时检索,并从庞大的知识库中选择最合适的检索工具。FLARE通过预测下一句并使用生成的低置信度词作为查询重新检索相关文档。DRAGIN利用LLMs在其生成内容中的不确定性,根据内部自注意力权重和相应的关键词来决定何时触发检索。Adaptive-RAG使用一个较小的LLM作为分类器,先查询问题的复杂性,然后选择最合适的检索策略——从简单到复杂。然而,这些现有的自适应RAG方法都不是图灵完备的,缺乏动态管理和监控检索过程的能力,无法保证系统收敛到一个可靠的结论。此外,它们尚未充分利用LLMs与RAG相结合的逐步规划和工具使用能力。我们的方法通过整合一个图灵完备的框架,优化了检索过程,通过高级的规划和工具使用策略,确保了更可靠和准确的结果。
推理和规划能力**:**最近的研究重点是增强LLMs的推理和规划能力。链式推理(Chain-of-Thought,CoT)展示了LLMs如何构建结构化的“思维过程”来解决复杂问题。ReAct将推理轨迹与任务特定的动作相结合,使LLMs能够计划、调整动作,并在从外部来源(如知识库)获取信息时管理异常。Reflexion通过使用语言反馈进一步改进了LLMs,使它们能够反思并存储任务反馈,从而提高未来尝试中的决策能力。尽管这些方法在推理和规划过程中引入了新的决策尝试,但它们往往在管理之前的记忆上表现不足,尤其是在删除无效决策或精炼历史记录方面。为了解决这些挑战,TC-RAG结合了具有回溯和总结操作的内存堆栈系统,允许及时纠正错误并压缩冗余知识,确保模型的推理过程高效且准确,从而得出更可靠的结果。
图灵完备的记忆栈定义(Tc Stack)
在Tc-RAG中,记忆栈被定义如下:
解释:记忆栈Tc=(S,A,M,delta,s0, F,sigma):
1. 其中S是大模型的可能处于的状态(作者这里用具体的数值来表示,代表大模型的确定性程度,越小代表大模型此刻对该任务的回答越确定);
2. A达标大模型可以执行的动作。在栈里面,在基于栈的记忆系统中,通过push和pop这两个基本操作的组合,TC-RAG将能够有效实现对大模型交互记忆的管理、精炼大模型交互过程中的记忆内容以及去除RAG过程中所引入的噪声:
基于这两个meta-actions,TC-RAG一共定义了5个由push和pop两个基本操作所组合而成的有意义的行为,在大模型每次决策时,都将从这5个行为中选择一个执行。这5个行为的定义如下:
(1) 思考:这个行为将激发大模型的决策能力,让大模型根据已有的信息进行分析和处理,决定大模型下一步的行为。大模型思考的内容会被push到记忆栈之中。
(2) 工具调用:当大模型仅凭借自身知识无法回答问题时,大模型可以通过调用网络搜索、文档检索、图谱检索等外部工具来获取额外的信息辅助自身回答问题。工具调用后,使用工具的名称以及工具检索的结果将被push到记忆栈之中。
(3) 反思:当大模型发现记忆栈栈顶的内容与整个任务不相关或是该内容是有害的时候,大模型可以通过反思行为,将记忆栈栈顶的元素pop出去,从而避免大模型被无关信息或是有害信息所干扰。
(4) 总结:当记忆栈栈顶的信息过长,或是在栈顶信息中包含了部分噪音时,大模型可以通过总结行为,先利用pop操作将栈顶元素取出,然后对取出的文本进行总结,得到更加精炼且与任务相关的文本,最后再将精炼后的文本push回到记忆栈之中。
(5) 结论:当大模型觉得可以给出最终答案时,会执行结论操作。然而,当且仅当此时整个系统的状态变量达到终止条件时,大模型才会停止整个流程
3. M代表的是大模型的记忆栈,在任务一开始时将用户的Query压入栈底
4. delta是状态转移函数
5. s0代表的是大模型的初始状态,这里用一个很大的值Large_Value表示
6. F代表大模型的终止状态。Tc-RAG认为当大模型自己需要输出Conclusion以及当状态值小于sigma阈值时,此刻推理结束,Tc的栈顶将作为最终的输出答案。
图灵完备性的证明
关于图灵完备性的证明,作者在第四部分和附录部分已经写的非常详细了,感兴趣的同学可以去阅读看看,这里就不细致说了。
记忆栈和系统监测方法
如上图所示,TC-RAG利用基于栈的记忆系统以及对应的状态变量来实现对整个RAG框架的状态管理与终止判定,让模型能够自适应地进行检索以及在合适的时刻输出最终答案。
1. 在一开始的时候,大模型将用户Query压栈,接下来大模型将不断的执行所定义的复合操作(Composed Action Set),例如:思考(push),反思(pop),工具执行(push),总结(pop->push)等。在工具执行的过程中,大模型被允许使用多源数据(图谱、文档、网页百科等)。
2. 在大模型执行到Conclusion/Thought时,系统会不断更新它的状态变量(状态变量的计算方法在下文);当大模型执行到有Pop的动作时,会将状态变量重置为上一个Thought的值,以确保系统的完备性。
3. 最后在大模型输出Conclusion且状态变量小于阈值时,输出最终答案,否则大模型的结论行为会被视为思考行为处理,并继续进行下一步推理。
为了解决自适应检索中的停机问题,我们在系统中引入了状态变量来监测系统状态。只有当状态变量满足终止条件时,整个系统才会停机。在实践中,TC-RAG分别尝试了条件困惑度和不确定性这两种不同的状态变量作为量化系统当前状态的指标。
(1) 条件困惑度通过计算大模型在用户提问内容的基础上,生成栈顶输出内容时的困惑度而获得:
(2) 不确定性则是通过计算输出栈顶输出信息的熵值所得到的:
当系统状态值较低或不确定性较低时,表明此时大模型对于最终的结果已经有了比较高的信心。
整个方法部分的伪代码如下:
Prompt如下所示:
和ReACT的对比:
图: ReACT策略
然而,我们如果将ReACT的执行过程视作栈的话,就可以发现这是一个单向的栈(只有push,没有pop)。先目前的Reflexion工作,虽然纳入了反思过程,但其上一次的错误思考过程还是被纳入到栈中了。因此,大量的错误知识被累计,token资源被浪费,容易导致资源lost in middle问题。
除此之外,ReACT等方法没有引入系统变量监测系统,因此该类模型往往都是黑盒的,即仅仅依靠大模型自己来决定是否结束检索和思考。
因此,Tc-RAG也做了一个可视化实验:
图:Tc-RAG和ReACT的可视化实验
从这个图可以看出,基于ReACT的方法在处理无关噪声的积累时存在困难,这导致了系统的过度自信和错误的结论。例如“仅仅因为单位不同”的错误,ReACT就得到了错误的判断。相比之下,TC-RAG能够有效管理其内存,并利用总结和回溯操作修剪错误的检索结果,从而得出更加简洁和准确的结论。这凸显了TC-RAG在处理复杂任务时的优势。此外,作者也发现基于ReACT的方法由于缺乏状态管理,往往会在系统状态值较高时过早确定答案。而TC-RAG能够动态地监控RAG过程,确保系统状态值符合终止条件,这进一步说明了构建系统状态的重要性。
实验
实验设置
(1) 精心微调的医学LLM模型:为了提升模型的思考和任务规划能力,作者搜集了海量的数据来持续预训练(continuous pretraining)了一个医学LLM:
(2) 医学工具库:
a. 作者纳入了 百万规模的医学知识图谱(包含130万医学实体和360万关系)并将图谱路径作为检索结果提供大模型(这里是延续了HyKGE的工作);
b. 医学文档库:作者搜集了海量的医学教程、就诊治疗、医学论文、病人电子病例等作为文档库
c. 网页检索:作者利用Bing和Google Search作为网页检索
d. 百科检索:作者利用WikiPedia和MedNet作为百科检索工具
e. 电子病历数据:来自MIMIC-III和MIMIC-IV数据。
实验结论
在CMB、MMCU以及CMB-Clin三个数据集上基于Qwen1.5-32B-Chat基座模型以及在Qwen1.5-32B-Chat上预训练后的模型的实验结果表明,TC-RAG的方法与其他RAG方法相比有着更好的表现,比现有方法在准确率上平均提升了7.20%,达到了SOTA的水平。同时,通过人为在RAG检索内容中引入噪声的投毒实验证明了TC-RAG方法在弹出检索噪声,保留有效信息方面有着较好的表现。此外,消融实验验证了TC-RAG中反思与总结动作的有效性以及状态变量引入的必要性。这些实验结果都表明,TC-RAG能够充分利用预训练大模型的规划能力,通过自适应地进行信息检索,辅助大模型更好地进行推理和决策,提升了模型的整体性能。
结论
本文提出了首个图灵完备的检索增强生成(RAG)系统,TC-RAG。通过引入监控状态变量,作者开发了一个内存堆栈框架,使检索过程更加动态和自适应,有效解决了传统RAG方法中存在的无休止和不准确的检索问题。TC-RAG框架通过其内存堆栈系统的回溯和总结功能,有效减少了错误知识和无关噪声的积累。实验表明,TC-RAG在多个真实世界的医疗数据集上显著优于现有的基准方法,展示了其在准确性和可靠性上的潜在改进。此外,TC-RAG的成功部署也凸显了其在实际应用中的价值。
如何学习大模型 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 的正确特征了。