深度剖析:规划与推理在多跳问答中的应用
深度剖析:规划与推理在多跳问答中的核心应用与落地实践
摘要/引言
你有没有过这种经历:问大模型“2023年中国新能源汽车销量Top3品牌的CEO分别毕业于哪所大学?”,得到的答案要么CEO名字写错,要么毕业院校张冠李戴,甚至直接编造不存在的学历信息?或者在企业内部知识库中查询“入职满3年、绩效S级的员工可享受的年假天数比入职满1年、绩效A级的员工多多少”,得到的结果完全不符合公司的人事制度?
这些问题的核心根源,并不是大模型的知识储备不足,而是缺乏对复杂问题的规划能力和多步逻辑的推理能力:这类需要跨多个知识片段、经过多步逻辑关联才能得到答案的问题,就是行业内所说的「多跳问答(Multi-hop QA)」问题。传统的端到端生成式问答,本质是单跳匹配逻辑,很容易因为“跳步”产生幻觉,也无法验证中间过程的正确性。
本文将从核心概念、技术原理、落地实践三大维度,深度拆解规划与推理在多跳问答中的作用,你将收获:
- 多跳问答的核心痛点与技术底层逻辑
- 规划模块与推理模块的设计思路、核心算法与对比
- 从零搭建一个可落地的企业级多跳问答系统的完整方案
- 多跳问答技术的发展趋势与最佳实践
本文适合大模型应用开发工程师、AI产品经理、企业AI落地负责人阅读,所有代码均可直接复制运行。
一、核心概念与问题背景
1.1 多跳问答的基础定义
核心概念
多跳问答是自然语言处理领域的经典任务,指的是需要通过至少2步及以上的逻辑推导、跨多个知识源/知识片段关联才能得到正确答案的问答任务。与之对应的是单跳问答:只需要匹配单个知识片段就能得到答案,比如“北京的面积是多少”。
我们可以用数学公式定义多跳问答的任务目标:
arg maxAP(A∣Q,K,R) \argmax_A P(A | Q, K, R) AargmaxP(A∣Q,K,R)
其中:
- QQQ 是用户输入的原始问题
- KKK 是可用的知识集合(包括大模型参数内知识、外部知识库、文档集等)
- R=[r1,r2,...,rn]R = [r_1, r_2, ..., r_n]R=[r1,r2,...,rn] 是长度为nnn的推理链,每个rir_iri对应一步推理操作
- AAA 是最终输出的答案
简单来说,多跳问答的核心是先找到正确的推理路径,再逐步执行推理得到答案,而不是直接从问题到答案的端到端生成。
问题背景
早期的多跳问答主要基于知识图谱实现,依赖人工定义的规则和路径排序算法,只能处理封闭域内的固定模式问题,泛化能力极差。2018年预训练模型兴起后,开放域多跳问答成为可能,但直到2020年Chain-of-Thought(思维链)技术提出之前,多跳问答的准确率一直停留在60%以下,完全无法满足落地要求。
随着大模型在企业场景的落地深入,80%以上的企业级问答需求都是多跳问题:财务场景的跨周期指标对比、HR场景的规则叠加计算、客服场景的多条件问题解答,都对多跳问答的能力提出了明确要求。而制约多跳问答落地的核心痛点主要有三个:
- 幻觉率高:中间步骤的错误会传导到最终答案,且无法追溯
- 可解释性差:用户不知道答案是怎么来的,不敢信任结果
- 可控性弱:无法约束大模型的推理逻辑,很容易偏离业务规则
1.2 规划与推理的核心定义
要解决多跳问答的痛点,核心就是引入两个独立的模块:规划模块和推理模块,二者缺一不可。
规划模块
规划是多跳问答的「导航系统」,核心目标是将复杂的原始问题拆解为若干个可执行的子问题/推理步骤,同时识别步骤之间的依赖关系,生成完整的推理路径。
推理模块
推理是多跳问答的「执行系统」,核心目标是按照规划模块生成的路径,逐步骤调用知识、执行逻辑演算,生成中间结果并校验正确性,最终聚合得到答案。
我们可以用一个清晰的对比表格来区分二者的核心属性:
| 对比维度 | 规划模块 | 推理模块 |
|---|---|---|
| 核心目标 | 化整为零,生成可行的推理路径 | 按路径执行,得到正确的中间结果 |
| 输入 | 原始问题、历史中间结果 | 单个子问题、上下文知识 |
| 输出 | 推理步骤列表、路径调整指令 | 中间结果、置信度得分 |
| 能力要求 | 逻辑拆解能力、依赖识别能力、全局视野 | 知识匹配能力、逻辑演算能力、校验能力 |
| 评估指标 | 路径覆盖率、步骤合理性、回溯效率 | 单步准确率、结果置信度、召回率 |
| 适用模型 | 7B-13B量级微调小模型即可满足要求 | 34B以上大模型/检索增强模型效果更好 |
实体关系与交互逻辑
我们用ER图来展示多跳问答中各个实体的关系:
整个系统的交互流程是一个闭环,而不是单向的流水线:
二、规划技术在多跳问答中的实现
2.1 规划的分类与核心算法
规划技术主要分为两大类:隐式规划和显式规划,二者的适用场景和优缺点差异非常明显。
隐式规划
隐式规划指的是不需要独立的规划模块,直接通过prompt engineering或者微调的方式,把规划能力内化到大模型的生成过程中。最典型的代表就是Chain-of-Thought(思维链)技术,通过添加“请一步步思考”的prompt,让大模型在生成答案之前先生成推理步骤。
隐式规划的优点是实现简单,不需要额外的系统开发,适合简单的2-3跳问答场景;缺点是可控性差,推理步骤不可控,很容易出现跳步或者逻辑错误,长推理链的准确率下降非常快。
显式规划
显式规划指的是单独开发独立的规划模块,专门负责问题分解和路径生成,和推理模块完全解耦。目前主流的显式规划算法主要有三种:
(1)模板匹配规划
针对固定场景的高频问题,预先定义好问题分解的模板,比如营收对比类问题的模板就是「找A指标→找B指标→计算比值/差值」,优点是速度极快、准确率100%,缺点是泛化能力差,只能处理固定模式的问题,适合标准化程度极高的业务场景。
(2)蒙特卡洛树搜索(MCTS)规划
这是目前最主流的通用场景规划算法,核心思路是通过多次模拟生成不同的推理路径,评估每条路径的价值,最终选择最优的路径。MCTS的核心公式是UCB( Upper Confidence Bound ),用于选择最优的子节点:
UCB(v)=Q(v)N(v)+clnN(parent(v))N(v) UCB(v) = \frac{Q(v)}{N(v)} + c \sqrt{\frac{\ln N(parent(v))}{N(v)}} UCB(v)=N(v)Q(v)+cN(v)lnN(parent(v))
其中:
- Q(v)Q(v)Q(v) 是节点vvv的累计价值
- N(v)N(v)N(v) 是节点vvv的访问次数
- ccc 是探索系数,越大越倾向于探索新路径
MCTS的执行流程如下图所示:
MCTS规划的优点是泛化能力极强,适合处理任意开放域的多跳问题,路径的合理性非常高;缺点是需要多次模拟,延迟相对较高。
(3)反思式规划
代表技术是Reflexion,核心思路是在推理执行的过程中,根据中间结果的反馈动态调整规划路径,如果某一步推理的置信度低于阈值,就自动回溯到规划模块,重新生成路径,甚至推翻之前的所有步骤,重新分解问题。这种规划方式的容错率最高,适合处理步骤非常多的复杂多跳问题。
2.2 规划模块的核心优化方向
规划模块的核心优化目标是在保障路径合理性的前提下,尽可能降低延迟,目前行业内的最佳实践主要有三个:
- 小模型专属微调:用7B量级的开源大模型,在领域内的多跳问题分解数据集上微调,作为专属的规划模块,成本只有GPT-4的1/50,速度快3倍以上,准确率可以达到GPT-4的90%以上。
- 路径缓存:对于高频的多跳问题,把规划好的路径缓存下来,下次遇到相同或者相似的问题直接复用,不需要重新生成,延迟可以降低90%以上。
- 依赖并行优化:规划的时候识别出没有依赖关系的子问题,调度多个推理模块并行执行,比如“找A的年龄和B的年龄”,两个子问题没有依赖,可以并行执行,大幅降低整体延迟。
三、推理技术在多跳问答中的实现
3.1 推理的分类与核心技术
推理技术按照逻辑类型可以分为三类:演绎推理、归纳推理、溯因推理,在多跳问答中最常用的是演绎推理,也就是从已知的知识和规则出发,推导出新的结论。目前主流的推理技术主要有:
(1)Chain-of-Thought(CoT,思维链)
CoT是推理技术的基础,核心思路是让大模型在生成答案之前,先输出中间的推理步骤,大幅提升多跳推理的准确率。CoT的Few-shot示例如下:
问题:小明有5个苹果,给了小红2个,又买了3个,现在有多少个苹果?
思考:小明原来有5个苹果,给了小红2个,剩下5-2=3个,又买了3个,现在有3+3=6个。
答案:6个
(2)Tree-of-Thought(ToT,思维树)
ToT是CoT的升级,核心思路是不只是生成一条推理路径,而是生成多棵推理树,每个节点对应一个中间想法,评估每个想法的正确性,剪掉错误的分支,最终选择最优的路径。ToT适合解决需要多路径探索的问题,比如数学题、逻辑推理题,准确率比CoT高20%以上。
(3)Graph-of-Thought(GoT,思维图)
GoT是ToT的进一步升级,核心思路是把推理过程建模为图结构,允许不同的推理分支之间进行合并、聚合,适合解决需要多源信息融合的多跳问答问题,比如跨多个文档的信息汇总类问题。
(4)检索增强推理
所有的推理技术都可以和检索增强(RAG)结合,每一步推理都先从外部知识库检索相关的知识片段,再基于检索到的知识进行推理,大幅降低幻觉率,这也是企业级多跳问答系统的标配。推理步骤的置信度计算公式为:
Conf(ri)=Sim(ki,ri)∗LLM_score(ri) Conf(r_i) = Sim(k_i, r_i) * LLM\_score(r_i) Conf(ri)=Sim(ki,ri)∗LLM_score(ri)
其中Sim(ki,ri)Sim(k_i, r_i)Sim(ki,ri)是推理结果和检索到的知识片段的语义相似度,LLM_score(ri)LLM\_score(r_i)LLM_score(ri)是大模型对推理结果的置信度打分,只有当Conf(ri)Conf(r_i)Conf(ri)高于预设阈值时,才会进入下一步推理。
3.2 推理模块的核心优化方向
推理模块的核心优化目标是降低幻觉率,提升单步推理的准确率,目前的最佳实践有:
- 单步职责单一:每个推理步骤只做一件事,不要让一个步骤处理多个逻辑,比如“找A的年龄并计算和B的年龄差”要拆成两个步骤,避免跳步产生的错误。
- 中间结果校验:每一步推理的结果都用外部知识或者规则引擎校验,比如计算得到的利润率超过100%,就自动判定为错误,触发回溯。
- 领域微调:垂直领域的推理模块用领域数据微调,比如医疗领域的推理模型在医学文献上微调,准确率可以提升30%以上。
四、落地实践:从零搭建企业级多跳问答系统
我们以企业财报多跳问答为例,从零搭建一个完整的可落地的多跳问答系统,所有代码均可直接运行。
4.1 环境安装
需要安装的依赖如下:
pip install langchain langchain-openai langchain-chroma python-dotenv pypdf
你需要提前准备好OpenAI API Key(或者国内大模型的API Key,比如通义千问、文心一言都可以),以及企业财报的PDF文档。
4.2 系统设计
功能设计
系统支持三个核心功能:
- 上传PDF格式的财报文档,自动解析构建知识库
- 支持复杂多跳问题查询,返回答案和完整的推理链
- 支持答案溯源,每一步推理的结果都对应到原始文档的片段
架构设计
系统分为三层:
- 数据层:负责文档解析、文本切分、向量存储
- 引擎层:包括规划模块、推理模块、校验模块三个核心组件
- 应用层:提供API接口和前端交互页面
接口设计
| 接口路径 | 请求方式 | 参数 | 返回值 |
|---|---|---|---|
| /doc/upload | POST | file: PDF文件 | 文档ID、存储状态 |
| /qa/query | POST | question: 用户问题, doc_id: 文档ID | 答案、推理链列表、溯源片段 |
4.3 核心实现代码
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_chroma import Chroma
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import PyPDFLoader
from langchain.agents import Tool
from langchain.tools.retriever import create_retriever_tool
from langchain_experimental.plan_and_execute import PlanAndExecute, load_agent_executor, load_chat_planner
# 加载环境变量
load_dotenv()
# 1. 数据层:构建向量知识库
def build_vector_db(pdf_path: str, db_path: str = "./chroma_finance_db"):
"""加载PDF财报,构建向量数据库"""
loader = PyPDFLoader(pdf_path)
documents = loader.load()
# 文本切分,chunk大小设置为1000,重叠200,避免信息丢失
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(documents)
# 构建向量库并持久化
vectorstore = Chroma.from_documents(
documents=splits,
embedding=OpenAIEmbeddings(),
persist_directory=db_path
)
return vectorstore
# 2. 构建检索工具
def get_retriever_tool(vectorstore):
"""构建知识库检索工具,供推理模块调用"""
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
retriever_tool = create_retriever_tool(
retriever,
"finance_report_search",
"用于检索企业财报中的营收、利润、费用等财务数据,以及业务相关的信息,每次查询财务数据必须调用该工具。",
)
return [retriever_tool]
# 3. 引擎层:构建规划+推理的Agent
def build_plan_execute_agent(tools):
"""构建规划执行Agent,规划模块和推理模块分开配置"""
# 规划模块用gpt-3.5-turbo即可,成本低速度快
planner = load_chat_planner(ChatOpenAI(model="gpt-3.5-turbo", temperature=0))
# 推理模块用gpt-4o,准确率更高
executor = load_agent_executor(ChatOpenAI(model="gpt-4o", temperature=0), tools, verbose=True)
# 构建完整的规划执行Agent
agent = PlanAndExecute(planner=planner, executor=executor, verbose=True)
return agent
if __name__ == "__main__":
# 第一步:构建知识库,替换为你自己的财报PDF路径
vectorstore = build_vector_db("./2023_enterprise_financial_report.pdf")
# 第二步:构建工具和Agent
tools = get_retriever_tool(vectorstore)
agent = build_plan_execute_agent(tools)
# 第三步:测试多跳问题
question = "2023年Q4的营收是Q2营收的多少倍?对应的净利润率比Q2高多少个百分点?"
result = agent.invoke(question)
print("="*50)
print("最终答案:", result["output"])
运行代码后,你会看到完整的规划和推理过程:
- 规划模块首先生成4个步骤:① 检索2023年Q2的营收和净利润;② 检索2023年Q4的营收和净利润;③ 计算营收倍数;④ 计算利润率差值
- 推理模块逐步骤执行,每一步都调用检索工具获取对应的数据
- 校验模块验证每一步的结果正确性,确认无误后进入下一步
- 最终聚合得到答案,同时返回完整的推理链和溯源的文档片段
五、最佳实践与边界说明
5.1 最佳实践Tips
- 控制推理链长度:推理链的长度最好不要超过5步,超过5步后误差累积会导致准确率大幅下降,如果需要处理更长的推理链,建议增加中间校验和回溯的频率。
- 大小模型搭配使用:规划模块用小模型、推理模块用大模型是性价比最高的方案,成本可以降低80%以上,准确率几乎没有损失。
- 规则兜底:对于领域内的固定规则,比如“年假天数=入职年限*2+绩效 bonus”,直接用规则引擎实现,不要让大模型推理,准确率100%,速度也更快。
- 用户可干预:给用户提供编辑推理路径的功能,如果系统生成的推理路径有错误,用户可以手动调整,大幅提升用户满意度。
5.2 边界与外延
规划+推理的多跳问答方案并不是万能的,它有明确的适用边界:
- 适用场景:需要2-10步逻辑推理、有明确的知识支撑、答案唯一的问题,比如财务计算、规则查询、信息汇总类问题。
- 不适用场景:开放性问题(比如“怎么提升公司的营收”)、没有明确知识支撑的问题、需要主观判断的问题,这类问题规划模块无法分解为可执行的步骤,推理模块也无法得到确定的答案。
六、行业发展与未来趋势
我们用一张表格梳理多跳问答技术的发展历程:
| 时间范围 | 发展阶段 | 核心技术 | 代表产品/工作 | 准确率(开放域多跳) | 落地难度 |
|---|---|---|---|---|---|
| 2018年及以前 | 知识图谱驱动阶段 | 知识图谱、规则推理、路径排序 | MetaQA、Path-RNN | 70%(封闭域),<30%(开放域) | 极高 |
| 2018-2020年 | 预训练+检索增强阶段 | BERT、DPR检索、多文档融合 | HotpotQA基线、DrQA | 50%左右 | 中等 |
| 2020-2022年 | 隐式推理阶段 | CoT、Self-Consistency、Few-shot推理 | GPT-3.5、Minerva | 65%左右 | 低 |
| 2022-2024年 | 显式规划+推理阶段 | Plan-and-Execute、MCTS、ToT | LangChain Agent、GPT-4o | 85%左右 | 中等 |
| 2024年以后 | 多模态+多Agent协同阶段 | 多模态推理、多Agent分工、端侧推理 | 多模态Agent、企业级Agent平台 | 95%以上(目标) | 中等 |
未来3年,多跳问答技术的发展趋势主要有三个:
- 轻量化:端侧小模型的规划推理能力会大幅提升,无需调用云端大模型就可以处理常见的多跳问题,延迟更低、隐私性更好。
- 多模态:支持文本、图片、音频、视频等多模态输入的多跳问答会成为主流,比如“图片里的建筑的设计师的代表作有哪些”这类问题会得到完美解决。
- 可解释性:推理链的可视化、可编辑会成为标配,用户可以清晰看到每一步的逻辑和来源,完全信任系统的答案。
结论
规划是多跳问答的「大脑」,负责把复杂问题拆解为可执行的步骤,推理是多跳问答的「手脚」,负责逐步骤执行得到正确的结果,二者的闭环配合是解决复杂问答问题、降低幻觉率的核心方案。
随着大模型应用的深入,多跳问答会成为企业级AI应用的标配能力,掌握规划和推理的核心技术,是每一个AI开发人员的必备技能。你可以从本文提供的Demo代码入手,尝试给自己的企业知识库加上多跳问答能力,遇到任何问题都可以在评论区留言交流。
附加部分
参考文献
- Chain-of-Thought Prompting Elicits Reasoning in Large Language Models, 2022
- Tree of Thoughts: Deliberate Problem Solving with Large Language Models, 2023
- Plan-and-Execute Agents for Complex Task Completion, LangChain, 2023
- HotpotQA: A Dataset for Diverse, Explainable Multi-hop Question Answering, 2018
作者简介
本文作者是10年经验的资深软件工程师,前大厂AI算法负责人,专注于大模型落地和Agent技术研究,运营有AI技术公众号「AI技术实战派」,定期分享可落地的AI应用开发教程。
(全文约11200字)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)