中科曙光 AI Agent 一面
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 实习内容和项目内容的关系是什么?
- 项目是自学还是学校项目?
- 简单介绍一下你的 Agent 项目。
- 数据来源、测试过程、整个流程讲一下。
- 举例说明整个系统的运转流程。
- 工具如何闭环?工具怎么选择?
- 提示词是如何写的、如何加工?
- 约束怎么写的?
- 需要支持多次工具调用(如
execute)时怎么做? - Agent 循环怎么办?
- ReAct Agent 是怎么做的?
- RAG 知识库流程是怎样的?
- 取不到数据怎么办,怎么排查?
- 构建一个 Agent 分几个模块?
- 不用框架、自己搭建,需要手写哪些部分?
- 反问。
《参考解析》
Agent 的模块划分是这套题的主干,先把它讲清楚,其余问题都能挂上去。最小可用 Agent 有六个部分:① 模型层——封装 LLM 调用(模型选择、温度、流式输出、重试与降级);② 规划/决策层——决定下一步做什么(ReAct 循环、Plan-and-Execute、或直接 function calling);③ 工具层——工具的定义(名称、描述、参数 schema)、注册与选择、执行与结果回填;④ 记忆/上下文层——短期对话历史、长期记忆(向量库或结构化存储)、上下文窗口管理与压缩;⑤ 知识层(RAG)——文档切分、向量化、索引、检索与重排;⑥ 控制与观测层——循环终止条件、超时与步数上限、错误处理与回退、日志与轨迹记录、以及评测。如果不用框架手写,对应的就是:手写 tool schema 的 JSON 定义、把 messages 数组按协议拼好发给模型、解析模型返回的 tool_calls、执行工具并把结果作为 role: tool 的消息追加回上下文,循环直到模型返回普通文本或触发终止条件。要主动说清框架(LangChain/LlamaIndex 之类)帮你省的是编排、内存与工具适配,但循环控制、上下文裁剪、评测这三件事无论用不用框架都得自己设计,这也是面试官问「自己搭要写哪些」想听的答案。
ReAct 与 Agent 循环:ReAct 是「Reasoning + Acting」交替——模型先输出一段思考,再决定调用哪个工具,拿到工具结果(Observation)后继续思考,如此循环。实现上要注意四件事:① 终止条件必须有多个——模型给出最终答案、达到最大步数、总 token 或时间超预算、连续 N 次工具调用失败,任何一条触发就退出,否则会陷入死循环烧钱;② 循环检测——同一个工具用同样的参数被反复调用,说明模型卡住了,要打断并把已有信息交回模型或直接兜底回答;③ 上下文增长——每轮的工具结果都会进上下文,长任务下必须裁剪(保留最近 N 轮完整内容 + 更早内容的摘要),否则会撞上窗口上限;④ 并行工具调用——模型一次可以返回多个 tool_calls,无依赖的应当并发执行以减少往返;有依赖的必须串行。多次工具调用的支持要点是:把每个结果按 tool_call_id 对应回填(顺序和 id 不能错,否则协议校验会失败)、单次结果做体积截断(把超大 JSON 摘要化或落盘给路径)、失败结果也要回填并说明错误原因,让模型有机会换参数重试。
工具的选择与闭环:选择上主流有三种做法——① 把全部工具的描述塞进系统提示,靠模型自己选(工具少于 20 个时最省事);② 用分层路由:先按意图粗分类,再在子集内选(工具多时最实用,能显著减少提示长度和误选);③ 用检索方式按用户输入召回相关工具(工具上百个时用)。工具的定义质量比数量重要:名称要动词开头且语义明确、描述要写「什么时候用它、什么时候不要用它」、参数要有类型和约束、最好带一个调用示例。闭环指「模型能判断工具结果是否达成了目标,并决定继续、换工具还是收尾」,这需要在提示里明确成功/失败的判据并给出结束条件。另外一定要讲错误处理:工具超时要有短超时 + 有限重试、参数非法要返回可读的报错(让模型能改参)、工具本身返回空要区分「查询成功但无数据」和「查询失败」。
RAG 流程按链路六步讲:文档加载与解析(PDF/HTML/表格,表格和图片是最容易丢信息的地方)→ 切分(固定长度、按语义/标题层级、父子块或句子窗口,块大小要按 embedding 模型的有效长度调,通常几百 token、带重叠)→ 向量化与索引(embedding 模型选择、向量库 HNSW/IVF 索引,元数据要一起存以便过滤)→ 检索(向量召回、关键词 BM25 混合检索、元数据过滤)→ 重排(cross-encoder 或 LLM 重排提升 top-k 精度)→ 生成(把命中片段作为引用塞进提示,要求模型只依据给定内容回答并标注出处)。常见的质量问题是「召回不到」和「召回了但答错」,分别对应检索侧(query 改写、多路召回、混合检索、调 top-k)和生成侧(重排、提示里明确「无依据就回答不知道」、引用校验)的优化。
**「取不到数据怎么排查」**这题答成一套排查清单最能得分,按链路自后向前查:① 先确认是哪一层失败——是模型没发起工具调用、还是工具调用失败、还是工具成功但结果为空;看轨迹日志就能区分。② 工具调用失败看 HTTP 状态码和错误体(鉴权过期、参数格式错、被限流、下游超时)。③ 工具成功但空结果:确认查询条件(时间范围、id 是否正确、是否被过滤条件排除)、确认数据确实存在(手工用同样参数查一次源头,做基准对比)、确认单位/时区/口径差异。④ 检索型取数:确认索引是否建好、文档是否入库、embedding 与查询是否用同一个模型、阈值是否设得过严。⑤ 兜底策略要设计好:让模型明确说明「我没有取到数据,原因是 X」而不是编造;可以给一次换参数重试的机会;仍失败则降级到转人工或返回已有信息,并把这个 case 记进日志用于后续评测。收尾补一句「这类问题最怕静默返回空,所以工具层必须区分空结果与错误,并且都要留下 trace」,体现工程意识。
**项目类问题(数据来源 / 测试过程 / 与实习的关系)**要按「来源可信、评测可复现」来答。数据来源要能说清:是公开数据集、业务日志、还是人工构造,是否涉及隐私与脱敏,数据量级和覆盖范围。测试/评测是 Agent 面试的必问项,合格的说法是三层:① 离线评测集(从真实 query 里采样并人工标注期望答案/期望工具调用,覆盖正常、边界、无答案三类);② 按维度打分(是否选对工具、参数是否正确、答案是否忠实于来源、有没有幻觉,可用规则匹配 + LLM-as-judge 结合);③ 线上观测(成功率、平均步数、平均耗时与 token 成本、人工介入率、用户反馈)。能说清「改了一版提示词之后,评测集上的通过率从多少到多少」是最有说服力的。