面灵AI→

百度智能体算法三面:容错、模型路由与结构化输出

轮次
三面
时间
2026-09
来源
牛客网

《面试题目》

  1. 请先做一下自我介绍。
  2. 基于 LangChain 开发 Agent 时,如果工具调用连续失败,如何设计一套不会失控的容错机制?
  3. 如何设计 Qwen、视觉语言模型和轻量模型之间的动态路由策略?
  4. 置信度阈值应该如何定义?为什么不能直接使用模型输出的概率?
  5. 如果 Prompt 中给了明确的输出格式,但模型仍然经常生成非法 JSON,如何处理?
  6. 图片审核系统在面对超大图片、切片图片和多模态并发请求时,主要会出现哪些问题?

《参考解析》

工具调用连续失败的容错设计 先把错误分类再决定动作,不要一刀切重试:可恢复(超时、限流、服务临时不可用)→ 指数退避 + 抖动重试,上限 2~3 次;参数类(字段缺失、类型错、枚举不合法)→ 不重试,把结构化错误回给规划模块重新生成参数;终态类(权限不足、资源不存在、业务状态不允许)→ 立即终止该分支,重试没有意义;空结果 → 要区分「正常没有数据」和「接口异常」,靠状态码或 error 字段判断,不能把空数组当失败反复重试。判定逻辑可以写成纯函数:

RETRYABLE = {"TIMEOUT", "RATE_LIMIT", "SERVICE_UNAVAILABLE"}

def next_action(err, retries, state_changed):
    if err not in RETRYABLE:
        return "REPLAN"
    if retries >= 3 or not state_changed:
        return "FAIL"
    return "RETRY"

外层再挂总超时、最大工具调用次数、最大 token 三个熔断阈值——LLM 循环烧钱的速度比想象中快,必须有硬上限。每次重试都要落日志(工具名、参数摘要、错误码、是否产生状态变化),否则线上无法归因。

Qwen 系列与轻量模型的动态路由 路由的输入至少要有五个维度:任务类型、模态、上下文长度、风险等级、实时负载。先用轻量分类器(规则 + 小模型)把请求分成普通问答、结构化抽取、图片理解、多轮规划、高风险写操作、长上下文任务几类,再映射到模型:图片走 qwen-vl-plus,超长上下文走 qwen-long,高风险决策必须走 qwen-max,高置信度的简单意图走 qwen-turbo,其余走 qwen-plus。两个容易答漏的点:① 置信度不足时应级联升级(先小模型试探,不确定再升大模型),而不是随机选一个;② 路由要考虑线上负载,但降级不能跨越风险边界——延迟优化只能把低风险请求往小模型挪,高风险请求不允许因为大模型排队就被降级。路由结果要打点(每条请求路由到哪个模型、后续是否被纠正),否则策略无法迭代。

置信度阈值不能直接用模型输出概率 模型输出的 token 概率是「下一个 token 的分布」,不是「这句话正确的概率」:逐 token 概率都高,整句仍然可能事实错误;而且模型普遍过自信,原始概率与真实正确率不成正比。更合理的做法是在验证集上做校准,把模型分数映射成真实正确率,常用方法有温度缩放(temperature scaling,一个参数、不改变排序)、Platt Scaling(逻辑回归拟合)和 Isotonic Regression(非参数,样本少时容易过拟合)。阈值本身要由业务代价决定:漏报代价高的场景(内容审核)往高召回偏,误报代价高的场景(自动封号)往高精确偏;评价时不能只看准确率,要看不同阈值下的精确率、召回率、拒答率和人工接管率。最后必须监控线上置信度分布漂移,离线标定的阈值会随模型版本与用户分布变化逐渐失效。

非法 JSON 的三层处理 提示词只能降低概率,不能提供保证。① 生成约束层:优先用模型原生的结构化输出能力(JSON mode、function calling、JSON Schema),比在 prompt 里写「只输出 JSON」可靠得多,同时降低 temperature 并给一个完整的 few-shot 示例。② 解析修复层:严格解析,不要用正则去截第一个 { 到最后一个 }(嵌套和字符串里的括号会直接崩);解析失败时把报错信息回填,让模型只修格式、不重做任务,成本低且不会改变语义;再兜一层容错修复(补尾部括号、去尾逗号、剥掉 markdown 代码块包裹)。

import json

def parse_result(text):
    try:
        result = json.loads(text)
    except json.JSONDecodeError:
        return None, "JSON_SYNTAX_ERROR"

    if not {"intent", "confidence"}.issubset(result):
        return None, "MISSING_FIELD"

    if not 0 <= result["confidence"] <= 1:
        return None, "INVALID_CONFIDENCE"

    return result, None

③ 语义校验层:字段类型对了不代表内容对,数量、枚举、业务范围、跨字段一致性都要校验。高风险接口(自动退款、下单)解析失败时不要猜字段,直接转人工或追问用户。

超大图片、切片与多模态并发 超大图的第一问题是显存和传输。直接缩放会把小目标缩没(缺陷检测、内容审核最容易踩),直接切片又会丢全局语义。工程解法是「先粗后细」的两段式:先对整图做低分辨率全局推理(或用一个便宜的目标检测、显著性模型)定位疑似区域,再只对候选区域做高分辨率裁剪送进高成本模型,最后融合去重——跨切片的同一目标按 IoU 合并,全局标签与局部标签冲突时以高置信度加更高分辨率的结果为准。切片方案要显式处理:切片尺寸与重叠率(重叠太小目标会被切在两个切片边缘)、小目标落在边界、切片数量爆炸时的批处理与优先级。多模态并发还要防显存竞争:不同模态用不同的并发配额或独立队列,给大图请求设独立限流,否则几个超大图请求进来就把服务打满;再加请求级超时与降级(超时返回「转人工复核」而不是 5xx)。