MCTS-RAG:通过树搜索重塑小模型中的检索增强生成(RAG)

https://arxiv.org/pdf/2503.20757v1这篇论文提出了MCTS-RAG框架,用于解决小型语言模型在知识密集型任务上的推理能力不足问题。具体来说,

  1. ​MCTS-RAG框架​​:MCTS-RAG通过迭代地精炼检索和推理过程来工作。给定一个查询,它探索多个推理路径,并在关键决策点动态地结合检索操作。检索到的知识用于评估中间状态,并通过反向传播强化有益的检索路径。

在这里插入图片描述

  1. ​动作空间定义​​:在每个MCTS决策点,设计了以下离散动作:
  • A1:直接回答:基于现有推理或预先已知的上下文提供即时响应。
  • A2:快速推理:基于当前上下文执行快速的增量推理步骤。
  • A3:分解问题:将复杂查询分解为更小、更易管理的子问题。
  • A4:检索推理:在进行下一步推理之前,从内部或外部源主动检索相关知识。
  • A5:检索分解:首先分解复杂问题,然后获取相关知识以解决各个子问题。
  • A6:总结回答:生成简洁且结构化的总结,综合之前的推理和检索信息。
  1. ​检索过程​​:动态地在演变的MCTS推理环境中检索信息,确保及时且相关地整合外部知识。模型自主确定何时需要检索,生成有针对性的查询,并将外部知识关键地整合到推理中以提高准确性。

    在这里插入图片描述

  2. ​确定最终答案​​:在MCTS探索结束时,通过投票机制和一致性分析选择最佳答案。每个推理轨迹产生一个候选答案,这些候选答案根据语义一致性分组为唯一答案集。最终分数计算如下:

其中, 是沿着其对应推理轨迹的所有节点的奖励的乘积。最终答案通过以下公式确定:

实验设计

当然可以!我们来深入解读 MCTS-RAG 项目的核心代码逻辑。该项目结合了 蒙特卡洛树搜索(MCTS)检索增强生成(RAG),通过动态迭代优化推理路径和知识检索,提升小型语言模型在复杂任务中的表现。


🧠 项目核心思想

https://github.com/yale-nlp/MCTS-RAG

📁 核心文件结构(简化)

从 GitHub 项目的目录结构来看,关键模块包括:

mcts_rag/
├── mcts.py                # MCTS 主要逻辑
├── rag_model.py           # RAG 模型封装
├── generator.py           # 生成器模块
├── discriminator.py       # 判别器模块
├── utils.py               # 工具函数
└── scripts/               # 运行脚本

接下来我们逐一解析这几个模块的关键代码逻辑。


🌲 一、mcts.py —— MCTS 核心逻辑

这是整个项目的灵魂部分,实现了基于 MCTS 的推理框架。

1. 节点类 Node

class Node:def __init__(self, state, parent=None):self.state = state                  # 当前状态(比如问题 + 推理步骤)self.parent = parent                # 父节点self.children = []                  # 子节点self.visits = 0                     # 被访问次数self.value = 0                      # 节点价值self.untried_actions = [...]       # 可选动作(如生成下一步 or 检索新信息)

每个节点代表一个“推理状态”,包含当前的问题、已有的推理步骤以及可能的动作。

2. MCTS 四步流程

标准的 MCTS 包括四个步骤:

  1. 选择(Selection):从根节点开始,按照某种策略(如 UCB)选择最有潜力的子节点。
  2. 扩展(Expansion):如果当前节点未完全展开,则创建新的子节点。
  3. 模拟(Simulation):从当前节点随机 rollout 直到结束(即生成完整回答)。
  4. 反向传播(Backpropagation):根据 rollout 结果更新路径上所有节点的价值。

mcts.py 中,这四个步骤被封装为函数:

def tree_policy(node):# 实现 UCT 或其他选择策略...def expand(node):# 创建新的子节点...def simulate(node):# 使用 generator 和 retriever 生成一个完整回答...def backpropagate(node, reward):# 更新路径上的节点价值...

3. Rollout 示例(模拟)

def rollout(node):state = node.state.copy()for _ in range(max_depth):if is_terminal(state):breakaction = random.choice(get_possible_actions(state))state = apply_action(state, action)return evaluate(state)  # 返回最终得分

其中:

  • apply_action 可能调用 generatorretriever
  • evaluate 使用 discriminator 对当前推理路径进行评分

🧠 二、rag_model.py —— RAG 模型封装

该模块负责封装语言模型和检索器,提供统一接口。

class RAGModel:def __init__(self, model_name, retriever):self.model = AutoModelForCausalLM.from_pretrained(model_name)self.tokenizer = AutoTokenizer.from_pretrained(model_name)self.retriever = retrieverdef generate(self, prompt):inputs = self.tokenizer(prompt, return_tensors="pt").to(device)outputs = self.model.generate(**inputs, max_new_tokens=200)return self.tokenizer.decode(outputs[0], skip_special_tokens=True)def retrieve(self, query):return self.retriever.retrieve(query)

这里你可以看到典型的 RAG 架构:

  • 输入 prompt 会先经过 retrieve 获取相关信息
  • 再拼接到 prompt 中送入 generate 生成答案

✍️ 三、generator.py —— 生成器模块

这个模块定义了如何使用语言模型进行推理生成。

class Generator:def __init__(self, model):self.model = modeldef propose_reasoning_step(self, current_state):prompt = self._build_prompt(current_state)reasoning_step = self.model.generate(prompt)return reasoning_step

每次 MCTS 扩展节点时,都可能调用 propose_reasoning_step 来生成一个新的推理步骤。


🔍 四、discriminator.py —— 判别器模块

判别器用于评估某个推理路径的可信度,是 MCTS 中 reward 的来源。

class Discriminator:def __init__(self, model):self.model = modeldef score_path(self, path):prompt = self._build_score_prompt(path)score = self.model.generate(prompt)  # 输出一个分数return float(score)

判别器可以是一个独立的小型模型,也可以是同一个模型的不同模式。


🛠️ 五、utils.py —— 工具函数

提供一些辅助函数,例如:

  • 构建 prompt 模板
  • 处理 JSON 数据
  • 日志记录
  • 缓存机制(避免重复生成或检索)

示例:

def build_prompt(question, retrieved_docs, steps):prompt = f"Question: {question}\n"prompt += "Retrieved Docs:\n" + "\n".join(retrieved_docs) + "\n"prompt += "Reasoning Steps So Far:\n" + "\n".join(steps) + "\n"prompt += "Next Step:"return prompt

🚀 总结:MCTS-RAG 的运作流程

以下是整个系统的执行流程图:

开始
│
├─ 初始化 MCTS 根节点(初始问题)
│
└─ 循环以下步骤直到达到最大迭代次数:│├─ Selection: 选择最有潜力的节点├─ Expansion: 如果节点未完全展开,则生成新推理步骤或检索新内容├─ Simulation: 随机 rollout 完成推理├─ Backpropagation: 使用判别器评分并更新节点价值│
└─ 最终选择评分最高的路径作为答案

📚 建议阅读源码顺序

如果你打算深入研究这个项目,建议按如下顺序阅读源码:

  1. mcts.py → 理解 MCTS 整体架构
  2. utils.py → 看懂 prompt 构造与数据处理方式
  3. generator.py / discriminator.py → 了解生成和评估机制
  4. rag_model.py → 理解 RAG 模型集成方式
  5. scripts/run_*.sh → 查看运行参数配置

📌 小贴士

  • 你可以在本地运行这个项目,但需要安装 PyTorch、Transformers、vLLM 等依赖。
  • 训练自己的判别器 可以进一步提高系统效果。
  • 可尝试更换不同 SLM 模型(如 Llama-3-8B、Phi-3 等)测试性能差异。

结果与分析

  1. ​主要发现​​:MCTS-RAG在不同数据集上一致优于基线方法,展示了强大的多步推理和检索能力。在CWQA上,Llama 3.1-8B提高了超过20%,Qwen2.5-7B提高了约6%。在GPQA上,分别提高了约15%和10%。在FMT上,Llama 3.1-8B提高了超过10%,Qwen2.5-7B提高了4%。与基线方法相比,MCTS-RAG的平均性能提高了约14%。
  2. ​不同动作的影响​​:检索动作(特别是A4和A5)对于多步推理至关重要。启用所有检索提高了GPQA(+20.88%)和FMT(+16.10%)。禁用A5提高了GPQA(+7.84%)和FMT(+6.43%),表明A4的作用更强。CWQA的影响最小(+1.25%)。
  3. ​不同展开策略的影响​​:更多的展开提高了性能,特别是对GPQA。从4增加到8略微提高了CWQA(+3%),从8到12提高了GPQA(+11%)。扩展到16进一步提高了GPQA(+9%)和FMT(+5%),强化了迭代推理的价值。

总体结论

这篇论文提出了MCTS-RAG框架,通过结合MCTS的推理和检索能力以及自适应检索机制,提高了多步推理的准确性和可靠性。MCTS-RAG在处理需要深入外部知识的跨域任务时表现出色,不仅能够灵活地制定高质量的检索查询,还能通过迭代树探索细化推理路径,从而减少由浅层检索或简单推理引起的幻觉。实验结果表明,MCTS-RAG在复杂推理任务、知识增强的科学问答任务和具有挑战性的事实核查任务中取得了良好的效果。未来的工作将集中在优化搜索效率、开发自适应动作选择策略、基于置信度的检索过滤和错误感知剪枝机制上,以进一步提高MCTS探索的效率。

思考与见解

与传统RAG的静态管道不同,MCTS-RAG引入了一种“推理驱动的知识增强”的新范式。它提供了比CoT更多的灵活性和控制,可能是迈向下一代智能问答系统的关键一步。

话虽如此,我有几点想法。

虽然它比端到端使用LLMs更高效,但MCTS中的推出阶段仍然引入了不可忽视的计算成本。

此外,奖励被定义为推理路径上行动分数的乘积,但值得质疑这是否完全捕捉了推理轨迹的“正确性”。

总的来说,MCTS-RAG提供了一种有意义的方法论转变。在我看来,它试图弥合结构化算法与非结构化语言推理之间的差距——本质上通过离散控制流引导语言生成。这就是它的潜力所在,但也是其最大风险所在。

关键问题及回答

​问题1:MCTS-RAG框架中的动作空间是如何定义的?这些动作各自的作用是什么?​

在MCTS-RAG框架中,动作空间定义了在每个MCTS决策点可以执行的操作。具体动作包括:

  • ​A1:直接回答​​:基于现有推理或已知上下文提供即时响应,适用于简单查询或不需要额外分析的情况。
  • ​A2:快速推理​​:在当前上下文基础上执行快速的增量推理步骤,适用于探索性路径或初步判断,以高效指导搜索。
  • ​A3:分解问题​​:将复杂查询分解为更小、更易管理的子问题,有助于清晰的问题解决路径和提高推理效率,特别适用于多部分或复杂问题。
  • ​A4:检索推理​​:在下一步推理之前,从内部或外部源主动检索相关信息,对于需要补充信息的查询或现有上下文不完整的情况至关重要。
  • ​A5:检索分解​​:结合分解和检索,首先分解复杂问题,然后获取相关知识以解决各个子问题,特别适用于涉及详细上下文依赖子问题的查询。
  • ​A6:总结回答​​:生成简洁、结构化的总结,综合之前推理和检索的信息,提供连贯且全面的响应,特别适用于需要总结或整合多方面信息的查询。

这些动作旨在解决推理-检索相互作用的特定方面,确保模型能够在导航问题空间时动态调整其策略。

​问题2:MCTS-RAG框架中的检索过程是如何设计的?它在推理过程中起到了什么作用?​

MCTS-RAG框架中的检索过程是动态地在MCTS推理环境中进行的,确保及时和相关地整合外部知识。具体步骤包括:

  • ​R1:查询生成​​:如果检测到知识缺口,模型生成搜索查询。
  • ​R2:查询执行​​:使用外部检索工具获取最相关的信息。
  • ​R3:知识反思​​:评估检索数据的相关性和一致性,以确定其是否包含在推理过程中。
  • ​R4:总结回答​​:整合精炼后的信息,使模型能够回答子问题或推进推理。

检索过程在推理过程中的作用是确保模型的推理不断更新并通过外部数据进行验证,从而减少错误并增强最终输出的稳健性。通过将检索与推理交织在一起,信息流得以简化,产生既简洁又富有信息量的输出。如果先前检索的数据足以回答当前推理步骤确定的问题,模型会跳过额外的检索,避免冗余。

​问题3:MCTS-RAG在实验中表现如何?与其他基线方法相比有哪些优势?​

MCTS-RAG在实验中表现出色,展示了强大的多步推理和检索能力。具体结果如下:

  • ​ComplexWebQA (CWQA)​​:在Llama 3.1-8B和Qwen2.5-7B上分别提高了20%和6%。
  • ​Graduate-Level Google-Proof QA (GPQA)​​:在Llama 3.1-8B和Qwen2.5-7B上分别提高了约15%和10%。
  • ​FoolMeTwice (FMT)​​:在Llama 3.1-8B和Qwen2.5-7B上分别提高了10%和4%。

与其他基线方法相比,MCTS-RAG的优势包括:

  • ​提高推理准确性​​:通过新的检索动作,小型语言模型能够获取外部知识,增强了问答的质量。
  • ​优化查询构建​​:精炼过程确保每个查询专注于特定的信息需求,提高了检索查询生成的有效性。
  • ​增强检索质量​​:反思和总结检索信息有助于减少语义差异,确保与核心问题的对齐。
  • ​减少幻觉​​:通过详细的显式推理步骤,MCTS-RAG减少了由于浅层检索或简单推理引起的幻觉。

总体而言,MCTS-RAG在复杂推理任务、知识增强的科学问答任务和具有挑战性的事实核查任务中展示了卓越的性能和效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/81900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构:绪论之时间复杂度与空间复杂度

作者主页 失踪人口回归,陆续回三中。 开辟文章新专栏——数据结构,恳请各位大佬批评指正! 文章目录 作者主页 数据结构的基本知识数据:数据元素:数据对象:数据类型:数据结构:逻辑结…

位图算法——判断唯一字符

这道题有多种解法,可以创建hash数组建立映射关系判断,但不用新的数据结构会加分,因此我们有“加分”办法——用位图。 我们可以创建一个整型变量(32位)而一共才26个字母,所以我们只要用到0-25位即可&#…

深度学习之-目标检测算法汇总(超全面)

YOLO目标检测改进 YOLO V1- YOLO V10: 点这进入https://www.researchgate.net/publication/381470743_YOLOv1_to_YOLOv10_A_comprehensive_review_of_YOLO_variants_and_their_application_in_the_agricultural_domain YOLO V11: YOLO11 🚀Ultralytics YOLO11 &…

软考中级软件设计师——计算机网络篇

一、计算机网络体系结构 1.OSI七层模型 1. 物理层(Physical Layer) 功能:传输原始比特流(0和1),定义物理介质(如电缆、光纤)的电气、机械特性。 关键设备:中继器&#…

高等数学-空间中的曲线与曲面

一、 向量的数量积: 直线与直线的夹角: 直线与平面的夹角: 平面与平面的夹角(锐角): 方向余弦: 注:空间向量与坐标轴的夹角定义为向量与坐标轴正方向的夹角 例1: 二、 1、z0所…

使用计算机视觉实现目标分类和计数!!超详细入门教程

什么是物体计数和分类 在当今自动化和技术进步的时代,计算机视觉作为一项关键工具脱颖而出,在物体计数和分类任务中提供了卓越的功能。 无论是在制造、仓储、零售,还是在交通监控等日常应用中,计算机视觉系统都彻底改变了我们感知…

javaweb-html

1.交互流程: 浏览器向服务器发送http请求,服务器对浏览器进行回应,并发送字符串,浏览器能对这些字符串(html代码)进行解释; 三大web语言:(1)html&#xff1a…

图漾相机错误码解析

文章目录 1.相机错误码汇总2.常见报错码2.1 -1001报错2.1.1 没有找到相机2.1.2 SDK没有进行初始化2.1.3 相机不支持Histo属性 2.2 -1005报错2.2.1 跨网段打开相机2.2.2 旧版本SDK在软触发失败后提示的报错2.2.3 相机初始化上电时报错2.2.4 USB相机被占用 2.3 -1009报错2.3.1 相…

18. 结合Selenium和YAML对页面继承对象PO的改造

18. 结合Selenium和YAML对页面继承对象PO的改造 一、架构改造核心思路 1.1 改造前后对比 #mermaid-svg-ziagMhNLS5fIFWrx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ziagMhNLS5fIFWrx .error-icon{fill:#5522…

将VMware上的虚拟机和当前电脑上的Wifi网卡处在同一个局域网下,实现同一个局域网下实现共享

什么是桥接模式:桥接模式(Bridging Mode)是一种网络连接模式,常用于虚拟机环境中,将虚拟机的虚拟网络适配器直接连接到主机的物理网络适配器上,使虚拟机能够像独立的物理设备一样直接与物理网络通信 1.打开…

gitee错误处理总结

背景 如上图,根据图片中的 Git 错误提示,我们遇到的问题是 ​本地分支落后于远程分支,导致 git push 被拒绝。 ​问题原因​ 远程仓库的 master 分支有其他人推送的新提交,而您的本地 master 分支未同步这些更新(即本…

如何提高独立服务器的安全性?

独立服务器相对于其它服务器来说,整体的硬件设备都是独立的同时还有着强大的服务器性能,其中CPU设备能够决定着服务器的运算能力,所以独立服务器的安全性受到企业格外的重视,严重的话会给企业造成巨大的资金损失。 那么&#xff0…

Spark,集群搭建-Standalone

以下是 Spark Standalone 集群搭建 的详细步骤(基于 Linux 系统,以伪分布式为例): 一、环境准备 1. 硬件要求 - 至少 2 台节点(1 台 Master,1 台 Worker,可扩展)。 - 每节点配置…

如何在WordPress中使用ChatGPT

ChatGPT 自 2022 年 11 月问世以来,极大地影响了我们的创作方式。ChatGPT 可以帮助您制作大纲、标题、段落或完整的博客文章,各地的数字创作者都在热衷于使用人工智能(AI)创建内容。随着人工智能的不断发展,我们看到了…

spring5-配外部文件-spEL-工厂bean-FactoryBean-注解配bean

spring配外部文件 我们先在Spring里配置一个数据源 1.导c3p0包,这里我们先学一下hibernate持久化框架&#xff0c;以后用mybites. <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.2.…

GStreamer (三)常⽤插件

常⽤插件 1、Source1.1、filesrc1.2. videotestsrc1.3. v4l2src1.4. rtspsrc和rtspclientsink 2、 Sink2.1. filesink2.2. fakesink2.3. xvimagesink2.4. kmssink2.5. waylandsink2.6. rkximagesink2.7. fpsdisplaysink 3 、视频推流/拉流3.1. 本地推流/拉流3.1.1 USB摄像头3.1…

【EDA软件】【联合Modelsim仿真使用方法】

背景 业界EDA工具仿真功能是必备的&#xff0c;例如Vivado自带仿真工具&#xff0c;且无需联合外部仿真工具&#xff0c;例如MoodelSim。 FUXI工具仿真功能需要联合Modelsim&#xff0c;才能实现仿真功能。 方法一&#xff1a;FUXI联合ModelSim 1 添加testbench文件 新建to…

国产化Excel处理组件Spire.XLS for .NET系列教程:通过 C# 将 TXT 文本转换为 Excel 表格

在数据处理和管理场景中&#xff0c;将原始文本文件&#xff08;TXT&#xff09;高效转换为结构化的 Excel 电子表格是一项常见要求。对于那些需要自动生成报表或者处理日志文件的开发人员而言&#xff0c;借助 C# 实现 TXT 到 Excel 的转换工作&#xff0c;可以简化数据组织和…

DeepSeek 的强化学习优化策略:RLHF 与 DPO 的应用

DeepSeek 的强化学习优化策略&#xff1a;RLHF 与 DPO 的应用 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 DeepSeek 的强化学习优化策略&#xff1a;RLHF 与 DPO 的应用摘要引言技术原理对比1. RLHF&#xff1a…

c: 分号的歧义

最近看到一个关于某些语言里的分号问题&#xff0c;比如下面一个作者就是无意识的每行后面多加了分号导致问题。 其实python的语法可以更好的规避这种潜意识&#xff0c;因为根本就不需要每行后面加分号的意识&#xff0c;也就不需要开发者习惯这种意识。 所以&#xff0c;最后…