
架构师之道
● AI · LLM · Agents | Enterprise Architecture | Digital Transformation
1 引言
AI 智能体不是因为提示词写得更长就变得好用。它好用的前提,是有一个合适的工作场所:能查看的文件、能调用的工具、能恢复的状态、以及不能越过的边界。
这是当下许多开发者正在感受到的转变。聊天机器人负责回答,智能体负责执行。但如果你只给智能体一条系统提示和几个 API 工具就把它扔进产品,很快就会撞上同样的问题:上下文混乱、权限不清、工具调用难以调试、成本在后台悄悄攀升。
解决之道不是“更放任”,而是“工作空间架构”。
一个好的 AI 智能体工作空间,为模型提供一个受控环境,让它能够探索、规划、执行、暂停,并留下可追溯的痕迹。本文会讲清楚:面向真实客户场景,你应该存什么、暴露什么、限定什么、审核什么、追踪什么。
2 什么是 AI 智能体工作空间?
AI 智能体工作空间,是智能体执行任务时的运行时环境。
它通常包含:
任务说明 用户或租户上下文 文件、文档或结构化记录 工具和 API 记忆或运行历史 权限 预算 追踪信息 审批关卡 输出产物
打个比方:给外包人员发一条模糊的 Slack 消息,和给他一个项目文件夹、访问规则、检查清单、以及提交成果供审核的流程——两者效果截然不同。
工作空间决定了模型能看到什么、改动什么、恢复什么、以及证明什么。
3 为什么工作空间设计现在很重要
最近的 AI 工具趋势指向同一个方向:智能体正在从聊天框走向工作环境。
新闻和搜索信号显示,以下方向关注度在上升:
能在模型和工具之间切换的智能体应用 面向应用开发者的嵌入式智能体框架 具备持久状态的企业级智能体工作空间 浏览器和桌面端的智能体运行环境 需要权限、追踪和成本控制的 AI 工作流 原生集成 AI 能力的开源自动化工具
开发者的关注点不再只是“该用哪个模型?”,而是“智能体该在哪里工作?”
这很重要,因为生产环境中的很多故障,其实是环境故障,而不单纯是模型故障。
如果你正在为客户构建 AI 功能,工作空间不是锦上添花,而是控制平面。
“Control Plane”(控制平面)是系统架构中的标准术语,特指负责策略制定、配置下发和全局调度的管理层,与“Data Plane”(数据平面)相对。
4 核心工作空间分层
一个可用于生产的工作空间,包含五个层次。
4.1 任务层
任务层定义智能体要做什么。
它应当包含:
用户请求 成功标准 约束条件 预期输出格式 截止时间或预算 风险等级 允许使用的数据来源 是否需要人工审批
不要只把原始用户提示词丢给模型。用户提示词往往模糊、带有情绪、或缺失关键背景。你应该把请求转成一个任务对象,让系统能够检查。
示例:
{
"task_id": "task_481",
"tenant_id": "tenant_acme",
"goal": "根据已批准的产品说明,创建一封入职邮件草稿序列。",
"success_criteria": [
"只使用已批准的产品说明",
"创建 5 封邮件",
"包含主题行",
"不实际发送邮件"
],
"risk_level": "draft_only",
"max_model_cost_usd": 1.25,
"requires_human_approval": false
}
这样就把一条松散的提示,变成了一份可执行的契约。
4.2 上下文层
上下文层决定智能体能读取什么。
这是很多团队最容易踩的第一个大坑:要么给的上下文太少,导致智能体靠猜;要么给得太多,导致响应慢、成本高、且更容易被恶意利用。
请使用“上下文数据包”,而不是“上下文倾泻”。
一个好的上下文数据包应包含:
简短的任务摘要 选定的记录 来源 ID 每个来源的权限 来源更新时间戳 缓存有效期限(TTL) 排除的数据列表 引用规则
示例:
{
"context_packet": {
"summary": "客户正在为按使用量计费的套餐配置账单告警。",
"sources": [
{
"id": "doc_17",
"type": "help_doc",
"title": "使用量计费告警说明",
"source_updated_at": 1723795200000,
"cache_ttl_seconds": 3600,
"permission": "tenant_read"
},
{
"id": "ticket_3391",
"type": "support_ticket",
"permission": "user_visible"
}
],
"excluded": ["internal_pricing_notes", "other_tenant_tickets"],
"citation_required": true
}
}
注意,source_updated_at 和 cache_ttl_seconds 字段将上下文有效性判断从"模型的主观猜测"变成了"系统的确定性断言"。策略引擎会在任务启动前做一道硬校验:如果当前时间减去数据更新时间超过了 TTL,该数据包会被标记为"可能已过期",系统会强制触发一次源数据拉取,或者要求人工确认后才交给智能体。
重点不是把有用的信息藏起来,而是让上下文的提供变得有意图、有章法。
4.3 文件与产物层
智能体如果能创建和修改产物,工作效果会更好。
工作空间应该提供一个轻量级文件系统或产物存储区,让智能体能够:
读取已批准的输入 创建草稿 保存中间笔记 产出最终结果 附加证据 留下变更差异供审核
这对代码生成智能体、报告生成器、入职助手、研究智能体和数据分析工作流尤其有用。
建议按用途分离文件目录:
/workspace
/input
product_notes.md
customer_profile.json
/scratch
plan.md
extracted_claims.json
/output
onboarding_sequence.md
/evidence
source_map.json
tool_trace.json
/scratch 目录很重要。智能体需要空间来推演工作,但草稿内容不应自动变成面向客户的最终输出。
在多智能体协作或"人类与智能体协同编辑"的场景下,文件并发问题必须提前考虑。智能体的"读取-修改-写入"操作序列并不是原子的。如果人类审核员在智能体生成草稿的同时修改了同一个文件,后写入的一方会直接覆盖前者的变更。工作空间服务应当对每个文件附带版本号(etag),写入时必须校验版本是否匹配,若不匹配则拒绝本次写入并返回冲突提示,强制智能体重新读取最新内容后再试。如果不想引入并发控制的复杂度,可以退一步,将该工作空间显式设计为"仅智能体可写、人类只读审核"的简化模型。
4.4 工具层
工具层定义智能体能做什么。
每个工具都要封装成一个契约,不要直接暴露原始 API 访问。
工具契约应定义:
名称 用途说明 输入输出结构 所需权限 副作用说明 速率限制 成本预估 风险等级
需要特别指出的是,风险等级不能只依据"读"或"写"这类动作来划分。在实际生产环境中,"读取"个人身份信息或财务核心字段,其合规风险远高于"写入"一张临时调试表。正确的做法是采用"动作类型 + 数据分类"的二维矩阵来确定风险等级。例如,读取公开文档可归为低风险,读取用户手机号则应自动升为高危操作并强制触发审批。工具契约中应显式声明该工具所能接触的最高数据敏感级别。
示例工具定义:
type AgentTool<I, O> = {
name: string;
description: string;
risk: "read" | "draft" | "write" | "external";
data_classification: "public" | "internal" | "confidential" | "pii" | "financial";
inputSchema: unknown;
requiresApproval: boolean;
validateInput: (input: I) => boolean;
run: (input: I, ctx: ToolContext) => Promise<O>;
};
const createDraftEmail: AgentTool<
{ customerId: string; subject: string; body: string },
{ draftId: string; status: "created" }
> = {
name: "create_draft_email",
description: "创建邮件草稿。不会实际发送。",
risk: "draft",
data_classification: "pii",
inputSchema: {
customerId: "string",
subject: "string",
body: "string"
},
requiresApproval: false,
validateInput(input) {
// 对 subject 和 body 做 XSS 注入检查
return !/<script|javascript:|on\w+=/i.test(input.subject + input.body);
},
async run(input, ctx) {
await ctx.policy.assertTenant(input.customerId);
return ctx.email.createDraft(input);
}
};
注意描述中的"不会实际发送"。工具描述要消除歧义。如果某个工具会写入、发送、删除、支付、邀请、导出或更改权限,一定要说清楚,并设置相应的审批关卡。
另外,所有涉及可执行字符串类型的工具参数,必须实施输入合法性校验。智能体生成的字符串有可能被上游用户通过提示词注入攻击,夹带 "'; DROP TABLE users; --" 或 "$(rm -rf /)" 之类的内容。不能把模型输出的原始字符串直接拼接到 SQL、Shell 命令或 GraphQL 变量中。凡是未定义输入净化规则的工具,一律禁止注册到生产环境。
4.5 状态与追踪层
状态层让智能体能恢复执行,追踪层则让人能够调试。
需要记录:
任务状态 当前步骤 模型调用 工具调用 工具输入及脱敏后的输出 每一步的成本 审批记录 错误信息 最终产物 面向用户的摘要
不需要把所有词元都永久保留,但必须保留足够证据来回答:
智能体当时知道什么? 它做了什么决策? 调用了哪个工具? 谁批准的? 改了什么? 花了多少钱? 能重放或修复吗?
没有追踪,每个线上问题都会变成谜团。
除了记录信息,工作空间还必须具备智能体行为异常检测能力。生产环境中一个常见故障是智能体陷入"工具调用死循环"——反复用相同或高度相似的输入调用同一个工具,却没有实质性的进度推进。仅靠最大调用次数这类硬上限,无法区分复杂长链推理和原地空转。
建议引入进度单调性检查:每次工具调用结束后,对比调用前后的工作空间状态,特别是 /scratch 目录下的文件哈希值或内容增量。如果连续三轮调用后,工作空间既没有产生新的有效产出,也没有标记任何待办事项的完成,则判定为疑似卡死,主动触发告警并转入人工接管流程。同时,对相邻轮次的模型输入计算语义相似度,若连续多轮高度相似(如 > 0.95),同样视为循环迹象,立即暂停执行。
5 一个简单的参考架构
下面是一个实际的 AI 智能体工作空间流程:
用户请求
↓
任务构建器
↓
策略检查 —— 拒绝不安全或不支持的任务
↓
上下文数据包构建器(含时效性校验)
↓
创建工作空间
↓
智能体浏览文件和工具
↓
生成计划(v1)
↓
风险检查(二维矩阵:动作 × 数据分类)
↓
执行工具 / 创建产物草稿
↓
进度评估与重规划
├─ 进度正常 → 继续
└─ 停滞或信息缺失 → 生成计划差异更新(v2),不覆盖 v1
↓
如有需要,进入审批关卡
↓
最终输出 + 证据摘要
↓
存储追踪信息,用于审计和改进
这个流程特别强调了规划与执行之间的解耦。一次性规划对于复杂任务几乎永远不够用。智能体在调用工具后往往会发现新的上下文,或遭遇预期之外的错误,此时必须允许它动态调整剩余步骤。
但"调整"不等于"推倒重来"。工作空间应当以差异更新的方式来记录每次规划的变更:保留原始计划的完整快照,每次修改只记录"新增了哪些步骤、删除了哪些步骤、修改了哪些步骤的前置条件"。这样做有两个好处:第一,审计人员能清晰追溯智能体的意图演变过程;第二,当最终结果出错时,调试者可以定位到哪一次重规划引入了错误方向,而不会迷失在混乱的工具调用堆栈中。
这个流程不绑定任何特定框架。你可以用自定义编排器、工作流引擎、智能体 SDK、Serverless 函数、队列或后台任务来实现。
关键在于边界:智能体不能在你的产品里随意游荡,它必须在一个有规则的工作空间内运行。
6 如何限定文件访问,又不损害实用性
文件访问应该做到‘朴素且明确’——即规则简单清晰,不玩花样。
遵循以下原则:
- 默认拒绝。
除非任务构建器明确包含,否则智能体看不到任何文件。 - 区分输入、草稿、输出和证据。
不要把原始数据和生成结果混在一起。 - 给文件附加权限。
支持工单、发票和内部笔记的可见性不应相同。 - 让写操作可逆。
先出草稿,再正式应用。 - 让工作空间过期失效。
敏感临时上下文不要保留超过必要时间。
常见做法是按任务创建工作空间:
/workspaces/{tenant_id}/{task_id}/
然后所有读写操作都通过工作空间服务来执行。模型永远不应该直接拿到原始存储桶路径或不受限的文件浏览器。
7 如何设计工具权限
工具权限的判定依据,不应仅仅是"用户是谁",也不该是"动作是什么",而应是"谁 + 对什么数据 + 做什么"的三元组。用户本人可能有删除记录的权限,但不代表智能体可以在任意任务上下文中继承该权限。
我们建议采用二维风险模型:
这种矩阵式模型比单纯按动作定级要严谨得多,能兼顾灵活性与安全性。
另外,为工具设置预算也是一种有效防护:
{
"tool_budget": {
"max_calls_total": 25, // 总调用次数上限
"max_search_calls": 5, // 搜索类调用上限
"max_write_calls": 2, // 写入类调用上限
"max_runtime_seconds": 180, // 最大运行时间(秒)
"max_cost_usd": 2.00 // 最大花费(美元)
}
}
预算不仅控制成本,还能用来发现卡住的工作流。但注意,预算只是辅助手段,核心的卡死检测还是要靠上一节提到的进度单调性检查。
8 工作空间记忆:哪些该记,哪些该忘
智能体记忆很有用,但不应该什么都存。建议分成三类:
- 运行记忆:
当前任务临时状态 - 用户记忆:
用户期望你记住的稳定偏好 - 系统记忆:
产品规则、策略和工作流指令
不要让运行记忆悄悄变成用户记忆。如果智能体学到了某些可长期保留的信息,那应当作为一个显式的产品决策来处理。基本原则:运行记忆设短 TTL,用户记忆需用户同意,默认不存敏感字段,不跨租户共享记忆。
9 把人工审核纳入工作空间
人机协同应当内置于工作空间,而不是后期补丁。当任务越过风险边界时,暂停执行并生成一个审核数据包,包含:请求的操作、精确的工具输入、预期副作用、来源证据,以及批准/拒绝/编辑控件。
糟糕的审核界面说:“智能体想继续,批准吗?”
好的审核界面说:“智能体想把这封邮件发送给这 142 位用户,主题和正文如下,依据来源如下。批准、编辑还是取消?”
审批是信任界面,不是复选框。
10 最小可行工作空间
如果你刚起步,可以从最小可行工作空间开始:
任务对象 上下文数据包(带时效校验) 限定了作用域的文件/产物存储(带并发控制或单写约束) 工具注册表(含风险等级和数据分类) 成本与工具调用预算 追踪日志(含卡死检测) 外部操作的审批关卡 最终答案带证据链接
这些足够让你从“酷炫演示”升级到“受控工作流”。
具体代码会因技术栈而异,但结构应该保持不变:创建任务、构建作用域上下文、挂载允许的工具、执行预算、记录追踪,遇到需审批的操作就暂停。
11 常见错误规避
把软性提示当成硬性控制,是削弱智能体工作空间的最快方式。注意这些陷阱:
- 只靠提示保证安全:
提示可以说"不要访问私有数据",但工作空间应当让私有数据根本不可见。 - 完全继承用户权限:
用户权限应缩减为任务范围的智能体权限,而非全量继承。 - 没有草稿空间:
没有草稿区,计划和最终答案就会混在一起。 - 看不到成本:
重试、检索和长上下文可能隐藏高昂的运行开销。 - 无法复现:
如果无法重放失败的运行,你就无法可靠地改进它。 - 未净化的工具输入:
模型生成的参数不可信。把智能体输出直接拼接到 SQL、Shell 或文件路径中,等于给外部攻击者敞开了远程代码执行的大门。
12 最终检查清单
在发布智能体工作空间之前,问自己:
每次运行是否都有任务对象? 上下文是否经过选择、限定范围,并且有明确的时效性校验? 文件是否按输入、草稿、输出和证据分别存放? 文件写入是否考虑了并发冲突(版本校验或单写约束)? 每个工具是否有明确的风险等级和数据分类? 外部操作是否在执行前经过审批? 成本和工具调用预算是否已强制执行? 是否实现了智能体卡死检测(进度单调性检查)? 智能体能暂停并恢复运行吗? 规划是一次性的,还是支持差异化的重规划? 人类能查看追踪记录吗? 失败的运行能安全地重放吗? 记忆是否设有过期时间,或需要用户同意?
如果多个问题的答案是“否”,那这个智能体还没有做好自主投入生产的准备。请让它继续在草稿模式下运行,直到工作空间完善为止。
13 结语
下一代真正有用的 AI 产品,胜出的关键不是提示词,而是给智能体一个安全、有序的工作环境。
AI 智能体工作空间,把一次模型调用变成了一个操作系统式的环境。它给智能体提供了文件、工具、记忆、权限、预算、追踪和人工审核。同时,它也给了你的团队同样重要的东西:一种能力——当智能体成功、失败或请求帮助时,你能清楚地知道发生了什么。
从小处开始:创建任务对象、构建上下文数据包、限定工具范围、存储追踪信息,并在外部操作前要求审批。把基础打牢,再逐步增加智能体的自主权。
架构师之道
架构之道,在于化繁为简,以设计思维驱动技术决策
> 关注作者并添加星标,与‘架构师之道’同行
夜雨聆风