Agent智能体架构设计-知识整理
- Agent智能体架构设计-知识整理
-
- 目录
- [第 0 章 一图看懂全文结构](#第 0 章 一图看懂全文结构)
- [第 1 章 智能体的分类:控制权归属 × 自主程度](#第 1 章 智能体的分类:控制权归属 × 自主程度)
-
- [1.1 三类智能体对照](#1.1 三类智能体对照)
- [1.2 通用型智能体 vs 对话式机器人](#1.2 通用型智能体 vs 对话式机器人)
- [第 2 章 Agent 工程方法论](#第 2 章 Agent 工程方法论)
-
- [2.1 五个 Engineering](#2.1 五个 Engineering)
- [2.2 智能体能力构成:Agent 七件套](#2.2 智能体能力构成:Agent 七件套)
- [2.3 概念边界:Loop / Harness / Skill / Tool / MCP](#2.3 概念边界:Loop / Harness / Skill / Tool / MCP)
- [2.4 循环停止条件(Loop 的收敛协议)](#2.4 循环停止条件(Loop 的收敛协议))
- [2.5 中间件 vs 插件](#2.5 中间件 vs 插件)
- [2.6 三层数据格式约束](#2.6 三层数据格式约束)
- [2.7 LLM模态选型原则](#2.7 LLM模态选型原则)
- [第 3 章 通用智能体架构设计](#第 3 章 通用智能体架构设计)
-
- [3.1 四个设计原则](#3.1 四个设计原则)
- [3.2 三层架构全景](#3.2 三层架构全景)
- [3.3 L1 模型协议层](#3.3 L1 模型协议层)
- [3.4 L2 通用编排层](#3.4 L2 通用编排层)
- [3.5 L3 产品能力层](#3.5 L3 产品能力层)
- [第 4 章 智能体核心执行流程](#第 4 章 智能体核心执行流程)
-
- [4.1 七层链路](#4.1 七层链路)
- [4.2 运行流程(以 Codex 类系统为例)](#4.2 运行流程(以 Codex 类系统为例))
- [第 5 章 框架对比与选型](#第 5 章 框架对比与选型)
-
- [5.1 主流框架能力对比](#5.1 主流框架能力对比)
- [5.2 LangChain 标准化模型接口的价值(避免供应商锁定)](#5.2 LangChain 标准化模型接口的价值(避免供应商锁定))
- [5.3 LangChain vs LangGraph 选型逻辑](#5.3 LangChain vs LangGraph 选型逻辑)
- [5.4 可解耦、可演进的 Agent 分层架构(支撑团队业务)](#5.4 可解耦、可演进的 Agent 分层架构(支撑团队业务))
- [第 6 章 智能体执行指标体系](#第 6 章 智能体执行指标体系)
-
- [6.1 核心效率指标](#6.1 核心效率指标)
- [6.2 质量指标](#6.2 质量指标)
- [6.3 成本指标](#6.3 成本指标)
- [6.4 风险指标](#6.4 风险指标)
- [6.5 指标使用原则](#6.5 指标使用原则)
- [第 7 章 常见问题](#第 7 章 常见问题)
-
- [7.1 初中级](#7.1 初中级)
-
- [Q1(TS 基础)你 TypeScript 掌握怎么样?TypeScript 与 Zod 为什么会在 AI Agent 开发中应用广泛?你认为前端往 Agent 能有哪些沉淀?](#Q1(TS 基础)你 TypeScript 掌握怎么样?TypeScript 与 Zod 为什么会在 AI Agent 开发中应用广泛?你认为前端往 Agent 能有哪些沉淀?)
- [Q2(通用智能体)你知道怎么搭建一个通用型智能体吗?说说类似 OpenClaw、Codex 智能体的全栈设计思路](#Q2(通用智能体)你知道怎么搭建一个通用型智能体吗?说说类似 OpenClaw、Codex 智能体的全栈设计思路)
- [Q3(前端视角)作为前端开发,请说说你对于 AI 提效工具的理解,Codex、Trae、OpenClaw 这些工具听过吗?说说你的看法](#Q3(前端视角)作为前端开发,请说说你对于 AI 提效工具的理解,Codex、Trae、OpenClaw 这些工具听过吗?说说你的看法)
- [Q4(Harness 入门)有没有了解过 Harness?为什么需要 Harness?在你的 Agent 产品中如何设计 Harness 体系?](#Q4(Harness 入门)有没有了解过 Harness?为什么需要 Harness?在你的 Agent 产品中如何设计 Harness 体系?)
- [Q5(认知)前端为什么要学全栈 Agent?跟传统前端工程有什么区别?Harness 和 Loop 这些概念到底是什么?](#Q5(认知)前端为什么要学全栈 Agent?跟传统前端工程有什么区别?Harness 和 Loop 这些概念到底是什么?)
- [7.2 中高级](#7.2 中高级)
-
- [Q6(TS 框架)基于 TypeScript 搭建 AI Agents 基础框架(参考 LangGraph 核心能力),说说你的核心设计思路与关键代码实现逻辑](#Q6(TS 框架)基于 TypeScript 搭建 AI Agents 基础框架(参考 LangGraph 核心能力),说说你的核心设计思路与关键代码实现逻辑)
- [Q7(LangChain 选型)聊聊 LangChain 标准化模型接口对避免供应商锁定的价值,以及如何根据业务复杂度在 LangChain 和 LangGraph 之间做选型?如何设计可解耦、可演进的 Agent 分层架构来支撑团队业务?](#Q7(LangChain 选型)聊聊 LangChain 标准化模型接口对避免供应商锁定的价值,以及如何根据业务复杂度在 LangChain 和 LangGraph 之间做选型?如何设计可解耦、可演进的 Agent 分层架构来支撑团队业务?)
- Q8(模型与智能体)请站在前端角度深刻聊聊模型和智能体的关系,如何选择模型、如何开发智能体来支撑团队或者公司业务?
- [Q9(工程链路)实现"从 Vite 构建到 Agent 自动修复 Bug"的功能,完整工程链路是怎么设计的?](#Q9(工程链路)实现"从 Vite 构建到 Agent 自动修复 Bug"的功能,完整工程链路是怎么设计的?)
- [Q10(Harness / 术语辨析)DeepSeek Harness 的体系设计为什么会引起关注?背后的插件机制原理你有了解过吗?](#Q10(Harness / 术语辨析)DeepSeek Harness 的体系设计为什么会引起关注?背后的插件机制原理你有了解过吗?)
- [7.3 专家级](#7.3 专家级)
-
- [Q11(自研框架)如果让你实现对标 LangGraph 的 TypeScript AI Agents 框架,说说你的整体架构设计、核心模块划分与底层源码实现的关键难点突破](#Q11(自研框架)如果让你实现对标 LangGraph 的 TypeScript AI Agents 框架,说说你的整体架构设计、核心模块划分与底层源码实现的关键难点突破)
- [Q12(系统设计)如果让你基于 DeepAgents 设计完整类似 OpenClaw、Codex 系统及操作 AI Agent,请给出你的设计方案和核心代码实现](#Q12(系统设计)如果让你基于 DeepAgents 设计完整类似 OpenClaw、Codex 系统及操作 AI Agent,请给出你的设计方案和核心代码实现)
- [Q13(Coding Agent)如果让你开发类似 Codex 的 Coding AI 智能体,有没有明确的实现方案和思路?请实现一个核心功能版本 Codex](#Q13(Coding Agent)如果让你开发类似 Codex 的 Coding AI 智能体,有没有明确的实现方案和思路?请实现一个核心功能版本 Codex)
- [Q14(架构 Leader)假如你是 Leader,来负责高可用低耦合的 Agent 产品,请说一说你的完整架构与落地思路(微内核 / 插件化机制设计)](#Q14(架构 Leader)假如你是 Leader,来负责高可用低耦合的 Agent 产品,请说一说你的完整架构与落地思路(微内核 / 插件化机制设计))
- [Q15(数据结构)State Schema、Graph Schema 与业务 DSL 分别约束什么?](#Q15(数据结构)State Schema、Graph Schema 与业务 DSL 分别约束什么?)
- Q16(指标体系)如何定义和评估智能体执行指标?
- [Q17(架构治理)作为架构师,如何让多产品线共享同一套 Agent 内核?](#Q17(架构治理)作为架构师,如何让多产品线共享同一套 Agent 内核?)
- [Q18(Coding Agent 模块)类似 Codex 的 Coding Agent 应该划分哪些模块?](#Q18(Coding Agent 模块)类似 Codex 的 Coding Agent 应该划分哪些模块?)
- [附录 A:术语速查表](#附录 A:术语速查表)
- [附录 B:思考作答模板与一句话主线](#附录 B:思考作答模板与一句话主线)
-
- [B.1 五步作答模板](#B.1 五步作答模板)
- [B.2 一句话主线](#B.2 一句话主线)
Agent智能体架构设计-知识整理
本文档范围:智能体分类 → 工程方法论 → 架构设计 → 执行流程 → 框架选型 → 指标体系 → 常见问题。
目录
| 章节 | 内容 | 回答什么问题 |
|---|---|---|
| [第 1 章](#章节 内容 回答什么问题 第 1 章 智能体的分类 有哪几类 Agent,区别在哪 第 2 章 Agent 工程方法论 五个 Engineering 管什么、概念边界怎么切 第 3 章 通用智能体架构设计 四条设计原则 + L1/L2/L3 三层架构 第 4 章 智能体核心执行流程 一次任务从入口到落盘怎么走 第 5 章 框架对比与选型 LangChain / LangGraph / DeepAgents 怎么选 第 6 章 执行指标体系 怎么衡量一个 Agent 好不好 第 7 章 常见问题(初中级 / 中高级 / 专家级) 作答思路与骨架 附录 A 术语速查表 名词快速对照 附录 B 作答模板与一句话主线 组织解题思路) | 智能体的分类 | 有哪几类 Agent,区别在哪 |
| [第 2 章](#章节 内容 回答什么问题 第 1 章 智能体的分类 有哪几类 Agent,区别在哪 第 2 章 Agent 工程方法论 五个 Engineering 管什么、概念边界怎么切 第 3 章 通用智能体架构设计 四条设计原则 + L1/L2/L3 三层架构 第 4 章 智能体核心执行流程 一次任务从入口到落盘怎么走 第 5 章 框架对比与选型 LangChain / LangGraph / DeepAgents 怎么选 第 6 章 执行指标体系 怎么衡量一个 Agent 好不好 第 7 章 常见问题(初中级 / 中高级 / 专家级) 作答思路与骨架 附录 A 术语速查表 名词快速对照 附录 B 作答模板与一句话主线 组织解题思路) | Agent 工程方法论 | 五个 Engineering 管什么、概念边界怎么切 |
| [第 3 章](#章节 内容 回答什么问题 第 1 章 智能体的分类 有哪几类 Agent,区别在哪 第 2 章 Agent 工程方法论 五个 Engineering 管什么、概念边界怎么切 第 3 章 通用智能体架构设计 四条设计原则 + L1/L2/L3 三层架构 第 4 章 智能体核心执行流程 一次任务从入口到落盘怎么走 第 5 章 框架对比与选型 LangChain / LangGraph / DeepAgents 怎么选 第 6 章 执行指标体系 怎么衡量一个 Agent 好不好 第 7 章 常见问题(初中级 / 中高级 / 专家级) 作答思路与骨架 附录 A 术语速查表 名词快速对照 附录 B 作答模板与一句话主线 组织解题思路) | 通用智能体架构设计 | 四条设计原则 + L1/L2/L3 三层架构 |
| [第 4 章](#章节 内容 回答什么问题 第 1 章 智能体的分类 有哪几类 Agent,区别在哪 第 2 章 Agent 工程方法论 五个 Engineering 管什么、概念边界怎么切 第 3 章 通用智能体架构设计 四条设计原则 + L1/L2/L3 三层架构 第 4 章 智能体核心执行流程 一次任务从入口到落盘怎么走 第 5 章 框架对比与选型 LangChain / LangGraph / DeepAgents 怎么选 第 6 章 执行指标体系 怎么衡量一个 Agent 好不好 第 7 章 常见问题(初中级 / 中高级 / 专家级) 作答思路与骨架 附录 A 术语速查表 名词快速对照 附录 B 作答模板与一句话主线 组织解题思路) | 智能体核心执行流程 | 一次任务从入口到落盘怎么走 |
| [第 5 章](#章节 内容 回答什么问题 第 1 章 智能体的分类 有哪几类 Agent,区别在哪 第 2 章 Agent 工程方法论 五个 Engineering 管什么、概念边界怎么切 第 3 章 通用智能体架构设计 四条设计原则 + L1/L2/L3 三层架构 第 4 章 智能体核心执行流程 一次任务从入口到落盘怎么走 第 5 章 框架对比与选型 LangChain / LangGraph / DeepAgents 怎么选 第 6 章 执行指标体系 怎么衡量一个 Agent 好不好 第 7 章 常见问题(初中级 / 中高级 / 专家级) 作答思路与骨架 附录 A 术语速查表 名词快速对照 附录 B 作答模板与一句话主线 组织解题思路) | 框架对比与选型 | LangChain / LangGraph / DeepAgents 怎么选 |
| [第 6 章](#章节 内容 回答什么问题 第 1 章 智能体的分类 有哪几类 Agent,区别在哪 第 2 章 Agent 工程方法论 五个 Engineering 管什么、概念边界怎么切 第 3 章 通用智能体架构设计 四条设计原则 + L1/L2/L3 三层架构 第 4 章 智能体核心执行流程 一次任务从入口到落盘怎么走 第 5 章 框架对比与选型 LangChain / LangGraph / DeepAgents 怎么选 第 6 章 执行指标体系 怎么衡量一个 Agent 好不好 第 7 章 常见问题(初中级 / 中高级 / 专家级) 作答思路与骨架 附录 A 术语速查表 名词快速对照 附录 B 作答模板与一句话主线 组织解题思路) | 执行指标体系 | 怎么衡量一个 Agent 好不好 |
| [第 7 章](#章节 内容 回答什么问题 第 1 章 智能体的分类 有哪几类 Agent,区别在哪 第 2 章 Agent 工程方法论 五个 Engineering 管什么、概念边界怎么切 第 3 章 通用智能体架构设计 四条设计原则 + L1/L2/L3 三层架构 第 4 章 智能体核心执行流程 一次任务从入口到落盘怎么走 第 5 章 框架对比与选型 LangChain / LangGraph / DeepAgents 怎么选 第 6 章 执行指标体系 怎么衡量一个 Agent 好不好 第 7 章 常见问题(初中级 / 中高级 / 专家级) 作答思路与骨架 附录 A 术语速查表 名词快速对照 附录 B 作答模板与一句话主线 组织解题思路) | 常见问题(初中级 / 中高级 / 专家级) | 作答思路与骨架 |
| [附录 A](#章节 内容 回答什么问题 第 1 章 智能体的分类 有哪几类 Agent,区别在哪 第 2 章 Agent 工程方法论 五个 Engineering 管什么、概念边界怎么切 第 3 章 通用智能体架构设计 四条设计原则 + L1/L2/L3 三层架构 第 4 章 智能体核心执行流程 一次任务从入口到落盘怎么走 第 5 章 框架对比与选型 LangChain / LangGraph / DeepAgents 怎么选 第 6 章 执行指标体系 怎么衡量一个 Agent 好不好 第 7 章 常见问题(初中级 / 中高级 / 专家级) 作答思路与骨架 附录 A 术语速查表 名词快速对照 附录 B 作答模板与一句话主线 组织解题思路) | 术语速查表 | 名词快速对照 |
| [附录 B](#章节 内容 回答什么问题 第 1 章 智能体的分类 有哪几类 Agent,区别在哪 第 2 章 Agent 工程方法论 五个 Engineering 管什么、概念边界怎么切 第 3 章 通用智能体架构设计 四条设计原则 + L1/L2/L3 三层架构 第 4 章 智能体核心执行流程 一次任务从入口到落盘怎么走 第 5 章 框架对比与选型 LangChain / LangGraph / DeepAgents 怎么选 第 6 章 执行指标体系 怎么衡量一个 Agent 好不好 第 7 章 常见问题(初中级 / 中高级 / 专家级) 作答思路与骨架 附录 A 术语速查表 名词快速对照 附录 B 作答模板与一句话主线 组织解题思路) | 作答模板与一句话主线 | 组织解题思路 |
第 0 章 一图看懂全文结构
text
认知层 智能体分类(工作流 / 通用 / 垂直场景)
↓
方法层 Prompt / Context / Harness / Loop / Graph Engineering + 概念边界
↓
约束层 架构四原则(依赖倒置 · 协议先行 · 核心精简 · 扩展开放)
↓
结构层 L1 模型协议层 → L2 通用编排层 → L3 产品能力层
↓
流程层 目标解析 → 规划(DAG) → 编排调度 → 子智能体 → 技能(SOP) → 工具 → 持久化
↓
选型层 LangChain / LangGraph / DeepAgents / Spring AI / AgentScope-Java
↓
度量层 效率 · 质量 · 成本 · 风险
↓
实战层 常见问题(初中级 / 中高级 / 专家级)+ 作答模板
阅读建议:第 2 章(概念边界)和第 3 章(分层架构)是全文的地基,常见问题都在引用这两章。
第 1 章 智能体的分类:控制权归属 × 自主程度
分类的两个维度:控制权归属(人/规则 vs 模型) 与 自主程度(路径是否预先定义)。
1.1 三类智能体对照
| 类型 | 控制权归属 | 路径特征 | 可预测性 | 典型产品 |
|---|---|---|---|---|
| 通用智能体 | 模型(Model-in-the-loop) | 只给目标,模型自己决定分几步、用什么工具、何时调整策略 | 低( emergent,需 Harness 兜底) | Codex、Cursor、Claude Code、OpenClaw |
| 工作流智能体 | 代码/规则(开发者) | 路径预先定义、显式编排 | 高(可预测) | 开发平台:Coze(字节)、Dify; 一些成品办公智能体已经内嵌了工作流,如:WorkBuddy、豆包Worker、千问Worker |
| 垂直业务场景智能体 | 领域规则 + 轻量模型决策 | 场景固定、能力收敛 | 中-高 | 剪映(智能剪辑)、Figma AI(设计)、智能客服 |
关键区别一句话:工作流智能体是"人写流程图,模型填空";通用智能体是"人给目标,模型写流程图"。
1.2 通用型智能体 vs 对话式机器人
| 维度 | 对话式机器人 | 通用型智能体 |
|---|---|---|
| 定位 | 单轮/多轮问答交互 | 目标导向,自动化任务规划与执行,拆解为子智能体并发执行 |
| 能力 | 内容生成、轻量工具调用 | 任务分解(Planning)、多轮执行循环、多工具协同、文件操作、操作系统级命令、Skill 调用 |
| 状态 | 会话上下文为主,无长期任务态 | 任务态 + 会话态 + 文件系统外化记忆 |
| 终止条件 | 用户停止提问 | 达成目标契约或触发停止协议(maxTurns / 验证器通过 / 人工介入) |
第 2 章 Agent 工程方法论
2.1 五个 Engineering
| 范式 | 回答的问题 | 性质 | 核心抓手 |
|---|---|---|---|
| Prompt Engineering | 单轮交互中如何表达:措辞、角色设定、示例、输出格式约束,让模型这一次答对 | 静态 | few-shot、角色设定、输出格式约束(JSON Schema) |
| Context Engineering | 模型做每个决策时,上下文窗口里装什么、以什么结构装、什么时候装、什么时候撤掉、超限时如何压缩 | 动态 | 上下文组装顺序、外化到文件、检索注入、压缩与裁剪策略 |
| Harness Engineering | 定边界、供环境:工具权限、沙箱隔离、状态持久化(崩溃可恢复)、验证检查(test/lint) | 静态配置 | 解决输出不稳定、幻觉等问题的环境侧方案:安全、可观测、可恢复 |
| Loop Engineering | 何时继续、何时停止:执行 → 外部验证 → 决定重试 / 回滚 / 停止 / 交给人 | 动态执行流程 | 设计带验证器 和停止协议 的循环;每一次执行都是一次 ReAct:Thought → Action → Observation,循环往复直到得出最终答案 |
| Graph Engineering | 定分工、管交接 :写代码的节点与检查代码的节点分离,检查者用干净上下文、只看结果;并行节点处理无依赖任务 | 静态结构 + 动态调度 | 避免线性等待;节点拆分 + 条件边 + 循环边 |
ReAct 是 Loop 的原子 :Thought(推理)→ Action(行动)→ Observation(观察)→ 循环。
五个 Engineering 的层次关系:Prompt 管一次对话的表达,Context 管窗口的内容,Harness 管环境边界,Loop 管执行节奏,Graph 管多人分工。
2.2 智能体能力构成:Agent 七件套
text
Agent = LLM + Planning + Memory + Tool Use + Verifier + Guardrail + Telemetry
| 组成 | 作用 | 缺失后的典型问题 |
|---|---|---|
| LLM | 理解、推理、生成、选择下一步动作 | 没有智能决策能力 |
| Planning | 任务分解、排序、制定执行计划 | 只会单轮回答,无法完成复杂任务 |
| Memory | 短期上下文、长期知识、任务状态 | 多轮断片、无法恢复、无法积累经验 |
| Tool Use | 检索、文件、代码、API、系统命令 | 只能"说",不能"做" |
| Verifier | 测试、lint、类型检查、规则校验 | 幻觉无法被拦截,错误结果直接交付 |
| Guardrail 护栏 | 权限、沙箱、审批、内容安全 | 越权操作、数据泄露、不可控副作用 |
| Telemetry 遥测 | 日志、链路、Token、成本、指标 | 出问题无法定位,无法评估与优化 |
记忆口诀:模型决定上限,Harness 决定下限,Verifier 决定结果可不可信。
2.3 概念边界:Loop / Harness / Skill / Tool / MCP
| 概念 | 本质 | 解决的问题 | 典型内容 |
|---|---|---|---|
| Loop | 最小执行闭环 | 何时调用模型、何时执行工具、何时停止 | 模型调用、工具执行、结果回灌、停止条件 |
| Harness | 执行环境与约束外壳 | 如何让 Agent 安全、稳定、可观测、可恢复 | 权限、沙箱、持久化、验证、审批、遥测 |
| Skill | 行为规范包 | 在特定场景下如何规范地使用工具 | SOP、提示词、参数约束、重试策略 |
| Tool | 原子能力 | 如何与外部世界交互 | 读文件、写文件、执行命令、检索、调 API |
| MCP | 工具接入协议 | 如何标准化接入外部能力 | Server 提供 Tool/Resource/Prompt,Client 消费 |
一句话记忆:
Loop 决定"继续还是停止",Harness 决定"在什么边界内执行",Skill 决定"怎么做才规范",Tool 决定"具体做什么",MCP 决定"能力如何接进来"。
2.4 循环停止条件(Loop 的收敛协议)
没有停止协议的 Loop 等于没有出口。必须显式设计以下条件,并明确优先级:
- 正常收敛:模型不再请求工具调用,产出最终答复。
- 预算上限 :达到
maxTurns、Token 或成本预算上限。 - 外部中断 :用户取消、超时或
AbortSignal触发。 - 验证失败:验证器连续失败达到阈值,回滚并转人工处理。
- 风险拦截:命中高危操作,暂停循环等待人工确认。
反例:把"模型自称任务已完成"当作唯一停止条件 ------ 模型的自我判断不能替代外部验证。
2.5 中间件 vs 插件
| 维度 | 中间件(Middleware) | 插件(Plugin / Extension) |
|---|---|---|
| 本质 | 流程中的拦截器,控制或修改执行流程 | 能力的安装包,把一组相关能力(可含中间件、工具)打包接入 |
| 典型用途 | 日志记录、权限校验、敏感信息过滤、提示词转换、错误重试 | 一键安装/启用:工具集 + 技能 + 中间件 + MCP 服务的组合 |
| 工作方式 | 以链 的形式工作:请求依次穿过多个中间件,每个都可在调用下一环节之前/之后 执行操作,甚至短路(阻断)流程 | 声明式注册,安装即生效,可整体启用/禁用 |
| 归属层 | 运行时基础设施:不增加"新技能",而是改变已有流程的行为 / 增加横切关注点(安全、可观测) | 分发与集成层:解决"如何把一堆相关能力方便地装进系统" |
| 在 DeepAgents 中的体现 | TodoList / Filesystem / SubAgent / Summarization / PromptCaching / PatchToolCalls 等 Middleware | Skills 包、MCP Server、Extensions |
一句话区分:中间件改的是"流程怎么走",插件装的是"系统能干什么"。 插件通常内部包含若干中间件。
2.6 三层数据格式约束
| 概念 | 定位 | 约束对象 | 作用 |
|---|---|---|---|
| State Schema(状态模式) | 「状态模式」 | 整个多智能体系统的数据结构 | 规定图中各节点(智能体)之间传递的共享状态包含哪些字段、每个字段是什么类型 |
| Graph Schema(协作契约) | 「协作的契约」 | 系统架构 ,定义多智能体中的数据流转规则 | 谁产出什么、谁消费什么、流转顺序与分支条件 |
| 业务 DSL(输出模具) | 「输出的模具」 | 单次模型调用,收敛输出 | 把模型自由散漫的文本强制规范为结构化数据(如 JSON),大幅提升输出的语法有效性与可解析性 |
三者是从宏观到微观的三道闸门:State Schema 管"共享什么",Graph Schema 管"怎么流动",业务 DSL 管"单次产出是否合格"。
2.7 LLM模态选型原则
| 模态 | 方向 | 说明 |
|---|---|---|
| 文本内容 | 内容生成 | 通用文本生成、摘要、改写、翻译 |
| 图片内容 | 文生图 / 图生图 | 设计稿生成、UI 草图转图 |
| 音频内容 | 文生音频(TTS) | 播报、配音 |
| 视频内容 | 文生视频 / 图生视频 | Seedance 等视频生成模型 |
选型原则:按步骤分模------规划与编码用强推理模型,摘要与格式化用低成本小模型,多模态任务才上多模态模型。
第 3 章 通用智能体架构设计
3.1 四个设计原则
定位:作为通用智能体架构负责人,在项目启动时确立四条不可妥协的设计原则,所有技术决策必须通过这四条原则的检验。
| 原则 | 核心表述 | 落地判据(如何检验一条新需求是否合规) |
|---|---|---|
| 原则一:依赖倒置 | 核心 Loop 依赖抽象协议,不依赖具体模型 SDK 与工具实现 | Model 接口是唯一模型接入点,Tool 接口是唯一工具接入点。切换供应商、新增工具,核心 Loop 一行代码都不改 |
| 原则二:协议先行 | Message / Tool / Model / AgentEvent 是系统宪法,先锁协议再写实现 |
协议变更必须走架构评审;协议稳定 → 各模块可并行开发、独立测试(可 mock 协议做单测) |
| 原则三:核心精简 | Loop 内核保持最小正确闭环(约 100 行有效代码),复杂能力通过 Harness 外壳与钩子系统扩展 | 若某功能需 >120 行才能塞进核心 → 它应该被抽到扩展层 |
| 原则四:扩展开放 | 对扩展开放(钩子 / 插件 / 技能 / MCP),对修改关闭(核心 Loop 稳定) | 产品层差异化需求通过配置 + 扩展点实现,而不是 fork 核心代码;多产品线共享同一内核 |
四条原则的内在关系:原则一/二保证可替换 (不锁定供应商),原则三保证可维护 (内核小 ⇒ bug 少、可测),原则四保证可规模化复用(一套内核 N 个产品线)。
3.2 三层架构全景
关于分层编号(先看这张表,后文所有编号以此为准):本文档有三处出现分层视角,编号不同、含义不同,不要混用。
视角 编号 含义 第 3 章 · 运行时三层(本章) L1/L2/L3L1 模型协议层 · L2 通用编排层 · L3 产品能力层 5.4 节 · 团队分层 L1~L4在运行时三层之上,把 L3 再拆为「L3 能力层(可复用)+ L4 业务层(差异化)」 Q11 · 自研框架五层 E0~E4工程落地视角:E0 适配层 / E1 协议层 / E2 内核层 / E3 编排层 / E4 生态层 对应关系:
E1 ≈ L1,E2 + E3 ≈ L2,E4 ≈ L3,E0是 L1 中 Provider 适配的下沉。
- L1 模型协议层:唯一职责就是把不同模型供应商的 API 统一成内部
Model接口 。核心包零 LLM SDK 依赖,所有 Provider 作为独立包实现。 - L2 通用编排层:Agent 的运行时内核 ,包含 Loop 与 Harness 外壳,Loop 负责最小闭环,Harness 负责生产级能力。
- L3 产品能力层:面向具体产品场景,在共享内核之上构建差异化能力。
3.3 L1 模型协议层
| 能力 | 说明 |
|---|---|
| 统一多 Provider API | OpenAI / Anthropic / Google / Bedrock / 本地模型(Ollama、vLLM、llama.cpp),每个 Provider 独立包、独立发版 |
| 流式 EventStream | 统一流式响应协议,支持三种增量事件:text_delta、thinking_delta、tool_call_delta |
| 消息协议转换 | 内部 Message → 各 Provider API 格式,自动处理 tool_calls、tool_call_id 等协议差异 |
| Model Catalog(模型目录服务) | 按能力 (推理/编码/多模态)、成本 、延迟 动态选型;配合 prepareNextTurn 钩子实现"简单任务用小模型、复杂任务用大模型" |
设计要点:Provider 独立发版 ⇒ 某家 API 变更不影响其他家;Model Catalog 是成本治理的抓手(同一 Agent 内按步骤分级用模)。
3.4 L2 通用编排层
| 模块 | 关键设计 |
|---|---|
| Agent Loop 内核 | 约 100 行,实现「模型调用 → 工具执行 → 结果回灌 → 再推理」最小闭环;含并行工具、maxTurns、AbortSignal、事件生命周期 |
| 流式响应 | partial message 不变量,逐 token 推送 UI;首字等待从秒级降到百毫秒级 |
| 会话管理 | 会话持久化(JSONL 文件或 SQLite)、会话树(分支 / 回溯 / 时间旅行)、状态管理 |
| 上下文压缩 | 消息历史超 token 预算时,自动用模型摘要旧消息并保留关键信息,防止上下文窗口溢出 |
| 技能系统 | 可加载的指令包,在特定场景注入 system prompt 或工具,类似「专家模式」切换 |
| 钩子系统 | 8 个生命周期钩子(见下表),产品层零修改核心代码即可定制行为 |
| 遥测与状态归约 | token 用量统计、工具调用追踪、性能指标采集;AgentEvent 流归约为不可变 UI 状态,支持时间旅行调试 |
| Sandbox 沙箱 | 工具执行沙箱化、文件系统隔离、网络访问白名单、高危操作人工确认 |
8 个生命周期钩子:
beforeToolCall → 工具调用前:权限校验、参数改写、危险命令拦截
afterToolCall → 工具调用后:输出截断、敏感信息脱敏、结果入库
prepareNextTurn → 下一轮前:上下文组装、模型动态选型(大小模型切换)
shouldStopAfterTurn → 停止判定:是否达到 maxTurns / 目标契约 / 预算上限
getSteeringMessages → 注入转向消息(用户中途插话、优先级调整)
getFollowUpMessages → 注入追问消息(子任务完成后自动续接)
transformContext → 上下文转换:压缩、裁剪、重排、外化到文件
convertToLlm → 最终 LLM 请求格式转换(消息 → Provider 格式;部分框架文档写作 convertToLLM)
3.5 L3 产品能力层
| 方向 | 内容 |
|---|---|
| 领域工具集 | 编码工具(bash / read / write / edit / grep / find / ls)、浏览器自动化(Playwright)、知识库检索(RAG 工具)、企业内部系统工具 |
| 多端交互界面 | TUI 终端(差分渲染、键盘绑定);Electron 桌面端(Local Daemon + IPC);Web/H5(SSE 流式渲染、多模态消息);移动端(React Native + 双向信令) |
| 扩展系统 | Extensions 第三方插件、MCP 服务接入、斜杠命令(/clear、/model、/help) |
三层之间的依赖方向严格向下:L3 → L2 → L1 ,禁止反向依赖;跨层通信一律走协议(L2 只认
Model接口,不认 OpenAI)。
第 4 章 智能体核心执行流程
4.1 七层链路
① 入口与目标解析(目标契约化)
↓
② 模型层:决策与规划(产出子任务 DAG)
↓
③ 执行编排层:调度 + 异常回退(控制平面)
↓
④ 子智能体层:角色化能力切片
↓
⑤ 技能层:行为规范与执行标准(SOP)
↓
⑥ 工具层:实际执行
↓
⑦ 持久化层:结果落盘 + 安全校验(横切)
| 层 | 职责 | 关键设计 |
|---|---|---|
| ① 入口与目标解析 | 目标契约化 ,而非直接调用模型。把模糊指令转化为可验证的完成标准与终止条件,产出结构化任务描述 | 契约 = 完成标准(DoD)+ 终止条件 + 验收方式。没有契约就没有"完成",循环无法收敛 |
| ② 模型层:决策与规划 | 意图理解、任务分解、下一步动作选择 | 复杂场景下模型不直接执行 ,而是生成子任务 DAG------这是编排层能调度和回退的前提 |
| ③ 执行编排层 | 整个流程的控制平面。读取子任务 DAG,按依赖关系把就绪任务分发给子智能体,监控每个节点状态 | 支持并行分发、依赖门控、失败重试、局部回滚、人工接管 |
| ④ 子智能体层 | 接收子任务、调用技能层、回传结果(检索智能体 / 代码智能体 / 分析智能体) | 角色化切片 ⇒ 每个子智能体上下文干净、职责单一;上下文隔离是最有效的 token 经济手段 |
| ⑤ 技能层 | 子智能体与工具之间的中间规范层 。把通用工具封装为带约束的 SOP | 定义:参数校验规则、输出格式要求、失败重试策略、安全边界。⇒ 同一套工具可被不同子智能体复用,但遵循各自的场景行为规范 |
| ⑥ 工具层 | 真实执行:检索、文件读写、代码执行、API 调用 | 向技能层返回原始结果,由技能层完成格式化与初步校验后再交给子智能体 |
| ⑦ 持久化层 | 横切全链路:中间结果、工具调用记录、模型决策轨迹落盘 | 用途:断点恢复、审计追踪、安全校验 (输出内容过滤、权限裁剪)。⚠️ 不是流程终点才触发,而是编排层每调度一步就同步写入,否则异常回退时无可恢复状态 |
一句话总结架构哲学:模型负责"想",编排层负责"管",技能层负责"规范",工具层负责"做",持久化层负责"记住"。
4.2 运行流程(以 Codex 类系统为例)
1. 智能体加载 → 读取 Agent 配置(AGENT.md、权限、模型、技能清单)
2. 模型初始化 → 实例化 Provider、注入 Model Catalog 选型结果
3. Skill 加载 → 按需/全量加载技能包,注入 system prompt 与工具集
4. Workspace 映射 → 工作区挂载 + 沙箱初始化(文件系统隔离、网络白名单)
5. 提示词层面处理 → 目标契约化、上下文组装、System/User/Tool 消息分层
6. 工具识别 → Tool / MCP / Skill 三层工具发现与注册
7. 搜索引擎调用 → Tavily(AI 优化的检索 API)等外部检索
8. 获取搜索结果 → 原始结果返回 + 去重/截断
9. 结果用 LLM 加工 → 摘要、结构化、与任务目标对齐
10. 文件操作与落盘 → 写入本地文件系统(沙箱内),同步写持久化层
11. 验证与交付 → 跑测试 / lint / 类型检查,输出改动说明、风险提示与回滚方案
第 5 章 框架对比与选型
5.1 主流框架能力对比
| 框架 | 语言 | 定位 | 核心价值 |
|---|---|---|---|
| LangChain | Python / TS | 组件抽象层 | 统一封装模型、提示词、工具、检索等核心组件,降低 LLM 应用入门门槛与跨平台迁移成本 |
| LangGraph | Python / TS | 有状态图运行时 | 基于节点、边、状态的图模型,支持循环、分支、人机协同、断点续跑;是生产级复杂工作流的核心载体 |
| DeepAgents | Python / TS | 开箱即用的 Agent Harness | 在 LangChain/LangGraph 之上封装通用智能体高频能力(文件系统沙箱、子智能体、技能体系、输出收敛、路径安全),是快速落地 Claude Code / Codex / OpenClaw 类系统的最省路径 |
| Spring AI | Java | Java 生态集成 | 面向 Spring 生态的模型/向量/工具抽象,适合 Java 存量系统内嵌 AI 能力 |
| AgentScope-Java | Java | 多智能体编排 | 阿里开源的 Java 多智能体框架,适合 Java 团队做多 Agent 协作 |
5.2 LangChain 标准化模型接口的价值(避免供应商锁定)
LangChain 基于 BaseLLM / ChatModel 等核心抽象定义标准化模型接口,是破解供应商锁定的关键:
- 抹平协议差异 :统一 Ollama(
@langchain/ollama)、OpenAI、云厂商模型等不同供应商的调用协议、参数格式、返回结构。 - 切换成本归零 :当前用本地 Ollama,后续切云端大模型,只需替换模型实例化逻辑(
OllamaChatModel→ChatOpenAI),无需修改 提示工程、工具调用(如d3-dsv数据解析、PostgreSQL 交互)、Agent 编排等核心业务代码。 - 统一横切逻辑:错误处理、上下文管理、流式输出等通用逻辑统一,降低切换成本。
- 支持混合调用 :核心场景用云端模型、低成本场景用本地 Ollama ------ 规避单一供应商的定价、稳定性、合规风险。
5.3 LangChain vs LangGraph 选型逻辑
选型锚点:业务复杂度与流程特性。
| 场景 | 选择 | 理由 |
|---|---|---|
轻量场景 :线性流程、单轮/简单多轮交互(如基于 PostgreSQL 数据的问答、d3-dsv 解析后直接返回结果) |
LangChain | AgentExecutor、PromptTemplate 等组件开箱即用,开发效率高,适配中小规模、无复杂状态管理的业务 |
复杂场景 :非线性流程、多角色协作、状态持久化/容错重试(如「数据拆分(@langchain/textsplitters)→ 入库 → 推理 → 纠错」闭环) |
LangGraph | 基于 LangChain 核心扩展,主打有状态的推理图 ,支持节点拆分、条件分支、循环执行,能精准描述复杂 Agent 的状态流转;且可嵌套复用 LangChain 的工具/提示组件,适配需可解释、可干预的复杂决策场景 |
三层关系一句话:LangGraph 是运行时(图),LangChain
create_agent是轻量 Harness,DeepAgents 是重 Harness。 三层可组合:任何 LangGraphCompiledStateGraph都可以作为子智能体传入 Deep Agent。
5.4 可解耦、可演进的 Agent 分层架构(支撑团队业务)
本图沿用
L1~L4编号:在[第 3 章](#第 3 章)运行时三层的基础上,把 L3 产品能力层拆为「L3 能力层(可复用)+ L4 业务层(差异化)」,编号对照见 [3.2 节](#3.2 节)。
┌─────────────────────────────────────────────────┐
│ L4 业务层:产品差异化配置 + 业务 DSL + 领域工具集 │ ← 各业务线独立演进
├─────────────────────────────────────────────────┤
│ L3 能力层:Skill / Plugin / MCP / 中间件链 │ ← 可插拔,热插拔式扩展
├─────────────────────────────────────────────────┤
│ L2 编排层:Agent Loop + Harness + 钩子系统 │ ← 团队共享内核,极少变更
├─────────────────────────────────────────────────┤
│ L1 协议层:Message / Tool / Model / AgentEvent │ ← 系统宪法,变更需架构评审
└─────────────────────────────────────────────────┘
解耦三板斧:
- 协议先行:层与层之间只认协议,不认实现 ⇒ 可并行开发、可 mock 测试。
- 配置驱动:业务差异走配置(模型选型、工具白名单、系统提示词、钩子开关),不改代码。
- 扩展点收敛 :所有差异化需求必须落到扩展点(钩子/插件/Skill/MCP),禁止 fork 内核。
第 6 章 智能体执行指标体系
6.1 核心效率指标
- 任务是否成功完成
- 是否首轮执行无返工并通过校验
- 总执行步骤
- 人工复核时长
6.2 质量指标
- 代码规范合规率
- 类型安全率
- 测试覆盖率
- 上线后回归缺陷数量
- 缺陷率 = 回归缺陷数量 / 总改动代码行数
6.3 成本指标
- 总 Token 消耗
- 输入 Token 量
- 输出 Token 量
- 总执行成本
6.4 风险指标
- 权限拦截次数
- 风险预警次数
- 回滚次数
- 是否通过审计
指标间的制衡关系 :压缩执行步骤(效率)往往抬高缺陷率(质量);加大上下文(质量)直接推高 Token 成本(成本);放宽权限拦截(效率)会抬升风险指标。架构调优本质是在四象限指标间找平衡点。
6.5 指标使用原则
- 效率看任务闭环,不只看生成速度。
- 质量看外部验证,不只看模型自评。
- 成本看单位成功任务成本,不只看单次调用价格。
- 风险看拦截与恢复能力,不只看是否出事。
第 7 章 常见问题
7.1 初中级
Q1(TS 基础)你 TypeScript 掌握怎么样?TypeScript 与 Zod 为什么会在 AI Agent 开发中应用广泛?你认为前端往 Agent 能有哪些沉淀?
作答骨架:
- TS 能力自评维度 :类型系统(泛型、条件类型、映射类型、模板字面量类型)、类型收窄与判别联合、声明合并、工程化(
tsconfigstrict 配置、声明文件、monorepo 构建)。 - 为什么 TS 适合 Agent :
- Agent 是事件流驱动 的:
AgentEvent天然适合用**判别联合(Discriminated Union)**表达,配合switch+ 穷尽性检查(never)保证事件处理的完备性 ------ 新增一种事件类型时,未处理的地方会直接编译报错。 - Agent 要对接 N 个模型 Provider,接口契约是这个领域的核心资产,TS 的接口/类型本身就是文档。
- 流式与异步密集:
AsyncIterable/AsyncGenerator在 TS 中表达流式响应非常自然。
- Agent 是事件流驱动 的:
- 为什么 Zod 在 Agent 中无处不在 (核心论点):
- 工具入参校验:LLM 输出的参数是"不可信输入",必须在执行前用 Schema 校验,并把结构化错误信息回灌给它重试。
- 一份 Schema 三处生效 :
z.infer给编译期类型、schema.parse给运行时校验、zodToJsonSchema转成 JSON Schema 下发给模型做 Structured Output ------ 写一次,三处复用,避免"类型说一套、运行时是另一套"。 - 错误可回灌:Zod 的错误是结构化的(path + message),可直接拼成消息回给模型让它自我修正 ------ 这就是 Loop 里的 Observation。
ts
import { z } from "zod";
import { zodToJsonSchema } from "zod-to-json-schema";
const ReadFileInput = z.object({
path: z.string().describe("文件绝对路径"),
offset: z.number().int().nonnegative().optional(),
limit: z.number().int().positive().optional(),
});
type ReadFileInput = z.infer<typeof ReadFileInput>; // ① 编译期类型
export const readFileTool: Tool<ReadFileInput, string> = {
name: "read_file",
description: "读取文件内容",
schema: ReadFileInput, // ② 运行时校验
jsonSchema: zodToJsonSchema(ReadFileInput), // ③ 下发给模型的工具定义
async execute(input, ctx) {
const safePath = ctx.sandbox.resolve(input.path); // 沙箱路径校验,防止越权读取
return ctx.fs.readRange(safePath, input.offset, input.limit);
},
};
- 前端往 Agent 沉淀的四块能力 :
- 流式渲染与体验工程:SSE/WebSocket 流式、增量 DOM 更新、首字延迟(TTFT)优化 ------ 这是 Agent 产品体验的护城河(首字从秒级降到百毫秒级)。
- 状态管理:Agent 的不可变状态归约(Event → State)本质就是 Redux 模型的复用,前端天然熟悉。
- 工具与 UI 的桥梁:MCP、插件市场、可视化编排画布 ------ 都是前端的主场。
- 工程化与质量保障 :构建、lint、测试、类型安全 ------ 直接对应 Agent 的 Verifier 环节。
一句话收尾:TS 的价值是把"Agent 的协议"变成编译期可检查的事实;Zod 的价值是把"LLM 的不可信输出"变成可校验的数据。
Q2(通用智能体)你知道怎么搭建一个通用型智能体吗?说说类似 OpenClaw、Codex 智能体的全栈设计思路
作答骨架:按"定位 → 能力 → 分层实现"展开。
-
定位与能力 :见 [1.2 节表格](#1.2 节表格)(目标导向、任务分解、子智能体并发、多工具协同、文件/OS 级操作、Skill 调用)。
-
全栈分层设计:
接入层 多渠道入口(CLI / TUI / 聊天渠道 / IDE 插件)→ 统一收敛到 Agent Runtime
↓
执行层 Harness:权限、沙箱、持久化、审批(HITL)、观测
↓
内核层 Agent Loop:模型调用 → 工具执行 → 结果回灌 → 再推理(含 maxTurns / Abort)
↓
能力层 Planning(TodoList)· SubAgent(上下文隔离)· Filesystem(大结果外化)· Compaction(上下文压缩)· Skills
↓
协议层 统一 Model 接口(多 Provider)+ 统一 Tool 接口(本地/MCP)
↓
模型层 Model Catalog:按能力/成本/延迟动态选型 -
最小可跑版本(MVP)路径 :
- 第一步:跑通「模型 + 一个工具 + Loop」的闭环(约 100 行核心)。
- 第二步:加 Harness ------ 权限白名单 + 工作区隔离 + 事件落盘。
- 第三步:加 Planning 与 SubAgent ------ 撑住长任务。
- 第四步:加压缩与外化 ------ 撑住超长任务。
- 第五步:加多渠道接入与 HITL ------ 产品化。
Q3(前端视角)作为前端开发,请说说你对于 AI 提效工具的理解,Codex、Trae、OpenClaw 这些工具听过吗?说说你的看法
作答骨架 :核心论点 ------ AI 提效工具的演进主线是"代码生成 → 工程链路闭环(端到端交付)"。
四个层次递进:
- 上下文深度理解 :不只是读当前文件,而是理解旧代码、代码风格、代码约束 ------ 载体就是
AGENT.md/.cursorrules这类仓库级约定文件 。仓库有没有写好约束文件,直接决定工具效果上限。 - 全链路调用执行 :模型 ≠ 智能体。
Agent = LLM + Planning + Memory + Tool Use。关键是把 Agent 内各组件的调用、流程、步骤、计划都用统一 Schema 规范描述出来(计划可执行、步骤可回退)。 - 反思优化(结果自动校验):不是生成完就结束,而是自动跑 lint / 类型检查 / 单测,把失败信息回灌给模型重试 ------ 这就是 Loop Engineering 的验证器。
- 交付物完整性 :不仅给 diff,还要给出改动说明、测试结果、风险提示。
工具对比看法:
| 工具 | 形态 | 特点 |
|---|---|---|
| Codex / Claude Code | CLI + IDE | 通用智能体,OS 级能力,适合工程链路闭环;模型能力强、可控性高 |
| Trae | AI IDE | 面向开发者的集成环境,强调中文场景与工程内闭环 |
| OpenClaw | 本地开源个人助手(Node ≥ 22,MIT) | 多渠道入口(WhatsApp/Telegram/Discord/企微等)+ Browser/Exec/Web 工具 + Gateway 安全边界;强调本地运行、数据自主、持久记忆、可自建 Skill |
判断标准:从"能不能生成代码"升级为"能不能在真实仓库里跑完测试并交付 ",以及"出问题时我能不能审计和回滚"。
Q4(Harness 入门)有没有了解过 Harness?为什么需要 Harness?在你的 Agent 产品中如何设计 Harness 体系?
作答骨架:
- Harness 是什么 :包裹在「模型 + 工具调用循环」之外的一整套脚手架 ------ 系统提示词、计划与步骤追踪、中间结果存放处、子任务委派机制、上下文防溢出策略。Agent ≠ 模型,Agent = 模型 + Harness。
- 为什么需要(解决四个真实痛点):
| 痛点 | Harness 的解法 |
|---|---|
| 长任务跑飞、丢失目标 | Planning:显式的 TodoList,能从二十次工具调用后找回位置 |
| 大工具结果污染上下文 | Filesystem:40K token 的抓取结果写文件,按需 grep 取片段 |
| 上下文窗口撑爆 | Compaction:摘要压缩;大结果外化(offloading) |
| 输出不稳定、有幻觉、不可控 | Verifier(测试/lint)+ Guardrail(沙箱/权限/审批)+ 可观测 |
-
如何设计自己的 Harness 体系(五件套):
① 权限与沙箱层 工具白名单、路径沙箱、网络白名单、高危操作人工确认
② 状态与持久化层 JSONL/SQLite 落盘、Checkpoint、崩溃可恢复、可审计
③ 验证与检查层 每轮执行后自动 lint / typecheck / test,失败信息回灌重试
④ 上下文管理层 预算监控、压缩策略、外化策略、检索注入
⑤ 可观测层 事件流、token 统计、轨迹追踪、时间旅行调试
落地形态:Harness 不是写进 Loop 里,而是以**中间件(Middleware)**形式挂载 ------ 可插拔、可替换、可禁用(这正是 DeepAgents 的做法)。
Q5(认知)前端为什么要学全栈 Agent?跟传统前端工程有什么区别?Harness 和 Loop 这些概念到底是什么?
作答骨架:
- 为什么前端要学全栈 Agent :
- 交付物形态变了:从"交付页面"变成"交付能自动完成任务的程序"。
- 前端是 Agent 的体验主战场:流式渲染、多端界面、工具可视化、插件市场。
- 前端的工程化能力(构建、测试、类型、CI)直接就是 Agent 的 Verifier 环节。
- 与传统前端工程的区别:
| 维度 | 传统前端工程 | Agent 工程 |
|---|---|---|
| 控制流 | 确定性代码分支 | 模型决定的非确定性分支 |
| 状态 | 可枚举的 UI 状态 | 对话/任务态 + 上下文窗口(有限资源) |
| 错误处理 | try/catch + 边界分支 | 把错误回灌给模型让它自我修复 |
| 调试 | 断点、DevTools | 轨迹回放 / 时间旅行调试 |
| 测试 | 单测 + E2E(确定性断言) | 评测集 + 指标(成功率、返工率、成本) |
| 成本 | 运行时性能 | Token 成本 + 延迟 |
- Harness 与 Loop 的通俗解释 :
- Loop = 心跳/引擎:执行 → 观察 → 再决策,并回答"何时继续、何时停"。
- Harness = 底盘/驾驶舱:权限、沙箱、持久化、验证检查 ------ 回答"在什么环境里跑、边界在哪"。
- 类比:Loop 是发动机循环,Harness 是整车底盘 + 仪表盘 + 安全带。
7.2 中高级
Q6(TS 框架)基于 TypeScript 搭建 AI Agents 基础框架(参考 LangGraph 核心能力),说说你的核心设计思路与关键代码实现逻辑
作答骨架:先讲设计思路(4 点),再给关键代码(3 段)。
设计思路:
- 协议先行 :先定义
Message/Tool/Model/AgentEvent四个协议,再写实现。 - State 用不可变 + Reducer :每个节点的输出是
Partial<State>,由框架做归约,天然支持 Checkpoint 与时间旅行。 - 图是编译期的产物 :
StateGraph声明节点与边 →compile()得到可执行对象(LangGraph 的核心思想),编译期可校验边引用的节点是否存在。 - 流式与持久化正交:流式只是"把事件往外 emit",持久化只是"把 Checkpoint 存下来",两者都不侵入节点逻辑。
关键代码 ①:协议层(系统宪法)
ts
// ------ 消息协议 ------
export type Role = "system" | "user" | "assistant" | "tool";
export interface Message {
id: string;
role: Role;
content: string | ContentPart[];
toolCalls?: ToolCall[];
toolCallId?: string;
}
// ------ 模型事件流(统一流式协议)------
export type ModelEvent =
| { type: "text_delta"; delta: string }
| { type: "thinking_delta"; delta: string }
| { type: "tool_call_delta"; index: number; name?: string; argsDelta?: string }
| { type: "done"; finishReason: "stop" | "tool_calls" | "length" };
// ------ 模型接口:唯一接入点(依赖倒置)------
export interface Model {
readonly id: string;
stream(req: ChatRequest, signal?: AbortSignal): AsyncIterable<ModelEvent>;
}
// ------ 工具接口:唯一接入点(Zod 同时用于校验与 JSON Schema 下发)------
export interface Tool<I = unknown, O = unknown> {
name: string;
description: string;
schema: z.ZodType<I>;
execute(input: I, ctx: ToolContext): Promise<O>;
}
关键代码 ②:Loop 内核(最小正确闭环,约 100 行)
ts
export async function* runLoop(
model: Model, tools: ToolRegistry, state: AgentState, hooks: Hooks, signal?: AbortSignal
): AsyncGenerator<AgentEvent> {
for (let turn = 0; turn < state.maxTurns; turn++) {
// ① 中断检查:用户 Esc / 超时 / 上层取消
if (signal?.aborted) { yield { type: "aborted" }; return; }
// ② 钩子:转向消息(中途插话)→ 上下文组装 → 模型动态选型 → 请求格式转换
const steering = (await hooks.getSteeringMessages?.(state)) ?? [];
const ctxMessages = await hooks.transformContext(state);
const chosen = hooks.prepareNextTurn?.(state) ?? model;
const request = hooks.convertToLlm?.({ messages: [...ctxMessages, ...steering], tools: tools.defs })
?? { messages: [...ctxMessages, ...steering], tools: tools.defs };
// ③ 模型调用 + 流式增量下发
const acc = createStreamAccumulator();
for await (const ev of chosen.stream(request, signal)) {
acc.push(ev);
yield toAgentEvent(ev); // partial message 不变量:逐 token 推 UI
}
state.messages.push(acc.toMessage());
// ④ 无工具调用 → 先判停止;未停且有追问依据才续接,否则跳出(否则会空转到 maxTurns)
if (acc.toolCalls.length === 0) {
if (await hooks.shouldStopAfterTurn?.(state)) break;
const followUp = (await hooks.getFollowUpMessages?.(state)) ?? [];
if (followUp.length === 0) break; // 没有新信息 → 停止
state.messages.push(...followUp);
continue;
}
// ⑤ 并行执行工具:allSettled ⇒ 单个工具失败不炸整个 Loop,失败也作为 Observation 回灌
const settled = await Promise.allSettled(acc.toolCalls.map(async (call) => {
const input = await hooks.beforeToolCall(call); // 可短路 / 抛错
if (input.blocked) return { call, output: `blocked: ${input.reason}` };
const out = await tools.invoke(call, input.args, signal); // signal 透传,长命令可中断
return { call, output: await hooks.afterToolCall(call, out) }; // 截断/脱敏
}));
const results = settled.map(coerceToolResult); // rejected → 转错误 Observation
// ⑥ 结果回灌 + 落盘(持久化是横切的,每步同步写)
state.messages.push(...results.map(toToolMessage));
await state.persistence.append(results);
// ⑦ 停止判定
if (await hooks.shouldStopAfterTurn?.(state)) break;
}
}
关键代码 ③:Graph 层(状态机 + 条件边)
ts
// 示意代码:START / END / reduce / route / NodeFn / Checkpointer 定义在 core/state 模块,此处省略
type Edge<S> = { to?: string; router?: (s: S) => string };
export class StateGraph<S> {
#nodes = new Map<string, NodeFn<S>>();
#edges = new Map<string, Edge<S>[]>();
#entry?: string;
#maxSteps = 100; // 环路保护:条件边允许成环,必须设上限
addNode(id: string, fn: NodeFn<S>) { this.#nodes.set(id, fn); return this; }
addEdge(from: string, to: string) {
const list = this.#edges.get(from) ?? [];
list.push({ to });
this.#edges.set(from, list);
if (from === START) this.#entry = to; // 记录入口节点
return this;
}
addConditionalEdge(from: string, router: (s: S) => string) {
const list = this.#edges.get(from) ?? [];
list.push({ router });
this.#edges.set(from, list);
return this;
}
compile(checkpointer?: Checkpointer<S>) {
// 编译期校验:静态边指向的节点必须存在(把"边指向不存在节点"提前到编译期)
for (const [from, edges] of this.#edges)
for (const e of edges)
if (e.to && e.to !== END && !this.#nodes.has(e.to))
throw new Error(`edge ${from} -> ${e.to}: unknown node`);
if (!this.#entry) throw new Error("graph has no entry node: addEdge(START, '<node>')");
return {
invoke: async (input: S) => {
let state = input;
let cursor: string = this.#entry!; // 从真实入口节点开始,而不是 START 本身
let steps = 0;
while (cursor !== END) {
if (++steps > this.#maxSteps)
throw new Error(`graph exceeded maxSteps=${this.#maxSteps}`);
const node = this.#nodes.get(cursor);
if (!node) throw new Error(`unknown node: ${cursor}`);
state = reduce(state, await node(state)); // 不可变归约
await checkpointer?.save(state); // Checkpoint:断点续跑
cursor = route(this.#edges, cursor, state);
}
return state;
},
};
}
}
加分点 :说明
reduce的 Delta Channel 设计 ------ 消息列表若每次全量 Checkpoint 是 O(N²),LangGraph 用DeepAgentState的DeltaChannel降到 O(N)。
Q7(LangChain 选型)聊聊 LangChain 标准化模型接口对避免供应商锁定的价值,以及如何根据业务复杂度在 LangChain 和 LangGraph 之间做选型?如何设计可解耦、可演进的 Agent 分层架构来支撑团队业务?
原题自带完整答案,已整理至 [5.2 节](#5.2 节)、[5.3 节](#5.3 节)、[5.4 节](#5.4 节)。
补充三条重要论点:
- 避免锁定的真正落点不是"换模型",而是"换模型后行为不变" ------ 需要统一的流式协议、错误处理语义、
tool_call_id关联规则,否则换供应商后 Loop 逻辑要重写。 - 混合调用是更现实的收益:核心步骤用强模型、批量格式化用小模型,成本可降一个量级。
- 解耦的验收标准:新接一个业务线,是否需要改动内核仓库的代码?若答案是"只需新增配置 + 一个插件包",架构才算成立。
Q8(模型与智能体)请站在前端角度深刻聊聊模型和智能体的关系,如何选择模型、如何开发智能体来支撑团队或者公司业务?
作答骨架:
-
关系一句话 :模型是"大脑"(单次推理),智能体是"人"(目标 + 规划 + 记忆 + 工具 + 验证 + 安全 + 观测)。模型能力的上限决定智能体的上限,但智能体的实际表现由 Harness 决定。
智能体 = LLM + Planning + Memory + Tool Use + Verifier + Guardrail + Telemetry
类比:模型是发动机,智能体是整车。同一个发动机,装在不同底盘上,能跑的路完全不同。
- 如何选择模型(四个维度 + 分层策略):
| 维度 | 考察点 |
|---|---|
| 能力 | 推理 / 编码 / 长上下文 / 多模态 / 工具调用稳定性 |
| 成本 | 输入输出单价、是否有 Prompt Caching、批处理折扣 |
| 延迟 | 首字延迟(TTFT)、吞吐 ------ 直接决定交互体验 |
| 合规 | 数据出境、私有化部署(本地 Ollama / vLLM)要求 |
分层选型策略(Model Catalog):
- 规划 / 复杂编码 / 关键决策 → 强推理模型
- 摘要 / 格式化 / 分类 / 路由 → 低成本小模型
- 多模态任务(文生图、图生视频、TTS)→ 专用模型(如 Seedance 类)
- 数据敏感场景 → 本地/私有化模型
- 如何开发智能体支撑团队业务(落地四步) :
- Step 1 · 选场景:高频、有明确完成标准、可验证(能跑测试/能对账)------ 例如"自动修复 CI 失败"、"需求文档生成代码骨架 + 测试"。
- Step 2 · 沉淀仓库约束 :
AGENT.md(代码风格、目录约定、禁止事项)------ 这是投入产出比最高的一件事。 - Step 3 · 搭 Harness :权限白名单 + 沙箱 + 测试验证器 + 轨迹落盘。先有护栏,再放开能力。
- Step 4 · 建度量 :用[第 6 章](#第 6 章)四象限指标(效率/质量/成本/风险)持续调优,而不是凭感觉。
Q9(工程链路)实现"从 Vite 构建到 Agent 自动修复 Bug"的功能,完整工程链路是怎么设计的?
作答骨架(自顶向下):
负责的功能 → 架构设计 → 任务计划 → 开发测试 → 验证完成 → 交付实施培训
架构设计拆分(三层技术栈):
| 层 | 技术栈 | 关键内容 |
|---|---|---|
| 应用层 | Web / PC / 移动端 | 结果展示(diff、测试报告、风险提示)、人工审批入口、回滚按钮 |
| 服务层 | Node / BFF / 任务队列 | 构建日志采集、任务编排、Webhook 触发、状态持久化、权限与审计 |
| Agent 层 | LLM + 五个 Engineering | Prompt(修复规范)/ Context(错误上下文组装)/ Harness(沙箱+分支隔离)/ Loop(修复→验证→重试)/ Graph(生成节点 vs 检查节点分离) |
执行链路(闭环设计):
① 触发 CI / Vite build 失败 → Webhook → 服务层创建修复任务
② 上下文 采集:错误日志栈、相关源码、git diff、仓库约束(AGENT.md)
③ 契约化 定义完成标准:构建通过 + lint 通过 + 测试通过 + 无新增告警
④ 规划 模型产出修复计划(子任务 DAG:定位 → 修改 → 补测 → 验证)
⑤ 执行 Agent 在隔离分支/沙箱中改代码,每步落盘
⑥ 验证 自动跑 build / lint / test(Verifier),失败信息回灌重试
⑦ 收敛 达到 maxTurns 或连续 N 轮无进展 → 停止并转人工(停止协议)
⑧ 交付 PR + 改动说明 + 测试结果 + 风险提示 + 一键回滚
⑨ 度量 记录:返工轮次、token 成本、缺陷率、人工复核时长
关键难点:
- 上下文组装 ------ 错误日志要精准(不是全量 build 日志),要能反查源码位置。
- 验证器可信 ------ Verifier 必须独立、不可被模型绕过(Graph Engineering:写代码的节点与检查的节点分离,检查者用干净上下文、只看结果)。
- 安全边界 ------ Agent 只能在隔离分支操作,禁止直接推主干。
Q10(Harness / 术语辨析)DeepSeek Harness 的体系设计为什么会引起关注?背后的插件机制原理你有了解过吗?
术语辨析 :原题写作
DeepSeekHarness。结合上下文(LangChain / LangGraph / DeepAgent 体系)与公开资料,更可能指 LangChain 的deepagentsHarness;若确实指 DeepSeek 官方发布的某个 Harness 实现,机制框架基本一致,具体细节应以官方文档为准。以下按"通用 Harness 体系 + DeepAgents 插件机制"作答。
作答骨架:
- 为什么引起关注 :
- 这类 Harness 把"Claude Code 之所以强大"的原因显式拆成了可复用的中间件 ,证明了Agent 的竞争力不只在模型,也在 Harness(脚手架)。
- 模型无关:任何支持 tool calling 的模型(前沿 / 开源权重 / 本地 Ollama)都能用 ------ 打破模型锁定。
- 开箱即用 + 完全可替换 :
create_deep_agent()一行拿到完整能力,但每个中间件都可 inspect / 替换 / 禁用。
- 插件机制原理(核心:Harness 由 Middleware 组装而成):
| Middleware | 提供的能力 | 解决的问题 |
|---|---|---|
| TodoListMiddleware | write_todos 规划工具,状态持久化在 agent state(pending/in_progress/completed) |
长任务中不丢失目标;计划能存活于上下文压缩之后 |
| SubAgentMiddleware | task 工具,派生一次性、无状态子智能体,隔离上下文,只回传精简总结 |
最有效的上下文控制手段:子任务的"噪音中间过程"不污染父上下文 |
| FilesystemMiddleware | ls / read_file / write_file / edit_file / glob / grep(后端可为内存 / LangGraph Store / 真实磁盘) |
大结果外化(offloading):4 万 token 的抓取写文件后按路径引用 |
| SummarizationMiddleware | 上下文压缩:保留近期消息,早期消息替换为摘要 | 防止长任务"掉崖";避免从头部粗暴截断导致丢失原始指令 |
| AnthropicPromptCachingMiddleware | 自动命中 Prompt Cache | 长任务中 system prompt + 工具定义每步重发 ⇒ 直接省钱 |
| PatchToolCallsMiddleware | 修复被中断/取消的工具调用造成的消息历史破损 | 否则中途会抛 Provider 侧校验错误 |
| SkillsMiddleware | 按需加载可复用行为包 | 类似「专家模式」切换 |
- 底层机制原理 (一句话):每个 Middleware = 「挂一批工具 + 注入一段 system prompt + 可选包一层调用拦截」的统一扩展单元 。
create_deep_agent()只是把默认中间件按序组装并compile()成一个 LangGraph 图。
python
from deepagents import create_deep_agent
agent = create_deep_agent(
model="anthropic:claude-sonnet-4-6",
tools=[web_search],
system_prompt="You are an expert researcher.",
) # 返回值:一个已编译的 LangGraph CompiledStateGraph
- 自主压缩(Autonomous Compaction)值得单独提 :把"何时压缩"的决定权从 Harness 交给模型 ------ 给模型一个
compact_conversation工具,让它在任务边界自行决定压缩时机(有门控:约在自动摘要触发点的一半才允许触发,保留最后约 10% 上下文)。这是从"Harness 决定"到"模型自管记忆"的范式转变。
补充:异步子智能体 通过 Agent Protocol 派发,立即返回 task id,父智能体继续工作;task id 持久化在 state 的
async_tasks中,可存活于上下文压缩与外化。
7.3 专家级
Q11(自研框架)如果让你实现对标 LangGraph 的 TypeScript AI Agents 框架,说说你的整体架构设计、核心模块划分与底层源码实现的关键难点突破
作答骨架:按"整体架构 → 模块划分 → 难点突破"三段式。
一、整体架构(五层,严格单向依赖)
此处用
E0~E4编号,避免与第 3 章的L1~L3、5.4 节的L1~L4混淆。对应关系:E1 ≈ L1,E2 + E3 ≈ L2,E4 ≈ L3,E0是 L1 Provider 适配的下沉(详见 [3.2 节](#3.2 节))。
┌ E4 生态层 CLI / DevTools / 评测集 / 可视化编排 / 插件市场
├ E3 编排层 StateGraph · Node · Edge · Router · Checkpointer · SubAgent
├ E2 内核层 Agent Loop · Harness(中间件链) · 钩子系统(8个) · 事件总线
├ E1 协议层 Message · Tool · Model · AgentEvent · StateSchema(系统宪法)
└ E0 适配层 Provider 包(OpenAI/Anthropic/Google/Bedrock/Ollama)· MCP 客户端
二、核心模块划分
| 模块 | 职责 | 关键接口 |
|---|---|---|
core/protocol |
协议定义(零依赖,最先锁定) | Message、Tool、Model、AgentEvent |
core/loop |
最小闭环(≤120 行) | runLoop(model, tools, state, hooks) |
core/harness |
中间件链、沙箱、审批、遥测 | Middleware、use(mw)、Sandbox |
core/graph |
图定义与编译 | StateGraph、compile(checkpointer) |
core/state |
不可变归约、Delta Channel、Checkpoint | reduce()、Checkpointer |
core/context |
预算计算、压缩、外化、检索注入 | ContextManager |
providers/* |
各供应商适配(独立包、独立发版) | implements Model |
tools/* |
内置工具 + MCP 桥接 | implements Tool |
三、底层源码实现的 6 个关键难点与突破
| # | 难点 | 突破方案 |
|---|---|---|
| 1 | 流式增量与消息完整性(边推 token 边保证最终消息一致) | 引入 partial message 不变量 + StreamAccumulator:增量事件只用于渲染,done 时产出唯一权威 message;tool_call_delta 按 index 分片累积后再解析 JSON(避免半截 JSON 无法 parse) |
| 2 | 中断与取消(用户 Esc、超时、切模型) | 全链路透传 AbortSignal;中断处必须写 PatchToolCallsMiddleware 补齐"孤儿 tool_call"(否则 Provider 校验报错);中断状态落 Checkpoint 以便续跑 |
| 3 | 状态归约与 Checkpoint 的 O(N²) 问题 | 消息字段用 Delta Channel(只存增量 patch,读取时归并),把 Checkpoint 增长从 O(N²) 降到 O(N) |
| 4 | 并行工具的确定性与错误隔离 | Promise.allSettled + 每个工具独立超时与重试;失败结果也作为 Observation 回灌(让模型看到失败,而不是整个 Loop 崩溃);结果顺序按 tool_call_id 对齐 |
| 5 | 上下文压缩的时机与无损性 | 双策略:阈值压缩 (兜底)+ 自主压缩(模型在任务边界自触发);压缩前先把大结果外化到文件,压缩时保留原始指令与计划(TodoList 单独存 state,天然不丢) |
| 6 | 图编译期的静态校验与类型推导 | 用 TS 模板字面量类型 + const 泛型让节点名成为字面量类型,addEdge(from, to) 的 to 只能填已注册节点名 ------ 把"边指向不存在节点"从运行期错误提前到编译期 |
四、可测试性设计(体现架构师素养)
- Loop 只依赖
Model接口 ⇒ 单测用FakeModel回放脚本化事件流,断言完整轨迹,不联网、不花钱、可重复。 - 图用纯函数节点 ⇒ 节点级单测无需启动运行时。
- 中间件链可单独装配 ⇒ 权限、截断、压缩各自独立测试。
Q12(系统设计)如果让你基于 DeepAgents 设计完整类似 OpenClaw、Codex 系统及操作 AI Agent,请给出你的设计方案和核心代码实现
作答骨架:按"三层资产划分"作答 ------ 这是本题的核心考点。
一、三层资产划分(题目给定,需展开)
| 层 | 需要做的事 | 选型 |
|---|---|---|
| 核心实现(从 0 开发) | Skill + Tool + MCP ------ 这是业务差异化的真正所在 | 自研 |
| 框架(按业务组织、编排) | 模型接入、任务调度、权限、持久化、可观测 | LangChain / LangGraph / DeepAgents |
| 大模型(评测、选型) | 任务拆解与规划 + 内容生成 | Model Catalog + 评测集驱动选型 |
二、总体架构
渠道接入层 WhatsApp / Telegram / 企微 / 钉钉 / CLI / Web
↓ (多渠道收敛到统一执行面)
Gateway 层 认证、限流、审计、路由、安全边界(对应 OpenClaw 的 Gateway)
↓
Harness 层 DeepAgents:Planning + Filesystem + SubAgent + Compaction + Skills + HITL 审批
↓
能力层 自研 Tool / 自研 Skill / 外部 MCP Server
↓
执行环境 沙箱(文件系统隔离、网络白名单、高危操作人工确认)
↓
持久化层 JSONL/SQLite + Checkpoint + 长期记忆(跨会话)
↓
可观测层 事件流、Token 统计、轨迹回放、四象限指标看板
三、核心代码(TypeScript / DeepAgents JS 风格示意)
ts
import { createDeepAgent } from "deepagents";
import { ChatAnthropic } from "@langchain/anthropic";
import { MultiServerMCPClient } from "@langchain/mcp-adapters";
// ① 接入外部 MCP 服务(能力来源之一)
const mcp = new MultiServerMCPClient({
filesystem: { command: "npx", args: ["-y", "@modelcontextprotocol/server-filesystem", workspace] },
postgres: { command: "npx", args: ["-y", "@modelcontextprotocol/server-postgres"], env: { PG_URL } },
});
// ② 自研 Tool(带沙箱与权限校验)
const bashTool = defineTool({
name: "bash",
description: "在沙箱中执行命令",
schema: z.object({ cmd: z.string(), cwd: z.string().optional() }),
async execute({ cmd }, ctx) {
assertAllowed(cmd, ctx.policy.allowedCommands); // 白名单 + 高危命令拦截
return ctx.sandbox.exec(cmd, { cwd: ctx.sandbox.resolve(cwd ?? "."), timeoutMs: 30_000 });
},
});
// ③ 自研 Skill(SOP:行为规范 + 输出格式 + 重试策略)
const bugfixSkill = defineSkill({
name: "bugfix",
triggers: ["修复", "fix", "CI 失败"],
instructions: `
1. 先复现:读取错误日志,定位到具体文件与行号
2. 最小修改:只改动必要代码,禁止顺手重构
3. 必须补测试:每个修复至少一条回归用例
4. 自检:运行 build + lint + test,任一项失败则回到步骤 1
5. 输出 JSON:{ files: string[], cause: string, tests: string[], risk: string }
`,
outputSchema: BugfixReport, // 业务 DSL:收敛输出
maxRetries: 3,
});
// ④ 组装 Agent(Harness 提供规划/文件系统/子智能体/压缩)
const agent = createDeepAgent({
model: new ChatAnthropic({ model: "claude-sonnet-4-6" }),
tools: [bashTool, ...(await mcp.getTools())],
skills: [bugfixSkill],
subagents: [{ name: "researcher", systemPrompt: "...", tools: [webSearch] }],
middleware: [
approvalGuard({ dangerous: ["rm -rf", "git push --force", "DROP TABLE"] }), // HITL
telemetry({ onEvent: (e) => metrics.record(e) }), // 可观测
],
checkpointer: new SqliteCheckpointer("./.agent/state.db"), // 断点续跑
});
// ⑤ 流式执行 + 事件流归约为 UI 状态
for await (const ev of agent.stream({ messages: [{ role: "user", content: "修复 CI 失败" }] })) {
uiState = reduceEvent(uiState, ev); // 不可变归约,支持时间旅行调试
}
四、关键设计取舍(体现专家判断)
- 为什么用 DeepAgents 而不是裸 LangGraph :规划、文件系统外化、子智能体、压缩这四件事是每个长任务 Agent 都要重写一遍 的,且极易写错(尤其是压缩丢指令)。用成熟 Harness 把团队精力集中在 Skill + Tool + MCP 上。
- 为什么 Skill 层必须独立 :工具是"能力",Skill 是"规范"。同一套文件工具,在
bugfix里要求最小改动,在refactor里允许重排 ------ 规范差异放在 Skill,工具保持通用,这是复用与收敛的关键。 - MCP 的定位 :MCP 解决"外部能力如何标准化接入",是工具生态的 USB 接口;但 MCP 不解决"行为规范" ------ 仍需 Skill 层包装。
- 安全边界的落点 :DeepAgents 官方明确"trust the LLM"模型 ------ Agent 能做工具允许的任何事。边界必须在工具/沙箱层强制,不能指望模型自律。
Q13(Coding Agent)如果让你开发类似 Codex 的 Coding AI 智能体,有没有明确的实现方案和思路?请实现一个核心功能版本 Codex
作答骨架:方案 + 最小可跑内核。
一、实现方案(七个模块)
| 模块 | 内容 |
|---|---|
| 1. 仓库理解 | AGENT.md 约束、目录结构索引、依赖关系图;不是全量塞上下文,而是按需检索 |
| 2. 规划 | TodoList 化任务(Planning),显式追踪 pending/in_progress/completed |
| 3. 工具集 | bash / read / write / edit / grep / find / ls,全部走沙箱路径解析 |
| 4. 上下文管理 | 大结果外化到文件、阈值 + 自主压缩、检索注入 |
| 5. 验证器 | build / lint / typecheck / test,失败信息回灌重试(Loop 的核心) |
| 6. 安全 | 命令白名单、路径沙箱、写操作 diff 预览、高危操作人工确认 |
| 7. 交付 | 变更清单 + 测试结果 + 风险提示 + 一键回滚(git stash / 分支隔离) |
二、核心功能版本(最小可跑内核,TS 伪实现)
ts
// ------ 1. 最小 Loop:模型 → 工具 → 回灌 ------
async function codexLoop(goal: string, ctx: CodexContext) {
const todos = await plan(goal); // ① 规划
const state: State = { goal, todos, messages: [], turns: 0 };
while (state.turns++ < ctx.maxTurns) {
const resp = await ctx.model.chat({
system: renderSystemPrompt(ctx.agentMd, todos), // ② 仓库约束 + 计划注入
messages: state.messages,
tools: ctx.tools.defs,
});
if (resp.toolCalls.length === 0) break; // ③ 无工具调用 → 收敛
for (const call of resp.toolCalls) {
const args = call.schema.parse(call.args); // ④ Zod 校验(不可信输入)
const out = await ctx.tools.run(call.name, args, ctx.sandbox); // ⑤ 沙箱执行
state.messages.push(toolMessage(call.id, truncate(out, ctx.budget))); // ⑥ 截断回灌
}
// ⑦ 验证器:外部事实优先于模型自述
const verify = await ctx.verifier.run(); // build + lint + test
if (verify.ok) return finalize(state);
state.messages.push(userMessage(`验证失败:\n${verify.report}\n请修复后重试。`));
}
return handoffToHuman(state); // ⑧ 停止协议:转人工
}
三、三个决定成败的细节
- 编辑工具要"定位驱动"而非"全文重写" :
edit用 old_string/new_string 精确替换,避免模型重写整个文件引入无关 diff。 - 验证器必须独立于模型:检查节点用干净上下文、只看 diff 和测试结果(Graph Engineering)。
- 工具输出必须截断 :一次
cat几万行会直接撑爆上下文 ------ 大结果一律写文件返回路径。
Q14(架构 Leader)假如你是 Leader,来负责高可用低耦合的 Agent 产品,请说一说你的完整架构与落地思路(微内核 / 插件化机制设计)
作答骨架 :Leader 视角要回答四件事 ------ 架构、机制、落地节奏、治理。
一、架构:微内核 + 插件化
┌──────────────────────────────────────┐
│ 微内核(Microkernel) │
│ ① 协议层:Message/Tool/Model/Event │
│ ② Loop:≤120 行最小闭环 │
│ ③ 插件总线:注册 / 发现 / 生命周期 │
│ ④ 事件总线:emit → 归约 → UI State │
└──────────────┬───────────────────────┘
│ 只能通过扩展点接入
┌──────────┬──────────┬──────┴──────┬──────────┬──────────┐
│ Provider │ Tool │ Middleware │ Skill │ MCP │ ← 插件
│ 插件 │ 插件 │ 插件 │ 插件 │ 桥接插件 │
└──────────┴──────────┴─────────────┴──────────┴──────────┘
│
┌───────────┴───────────┐
│ Harness:沙箱/审批/观测 │ ← 由 Middleware 组装
└───────────────────────┘
微内核的边界(什么在内核,什么在插件):
| 在内核(极少变更) | 在插件(自由演进) |
|---|---|
| 协议定义 | 模型 Provider |
| Loop 最小闭环 | 工具实现 |
| 插件注册与生命周期 | 中间件(权限/截断/压缩/缓存) |
| 事件归约与 Checkpoint | Skill、MCP 服务 |
| 停止协议与预算控制 | 渠道接入、UI 呈现 |
二、插件化机制设计(五个要素)
- 统一扩展点契约 :所有插件实现同一个
Plugin接口(name、version、capabilities、install(ctx)、dispose())。 - 显式依赖声明 :插件声明依赖的协议版本与能力(如
needs: ["fs.write", "net.outbound"]),内核做能力校验与冲突检测。 - 生命周期隔离:插件崩溃不影响内核 ------ 工具执行包在独立超时与错误边界内,失败转为 Observation 回灌。
- 权限随插件走 :插件自带权限清单(白名单命令、可访问路径、网络域名),由 Harness 强制执行 ------ 不信任模型,也不信任插件。
- 热插拔与灰度:插件可运行时启用/禁用,支持按租户、按业务线灰度。
三、高可用设计(四道防线)
| 防线 | 措施 |
|---|---|
| 模型高可用 | 多 Provider 自动故障转移(fallback 链)、超时重试、降级到小模型 |
| 执行高可用 | Checkpoint 断点续跑、幂等工具设计、超时与熔断 |
| 状态高可用 | 持久化写入优先于内存态;事件流可重放重建状态 |
| 成本高可用 | Token 预算硬上限、单任务熔断、按步骤分级选模、Prompt Cache |
四、落地节奏(避免"大爆炸重构")
阶段一(0-1):跑通最小闭环 ------ 一个模型 + 三个工具 + Loop + 事件落盘
阶段二(1-10):补 Harness ------ 沙箱、权限、验证器、观测;此时才敢放开工具范围
阶段三(10-50):抽出微内核 ------ 把协议与 Loop 固化为独立包,业务全部插件化
阶段四(50+) :多产品线复用内核 ------ 差异化 100% 走配置 + 插件;建评测与指标体系
五、治理机制(Leader 必须立的规矩)
- 协议变更评审制:协议是宪法,变更必须评审 + 版本化(语义化版本 + 兼容期)。
- 内核代码冻结:内核 PR 需架构组双人评审;业务方提需求一律走扩展点。
- 插件准入清单:第三方插件需安全评审 + 权限最小化。
- 指标驱动迭代:以第 6 章四象限指标为迭代依据(成功率、返工率、成本、风险拦截数)。
Q15(数据结构)State Schema、Graph Schema 与业务 DSL 分别约束什么?
作答骨架:
- State Schema:约束共享状态,规定字段、类型与归并方式。
- Graph Schema:约束协作结构,规定节点、边、条件分支与数据流转规则。
- 业务 DSL:约束单次模型输出,把自由文本收敛为结构化、可校验的 JSON 或领域对象。
- 一句话:State 管"共享什么",Graph 管"怎么流动",DSL 管"单次产出是否合格"。
Q16(指标体系)如何定义和评估智能体执行指标?
作答骨架:
- 效率:任务成功率、首轮通过率、总执行步骤、人工复核时长。
- 质量:代码规范合规率、类型安全率、测试覆盖率、回归缺陷数、缺陷率。
- 成本:总 Token、输入/输出 Token、总执行成本、单位成功任务成本。
- 风险:权限拦截、风险预警、回滚次数、审计通过情况。
- 原则:以"单位成功任务"为口径,效率、质量、成本、风险四者平衡,不能只看单点最优。
Q17(架构治理)作为架构师,如何让多产品线共享同一套 Agent 内核?
作答骨架:
- 内核只保留协议、Loop、状态与事件总线,保证稳定、极小、可测试。
- 产品差异通过配置、Skill、工具、插件、钩子实现,不 fork 核心代码。
- 建立协议版本管理、插件兼容性测试、灰度发布与快速回滚机制。
- 平台团队维护内核与扩展点契约,产品团队只做扩展与场景化编排。
- 用统一指标与评测集衡量各产品线效果,反哺内核演进。
Q18(Coding Agent 模块)类似 Codex 的 Coding Agent 应该划分哪些模块?
作答骨架:
| 模块 | 职责 |
|---|---|
| Interface | CLI/IDE 入口,接收任务、展示流式输出与 diff |
| Session/Runtime | 会话生命周期、消息历史、状态与中断管理 |
| Agent Loop | 模型调用 → 工具执行 → 结果回灌 → 停止判断 |
| Context Manager | 上下文装配、文件检索、历史压缩、Token 预算 |
| Tool Registry | 注册、校验、执行 read/write/edit/bash/grep 等工具 |
| Sandbox | 文件系统与命令隔离、网络白名单、高危操作审批 |
| Verifier | 测试、lint、类型检查、结果断言 |
| Memory/State | 会话树、检查点、断点恢复 |
| Policy | 权限策略、审批流、操作边界 |
| Telemetry | 日志、链路追踪、Token 与成本统计 |
验收标准:能完成"定位 Bug → 修改代码 → 跑测试 → 输出 diff 与风险说明"的最小闭环。
附录 A:术语速查表
| 术语 | 含义 |
|---|---|
| ReAct | Reasoning + Acting,智能体的原子循环:Thought → Action → Observation |
| DAG | 有向无环图,子任务依赖关系的表达方式,是编排层调度与回退的前提 |
| Harness | 包裹在模型+工具循环外的脚手架:系统提示、计划追踪、中间结果存放、子任务委派、上下文防溢出 |
| Loop | 最小执行闭环:模型调用 → 工具执行 → 结果回灌 → 再推理,含 maxTurns / AbortSignal |
| HITL | Human-in-the-Loop,高危操作人工确认/审批 |
| Checkpoint | 状态快照,用于断点续跑与时间旅行调试 |
| 时间旅行调试 | 基于不可变事件流重放到任意历史时刻的状态 |
| Offloading(外化) | 把大工具结果写入文件、以路径引用,避免污染上下文窗口 |
| Compaction(压缩) | 上下文超预算时摘要旧消息;分阈值压缩与自主压缩两种 |
| Delta Channel | 状态字段只存增量 patch,把 Checkpoint 增长从 O(N²) 降到 O(N) |
| MCP | Model Context Protocol,工具/能力标准化接入协议("工具的 USB 接口") |
| A2A / Agent Protocol | 智能体间通信协议,支持异步子智能体派发与 task id 追踪 |
| Skill | 可加载的指令包,在特定场景注入 system prompt 或工具("专家模式"切换) |
| SubAgent | 子智能体,拥有隔离上下文,只向父智能体回传精简结论 |
| Model Catalog | 模型目录服务,按能力/成本/延迟动态选型 |
| 业务 DSL | 约束单次模型输出的结构化模具(如 Zod Schema + Structured Output) |
| Verifier | 外部验证器(build / lint / test),Loop 中决定是否重试的权威来源 |
| Guardrail | 安全护栏:权限、沙箱、审批、内容过滤 |
| Telemetry | 观测:Token 统计、工具追踪、性能指标、轨迹回放 |
| TTFT | Time To First Token,首字延迟 ------ Agent 体验的关键指标 |
| JSONL | 行式 JSON,常用的会话持久化格式(另一个选择是 SQLite) |
附录 B:思考作答模板与一句话主线
B.1 五步作答模板
- 先说结论:一句话给出核心判断,直击重点。
- 再讲分层:从模型层、编排层、能力层、基础设施层展开。
- 强调边界:Loop、Harness、Skill、Tool、MCP 各管什么。
- 给验证方式:如何测试、如何回滚、如何观测、如何控制成本。
- 补落地经验:一个最小闭环案例,再说明如何扩展到生产。
B.2 一句话主线
text
控制权决定智能体形态,
协议决定系统能否协作,
Loop 决定任务能否闭环,
Harness 决定执行是否安全可控,
Skill 与 Tool 决定能力边界,
Verifier 决定结果是否可信,
Telemetry 决定系统能否持续优化。
最后一句 :整套体系的收敛点可以概括为 ------ 用协议锁住变化,用 Harness 兜住不确定性,用 Loop 驱动收敛,用 Graph 组织分工,用指标衡量成败。