中兴未来领军计划 AI 算法一面:RAG、Agent 与 Claude Code 原理
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 请做一个两到三分钟的自我介绍。
- 读研期间有没有论文产出?你们的毕业要求是什么?
- 本硕都是中南,是考研还是保研?本硕期间成绩排名是什么情况?
- 你使用什么模型?
- Agent 框架有哪些?
- Claude Code 的原理、组成和工作流是什么?
- effort 的 high、low 主要控制什么?
- effort 会改变 max token 吗?
- DeepSeek Flash 使用的是最新 0731 版本吗?DeepSeek Flash 有什么提升?
- 为什么 RAG 既要 embedding 又要 rerank?为什么不能全部 rerank?
- Agent loop 一般是什么样?
- Agent 在什么情况下结束?
- 使用成熟 Agent 工具,还是自己开发?
- 子 Agent 在实现层面怎么做?子 Agent 是不是做成服务?
- 多智能体之间如何通信和协作?
- 2025 年 11 月到 2026 年 6 月的项目是什么系统?
- 知识图谱中有没有把 node、edge 喂给大模型做结构化输出?
- 弱模型无法结构化输出,怎么改进?
- 提示词里的约束怎么设计?提示词约束只是「不要做什么」吗?
- 对公司有什么了解?为什么投递?通过什么渠道投递?
- 家是哪里的?
- 实习工作强度怎么样?怎么看加班?
- 百度有没有给你转正 Offer?有没有其他 Offer?如何比较其他 Offer?有没有考公或读博计划?
- 写代码完全依赖 Codex / Claude Code 吗?
- 使用 AI 编码工具时如何团队合作?
- 使用 AI 编码工具时,最大的问题是什么?
- 有没有 AI 解决不了的问题?举例说明。
- 混合云故障排查如何确保 Agent 定位正确?
《参考解析》
为什么 RAG 既要 embedding 又要 rerank,而不能全用 rerank
两者解决的是不同阶段的矛盾:embedding 检索负责从海量语料里快速缩小候选,rerank 负责在少量候选里精确排序。向量检索把 query 和文档分别编码成向量后算相似度,文档向量可以离线算好、建 ANN 索引(HNSW/IVF),所以能在百万级语料上做到毫秒级召回;代价是 query 与文档在编码阶段没有交互(双塔结构),只能比对整体语义,对否定、数字、专有名词、细粒度的条件约束不敏感,排序偏粗。rerank 用的是交叉编码器(cross-encoder),把 query 和文档拼在一起送进模型做完整注意力计算,能捕捉词级交互,精度明显更高,但它必须在线对每个候选做一次推理,耗时随候选数线性增长。
所以「不能全部 rerank」有两个原因:一是成本与延迟,语料是全量的,逐条打分根本跑不完;二是 rerank 模型有输入长度上限,长文档也不适合直接塞进去。工程上的标准链路是「粗排召回 Top-50100 → rerank 精排取 Top-35 → 交给大模型」,常见的额外手段还有:embedding 之外并行跑一路 BM25/关键词召回做混合检索(提升专有名词和数字的命中)、用元数据过滤先缩小范围、以及对 rerank 结果做阈值截断——分数普遍很低时宁可回答「知识库中没有」,也不要硬塞无关上下文让模型编。
Agent loop 的形态与终止条件
一个最小的 Agent loop 就是「想 → 做 → 看」的循环:把系统提示、用户目标、可用工具和历史观察结果一起送给模型;模型输出要么是最终答案,要么是一个或多个工具调用(含参数);运行时执行工具,把结果作为新的观察追加进上下文,再进入下一轮。工程实现上一般还会加:规划的显式化(先让模型列 TODO,再逐步执行并更新)、并行工具调用、以及中间结果的状态外置(把长工具输出写进文件或变量,只在上下文里留摘要,避免上下文爆炸)。
终止条件必须显式设计,不能只靠「模型自己说完了」:① 模型直接给出终止信号或不再产生工具调用;② 达到最大步数/最大 token/最大耗时/最大工具调用次数的预算上限,强制收尾并回报「已完成什么、还差什么」;③ 连续 N 轮没有产生新的有效信息或工具反复报同样的错,判定为陷入循环,主动中断;④ 命中不可恢复的错误或安全策略(危险操作、越权访问)立即停止并转人工;⑤ 任务目标达到可验证的完成条件(比如测试通过、文件已生成并校验)。再加一层防护:同一工具同一参数短时间内重复调用要拦截(去重/熔断),以及对循环整体设置超时——否则挂死的 Agent 会一直烧 token。
子 Agent 的实现方式与多智能体协作
子 Agent 本质上是把「一段独立的推理 + 工具使用」封装成一个可复用的能力,实现上有两种主流形态:一是进程内的轻量封装——父 Agent 把一个子任务交给一个独立的模型调用(独立的系统提示、独立的上下文、受限的工具集),拿到它的结果摘要后继续自己的循环,相当于「函数调用 + 上下文隔离」,实现简单、开销小,缺点是共享同一进程的资源和超时预算;二是服务化——子 Agent 是一个独立服务或独立进程,通过 RPC/HTTP/消息队列通信,可以独立扩缩容、用不同模型、单独限流和鉴权,适合团队分工和跨系统调用,代价是引入网络延迟和状态管理复杂度。实际选型取决于隔离需求:需要独立权限、独立模型、独立伸缩就做成服务;只是想让上下文更干净、任务可并行,进程内封装就够了。
多智能体协作的几种典型拓扑:主管(supervisor/orchestrator)——一个主 Agent 拆解任务并分派给专职子 Agent,负责汇总与决策,最容易控住;流水线——按阶段串行传递(检索 → 分析 → 写作 → 校验),每步的产物是下一步的输入;对等协商/辩论——多个 Agent 独立给出结论再互评收敛,用于提高可靠性但成本高;黑板/共享内存——所有 Agent 读写同一份结构化状态,适合长任务。协作的难点不在通信本身,而在上下文传递格式与冲突消解:要有统一的结构化消息契约(任务、输入、约束、产出、置信度、引用来源)、明确谁有最终决策权、以及幂等与去重机制(同一个子任务不要被重复执行)。另外别忘了加上「验证者」角色——让一个独立 Agent 检查结果是否有证据支撑,是抑制幻觉最划算的一招。
effort 档位控制什么,会不会改 max token
effort(有的厂商叫 reasoning effort / thinking budget)控制的是模型在回答前愿意花多少推理算力:high 会生成更长的思维链、做更多自我检查与方案比较,low 则倾向快速给出直接答案。它影响的是思考 token 的数量与推理深度,进而在准确率和响应延迟、成本之间做取舍——适合难度分级的场景:常规问答走 low,复杂推理、代码生成、多步规划走 high。
它和 max_tokens 是两件事:max_tokens 是输出长度的硬上限(包含思考 token 和正式回答),由调用方设定,属于截断约束;effort 是模型侧的行为倾向,不改变上限,但会显著改变「实际用了多少 token」——high 档更容易把预算耗在思考上,如果 max_tokens 设得太小,会出现思考没结束就被截断、正式答案为空的情况。实践上两者要一起调:给 high 档留足输出预算,同时监控「因长度截断而失败」的比例;另外不同厂商对 effort 的实现不同(有的映射到 reasoning 参数,有的只是提示词层面的引导),跨模型切换时要实测而不是想当然。
弱模型结构化输出怎么改进,以及提示词约束怎么设计
结构化输出失败通常不是「模型不想」,而是任务对模型太难 + 约束太弱。可按代价从低到高改进:① 用约束解码——JSON mode、JSON Schema、语法约束(GBNF/grammar)或厂商的 structured output,让采样阶段就不可能产出非法字符,这是最有效的一招;② 简化目标——把「一步输出复杂嵌套结构」拆成多次调用,先抽实体、再抽关系、最后组装,每步只要一个扁平的 schema;③ 提示词里给一个完整的输出样例(few-shot 比纯描述有效得多),并把字段名、类型、枚举值、必填项、空值怎么写全部写死;④ 加校验与修复闭环——解析失败时把报错信息回灌给模型让它只修格式(不重做内容),限制重试次数,仍失败则降级到规则抽取或转人工;⑤ 最后才是换模型或加微调。
提示词约束的设计要点是:只写「不要做什么」不够,负面约束既难穷举、又没告诉模型该怎么做,模型经常一边避开禁令一边跑偏。好的约束是「边界 + 正确做法 + 判定标准」三件套:明确输入输出格式与取值范围,给出冲突时的优先级(比如「以文档为准,文档没写就回答不知道」),并把「不确定时怎么办」写进去(要求输出置信度或明确说无法判断,而不是编一个答案)。再配合少量正反例和可自动校验的结构(schema、枚举、必填字段),效果比堆一长串「禁止……」稳定得多。