深度剖析:规划与推理在多跳问答中的核心应用与落地实践

摘要/引言

你有没有过这种经历:问大模型“2023年中国新能源汽车销量Top3品牌的CEO分别毕业于哪所大学?”,得到的答案要么CEO名字写错,要么毕业院校张冠李戴,甚至直接编造不存在的学历信息?或者在企业内部知识库中查询“入职满3年、绩效S级的员工可享受的年假天数比入职满1年、绩效A级的员工多多少”,得到的结果完全不符合公司的人事制度?

这些问题的核心根源,并不是大模型的知识储备不足,而是缺乏对复杂问题的规划能力和多步逻辑的推理能力:这类需要跨多个知识片段、经过多步逻辑关联才能得到答案的问题,就是行业内所说的「多跳问答(Multi-hop QA)」问题。传统的端到端生成式问答,本质是单跳匹配逻辑,很容易因为“跳步”产生幻觉,也无法验证中间过程的正确性。

本文将从核心概念、技术原理、落地实践三大维度,深度拆解规划与推理在多跳问答中的作用,你将收获:

  1. 多跳问答的核心痛点与技术底层逻辑
  2. 规划模块与推理模块的设计思路、核心算法与对比
  3. 从零搭建一个可落地的企业级多跳问答系统的完整方案
  4. 多跳问答技术的发展趋势与最佳实践

本文适合大模型应用开发工程师、AI产品经理、企业AI落地负责人阅读,所有代码均可直接复制运行。


一、核心概念与问题背景

1.1 多跳问答的基础定义

核心概念

多跳问答是自然语言处理领域的经典任务,指的是需要通过至少2步及以上的逻辑推导、跨多个知识源/知识片段关联才能得到正确答案的问答任务。与之对应的是单跳问答:只需要匹配单个知识片段就能得到答案,比如“北京的面积是多少”。

我们可以用数学公式定义多跳问答的任务目标:
arg max⁡AP(A∣Q,K,R) \argmax_A P(A | Q, K, R) AargmaxP(AQ,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. 可解释性差:用户不知道答案是怎么来的,不敢信任结果
  3. 可控性弱:无法约束大模型的推理逻辑,很容易偏离业务规则

1.2 规划与推理的核心定义

要解决多跳问答的痛点,核心就是引入两个独立的模块:规划模块推理模块,二者缺一不可。

规划模块

规划是多跳问答的「导航系统」,核心目标是将复杂的原始问题拆解为若干个可执行的子问题/推理步骤,同时识别步骤之间的依赖关系,生成完整的推理路径。

推理模块

推理是多跳问答的「执行系统」,核心目标是按照规划模块生成的路径,逐步骤调用知识、执行逻辑演算,生成中间结果并校验正确性,最终聚合得到答案。

我们可以用一个清晰的对比表格来区分二者的核心属性:

对比维度 规划模块 推理模块
核心目标 化整为零,生成可行的推理路径 按路径执行,得到正确的中间结果
输入 原始问题、历史中间结果 单个子问题、上下文知识
输出 推理步骤列表、路径调整指令 中间结果、置信度得分
能力要求 逻辑拆解能力、依赖识别能力、全局视野 知识匹配能力、逻辑演算能力、校验能力
评估指标 路径覆盖率、步骤合理性、回溯效率 单步准确率、结果置信度、召回率
适用模型 7B-13B量级微调小模型即可满足要求 34B以上大模型/检索增强模型效果更好
实体关系与交互逻辑

我们用ER图来展示多跳问答中各个实体的关系:

触发

生成

调用

访问

生成

反馈调整

聚合生成

QUESTION

PLANNING_MODULE

REASONING_STEP

REASONING_MODULE

KNOWLEDGE_BASE

INTERMEDIATE_RESULT

ANSWER

整个系统的交互流程是一个闭环,而不是单向的流水线:

不合法

合法

置信度<阈值

置信度>=阈值

输入多跳问题

规划模块:问题分解&路径生成

路径合法性校验

推理模块:执行第1步推理

检索&验证模块:校验当前步结果置信度

是否可回溯

返回无法回答

是否所有步骤执行完成

更新中间结果,执行下一步推理

聚合所有中间结果,生成最终答案

返回答案&完整推理链


二、规划技术在多跳问答中的实现

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)+cln⁡N(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的执行流程如下图所示:

根节点:原始问题

选择:选择UCB最高的子节点

扩展:生成新的子节点(新的推理步骤)

模拟:执行该步骤的推理,得到模拟结果

回溯:更新路径上所有节点的价值

迭代次数是否达到上限

输出价值最高的推理路径

MCTS规划的优点是泛化能力极强,适合处理任意开放域的多跳问题,路径的合理性非常高;缺点是需要多次模拟,延迟相对较高。

(3)反思式规划

代表技术是Reflexion,核心思路是在推理执行的过程中,根据中间结果的反馈动态调整规划路径,如果某一步推理的置信度低于阈值,就自动回溯到规划模块,重新生成路径,甚至推翻之前的所有步骤,重新分解问题。这种规划方式的容错率最高,适合处理步骤非常多的复杂多跳问题。

2.2 规划模块的核心优化方向

规划模块的核心优化目标是在保障路径合理性的前提下,尽可能降低延迟,目前行业内的最佳实践主要有三个:

  1. 小模型专属微调:用7B量级的开源大模型,在领域内的多跳问题分解数据集上微调,作为专属的规划模块,成本只有GPT-4的1/50,速度快3倍以上,准确率可以达到GPT-4的90%以上。
  2. 路径缓存:对于高频的多跳问题,把规划好的路径缓存下来,下次遇到相同或者相似的问题直接复用,不需要重新生成,延迟可以降低90%以上。
  3. 依赖并行优化:规划的时候识别出没有依赖关系的子问题,调度多个推理模块并行执行,比如“找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 推理模块的核心优化方向

推理模块的核心优化目标是降低幻觉率,提升单步推理的准确率,目前的最佳实践有:

  1. 单步职责单一:每个推理步骤只做一件事,不要让一个步骤处理多个逻辑,比如“找A的年龄并计算和B的年龄差”要拆成两个步骤,避免跳步产生的错误。
  2. 中间结果校验:每一步推理的结果都用外部知识或者规则引擎校验,比如计算得到的利润率超过100%,就自动判定为错误,触发回溯。
  3. 领域微调:垂直领域的推理模块用领域数据微调,比如医疗领域的推理模型在医学文献上微调,准确率可以提升30%以上。

四、落地实践:从零搭建企业级多跳问答系统

我们以企业财报多跳问答为例,从零搭建一个完整的可落地的多跳问答系统,所有代码均可直接运行。

4.1 环境安装

需要安装的依赖如下:

pip install langchain langchain-openai langchain-chroma python-dotenv pypdf

你需要提前准备好OpenAI API Key(或者国内大模型的API Key,比如通义千问、文心一言都可以),以及企业财报的PDF文档。

4.2 系统设计

功能设计

系统支持三个核心功能:

  1. 上传PDF格式的财报文档,自动解析构建知识库
  2. 支持复杂多跳问题查询,返回答案和完整的推理链
  3. 支持答案溯源,每一步推理的结果都对应到原始文档的片段
架构设计

系统分为三层:

  1. 数据层:负责文档解析、文本切分、向量存储
  2. 引擎层:包括规划模块、推理模块、校验模块三个核心组件
  3. 应用层:提供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"])

运行代码后,你会看到完整的规划和推理过程:

  1. 规划模块首先生成4个步骤:① 检索2023年Q2的营收和净利润;② 检索2023年Q4的营收和净利润;③ 计算营收倍数;④ 计算利润率差值
  2. 推理模块逐步骤执行,每一步都调用检索工具获取对应的数据
  3. 校验模块验证每一步的结果正确性,确认无误后进入下一步
  4. 最终聚合得到答案,同时返回完整的推理链和溯源的文档片段

五、最佳实践与边界说明

5.1 最佳实践Tips

  1. 控制推理链长度:推理链的长度最好不要超过5步,超过5步后误差累积会导致准确率大幅下降,如果需要处理更长的推理链,建议增加中间校验和回溯的频率。
  2. 大小模型搭配使用:规划模块用小模型、推理模块用大模型是性价比最高的方案,成本可以降低80%以上,准确率几乎没有损失。
  3. 规则兜底:对于领域内的固定规则,比如“年假天数=入职年限*2+绩效 bonus”,直接用规则引擎实现,不要让大模型推理,准确率100%,速度也更快。
  4. 用户可干预:给用户提供编辑推理路径的功能,如果系统生成的推理路径有错误,用户可以手动调整,大幅提升用户满意度。

5.2 边界与外延

规划+推理的多跳问答方案并不是万能的,它有明确的适用边界:

  1. 适用场景:需要2-10步逻辑推理、有明确的知识支撑、答案唯一的问题,比如财务计算、规则查询、信息汇总类问题。
  2. 不适用场景:开放性问题(比如“怎么提升公司的营收”)、没有明确知识支撑的问题、需要主观判断的问题,这类问题规划模块无法分解为可执行的步骤,推理模块也无法得到确定的答案。

六、行业发展与未来趋势

我们用一张表格梳理多跳问答技术的发展历程:

时间范围 发展阶段 核心技术 代表产品/工作 准确率(开放域多跳) 落地难度
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年,多跳问答技术的发展趋势主要有三个:

  1. 轻量化:端侧小模型的规划推理能力会大幅提升,无需调用云端大模型就可以处理常见的多跳问题,延迟更低、隐私性更好。
  2. 多模态:支持文本、图片、音频、视频等多模态输入的多跳问答会成为主流,比如“图片里的建筑的设计师的代表作有哪些”这类问题会得到完美解决。
  3. 可解释性:推理链的可视化、可编辑会成为标配,用户可以清晰看到每一步的逻辑和来源,完全信任系统的答案。

结论

规划是多跳问答的「大脑」,负责把复杂问题拆解为可执行的步骤,推理是多跳问答的「手脚」,负责逐步骤执行得到正确的结果,二者的闭环配合是解决复杂问答问题、降低幻觉率的核心方案。

随着大模型应用的深入,多跳问答会成为企业级AI应用的标配能力,掌握规划和推理的核心技术,是每一个AI开发人员的必备技能。你可以从本文提供的Demo代码入手,尝试给自己的企业知识库加上多跳问答能力,遇到任何问题都可以在评论区留言交流。


附加部分

参考文献

  1. Chain-of-Thought Prompting Elicits Reasoning in Large Language Models, 2022
  2. Tree of Thoughts: Deliberate Problem Solving with Large Language Models, 2023
  3. Plan-and-Execute Agents for Complex Task Completion, LangChain, 2023
  4. HotpotQA: A Dataset for Diverse, Explainable Multi-hop Question Answering, 2018

作者简介

本文作者是10年经验的资深软件工程师,前大厂AI算法负责人,专注于大模型落地和Agent技术研究,运营有AI技术公众号「AI技术实战派」,定期分享可落地的AI应用开发教程。

(全文约11200字)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐