快速回顾
| 项目 | 内容 |
|---|---|
| ReAct | 根据每次工具结果决定继续检索、补充条件、澄清或回答 |
| Plan-and-Execute | 将复杂任务拆成步骤,跟踪完成情况,按执行结果调整计划 |
| 配合方式 | 计划管理整个任务,步骤内部按需使用 ReAct |
| 执行边界 | 后端校验工具参数、权限、知识库范围和时间条件;设置执行上限 |
| 上下文管理 | 滑动窗口与历史摘要管理对话,计划、状态和证据单独跟踪 |
| 完成条件 | 覆盖问题要求,检查版本、必要条件和引用,说明缺失或冲突 |
| 计划与恢复 | MySQL 持久化结构化计划、checkpoint 和调用记录;恢复不重置累计预算 |
| 防止重复 | 复用仍适用的查询结果,检查证据增量,调整无进展的检索方向 |
| 摘要约束 | 地区、时间、对象和输出要求单独保存,摘要保留来源与确认状态 |
面试主回答
我们在问答流程中使用 ReAct,让 Agent 根据工具结果判断下一步。它可以选择知识检索工具、补充查询条件,证据不足时继续检索,信息缺失时向用户澄清。工具执行前,后端统一检查参数、权限和检索范围。
对政策变化分析和机构制度对比这类任务,我们引入 Plan-and-Execute,先明确对比对象、时间和维度,再拆成查版本、提取条款、比较差异等步骤。每一步内部仍可以采用 ReAct 补充证据,执行结果也可以触发计划调整。
对话上下文通过滑动窗口和历史摘要控制长度,计划和证据单独跟踪。结束前检查问题要求是否覆盖、引用是否齐全,同时设置执行上限,避免重复检索和无限调用。最终答案关联 Evidence ID、文档和页码,方便回到原文核对。
原理与选型
面试回答
ReAct 是让模型判断和工具调用交替进行的一种 Agent 执行方式。在我们的养老知识问答里,模型会根据当前问题和已经拿到的证据,决定下一步调用哪个工具;工具返回结果后,再判断是否需要继续检索,还是已经可以回答。
比如用户询问能否申请护理补贴,Agent 会先检查地区、照护等级这些必要条件是否齐全,缺少时向用户澄清。查到政策后,如果申请条件还引用了另一份认定办法,就继续检索对应资料,补齐回答依据。
模型负责提出工具调用和参数,后端负责参数、权限及时间范围校验。同时设置调用次数和超时上限,结束前检查证据与引用是否齐全,避免反复检索或依据不足就给出结论。
实现细节
执行循环为接收问题、判断证据缺口、生成调用、后端校验执行、回传结果、再次判断。后续动作取决于实际工具结果,工具错误也作为结果返回,不能预先假定每次检索都成功。
面试回答
ReAct 适合根据当前结果决定下一步,但政策变化分析通常包含多个版本和比较维度,如果一直局部补查,容易漏掉子问题,或者反复搜索同一部分。所以我们在复杂任务中引入 Plan-and-Execute,先拆解目标,再按步骤执行和检查完成情况。
比如比较政策调整前后的申请条件、补贴标准和材料要求,要先确认地区和时间,找到两个适用版本,再分别提取这些维度,最后核对差异和引用。计划会记录哪些步骤已完成、缺什么证据。如果执行中发现文件被替代或附件缺失,可以调整计划;某一步需要动态补查时,内部仍然使用 ReAct。
实现细节
计划按任务目标、比较维度和依赖拆解,完成条件与证据关联。补充检索解决局部缺口,重规划处理目标分解或依赖发生变化的情况,并保留已有有效证据与执行记录。
面试回答
我主要根据对象数量、时间版本、输出维度和步骤依赖判断。查询一个明确条款时,直接检索就可以;需要根据工具结果继续查附件或补条件时,使用有执行上限的 ReAct 循环。
如果任务同时比较多个版本或机构制度,还要求从多个维度给出结论,就先用 Plan-and-Execute 管理整个任务,避免漏项。计划中的某一步仍然可以用 ReAct,比如查旧版申请条件时,先查正文,再根据引用补查认定办法。简单任务不额外生成计划,减少不必要的耗时和模型调用,判断依据也不能只是问题字数。
实现细节
整体计划负责步骤、依赖和完成状态;步骤内部的 ReAct 负责根据工具结果继续行动。复杂度由任务结构决定,同样长度的问题可能具有完全不同的证据要求。
| 场景 | 处理方式 |
|---|---|
| 查询一个明确条款 | 直接检索,必要时补查 |
| 根据工具结果继续调查 | 有边界的 ReAct 循环 |
| 政策变化分析、多机构制度对比 | 先规划再执行,步骤内部按需使用 ReAct |
工具与计划
面试回答
我按明确的业务能力定义工具,比如知识检索、读取证据原文和查询文档版本。每个工具都提供名称、适用场景、输入 Schema 和结构化返回值,让模型知道什么时候调用、参数怎么填、结果代表什么。
以知识检索为例,输入包含查询文本、文档类型、时间条件和返回数量,成功时返回片段、Evidence ID、文档版本和页码;失败时返回错误类型和是否可重试。用户身份和可访问范围由后端认证上下文确定,模型填写参数不能扩大权限。结果正文也控制长度,先返回必要片段,需要完整条款时再调用原文读取工具。
实现细节
工具描述应区分检索、原文读取与版本查询的用途。返回状态明确区分成功无命中、参数错误和服务异常,便于模型选择改写查询、修正参数或结束。数量与字段类型仍由后端检查。
| 部分 | 知识检索工具示例 |
|---|---|
| 工具名称 | search_knowledge |
| 用途 | 根据问题检索政策或机构制度证据 |
| 输入 | 查询文本、文档类型、时间条件、返回数量等 |
| 成功返回 | Evidence ID、文档版本、页码、片段及检索状态 |
| 失败返回 | 错误类型、是否可重试、错误说明 |
面试回答
后端会把当前任务允许使用的工具说明和参数 Schema 提供给模型。模型结合用户目标、当前步骤和已有结果,生成结构化的工具名和参数;后端根据工具名找到处理器,完成类型、范围与权限校验后执行,再把结果交回模型。
工具说明要写清能力边界,比如找资料用检索工具,已经拿到 Evidence ID 但需要完整条款时用原文读取工具,确认某个时间点适用哪个文件时用版本查询工具。模型提出的调用不会直接执行,未知工具、错误参数或越界数量会被拒绝并返回具体错误,允许模型在合法范围内修正。
实现细节
工具是否可用由后端决定,模型选择只发生在当前允许的能力范围内。调用参数不能充当身份或权限凭据,结果再次进入上下文后才触发下一轮判断。
面试回答
我们把计划作为结构化任务保存在 MySQL,包含目标、地区和时间等约束、计划版本、步骤列表及依赖。每个步骤记录自己的状态、完成条件、工具执行记录和 Evidence ID,根任务还保存已用步数、调用次数和截止时间。
这样恢复时能够明确知道哪些已经完成、下一步的依赖是否满足,而不必让模型重新解释一段自然语言计划。比较长的工具结果单独存,计划通过记录 ID 关联。需要重规划时保留旧计划和执行记录,生成新版本,已经拿到的证据经适用性检查后继续复用,避免整个任务从头再来。
实现细节
任务身份和范围也随根任务持久化。计划状态、工具原始结果和对话摘要分别保存;摘要便于理解背景,不能承担步骤状态与恢复位置的全部职责。具体字段见下表。
| 层级 | 主要字段 |
|---|---|
| 根任务 | taskId、用户与权限范围、目标、状态 |
| 约束 | 地区、时间、文档范围、对比维度 |
| 计划 | planVersion、步骤列表 |
| 每个步骤 | stepId、目标、依赖、完成条件、状态 |
| 执行记录 | 工具及参数、结果、错误、Evidence ID |
| 执行预算 | 已用步数、模型与工具调用次数、截止时间 |
执行与恢复
面试回答
我把完成判断和用户要求关联起来,检查输出维度是否覆盖、证据是否适用、引用是否齐全,以及还有没有未解决项。比如政策对比要找到两个正确版本,申请条件、标准和材料都完成比较,每个差异都有对应原文,才能认为主要目标完成。
工具返回成功只说明这一次调用正常,不能直接当成任务完成。我们同时设置步数、调用次数和总超时上限。如果到上限仍缺资料,就保留已经确认的部分,明确说明缺哪项证据或条件。这样既有内容上的完成条件,也有执行预算,避免无限检索。
实现细节
政策对比还要核对地区、适用时间及文件关系。附件缺失、条款冲突等未解决项需要显式记录;达到预算上限属于停止执行的原因,不代表所有问题已经得到回答。
面试回答
暂停时保存任务、步骤状态、checkpoint、已有证据和累计预算,并停止发起新调用。恢复时先加载这些记录,重新检查当前权限、文档版本和证据适用性,再从未完成的位置继续,不重复执行已确认完成的部分。
正在进行的外部调用是否能取消,要看工具支持情况,不能认为点击暂停就已经停止。对于已发出但结果不确定的调用,恢复时先核对调用记录或查询结果。步数、重规划次数、模型和工具调用次数以及总时间都按同一个任务累计,重试和恢复也计入,避免每次恢复重新获得完整额度。
实现细节
暂停点应位于可保存状态、可判断后续行为的安全边界。证据失效或权限变化时,恢复位置需相应调整;较长结果通过记录 ID 读取,并继续遵守上下文预算。
| 环节 | 保存或检查 | 处理原则 |
|---|---|---|
| 暂停 | 任务、步骤、checkpoint、证据与已用预算 | 保留已经完成的部分 |
| 恢复 | 当前权限、证据适用性与未完成位置 | 从可继续的位置执行 |
| 重试与重规划 | 累计步数、调用次数和截止时间 | 共用累计预算,不重新计零 |
面试回答
我根据错误类型决定后续动作。参数错误就返回具体字段问题,让模型修正;超时和连接异常在剩余预算内有限重试;单路检索不可用时,使用其他可用通道。权限不足则停止这次访问,不能靠修改参数绕过。
工具正常执行但没有结果,要考虑改写查询、补条件或说明未找到,不能当作服务故障盲目重试。一次失败也不一定让整个任务重来,比如正文已经取得但附件获取失败,会保留正文证据,只继续处理附件缺口。必要依据始终拿不到时,返回已确认部分,并说明哪些结论暂时无法给出。
实现细节
工具返回应包含错误类型、错误说明和可重试信息。重试与降级计入累计预算,已完成步骤和已取得证据保留;附件未取得时,不生成依赖附件内容的确定结论。
| 失败情况 | 处理方式 |
|---|---|
| 参数错误 | 返回明确字段错误,让模型修正 |
| 超时、连接异常 | 在剩余预算内有限重试 |
| 单路检索不可用 | 使用其他可用通道并记录降级 |
| 权限不足 | 停止该访问,不能通过换参数绕过 |
| 正常执行但无结果 | 改写查询、补充条件或说明未找到 |
| 必要证据无法取得 | 保留已完成部分,说明缺失项 |
面试回答
我会记录每次查询的文本、时间与知识库等过滤范围,以及返回的 Evidence ID。再次调用前,先检查相同请求是否已有可复用结果,权限和版本仍适用时直接复用。
另外还要看检索有没有推进任务。模型即使换了措辞,如果一直返回同一批证据,也没有覆盖新的问题维度,就需要调整检索方向。比如补贴标准已经查到,缺少申请材料,下一次就查材料或附件,不再宽泛地搜索补贴政策。判断重复也不能只看文本,同一句问题查询不同地区、时间或版本,范围不同,仍然属于不同请求。
实现细节
请求复用关注查询与过滤条件是否一致,进展判断关注新增 Evidence ID 和未覆盖维度。缓存或复用前检查当前权限、版本与时间适用性,不能为了减少调用继续使用失效证据。
上下文与摘要
面试回答
我把当前问题、用户刚补充的条件、任务约束和当前步骤放在优先位置,再装配相关证据、近期消息和历史摘要。近期对话用滑动窗口保留,较早内容压缩为摘要;计划、步骤状态和证据记录单独跟踪,不完全依赖聊天历史。
检索结果先去重并提取相关片段,长工具结果移出上下文后保留记录 ID,需要时再读。计算预算时把工具 Schema、消息结构和引用信息也算进去,并给模型输出预留空间。裁剪不能丢掉条款的必要条件或工具调用与返回的对应关系,摘要里的政策描述也不能直接代替当前适用的原文证据。
实现细节
上下文装配同时管理对话背景、任务状态和证据,三者用途见表。旧结果可通过记录 ID 恢复,最终回答重新确认权限、时间与文档版本,避免摘要延续过时结论。
| 内容 | 作用 |
|---|---|
| 最近消息与历史摘要 | 理解用户意图和对话背景 |
| 计划、步骤状态、已取得的证据 | 跟踪当前任务进展 |
| 文档、版本、页码和 Evidence ID | 核对结论依据 |
面试回答
我们把地区、时间、对象和输出要求单独保存成结构化任务约束,每次装配上下文都明确提供给模型。摘要主要压缩对话背景,关键条件不依赖摘要模型自行记住,所以长对话压缩后仍能按同样范围检索和回答。
用户修改条件时,更新对应字段,后续查询使用新值;没有提供的信息继续保持缺失,不能让摘要自动补齐。摘要里还区分用户明确提供、工具已确认和尚未确认的内容,对重要事实保留来源消息或证据记录。发生不一致时,回到明确的用户要求和原始记录核对,避免错误摘要被不断沿用。
实现细节
政策比较任务的结构化约束包括地区、适用时间、指定机构或版本、比较维度、引用要求和尚缺信息。任务状态与约束独立维护,不能把“已讨论过”误当成“已确认”。
易混点与回答检查
易混点:计划管理整个任务,ReAct 可执行其中一步;摘要不承担结构化计划与任务状态的全部职责。
回答检查
补充记录
简历表述:基于 ReAct 实现检索和工具调用,引入 Plan-and-Execute 支持多步任务规划与执行,并结合滑动窗口和历史摘要管理上下文。
事实 / 代码依据:待补充。