主题
高频面试题
如何设计一个生产级的 Agent 系统架构?需要考虑哪些关键模块?
这道系统设计题的重点不是画一个“用户 -> LLM -> 工具”的线,而是把控制权、状态、权限、评估、可观测和可靠性边界讲完整。
面试官角度分析,想考什么
生产级 Agent 和 demo 差在哪?
考意识:demo 跑通工具调用,生产要权限、状态、失败、评估、成本和审计。关键模块和控制权在哪里?
考拆分:runtime、context、tools、memory、policy、trace;模型提议,系统决定执行。如何保证可靠、安全和持续改进?
考落地:超时重试回滚、沙箱审批、trace 和离线 eval 回归。
可直接抄走的 30 秒参考答案
text
我会把生产级 Agent 设计成可控 runtime,而不是 LLM 直接调工具。入口层处理身份、租户、意图和风险;Runtime 管 loop、状态、终止条件和恢复;Context Builder 组装任务、记忆、RAG 和工具 schema;Tool Platform 统一管理工具注册、MCP 接入、执行、超时和幂等;Policy/Guardrail 做权限、沙箱、高危确认和输出检查;State/Memory 区分当前任务状态和长期记忆;Trace/Eval 记录全过程并做回归;部署层负责队列、隔离、限流、成本和告警。面试回答详解,知其所以然
生产级 Agent 的核心原则是:模型可以动态决策,但系统必须拥有控制边界。架构不是为了让 Agent “更自由”,而是让它在可观测、可授权、可恢复、可评估的边界里完成任务。
1. 总体架构可以这样拆
text
Client / API
-> Intent & Risk Router
-> Agent Runtime / Runner
-> Context Builder
-> LLM Gateway
-> Tool Platform / MCP Gateway
-> State Store / Memory Store
-> Policy & Guardrail
-> Trace / Eval / Monitoring
-> Human Review & Approval这张图不用追求组件名字固定,关键是职责完整:入口分流、运行时控循环、上下文可控、工具可管、状态可恢复、安全可执行、质量可度量。
2. 入口层:任务、身份和风险先识别
入口层不只是收消息。它要先处理:
- 用户身份、租户、会话和授权 scope。
- 请求来源,例如 Web、Slack、IDE、API。
- 意图分类和任务类型。
- 风险分级,例如只读问答、内部写入、对外副作用、高危操作。
- 文件、链接、外部文档等不可信输入标记。
- 同步/异步任务选择。
高风险任务不要一开始就进入自由 Agent loop。可以先进入受限 workflow、要求澄清或人工确认。
3. Runtime 层:控制循环和停止条件
Runtime 是生产 Agent 的中心。它负责:
- 加载状态和历史。
- 计算当前允许动作。
- 构建模型上下文。
- 调用模型得到候选动作。
- 调用 policy 决定是否执行。
- 执行工具并把结果写回 state。
- 判断继续、停止、澄清、降级或人工介入。
典型伪代码:
text
while not done:
state = state_store.load(run_id)
allowed_tools = policy.allowed_tools(user, state)
context = context_builder.build(state, allowed_tools)
action = llm.propose(context)
decision = policy.authorize(action, user, state)
state = executor.apply(decision, action, state)
done = stop_checker.check(state)面试里要强调:LLM 主导候选动作,不主导系统权限、终止条件和最终副作用。
4. Context Builder:上下文不是越多越好
Context Builder 负责把可用信息压成当前轮模型真正需要的输入:
- system/developer 指令。
- 当前任务目标和约束。
- 最近对话摘要。
- 工作记忆和当前计划。
- RAG 检索结果。
- 长期记忆中相关且有权限的记录。
- 可用工具 schema。
- 工具结果和 artifacts 摘要。
它还要处理上下文预算、优先级、去重、引用、过期信息和敏感信息脱敏。把所有历史、所有工具、所有文档全塞进去,既贵又容易污染。
5. Tool Platform:工具接入和执行边界
生产工具层通常包括:
- Tool Registry:schema、版本、owner、risk、权限要求。
- Tool Executor:本地函数、HTTP API、队列、浏览器、代码沙箱、MCP Server。
- MCP Gateway:连接外部 tools/resources/prompts。
- 参数校验和业务规则。
- 幂等、超时、重试、熔断、降级。
- 结果标准化和错误回传。
- 审计日志和调用指标。
工具层是副作用发生的地方,所以也是安全边界最硬的一层。
6. Policy、Guardrail 和 Human-in-the-loop
安全模块要覆盖三类问题:
- 输入侧:prompt injection、恶意文件、越权请求、敏感数据。
- 执行侧:工具白名单、ACL、参数级权限、沙箱、高危确认。
- 输出侧:事实一致性、PII、合规、HTML/Markdown sanitize、对外话术。
Human-in-the-loop 应该按风险触发,而不是每一步都问。对外发送、删除、退款、资金、权限、批量操作、不可逆动作通常需要确认或审批。
7. State 和 Memory:区分运行状态与长期记忆
生产架构里至少有两类状态:
- Run State:当前任务的事件流、计划、工具结果、审批、错误、checkpoint。
- Long-term Memory:跨会话复用的用户偏好、项目事实、历史经验、组织知识。
Run State 强调恢复和审计;Long-term Memory 强调写入治理、检索、权限、冲突、删除和过期。不要把聊天记录全量当长期记忆。
8. Observability 和 Eval:上线后能不能改进
生产 Agent 必须记录结构化 trace:
- 模型调用、token、延迟、成本。
- 工具调用、参数、结果、错误。
- policy 判定、人工确认。
- RAG 检索、引用、memory 命中。
- 最终输出、用户反馈和业务状态。
Eval 则把 trace 变成改进闭环:
- 离线回归集。
- 任务完成度评估。
- 工具正确性评估。
- 忠实性和引用评估。
- 安全红队 case。
- 线上采样 judge 和人工抽检。
没有 trace 和 eval,Agent 质量只能靠感觉调 prompt。
9. 部署和可靠性
生产系统还要考虑非模型工程:
- 同步 vs 异步任务队列。
- worker 隔离和租户隔离。
- 模型和工具超时。
- 重试、幂等、回滚和补偿事务。
- 成本预算、限流和配额。
- 灰度、A/B、模型版本和 prompt 版本。
- secrets 管理和日志脱敏。
- SLA、告警和事故响应。
这部分往往是面试加分点,因为它说明你真的把 Agent 当生产系统,而不是聊天 demo。
面试官追问3个问题
追问一:生产 Agent 的控制权到底在哪里?
- 考察点:是否避免“模型全权代理”。
- 回答方向:Runtime 控 loop 和终止,Policy 控权限和风险,Tool Platform 控执行,LLM 只生成候选动作和解释。
追问二:如果工具失败怎么办?
- 考察点:可靠性设计。
- 回答方向:把错误作为 observation 写回 state;按错误类型重试、换工具、降级、澄清或人工介入;写操作要幂等,外部副作用要可审计和补偿。
追问三:长期任务怎么恢复?
- 考察点:状态设计。
- 回答方向:用事件流记录每步输入、模型动作、工具结果和审批,用 checkpoint 保存当前状态。worker 重启后从 checkpoint 继续,必要时重放事件。
扩展知识
Demo 架构和生产架构的差别
text
Demo: prompt + tools + while loop
Production: runtime + state + tools + policy + trace + eval + opsDemo 关心能不能完成;生产关心能不能稳定、可控、可审计、可恢复、可迭代。
Workflow 和 Agent 可以混合
高风险业务不一定适合完全自由 Agent。常见做法是外层 workflow 控制关键状态,局部节点使用 Agent 处理长尾语义和工具选择。这类 constrained agentic workflow 在生产里很实用。
人机协同是架构模块,不是临时弹窗
审批、澄清、人工接管、结果验收、任务恢复都需要产品和后端支持。Human-in-the-loop 如果没有状态和 trace 支撑,就很难规模化。