四、系统设计篇 (开放思辨)
以下题目无标准答案, 重点是看候选人的取舍框架和风险意识.
Q18. 设计一个”agentic 低代码平台”, 你会优先考虑哪些设计原则?
讨论方向:
谁是 source of truth? Agent 生成的代码是 source, 还是低代码 DSL 是 source? 二者双向同步是个工程地狱, 必须二选一.
可逆性与版本控制 —— agent 一键改 50 个组件后, 必须能 diff、能 revert、能 review.
沙箱与权限分级 —— 平台用户的 agent 不能直接访问数据库, 必须经过权限网关 (类似 permission mode).
上下文供给 —— 业务知识怎么进入 agent? 是要求用户写 CLAUDE.md 风格的指南, 还是从已有数据自动提炼?
失败可观测 —— agent 调用第三方 API/MCP 的失败必须能回放, 而不仅是”它说失败了”.
不要替代用户思考 —— 设计良好的 agentic 平台让用户减少打字, 但不减少决策; 关键岔路必须显式确认.
可组合 —— 平台能力应该像 skill/plugin 一样可被组合, 而不是一堆魔法按钮.
成本可见 —— 每个 agent 操作的 token / API / 时延都要前置可见, 否则用户会失控.
Q19. 设计一个企业内部的 “MCP 网关”, 你会如何处理权限、审计、限流?
讨论方向:
权限: 谁能 list 哪些 tool? 一个 read-only 角色看不到 delete_* 工具的 schema, 减少误调用面.
审计: 每次 tool call 落日志, 包含 user / agent_id / 参数 / 返回大小 / 耗时.
限流: 同一 user 的 MCP tool 调用 QPS / 并发数, 防止 agent 跑飞.
数据脱敏: Tool 返回值经过中间层脱敏 (PII、密钥), 再回到 agent.
降级策略: 后端服务挂了, MCP 网关应返回 structured error 而不是超时, 让 agent 知道”这条路不通”.
版本管理: Tool schema 改了怎么 backward compatible? 加版本号, 旧客户端继续看到旧 schema.
隔离: 不同租户的 MCP server 进程隔离, 避免相互看到对方数据.
Q20. 如果让你设计 Claude Code / Codex 的多 agent 协作模型, 你会选择”星型 (主-子)“还是”网状 (互通)“? 为什么?
讨论方向:
星型优点: 易调试、上下文可控、责任清晰; 缺点: 主对话成为瓶颈, 并行度有限.
网状优点: 接近真实团队, 并行高; 缺点: 易出现”agent 间循环对话”、“上下文爆炸”、“责任不清”、“调试地狱”.
现实答案: 大多数任务星型够用, 极少数复杂多角色任务才上网状, 而且要配合消息预算、总线程数上限、可观测的对话图等护栏.
进一步思辨: 多 agent 协作的 ROI 是否真的高于”一个更强的单 agent”? 如果模型能力继续提升, 多 agent 编排可能变成短期权宜之计.
Q21. 设计一个”AI 安全 review agent”, 要避免哪些坑?
讨论方向:
不能只看 diff —— 安全问题往往出现在 diff 没改的”调用方”. 必须能扩展到上下文.
不能盲信测试通过 —— 测试覆盖不到的 (反序列化、命令注入) 才是常出问题的地方.
不能让 agent 自己跑攻击命令 —— review 阶段必须只读, 否则 review agent 反而成攻击面.
要 cross-check —— 用第二个模型 (例如 Codex) 独立 review 一遍, 降低单模型盲点.
不要追求”零误报” —— 安全 review 宁可误报也别漏报, 但要分级 (P0 / P1 / P2), 让人工聚焦.
可解释 —— agent 必须能给出”为什么这是漏洞”的论证链, 而不是只丢一句”this is unsafe”.
Q22. 设计一个”长期记忆”机制 (类似 Claude Code 的 auto memory), 你会怎么决定记什么、不记什么?
讨论方向:
应该记: 用户反复纠正过的偏好 (代码风格、命名)、项目级硬约束、易遗忘的 trivia (端口号、密钥位置).
不应该记: 一次性的临时对话、含有敏感数据的内容、过时的事实 (上次的 bug 早已修复).
如何更新? 写时合并 (避免重复)、定期 GC (太老的条目降权或删除)、用户可以一键审查 / 编辑 memory 文件.
如何避免污染? 把 memory 限定大小 (例如 25KB), 超出后按”使用频率 + 用户标记”取舍.
跨项目共享 vs 项目独立? 偏好类跨项目共享, 项目知识类不共享 —— 否则 A 项目的密钥被误用到 B 项目.