Skip to content

通用智能体平台 ​

典型题:设计一个企业内部 Agent 平台,支持多个业务创建 Agent、配置工具、接入知识库、查看 trace 和评估结果。

面试官真正想看什么 ​

平台接入一个会发邮件的工具后,租户隔离、版本发布和审批马上变成真实问题。一个好平台不是工具越多越好,而是能知道谁在什么版本、什么权限下调用了什么,并能快速禁用。

  • 你能不能把 Agent 从 demo 抽象成平台能力。
  • 你知道平台化会带来权限、配置、版本、观测和评估问题。
  • 你不会一上来做“大而全”,而是从最小闭环扩展。

先问清楚 ​

Q1:设计 Agent 平台前先问什么? ​

参考答案

我会先问:

  • 平台用户是谁:研发、运营、客服、数据团队还是业务部门。
  • Agent 类型有哪些:客服、调研、知识库、代码审查、数据分析。
  • 是否需要低代码配置。
  • 是否支持自定义工具。
  • 是否需要多租户和权限隔离。
  • 是否需要统一评估和发布流程。

最小架构 ​

核心模块 ​

Q2:Agent 平台最小版本包含什么? ​

参考答案

最小版本包含:

  • Agent 配置:prompt、模型、工具、知识库、预算。
  • 工具注册:工具 schema、权限、调用地址。
  • 运行时:tool loop、状态、最大轮数。
  • 日志:trace、usage、cost、error。
  • 测试入口:用样本跑 Agent。

不要一开始就做复杂 marketplace、插件生态和可视化大屏。先把一个 Agent 跑稳。

Q3:Agent 配置怎么版本化? ​

参考答案

每次改 prompt、模型、工具列表、知识库版本、guardrails 都要生成配置版本。运行 trace 记录配置版本,方便回放和回滚。

没有版本化,线上出了问题就不知道是 prompt 改了、模型换了还是工具变了。

Q4:工具注册中心怎么设计? ​

参考答案

工具注册中心要保存:

  • 工具名。
  • 描述。
  • 参数 schema。
  • 输出 schema。
  • 权限要求。
  • 超时和重试策略。
  • 是否危险动作。
  • owner。

工具不是只给模型看的文本,也是一种受控执行能力。

Q5:知识库怎么接入 Agent? ​

参考答案

平台可以让 Agent 绑定一个或多个知识库。查询时按用户和 Agent 权限过滤,再做检索、rerank 和证据裁剪。

知识库必须有版本、权限和更新状态。否则 Agent 可能引用旧知识或无权限资料。

Q6:状态和记忆怎么做平台化? ​

参考答案

状态分为任务状态和长期记忆:

  • 任务状态:当前目标、阶段、工具结果、错误、预算。
  • 长期记忆:用户偏好、项目背景、历史摘要。

平台要允许业务选择是否开启长期记忆,并提供查看、删除和失效机制。

Q7:如何防止用户配置出危险 Agent? ​

参考答案

平台要有 guardrails:

  • 高风险工具默认禁用。
  • 写操作必须确认。
  • 工具权限审批。
  • prompt injection 检测。
  • 输出安全检查。
  • 预算限制。

不能让业务方随便把“删除数据”工具暴露给任意 Agent。

发布与评估 ​

Q8:Agent 发布流程怎么设计? ​

参考答案

我会设计成:

  1. 草稿配置。
  2. 本地样本测试。
  3. eval 集回归。
  4. 小流量灰度。
  5. 观察 trace、成本、安全。
  6. 正式发布。
  7. 可回滚。

Agent 配置发布应该像代码发布一样可回滚、可追踪。

Q9:平台级 eval 怎么设计? ​

参考答案

平台提供通用指标:

  • 任务成功率。
  • 工具调用正确率。
  • 引用准确率。
  • 无答案识别率。
  • 平均成本。
  • P95 延迟。
  • 安全违规率。

不同 Agent 还可以有业务指标,比如客服解决率、调研引用覆盖率、代码 review 采纳率。

Q10:平台如何支持多模型? ​

参考答案

通过模型网关统一接入。Agent 配置选择默认模型,也可以按步骤路由:小模型分类,大模型推理,embedding 模型检索,rerank 模型排序。

Q11:这个平台最难的点是什么? ​

参考答案

最难的是治理。Agent 平台一旦开放给多个业务,就会出现工具权限、配置漂移、成本失控、评估缺失、知识库版本不一致的问题。

30 秒收口 ​

text
我会先做一个支持配置、工具、知识库、运行时、trace 和 eval 的最小 Agent 平台。
核心不是让业务随便搭 Agent,而是让 Agent 的工具、权限、版本、成本和评估都可治理。

本题常见扣分点 ​

  • 一上来画大而全平台。
  • 不讲版本和回滚。
  • 不讲工具权限。
  • 不讲 eval。
  • 不讲多租户和预算。

深挖追问:平台化之后如何真正可运营 ​

Q12:多租户应该隔离哪些东西,怎样避免“逻辑上隔离、实际上串数据”? ​

参考答案

我会先明确租户边界:Agent 定义、配置版本、工具授权、知识库、运行任务、长期记忆、trace、预算和发布环境都属于租户资源。所有资源都有不可变的 tenant_id,服务端从登录身份或服务身份中得到租户,不接受调用方在请求体中自行指定一个更高权限的租户。数据库查询、对象存储路径、缓存 key、消息队列 topic 和向量检索过滤都必须带租户条件,不能只在前端隐藏数据。

隔离可以分层做。一般 SaaS 场景使用共享数据库加行级权限和强制 tenant filter;对高敏感客户,可以使用独立 schema、独立数据库甚至独立运行集群。无论哪一层,平台都要做跨租户访问的自动化测试:用租户 A 的 token 请求租户 B 的 Agent、文件、记忆和 trace,必须得到 404 或 403,并检查缓存和错误日志没有泄露对象名称。

租户内部还要有成员、角色和资源级权限,例如 owner、builder、viewer、operator、auditor。一个用户可以查看某个 Agent 的运行记录,却不一定能看到 prompt 原文或重放它;生产发布权限和配置编辑权限也应分离。管理员跨租户排查必须有临时授权、原因、有效期和审计记录。

替代方案何时使用

单企业内部平台可以先用共享库加严格租户字段和 RBAC;当客户有数据驻留、专属密钥或强隔离合同要求时,再为该租户切换到独立资源,不要一开始所有租户都物理隔离导致运维成本过高。

常见扣分点

  • 只说“每个租户一个 namespace”,却不覆盖缓存、trace、队列和长期记忆。
  • 只在前端做权限控制。
  • 把平台管理员默认为无限制超级用户,没有审计和时效。

Q13:Agent 的配置版本应该包含什么,如何保证一次运行可复现? ​

参考答案

一个可运行的 Agent 版本不是单独一段 system prompt,而是一个不可变 manifest,至少包含:模型和参数、系统提示词、工具列表及 schema、工具授权策略、知识库索引版本、记忆策略、输出 schema、guardrails 版本、路由策略、预算、运行时图版本以及依赖的模板或代码版本。配置中心保存内容的 hash 和父版本,修改产生新版本,不能原地覆盖已经被生产任务引用的版本。

运行时创建 run 时把完整 agent_version_id 固定下来,并把实际路由模型、工具版本、知识库版本、提示词模板版本、输入摘要和随机性参数写入 trace。这样同一个任务即使后来 Agent 发布了新版本,也不会在重试中悄悄变成另一套逻辑。涉及外部数据的重放要说明数据快照或抓取时间,因为模型版本固定也不代表网页和日历内容固定。

版本状态可以是 DRAFT -> TESTING -> APPROVED -> CANARY -> ACTIVE -> DEPRECATED -> RETIRED。已被运行引用的版本不能删除,只能停止新任务使用;历史 trace 仍能关联到它。配置提交时做 schema 校验、工具权限校验、循环检测、预算上限检查和敏感 prompt 检查,减少把非法配置带到运行时。

替代方案何时使用

小型内部原型可以先用 Git 管理 YAML manifest;多人在线编辑、审批、运行回放和租户权限较多时,需要配置中心提供版本、diff、锁定和发布记录,Git 可以作为底层存档而不是唯一运行时数据库。

常见扣分点

  • 只给 prompt 加版本号,没有锁定模型、工具和知识库版本。
  • 重试时读取“当前最新配置”,导致同一任务前后行为不一致。
  • 直接删除旧版本,历史 trace 无法解释。

Q14:平台的核心 API 和运行状态怎样设计? ​

参考答案

我会把控制面和数据面分开。控制面负责 POST /agents 创建草稿、POST /agents/{id}/versions 保存版本、POST /versions/{id}/validate 校验、POST /versions/{id}/deploy 发布、GET /runs/{id} 查询运行;数据面负责 POST /runs 创建一次执行、GET /runs/{id}/events 流式读取事件、POST /runs/{id}/cancel 取消任务,以及受策略保护的 POST /runs/{id}/approve 执行确认动作。

运行状态至少包括 QUEUED、RUNNING、WAITING_TOOL、WAITING_USER、PAUSED、SUCCEEDED、FAILED、CANCELLED、BUDGET_EXHAUSTED。状态迁移由服务端校验,例如 WAITING_USER 不能被普通重试接口直接改成 SUCCEEDED,而外部动作确认必须绑定具体的 approval_id 和草稿 hash。事件采用追加写入:run.started、model.called、tool.requested、tool.completed、approval.requested、approval.granted、run.failed。

运行状态和事件的关系要清楚:事件是审计和恢复依据,当前状态是查询优化视图。Worker 处理事件时使用租约和幂等键;进程崩溃后,调度器根据未完成步骤和最近 checkpoint 重新派发,不依赖内存中的 Agent 对象。流式输出只展示已产生的事件,最终结果仍以服务端持久化 artifact 为准。

替代方案何时使用

纯同步、几秒内完成的分类 Agent 可以只返回一次响应;长时间检索、工具调用、审批和批处理任务必须采用异步 run 加事件流,否则请求超时后无法知道任务是否已经执行。

常见扣分点

  • 只有一个 status=running 字段,没有等待人工、预算耗尽和取消语义。
  • 把状态全放在 Redis 或 Worker 内存,重启就丢。
  • 允许客户端任意提交状态,绕过审批和权限。

Q15:平台的容量和延迟目标怎样估算? ​

参考答案

我会先把平台负载拆成控制面请求和运行时步骤。假设有 2,000 个活跃 Agent、每天 50,000 次 run,高峰 10 倍;平均每次 run 4 次模型调用、2 次工具调用,模型调用平均 2 秒,工具平均 300 毫秒。模型调用往往是主要瓶颈,不能按“run QPS”简单估算 Worker 数,而要按并发模型请求、供应商 TPM/RPM、工具连接池和队列等待分别做容量规划。

用户体验也要拆 SLO:提交任务接口 P95 小于 300 毫秒;流式首事件 P95 小于 1 秒;短问答完成 P95 小于 10 秒;长任务可以异步完成并提供进度、预计剩余步骤和取消能力。平台运行时设置每租户并发上限、每 Agent 并发上限和全局模型并发上限,长任务使用持久队列,避免某个批量 Agent 把交互式任务挤掉。

容量测试至少覆盖:空闲工具、慢工具、模型 429、长上下文、并发审批、消息重复和 Worker 崩溃。监控重点是队列等待、步骤耗时、外部依赖耗时、活跃 run、每租户 token、checkpoint 存储增长和 P95/P99,而不是只看 API 服务 CPU。扩容前先判断瓶颈属于模型配额、数据库、队列还是运行时 Worker,避免盲目加 Pod。

替代方案何时使用

低频内部平台可以先用单队列和定时扩容;实时客服和批量数据分析共存时,应拆优先级队列或资源池,并给关键租户预留并发。

常见扣分点

  • 只给一个 QPS 数字,不说明调用扇出和外部配额。
  • 只谈平均延迟,不谈首 token、P95 和排队时间。
  • 长任务同步占用 HTTP 连接,超时后无法恢复。

Q16:工具和知识库怎样接入,平台如何防止能力越权? ​

参考答案

工具注册时除了名称和 JSON Schema,还应声明 owner、版本、调用 endpoint、超时、重试是否安全、数据分类、所需 scope、是否有副作用和确认级别。Agent manifest 只能引用已经批准的工具版本;运行时在每次调用前做三次检查:当前租户是否订阅、当前用户是否有 scope、当前任务是否满足风险和审批策略。工具服务收到调用后还要二次鉴权,不能因为请求来自平台 Worker 就默认信任。

知识库接入同样是授权问题。索引入库时保留文档 ACL、租户、来源和版本;查询时把用户身份和 Agent 身份带进过滤条件,再做检索和 rerank。模型只能看到通过权限过滤后的片段,引用展示也不能暴露用户无权打开的原文。文档被撤权或删除后,需要让索引和缓存尽快失效,并定义短暂传播延迟的安全边界。

外部网页、邮件和知识库文本都视为不可信数据。平台的系统指令、工具描述和权限策略由受信配置提供;模型输出只产生“工具意图”,实际参数还要经过 schema、范围、DLP 和业务规则检查。高风险写操作以 approval_required 返回给前端,不允许模型通过修改自然语言理由绕过。

替代方案何时使用

低风险只读工具可以采用统一服务账号加细粒度资源过滤;涉及删除、付款、发信或权限变更的工具应采用用户委托 token、短时凭证或专门审批服务,而不是长期共享密钥。

常见扣分点

  • 把工具 schema 当作权限控制。
  • 只在 Agent 配置时检查一次权限,不在每次运行时检查。
  • 检索先召回全库再让模型“自己不要看”,这不是真正的 ACL 过滤。

Q17:平台如何处理长任务失败、重试和恢复? ​

参考答案

我会把一次 run 拆成有输入输出的步骤图,每完成一个可复用步骤就持久化 checkpoint。Worker 失败后,调度器根据步骤状态和租约判断是重新领取、等待依赖还是标记失败;已完成的证据检索不重复做,后续写作可以从 artifact 继续。每个步骤有错误分类:临时网络错误和供应商 5xx 可退避重试,schema 错误需要修复或换模型,权限拒绝和用户输入不足应转 WAITING_USER,副作用工具则必须先查询执行状态。

重试策略要同时限制次数、时间和预算,使用 run_id + step_id + attempt 做追踪,并以业务幂等键避免重复写入。对会发送消息、创建工单或修改数据的工具,采用 outbox 或工具侧幂等记录:平台先写“待执行事件”,执行结果回写后才推进状态;网络响应丢失时通过查询接口确认,而不是盲目再发一次。

用户取消时停止尚未开始的步骤,向正在运行的模型和工具传递取消信号;无法立即中断的调用也要在结果回来时丢弃其后续动作。平台保存失败原因、最后 checkpoint、已产生费用和建议操作,给用户一个可恢复的“从此处继续”入口。不可恢复的配置错误不能靠自动重试掩盖,应阻止发布并提示 builder 修改。

替代方案何时使用

极短的同步 run 可以在请求内完成并由网关超时保护;跨分钟甚至跨天、需要人工审批的任务必须用持久化工作流引擎或等价的事件状态机。

常见扣分点

  • 所有异常都统一重试。
  • Worker 重启后从第一步开始,成本和结果都漂移。
  • 对外部副作用没有幂等和执行状态查询。

Q18:平台怎样做可观测性,如何定位“模型错了还是工具错了”? ​

参考答案

每个 run 建立 trace,下面有 step span 和 tool/model 子 span。核心字段包括 tenant、agent_version、run_id、step_id、model、route_id、prompt 模板 hash、输入输出 token、cached token、工具名、参数摘要、结果状态、耗时、重试、预算和安全决策。默认只记录脱敏摘要、哈希和引用 id;有权限的审计人员才能在保留期内查看加密原文。

一次任务的时间线应能回答:计划何时生成,检索返回了什么版本的证据,模型使用了哪个路由,为什么调用了这个工具,工具是否成功,是否发生 fallback,用户在哪一步确认,最终成本是多少。对于敏感字段使用字段级脱敏和访问审计,避免为了可观测性把完整邮箱、合同或源码复制到日志系统。

定位问题时按层切分:模型输出格式错,查看 prompt/schema/model;工具返回错误,查看 endpoint、scope、参数和外部服务;知识库答案错,查看 ACL、索引版本、召回和引用;平台恢复异常,查看事件重复、租约和 checkpoint。trace 不只是“把聊天全文打印出来”,而是让每个决策可关联、可过滤、可统计。

替代方案何时使用

个人开发阶段可以用结构化 JSON 日志;多租户生产平台应接入统一 trace、指标和事件存储,并配置采样、脱敏和保留策略,控制观测成本。

常见扣分点

  • 只记录最终回答,没有中间步骤和版本。
  • 把 token 和成本写在散落日志里,无法按租户聚合。
  • 为了排障默认保存所有敏感原文。

Q19:平台级成本控制如何设计,怎样把账算到具体 Agent? ​

参考答案

每次 run 创建成本账本,按模型调用、embedding、rerank、工具、存储和人工审批分别记一条 usage line。模型调用记录输入、输出、缓存命中 token、重试、路由和价格版本;Agent、应用、租户和用户通过 run_id 关联,月底可以回答“哪个 Agent 的哪一步最贵、质量是否值得”。平台不能只按请求次数收费,因为一次长上下文和一次短分类的资源消耗差别很大。

预算分为租户月额度、应用日额度、Agent 版本额度、单 run 上限和单步骤上限。运行前预留,完成后按实际 usage 结算并释放差额;并发预留必须原子化。接近预算时可以发告警、限速、缩短上下文、使用低成本模型或转人工,但策略依赖风险等级:高风险 Agent 不得为了省钱绕过必要检查。

平台还要提供成本优化入口:缓存稳定检索和模型前缀、压缩历史摘要、限制无效工具循环、批量执行离线任务、使用小模型处理分类和抽取、对长文档分层处理。每项优化都要与质量指标一起看,例如平均成本下降但引用准确率下降,就不能视为成功。

替代方案何时使用

内部试用阶段可以先做软预算和报表,不立即拒绝请求;开放给多个团队后必须有硬上限和按租户归因,否则一个失控循环会影响全平台。

常见扣分点

  • 只谈模型单价,不算存储、检索、工具和重试。
  • 没有单 run/步骤预算,只有月底账单。
  • 只优化成本,不验证回答质量和安全。

Q20:如何建立 Agent 的测试、评估和发布门禁? ​

参考答案

平台为每个 Agent 提供独立 eval 集,同时提供通用样本:正常输入、资料不足、越权请求、提示词注入、工具异常、重复消息、超长上下文和预算耗尽。评估结果分三层:任务结果是否正确,过程是否遵守工具和权限策略,系统是否满足延迟、成本和稳定性目标。平台级指标包括任务成功率、工具选择准确率、参数 schema 通过率、检索引用准确率、无答案识别率、安全违规率、人工介入率、P95 延迟和单位 run 成本。

发布前先做静态校验和离线回归,再做一段 shadow run。对影响较大的 Agent,按配置版本做成对比较或灰度分桶;不能只用 LLM-as-a-judge,至少用人工抽检校准事实、越权和关键业务指标。每个 Agent 可定义阻断阈值,例如安全违规率不能上升、结构化输出通过率不能低于旧版本、成本不能超过预算、关键业务准确率不能下降超过允许范围。

发布记录包含审批人、评估集版本、模型和工具版本、阈值结果、灰度范围和回滚版本。线上发现问题时,停止扩大流量并回滚 manifest;已有 run 按其原版本继续或安全终止,不能把运行中的配置热替换成新版本。评估集也要定期更新,防止团队只优化固定题目。

替代方案何时使用

探索阶段可以用少量专家抽检快速迭代;高风险或面向大量用户的 Agent 必须有可重复的回归集、自动门禁和人工审批,不能仅凭 demo 体验发布。

常见扣分点

  • 把“能回答”当作通过标准,不测工具、权限和失败分支。
  • 没有 eval 集版本,前后结果不可比。
  • 只看平均分,不看高风险样本和尾延迟。

Q21:如何做多环境发布、灰度、回滚和配置漂移治理? ​

参考答案

我会把环境分成开发、测试、预发布和生产,每个环境有独立的密钥、工具 endpoint、知识库权限和数据策略;Agent 的逻辑 manifest 可以晋级,但环境绑定值由环境配置注入,不能把生产密钥提交进版本。发布单固定要晋级的版本 hash,经过评估门禁后由发布服务写入目标环境,避免运营人员手动复制 prompt 造成漂移。

灰度按租户、应用、用户组或稳定 hash 分桶,并为每个版本设置流量比例、开始时间、自动停止阈值和回滚目标。先做 shadow,再做 1% 低风险流量,观察任务成功率、人工转接率、工具错误率、安全拦截、P95 延迟、缓存命中和成本。高风险动作仍需确认,不因为灰度就放宽权限。版本回滚不只切模型,还要同时回滚提示词、工具 schema、知识库版本、guardrails 和路由策略。

平台持续做 drift check:比较数据库中的 active manifest、运行时缓存、Worker 加载版本和外部工具实际版本;发现 hash 不一致就告警或阻止新 run。已经产生的 trace 保留实际版本,不能只显示“当前 Agent 名称”。工具和知识库的向后不兼容变更采用新版本并保留旧版本一段时间,给在途任务完成和回滚留窗口。

替代方案何时使用

低风险内部 Agent 可以使用应用级开关快速灰度;面向外部用户或涉及写操作时,应使用发布单、审批、稳定分桶和自动回滚,不要靠人工改数据库开关。

常见扣分点

  • 把灰度理解为只部署两套 Pod,没有请求分流和指标门禁。
  • 回滚只回滚模型,忽略 prompt、工具、知识库和安全策略。
  • 允许线上直接编辑配置,导致无法审计和复现。

持续学习,持续实践。