给 agent 做术语消歧层是建议做在服务端还是做成 tools 加载,比较主流的方案能讲讲吗
这一轮没法给出确定的分层,我先讲机制和取舍。 这个问题的本质是:消歧决策发生在哪一层,以及那一层能不能看到足够的上下文。 服务端做消歧,指的是在请求进 agent 之前,先把用户原始话语过一遍,把「这个」「上次那个」「它」之类映射到具体实体。好处是它对所有客户端统一、可复现、可审计,做错了改一处生效,而且不依赖模型是否听话。代价是它只能吃你主动传进去的上下文,缺当前会话的即时状态和工具返回内容,容易做成为规则表,边界情况堆成 if。 做成 tools 加载,指的是把消歧能力做成一组可调用的工具(比如按实体类型分:仓库、文档、历史问答、文件),让 agent 在需要时自己查。好处是它在上下文最全的时机执行,能结合当前对话、工具返回、用户历史一起判断,也能自然降级(查不到就反问)。代价是行为不确定,模型可能不调、调错、或者反复查;延迟和 token 成本由 agent 承担;而且调用链长了以后,一次错的多义消解会顺着后面的步骤放大。 实际主流做法基本是混合,而不是二选一:确定性高的映射放服务端(会话里的显式指代、当前引用的那条消息、最近上传的文件这类强信号),开放式的、需要推理的消歧(「那个我们之前讨论过的方案」)交给工具,同时用 prompt 约束调用时机,并把「无法消歧」当成合法的工具结果返回,强制模型反问,而不是猜一个。 如果你要落地,选哪边主要看两件事:一是消歧错了的后果有多重,错了要回滚或涉及写操作的,偏向服务端前置校验;二是候选集合是否封闭,封闭集合(本群文件、本人历史问答、登记的仓库)适合做成工具查,开放世界(用户随口说的外部东西)只能靠反问。