业务智能体实战笔记(二)|前置拦截:别让 LLM 做不该做的决策

系列导航 :上一篇:分层消除不确定性(一)主线与全景 | 下一篇(预告):收窄 LLM 决策空间(持续更新)

阅读提示:新手建议通读全文,第 2~4 节各配套具象案例辅助理解;有工程落地经验的读者可直接跳转至第 5 节查看通用判定规则与边界,第 6 节提供伪代码落地参考。


摘要

问题 :业务智能体场景下,LLM 会因信息不全生成看似正常的错误回复------漏检索关键资料、混淆业务对象概念、误判状态映射关系。这类静默错误无任何可供代码识别的异常特征,后置校验逻辑完全无法捕获。

收益:方向性估算三层机制整体可提升准确率 5~10pt(区间仅作参考,各层增益存在重叠,不可直接累加);核心间接收益为前置消歧,可大幅提升下游各环节的推理确定性。

关键词:业务智能体、LLM 准确率、前置拦截、RAG、工具选择、消息预处理


@
目录


链路全景

三个前置拦截点分布在 LLM 推理链路的不同位置,各拦截一类风险,互不重叠:

复制代码
用户消息
  │
  ▼
┌─────────────────────────┐
│  ① 消息预处理              │  ← 纯规则,无 LLM 调用
│  业务对象识别 + 格式规范化   │
│  (同步阻塞消歧,用户确认后恢复)│
└───────────┬─────────────┘
            │ 消歧后的标准化消息
            ▼
┌─────────────────────────┐
│  ② 两步 RAG               │  ← 纯工程流程,无 LLM 调用
│  Step 1: 前置强制检索      │
│  拉取知识库中的业务背景信息   │
└───────────┬─────────────┘
            │ 消息 + 业务背景上下文
            ▼
      ┌──────────┐
      │ 意图识别   │  ← 首个 LLM 调用,上下文已完成富化
      └─────┬────┘
            │
            ▼
      ┌──────────┐
      │ Agent 推理 │  (LLM,含工具选择与调用)
      └─────┬────┘
            │
            ▼
┌─────────────────────────┐
│  ③ 状态歧义拦截            │  ← 纯规则,无 LLM 调用
│  按业务规则移除歧义工具候选  │
└───────────┬─────────────┘
            │ 工具候选集已收窄
            ▼
       工具调用

一、什么是「前置拦截」

前置拦截:在 LLM 启动推理前,预先处理两类决策 ------ LLM 无法稳定判断、且无法通过后置代码校验捕获的业务逻辑。

核心判定标准:异常是否可通过后置校验识别修复。

诸如输出格式错误、字段缺失、数值越界这类显性异常(第 4 篇会介绍响应校验机制),代码可直接识别并触发重试;但漏检索、业务对象歧义、状态映射偏差属于静默故障(silent failure):LLM 依托残缺信息生成逻辑通顺的应答,输出结果不存在任何可供程序识别的异常标识。

由此提炼分层处理原则:

  • 可通过后置校验识别修复:交由第四层「后置修复 LLM 异常」处理(第 4 篇)
  • 无法通过后置校验识别修复:启用前置拦截,不再交由模型处理该类决策

本文介绍的三类前置拦截场景均属于后者,该判定逻辑将贯穿全文后续章节。


二、消息预处理:在意图识别前消除歧义

位置与核心动作

消息预处理位于链路入口,在意图识别执行前完成两件核心动作:

  • 业务对象识别:当同名业务对象存在多个释义时,同步阻塞交互,由用户确认后恢复流程。例如用户输入「查一下准确率」,系统追问「你指的是模型预测准确率还是工单处理准确率?」,用户点选后从中断点恢复处理,对话上下文不丢失。
  • 格式规范化:统一处理时间、编码类内容的大小写、全半角、空白符,消除格式差异带来的识别偏差。

具象案例:模糊词消歧

用户输入:「这周工单准确率怎么样?」

无前置拦截时 :消息直达意图识别 → LLM 无法区分「工单处理准确率」与「模型预测准确率」→ 随机选择一个方向生成答案 → 输出看似正常但实际答非所问 → 需用户追问一轮才能修正偏差。

增加前置拦截后:预处理节点识别到「准确率」为模糊词 → 弹出确认选项「你指的是:A. 模型预测准确率 / B. 工单处理准确率」→ 用户选择 B → 从中断点恢复流程,携带已消歧的消息进入意图识别。整条链路仅增加一次交互,但后续 LLM 推理的每一步都基于确定的信息执行。

为什么不让 LLM 自主澄清

LLM 完全具备发起澄清对话的能力,但前置消歧的优先级更高,核心原因与 LLM 的概率本质强相关:

  • 响应更优:无需额外的 LLM 调用,用户等待时长可缩短 2~5 秒,交互体验更流畅。
  • 成本更低:减少一次 token 消耗,规模化落地后可显著降低算力成本。
  • 结果更稳定:LLM 发起澄清还是直接硬猜是概率性的,同一模糊词可能出现「今日澄清、明日硬猜」的不一致行为,无法向业务方解释;业务智能体必须保证行为确定性,宁可多一次确认,也不能用错误的调用消耗用户信任。

易忽略的细节:格式规范化

大小写、全半角、空白符的规范化看似是细节,实则是消歧的前置基础------若编码不做规范化,「device01」与「DEVICE01」会被判定为两个不同的业务对象,消歧环节会弹出用户无法理解的确认问题。规范化是消歧的锚点,而非无意义的格式清洁。

收益

消息预处理模块可贡献约 +2 ~ +4pt 的准确率提升。这一步与第 3 篇的提示词工程、采样参数收窄为同期优化动作,65% → 75% 的准确率提升中,有部分收益来自该模块。前置拦截消除的歧义越多,下游工具选择、检索、约束校验的落地基础就越扎实。

注意:全系列的 Delta 数值均为方向性估算,各层之间存在重叠贡献,不建议直接累加。详见第 5 节的详细说明。


三、两步 RAG:以确定性约束替代概率采样

Agentic RAG 的常规用法是「让 Agent 自主决定何时检索知识库」,会使 LLM 承担两项概率化决策任务 :是否需要检索、检索结果如何使用。两步 RAG 架构剔除「是否检索」这一自主判断环节,将检索前置为强制动作,在 LLM 首次推理启动前完成执行。

强制检索的核心目的不只是「防止漏查资料」,更是解决核心痛点:LLM 选择工具时,若缺乏业务背景知识,会出现工具误选------工具描述中通常不会包含「该场景应使用哪个工具」的业务判断规则。

两步 RAG 核心流程

第一步:前置强制检索

消息预处理完成后,LLM 启动意图识别前,前置钩子率先执行。无条件强制检索知识库,拉取当前业务领域的背景信息------包括术语定义、流程规则、工具适用场景说明。

第二步:携带富化上下文执行推理

LLM 带着知识库上下文进入意图识别与工具选择环节,上下文已提前注入消息中,LLM 无需自主判断「是否需要检索知识库」,该判断流程已在 LLM 推理启动前执行完毕

两步流程硬串行:前置检索未完成,LLM 推理不启动。

具象案例:缺业务背景导致工具误选

用户提问:「这个月华东区的工单处理效率怎么样?」

LLM 可见的工具候选有两个:query_ticket_volume(查询工单量)和 query_ticket_resolution_rate(查询工单解决率)。从名称来看,两个工具均与「工单效率」相关,LLM 随机选择了 query_ticket_volume,返回了大量工单数量数据,但用户实际需要的是效率指标。

问题根源:知识库中明确标注了「工单处理效率 = 解决率,而非工单量」,但 LLM 选择工具时缺乏该业务背景------工具描述中仅标注了输入输出格式,未明确「效率」对应的业务口径。

两步 RAG 模式下 :前置检索从知识库拉取业务术语表 → 「处理效率 → 解决率」的映射规则随上下文注入 → LLM 在意图识别阶段就明确「效率」的业务口径 → 直接选择 query_ticket_resolution_rate

为什么不让 LLM 自主决定检索时机

核心原因与消息预处理的逻辑同源:

  • 行为不可预测:同一类问题可能出现「今日检索、明日不检索」的波动;同一句话更换措辞后,LLM 的检索决策可能完全翻转。工具选择场景对背景知识更敏感------LLM 一旦「自认为懂了」,就不会主动检索,但「自认为懂」和「真懂」的差距,正是工具误选的核心诱因。
  • 异常无法捕获:LLM 基于缺失背景的上下文选择了错误工具,工具调用成功、返回格式正确、答案看似合理,属于前文定义的静默故障,无任何程序可识别的异常标识。工程优化的核心原则是:仅对可通过后置校验处理的问题做后置优化,无法校验的风险不应放在关键路径上。

为什么选择强制检索而非按需检索

「按需检索」将「是否需要检索」的决策权交给了 LLM,但该决策本身的可靠性,正是我们需要解决的核心问题。

LLM 一次工具误选的代价------错误答案+用户追问+业务方对智能体的信任损耗------远大于强制检索的开销。而强制检索的成本完全可控:单次向量检索约 50ms,不到整轮 LLM 推理时长的 5%;同类问题的检索结果可缓存,成本为可预测的常量,不会随 LLM 的随机性出现波动。

采用强制检索,是以小幅资源开销换取输出确定性,规避看似节省成本但结果波动不可控的按需检索方案。

边界:检索结果不全量注入上下文

前置检索为必执行流程,但检索返回内容需经过相关性阈值过滤;低相关度的召回内容不注入模型上下文,避免噪声干扰推理效果。该设计思路与第三篇的工具注册逻辑一致:向 LLM 输入上下文时,优先保障信息精准度与有效密度,再兼顾信息完整度。

收益

两步 RAG 单独可提升准确率 1~3pt。该方案的核心价值体现在工程稳定性层面:模型全程基于预注入的完整上下文完成意图判断与工具调用,无需自主决策是否触发检索。强制检索将检索行为固化为固定流程,缓存优化、召回裁剪、上下文压缩等后续调优手段均拥有稳定基准;而按需检索不存在统一基准,优化落地难度显著更高。


四、状态歧义拦截:工具选择前做减法

第三个拦截点位于工具选择前:针对存在歧义的业务状态词,在 LLM 看到候选工具集之前,先按业务规则移除歧义项。

具象案例:工单状态歧义

用户提问「本月这批工单的状态怎么样」------「状态」在业务侧存在两个明确的映射:

  • 工单流转状态:创建 / 处理中 / 已完成
  • 处理结果状态:未处理 / 已解决 / 关闭

若两类状态查询工具均进入候选集,LLM 大概率会出现误选------模型无对应业务口径用于区分。状态拦截即在意图识别完成、工具选择启动前,依据业务规则完成工具筛选。

拦截完成后,LLM 面对的工具候选集中仅剩余一类状态工具,无歧义空间,不会出现误选。

与双时间补跑的关系

第 4 篇会介绍另一项硬约束机制「双时间补跑」,同样针对业务口径歧义,但触发时机与动作方向完全相反:

类型 触发位置 动作方向 核心机制
状态拦截(本篇) 工具调用前 减法:移除歧义工具候选 业务规则枚举过滤
双时间补跑(第 4 篇) 工具调用后 加法:补跑一次校验调用 硬约束触发重试

二者均为业务硬约束,但一前一后、一减一加,无法用同一套机制表达。这也说明「硬约束」类动作的分散性:触发时机与动作方向决定了不同的落地落点,强行统一抽象反而会造成设计冗余。

为什么硬编码规则是合理的

状态拦截的每一条映射规则都写在代码中,新增业务场景需修改代码,看似不够优雅,但完全符合工程落地逻辑:

  • 业务口径的定义权在业务侧,而非语言侧,LLM 无法自主推断
  • 该类错误属于静默故障,无任何异常标识,仅会出现答非所问,响应校验无法捕获
  • 一次错误回答的业务代价,远大于一次规则匹配的毫秒级成本

详细的逻辑推理会在第 5 篇「硬约束」章节展开,本篇仅将状态拦截作为前置拦截层的核心动作之一介绍。

收益

状态拦截与双时间补跑合计可贡献约 +2 ~ +4pt 的准确率提升。两个时机的贡献耦合度高,拆分归因反而会出现失真,第 5 篇会展开介绍硬约束的组合机制。


五、通用判定规则、边界与成本

三层拦截收益汇总

全文所有提升数值均为方向性估算,多层优化收益存在交叉重叠,请勿直接相加。

拦截模块 单模块准确率提升 核心作用
消息预处理 2~4pt 消除输入层模糊业务对象歧义
两步RAG 1~3pt 前置补充业务背景,规避漏检索问题
状态歧义拦截 2~4pt 过滤工具候选集中的歧义选项
整体叠加区间 5~10pt 各层优化效果相互重叠,不可累加计算

三层拦截共用的核心判定逻辑

三类拦截手段遵循统一的判定标准:仅对可通过后置校验修复的问题做后置优化,无法校验的业务风险需前置拦截

换个视角:三类场景下,模型发生错误时,输出均不会附带任何异常标识,全部属于前文定义的静默故障:

  • 消息歧义:模型匹配错误业务对象,输出文本格式完全正常,无异常字段;
  • 漏检索:模型依托过期信息生成完整应答,响应结构完全合规;
  • 工具状态误选:工具调用流程正常、返回数据格式无误,结论看似合乎逻辑。

前置拦截的核心作用,便是将这类程序无法识别的隐性错误,提前剥离出模型的决策范围。

前置拦截层的边界:什么场景拦不住

前置拦截仅对可通过业务规则枚举的歧义生效,核心边界如下:

可拦截场景 不可拦截场景
同名业务对象(准确率 → 模型/工单) 用户意图隐含未声明的上下文假设
强制检索需求(有知识库就该检索) 多轮对话中的指代消解(「那个」具体指代哪个对象)
状态映射(流转状态 vs 处理结果) 跨业务的语义等价判断(「完成」在A、B两个业务场景中是否同义)
格式差异(大小写/全半角) 用户真实意图与字面意思不一致

未纳入规则覆盖范围的全新歧义,无法被该机制拦截。 这也明确了前置拦截层的定位:它是基础防护层,并非核心优化环节,核心约束模型决策空间的逻辑将在第 3 篇展开。

成本侧:额外开销与可控性

前置拦截并非零开销,各拦截点的成本与可控性如下:

拦截点 额外成本 可控性
消息预处理 遇到歧义时多一次用户交互 完全可控(仅歧义场景触发,非每轮都弹出)
两步 RAG 每次推理多一次检索(约 50ms) 完全可控(可缓存、可并行、可裁剪检索范围)
状态歧义拦截 每次工具选择多一次规则匹配(ms级) 几乎为零

整体来看,前置拦截带来的延迟与算力开销,在整轮推理中占比极低(通常 < 10%);而它消除的风险------静默失败导致的错误回答------业务代价是该开销的几十倍,工程上完全划算。

但该方案有一个核心前提:业务口径可被枚举定义。若连需要拦截的歧义都无法明确写出映射规则,前置拦截无法生效------此类场景只能依靠第 3 篇的提示词工程与工具设计收窄决策空间。


六、落地参考

以下伪代码示意三层拦截在链路中的核心接口与调用时序,不涉及具体框架适配。

1. 消息预处理

python 复制代码
class MessagePreprocessor:
    """入口拦截:消歧 + 格式规范化"""
    def process(self, raw_msg: str, ctx: SessionContext) -> Message:
        # 格式规范化:统一大小写、全半角、空白符
        normalized_msg = normalize(raw_msg)
        # 检测歧义实体
        ambiguous_entities = self.detect_ambiguous_entities(normalized_msg)
        if ambiguous_entities:
            # 同步阻塞:弹出确认选项,用户回复后从会话上下文恢复
            ctx.await_user_choice(ambiguous_entities.options)
            resolved_msg = ctx.resolved_message  # 含消歧后的确定文本
            return resolved_msg
        return normalized_msg

2. 两步 RAG

python 复制代码
class PreRetrievalHook:
    """前置检索钩子:在 Agent 推理前强制执行"""
    def run(self, query: str) -> list[Document]:
        results = vector_search(query, top_k=5)
        # 相关性阈值过滤,低相关度内容不注入上下文
        return [r for r in results if r.score >= RELEVANCE_THRESHOLD]

class AgentPipeline:
    def execute(self, msg: Message, hook: PreRetrievalHook):
        # Step 1: 前置检索(硬串行,未完成不启动 Agent 推理)
        background_docs = hook.run(msg.text)
        # Step 2: 注入业务背景上下文后,启动 Agent 推理
        enriched_context = build_context(msg, background_docs)
        return agent.invoke(enriched_context)

3. 状态歧义拦截

python 复制代码
class StateAmbiguityFilter:
    """工具选择前:按业务规则移除歧义工具候选"""
    # 业务规则映射:硬编码枚举,与业务口径强绑定
    STATE_RULES = {
        ("处理结果",): ["query_resolution_state", "query_close_state"],
        ("流转", "进度"): ["query_flow_state", "query_process_state"],
    }

    def filter_tools(self, user_intent: str, candidates: list[Tool]) -> list[Tool]:
        matched_rule_group = self.match_rule(user_intent)
        if matched_rule_group:
            allowed_tool_names = set(self.STATE_RULES[matched_rule_group])
            return [t for t in candidates if t.name in allowed_tool_names]
        return candidates  # 未命中规则,返回原候选集

三段伪代码展示了核心接口与调用时序,具体的框架适配(LangChain、Dify、自研编排引擎)可根据项目实际情况调整,本文不展开。


本章小结

前置拦截层通过三件核心动作,完成了LLM推理全流程的基础风险防护:

  1. 消息预处理------在意图识别前完成同名对象与模糊词消歧,格式规范化为消歧提供锚点
  2. 两步 RAG------将检索前置为强制动作,Agent 仅需基于提前注入的上下文执行推理
  3. 状态歧义拦截------在工具选择前按业务规则移除歧义项,不让 LLM 处理无法判断的决策

三层拦截共用的核心判定逻辑:仅对可通过后置校验修复的问题做后置优化,无法校验的业务风险需前置拦截。识别标准仅一个:LLM 出错时,响应中是否有代码可捕获的异常信号?无任何可识别标识的,就执行前置拦截。

前置拦截层是整个准确率优化体系的地基,解决的是「业务口径能否提前定义」的问题------能定义的风险就提前挡住,无法定义的风险则交由第 3 篇「收窄 LLM 决策空间」模块处理。


下一篇预告

第 3 篇:收窄 LLM 决策空间------覆盖提示词工程(59 版迭代教训、CoT / few-shot / role-play 三件套的正确用法)、采样参数收窄(从通用对话档切到工具调用档,分两轮执行的完整逻辑)、业务数据预加载(为什么不塞 RAG、不塞提示词)、工具信息分层注册(≤20 全量 / >20 两阶段路由 / >50 tag 检索的三档设计)。

关键判断:这一层可拿到 65% → 75% 的核心准确率红利,但存在明确天花板;请勿将三个模块的 Delta 数值直接累加,各层之间存在重叠贡献。


系列导航 :上一篇:分层消除不确定性(一)主线与全景 | 系列目录:业务智能体准确率从 65% 到 85% | 下一篇:收窄 LLM 决策空间

关键词#业务智能体 #LLM准确率 #前置拦截 #RAG #工具选择 #消息预处理 #工程实践

相关推荐
AI-好学者4 小时前
阶段二-Cypher查询语言详解
数据库·rag·graphrag
小饕9 小时前
RAG 进阶|响应生成(Generation)4 大痛点深度剖析:从问题定位到工程解法
人工智能·rag
张彦峰ZYF1 天前
大模型LLM ACA - ACP认证考试真题冲刺演练二答案参考
人工智能·lora·llm·embedding·rag·few-shot
uncle_ll1 天前
LangChain 实战指南:回调系统、自定义组件与有状态对话全落地
langchain·llm·embedding·agent·大模型开发·rag
不能只会打代码2 天前
RAG 数据源全景解析指南:从 .txt 到知识图谱的 7 大阵营 47 种格式
rag·数据解析·文档处理·多模态检索·知识库建设
林间码客2 天前
LLM Wiki:大语言模型世界的“百科全书”
llm·rag·wiki·llm wiki
chanalbert2 天前
Agent 工程化指南(二):记忆与规划 — 让 Agent “记得住“且“做得对“
agent·memory·rag·mcp
ahauedu4 天前
多租户 RAG 知识库系统基于Spring Boot 4.0.5+Spring AI 2.0.0 + Milvus
spring·rag·springai2.0
染指11104 天前
50.llama_index-文档分割器(文本)
llama·rag·llamaindex