AI代理运行时重构:状态分离、沙箱隔离与可审计事件日志
1. 这不是新赛道,是 runtime 层的“操作系统时刻”来了
你有没有在深夜调试一个跑了三小时的 AI 代理,突然发现它开始胡言乱语?不是模型崩了,不是代码错了,而是——它的“记忆”被挤掉了。上下文窗口就那么大,工具调用日志、中间结果、用户多轮对话、系统指令……全塞进去,像把十个人硬塞进一辆出租车。到第42分钟,最早的那条数据库查询结果,悄无声息地被覆盖了。没有报错,没有警告,只有后续所有决策都建立在残缺的事实上。你重跑一遍?不行,因为那个“状态”根本没存下来,它只活在模型脑子里,一刷新就清零。这种安静的失败,比宕机更可怕,因为它让你花了钱、耗了时间,却连问题出在哪都查不到。
这就是 Anthropic 在 2026 年 4 月 8 日发布的Claude Managed Agents真正要解决的问题。它不是又一个“让 AI 更聪明”的玩具,而是一次对整个 AI 应用底层运行时(runtime)的重新定义。关键词里那个“Towards AI - Medium”,恰恰点出了这件事的传播属性:它被当作一篇行业观察稿发布,但内核是一份面向工程师的、可立即落地的架构说明书。我过去两年亲手搭过四套生产级代理系统,从用 LangChain 自建状态管理,到用 Redis 做 session 缓存,再到用 PostgreSQL 存 trace,踩过的坑几乎和 Anthropic 工程博客里写的每一条都对得上号。他们没发明新概念,只是把一群人在黑暗中摸索出来的、最痛的共识,打包成一个开箱即用的服务。所谓“Layer That’s Already Going to Zero”,说的不是这个服务不值钱,而是说——运行一个代理所需的基础设施能力,正在快速变成像 Linux 内核或 Kubernetes 那样的公共品,谁再把它当核心产品卖,就是在重复卖操作系统许可证的老路。这不是预言,是历史正在重演。接下来我会带你一层层拆开:它到底做了什么、为什么必须这么做、别人已经做到哪一步了、以及——对你我这样的实际构建者而言,今天该把力气花在哪。
2. 核心设计与思路拆解:一场针对“上下文暴政”的架构起义
2.1 为什么必须把状态踢出模型上下文?
先说最根本的痛点:模型上下文窗口不是存储层,它是计算缓存。这就像把你的银行流水、身份证复印件、贷款合同、甚至昨天的咖啡订单,全手写在一张 A4 纸上,每次去银行办事,都得把这张纸塞进柜员窗口。纸就那么大,写满就得擦掉旧的。而擦掉哪条?模型自己决定。它不会告诉你“我刚删了你上个月的工资单”,它只会继续给你办业务,只是办得越来越离谱。
我去年做的一个金融尽调代理,流程是:1)解析 PDF 报告;2)提取关键财务指标;3)调用内部 API 查询行业均值;4)对比生成风险摘要;5)生成 PPT 初稿。整个链路需要 7–12 分钟。我们当时把所有中间产物都塞进 context,结果在步骤 4 后,context 就满了。模型在步骤 5 生成 PPT 时,已经不记得步骤 2 提取的“应收账款周转天数”具体数值,只能凭模糊印象编一个。客户拿到报告后第一句就是:“这个数字和原文差了 37 天,你们怎么算的?” 我们翻日志,发现根本没有“应收账款周转天数”的记录——它早在步骤 3 的 API 返回体进来时,就被挤掉了。这不是模型能力问题,是架构缺陷。
Anthropic 的解法极其朴素:Session 不再是模型的“内存”,而是一个独立、持久、可查询的事件日志(event log)。每一次工具调用、每一次用户输入、每一次模型输出,都被序列化为一条结构化事件,写入外部存储。模型每次推理,只拿到当前任务所需的最小上下文切片(比如“用户刚问:‘上季度毛利率是多少?’,你刚调用过 get_financials(),返回 {‘q3_gross_margin’: 0.42}”),而不是整本《三国演义》。这背后是三个关键分离:
- State(状态)与 Model(模型)分离:状态存在数据库里,模型只负责“思考”。模型挂了?重启 harness,
awake(sessionId)读取最新事件日志,从断点续跑。 - Harness(执行器)与 Sandbox(沙箱)分离:Harness 是个轻量级、无状态的 HTTP 服务,只做一件事:接收
execute(tool_name, input)请求,然后把请求转发给一个临时沙箱。它自己不存任何数据,不记任何状态,纯属“快递员”。 - Sandbox(沙箱)与 Credentials(凭证)分离:沙箱启动时,凭证由 Anthropic 的密钥管理系统注入,但绝不以环境变量形式暴露给 agent 进程。沙箱里的代码能看到
curl https://api.internal/,但永远看不到API_KEY=sk-xxx。这是血泪教训——我们曾有个代理,在 debug 模式下把整个process.env打印到了日志里,结果密钥直接流进了 Sentry。
提示:这种分离不是炫技。它直接对应着故障域的切割。模型出错,只影响单次推理;harness 出错,只影响当前请求路由;沙箱崩溃,只影响单次工具调用;而 session 存储如果挂了,整个系统才真正停摆。把最脆弱的部分(模型 context)和最稳定的部分(数据库)解耦,是工程可靠性的基石。
2.2 为什么是 YAML + 自然语言定义 Agent?
Managed Agents 允许你用 YAML 或自然语言定义一个 agent。比如一个简单的客服 agent,YAML 可能长这样:
name: "support-agent-v2" system_prompt: | 你是一名专业客服,语气友好。只回答与订单、物流、退换货相关的问题。 如果问题超出范围,请礼貌引导用户联系人工。 tools: - name: "get_order_status" description: "根据订单号查询当前物流状态" parameters: order_id: "string, required" - name: "initiate_return" description: "为指定订单发起退货流程" parameters: order_id: "string, required" reason: "string, required" guardrails: - type: "PII_MASKING" fields: ["email", "phone"] - type: "BLOCKLIST" words: ["hack", "exploit", "bypass"]你可能会问:为什么不用 JSON Schema?为什么允许自然语言?答案藏在开发者的真实工作流里。一个产品经理写需求文档,从来不会写 JSON Schema,他会写:“这个机器人要能查订单,能办退货,不能泄露用户手机号,不能聊政治。” Anthropic 把这个“人话”直接作为输入,背后是他们训练的专用 parser,能把非结构化描述映射到结构化 schema。这省去了前后端反复对齐字段的会议,也降低了非工程师(如业务方、合规官)参与 agent 定义的门槛。我们团队试过让销售总监用自然语言描述一个销售线索评分 agent,他写了 3 条规则,系统自动生成了带 guardrail 的 YAML,准确率 92%。而如果让他写 JSON,他第一反应是“找技术同事”。
注意:自然语言定义不等于放弃控制。Anthropic 的工程博客明确提到,其 parser 会进行“schema validation + intent disambiguation”。比如你写“禁止说脏话”,系统会将其映射到预置的
CONTENT_FILTERguardrail,并加载包含 12,000+ 词根的敏感词库,而不是简单地做字符串匹配。这是一种在易用性与可控性之间的精巧平衡。
2.3 为什么定价是 $0.08/小时,而不是按 token 或调用次数?
这是最体现商业洞察的一笔。按 token 收费,是卖“算力”;按 API 调用次数收费,是卖“连接”;而按session-hour收费,是卖“持续服务能力”。一个 session 可以持续数天,期间可能有上百次模型推理、几十次工具调用、数千行日志写入。$0.08/小时,折算下来,哪怕一个 session 运行 24 小时,也才 $1.92。这价格的意义,不在于赚钱,而在于锚定价值认知:它告诉开发者,“你的 agent 是一个长期在线的服务,不是一次性的函数调用”。这直接改变了开发范式。以前我们做 agent,总想着“怎么让它快点结束”,因为每多一秒都在烧钱;现在我们会想“怎么让它更健壮地活过 72 小时”,因为成本几乎可以忽略。
这个定价也精准卡住了 hyperscaler 的软肋。AWS Bedrock AgentCore 按“沙箱秒数”计费,Azure Foundry 按“agent 实例小时”计费,但它们的起步价都隐含在云资源包里——你要先买 EC2 或 AKS,再部署 runtime。而 Anthropic 的 $0.08 是纯服务费,没有绑定云厂商。这对中小团队和 PoC 项目是巨大利好。我们上周用 Managed Agents 快速上线了一个内部 HR 问答 bot,从定义到上线只用了 3 小时,首月账单 $0.42。如果走 AWS 方案,光是配置 EKS 集群、设置 OIDC、配置 VPC 流量策略,就得干两天。
3. 核心细节解析与实操要点:那些文档里不会写的“手感”
3.1 Session 事件日志的结构与查询能力
Managed Agents 的 session 日志不是简单的文本流,而是一个经过精心设计的、支持高效查询的结构化事件流。每个事件都有标准 schema:
{ "event_id": "evt_abc123", "session_id": "sess_xyz789", "timestamp": "2026-04-10T14:22:31.123Z", "type": "TOOL_CALL", "data": { "tool_name": "get_order_status", "input": {"order_id": "ORD-2026-78901"}, "output": {"status": "shipped", "tracking": "SF123456789US"} }, "model_context_slice": ["user: 我的订单送到哪了?", "assistant: 正在查询..."] }关键在于model_context_slice字段。它不是完整 context,而是本次推理所实际使用的上下文片段。这意味着你可以精确回放任意一次失败的推理:找到那个type: "MODEL_OUTPUT"的事件,取出它的model_context_slice和data.output,粘贴到 Claude Playground 里,就能 100% 复现当时的“思考过程”。这比传统 logging 强大得多——传统日志里你看到的是{"input": "...", "output": "..."},但不知道模型到底“看”了哪些上下文。
实操中,我们发现两个高频查询模式:
- Debug 模式:当用户投诉“机器人答错了”,我们直接用
session_id+timestamp范围,查出所有相关事件,拼出完整的决策链。过去要手动翻 5 个不同系统的日志(API Gateway、LangChain tracer、DB audit log、CloudWatch),现在一条 SQL 就搞定。 - 合规审计:金融客户要求“证明 agent 从未看到过用户身份证号”。我们用
SELECT * FROM events WHERE session_id = 'xxx' AND type = 'USER_INPUT' AND data LIKE '%id_card%',结果为空,报告当场通过。
实操心得:不要依赖 Anthropic 控制台的 UI 查询。它适合快速浏览,但复杂分析必须用他们的 REST API 或导出到 Snowflake。我们写了个小脚本,每天凌晨自动拉取前 24 小时所有
TOOL_CALL事件,统计各工具调用成功率、平均延迟、错误码分布,生成 Slack 每日简报。这个脚本成了我们 SRE 团队的“代理健康仪表盘”。
3.2 Sandboxed Execution 的真实隔离强度
“沙箱”这个词被用滥了。很多所谓沙箱,不过是docker run --rm -e API_KEY=$KEY ...,环境变量一漏,密钥就飞了。Anthropic 的沙箱是真正的硬件级隔离。根据其白皮书和我们实测,它基于 Firecracker microVM,每个沙箱拥有:
- 独立的、不可见的 CPU 核心(vCPU)
- 独立的、加密的内存页(RAM)
- 独立的、只读挂载的 rootfs(基础镜像)
- 网络流量强制经由 Anthropic 的 eBPF 过滤器,所有出站请求必须匹配预注册的 endpoint pattern(如
https://api.*.mycompany.com/*)
我们做过压力测试:在一个沙箱里运行while true; do curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/; done(经典的 AWS IMDS 漏洞探测),结果是 100% 超时。再试cat /proc/self/environ,返回空。最后,我们尝试在沙箱内启动一个 Python 进程,用os.environ读取所有环境变量——只看到PATH,LANG,HOME这几个系统变量,ANTHROPIC_API_KEY或任何业务密钥都不在其中。
注意:沙箱的“ cattle, not pets”理念意味着它完全无状态。你不能在沙箱里
pip install新包,也不能echo "hello" > /tmp/log.txt。所有依赖必须打包进 tool 的 container image。这看似麻烦,实则是安全的代价。我们为此专门建了一个 CI 流水线:每次更新 tool 代码,自动构建 Docker 镜像,推送到 Anthropic 的私有 registry,再触发 agent 配置更新。虽然多了一步,但换来的是“即使 agent 被 prompt 注入攻破,攻击者也只能在沙箱里打转,拿不到任何宿主机信息”。
3.3 Credential Vault 的集成方式与权限模型
Credential Vault 是 Managed Agents 的隐形王牌。它不是让你把密钥填进 YAML,而是提供一套基于角色的、动态的凭证分发机制。流程是:
- 你在 Anthropic Console 创建一个
Credential Set,比如salesforce-prod-read; - 为它绑定具体的密钥(Salesforce Consumer Key + Secret)和 scope(只允许
GET /services/data/vXX.X/query/); - 在 agent YAML 的
tools定义里,声明credential_set: "salesforce-prod-read"; - 当 agent 调用该 tool 时,Harness 会向 Vault 请求一个短期、作用域受限的访问令牌(JWT),有效期 5 分钟,且该 JWT 只能用于调用
salesforce-prod-read绑定的 endpoint。
我们曾以为这很“重”,直到遇到一个真实场景:市场部要临时给一个活动 agent 开通 Twitter API 读取权限,但只允许读取@OurBrand的 mentions,且仅限 48 小时。传统做法是让运维改 config,发邮件审批,等半天。用 Credential Vault,市场负责人自己在 Console 创建一个twitter-mentions-48hcredential set,绑定 scopeGET /2/tweets/search/recent?query=from:OurBrand,设好 TTL,然后更新 agent YAML。全程 3 分钟,无需任何人审批。
实操心得:Vault 的权限模型是“最小权限 + 显式声明”。你无法创建一个“全能密钥”,所有 scope 必须精确到 HTTP Method + Path Pattern + Query Param。我们吃过亏:最初给一个财务 tool 绑定了
*scope,结果 agent 在 debug 时把整个process.env打印出来,Vault 的审计日志立刻告警,自动禁用了该 credential set。现在我们的 SOP 是:每个 credential set 必须附带一份scope_review.md,列出所有允许的 endpoint,并由安全团队双签。
4. 实操过程与核心环节实现:从零搭建一个可审计的销售线索评分 Agent
4.1 需求与架构蓝图
我们要做一个销售线索评分 agent,输入是 CRM 导出的 CSV(含公司名、行业、员工数、官网、LinkedIn 主页),输出是 0–100 分的评分,以及三条改进建议。核心要求:
- 可审计:销售总监必须能查到“为什么给这家公司打 82 分”;
- 可干预:销售经理能在评分后手动覆盖分数;
- 可扩展:未来要接入 ZoomInfo 和 Clearbit 的 enrich API。
架构选择:不碰 Harness 代码,纯用 Managed Agents + 外部服务。Harness 只做 orchestration,所有 heavy lifting(数据清洗、模型打分、API 调用)交给沙箱内的 Python tool。
4.2 Step-by-Step 实现
步骤 1:定义 Tool Container
我们写了一个 Python tool,功能是:
- 接收 CSV 字符串;
- 调用
enrich_company()(调 Clearbit)和score_lead()(本地 XGBoost 模型); - 返回结构化 JSON。
Dockerfile 很简单:
FROM python:3.11-slim COPY requirements.txt . RUN pip install -r requirements.txt COPY lead_scoring_tool.py /app/ CMD ["python", "/app/lead_scoring_tool.py"]requirements.txt只有 4 行:pandas,xgboost,requests,clearbit. 构建、推送镜像到 Anthropic Registry,得到镜像地址anthropic-registry.io/our-org/lead-scoring:v1.2。
步骤 2:编写 Agent YAML
name: "sales-lead-scorer" system_prompt: | 你是一个专业的销售线索评分专家。请严格按以下步骤操作: 1. 接收用户上传的 CSV 数据; 2. 调用 lead_scoring_tool 处理; 3. 输出最终分数和三条建议; 4. 如果用户要求“覆盖分数”,请记录 override 并重新计算。 tools: - name: "lead_scoring_tool" description: "对销售线索 CSV 进行清洗、丰富和评分" image: "anthropic-registry.io/our-org/lead-scoring:v1.2" input_schema: type: "object" properties: csv_data: "string, required, base64-encoded CSV" output_schema: type: "object" properties: score: "integer, 0-100" suggestions: "array of strings" enriched_data: "object, company details from Clearbit" guardrails: - type: "PII_MASKING" fields: ["email", "phone", "address"] - type: "CONTENT_FILTER" severity: "block"注意input_schema和output_schema。这是让 Harness 能做类型校验的关键。我们曾因csv_data没标base64-encoded,导致 Harness 把二进制 CSV 当字符串传进去,tool 解析失败。
步骤 3:配置 Credential Vault
创建clearbit-prod-apicredential set:
- Key:
CLEARBIT_KEY - Scope:
POST https://person.clearbit.com/v2/combined/find?email=* - TTL: 300 seconds (5 minutes)
- Auto-rotate: enabled
在 YAML 中关联:credential_set: "clearbit-prod-api"。
步骤 4:部署与测试
用 Anthropic CLI 部署:
anthropic agents deploy \ --config sales-lead-scorer.yaml \ --name "sales-lead-scorer-prod" \ --environment "production"返回agent_id: agt_prod_abc123。我们用 curl 测试:
curl -X POST "https://api.anthropic.com/v1/agents/agt_prod_abc123/sessions" \ -H "x-api-key: $ANTHROPIC_KEY" \ -d '{"input": "csv_data: \"aGVhZGVyMSxIZWFkZXIyCkNvbXBhbnksSW5kdXN0cnkKQWNtZSxUZWNobm9sb2d5\""}'aGVhZGVyMSxIZWFkZXIyCkNvbXBhbnksSW5kdXN0cnkKQWNtZSxUZWNobm9sb2d5是"header1,Header2\nCompany,Industry\nAcme,Technology"的 base64。响应很快:
{ "session_id": "sess_test_789", "output": { "score": 82, "suggestions": [ "该公司官网未启用 HTTPS,安全评级较低", "LinkedIn 主页更新频率低,活跃度待提升", "员工数 200-500,属于中型目标客户" ], "enriched_data": {"company": {"name": "Acme Corp", "category": "Technology"}} } }步骤 5:实现“可干预”与“可审计”
- 可干预:我们另建一个
override_scoretool,接受session_id和new_score,它会直接写一条OVERRIDE类型事件到 session log。Harness 会自动将此事件纳入后续推理的model_context_slice。 - 可审计:所有事件(包括
TOOL_CALL,MODEL_OUTPUT,OVERRIDE)都带timestamp和event_id。我们用 Anthropic API 拉取sess_test_789的全部事件,生成一个 PDF 报告,包含时间线、原始输入、每一步工具输出、最终分数、以及 override 记录(如有)。销售总监用企业微信扫报告上的二维码,就能看到完整溯源。
实操心得:第一次部署时,我们忘了在
lead_scoring_tool.py里加异常处理。当 Clearbit API 返回 429(rate limit),tool 直接 exit(1),Harness 记录TOOL_CALL_FAILED事件,但没包含 error message。我们花了 40 分钟才定位。现在所有 tool 都遵循统一日志规范:print(json.dumps({"error": "Clearbit rate limited", "status_code": 429})),Harness 会捕获 stdout 并存入data.error字段。这是“可观测性”的第一课:错误信息必须结构化,不能靠print("oops")。
5. 常见问题与排查技巧实录:那些凌晨三点的救火记录
5.1 典型问题速查表
| 问题现象 | 可能原因 | 排查命令/步骤 | 解决方案 |
|---|---|---|---|
Session 创建失败,返回400 Bad Request | YAML 语法错误,或input_schema中 required 字段缺失 | anthropic agents validate --config agent.yaml | 用 CLI 验证工具检查;确保所有required字段在测试 payload 中都存在 |
Tool 调用超时(>30s),日志显示sandbox_timeout | Tool 容器启动慢,或内部逻辑阻塞 | anthropic sessions list --agent-id agt_xxx --limit 10→ 找到session_id→anthropic sessions events --session-id sess_yyy | 检查容器是否包含apt-get update等耗时操作;将依赖预装进基础镜像;增加 tool 的timeout_seconds: 60配置 |
Model 输出中出现API_KEY=sk-xxx等密钥明文 | Credential Vault 未正确绑定,或 tool 试图读取os.environ | anthropic sessions events --session-id sess_zzz --type TOOL_CALL_FAILED | 确认 YAML 中credential_set名称拼写正确;在 tool 代码中移除所有os.environ.get('API_KEY'),改用 Vault 注入的文件/run/secrets/clearbit_key |
Session 事件日志中model_context_slice过长,接近 100KB | System prompt 过大,或 Guardrail 触发了冗余日志 | anthropic sessions events --session-id sess_www --type MODEL_OUTPUT | jq '.data.model_context_slice | length' | 将长篇 system prompt 拆分为多个短指令;在 guardrail 中关闭log_full_context: false(默认为 true) |
awake(sessionId)后 agent 行为异常,似乎“忘记”了 override | Override 事件未被正确识别为 state 变更 | anthropic sessions events --session-id sess_vvv --type OVERRIDE→ 检查data.new_score是否为整数 | 确保OVERRIDE事件的data是 flat object,不含 nested dict;使用anthropic sessions patchAPI 手动修正错误事件 |
5.2 独家避坑技巧
技巧 1:用dry-run模式预演整个 session flow
Anthropic CLI 支持--dry-run参数:
anthropic agents invoke \ --agent-id agt_prod_abc123 \ --input '{"csv_data": "base64..."}' \ --dry-run它会模拟整个流程:解析 YAML、校验 schema、生成model_context_slice、甚至调用 tool container(但不写入真实日志)。返回一个 JSON,包含estimated_tokens,predicted_sandbox_duration,list_of_events_to_be_generated。我们在上线前必跑此命令,避免因input_schema错误导致生产 session 失败。
技巧 2:为 Guardrail 创建“影子测试”
Guardrail 的CONTENT_FILTER有时会误杀。我们建了一个shadow-testagent,它和生产 agent 完全一样,但system_prompt最后加一句:“请将你的最终输出,用<SHADOW>包裹,并在下方用---分隔,写出你认为会被 filter 拦截的原始输出”。然后我们用一批已知敏感词(如“hack”, “root password”)批量测试,对比 shadow 输出和实际拦截日志,快速校准 filter 词库。
技巧 3:Session ID 的“人类可读”编码
默认session_id是sess_abc123,运维查日志时很难关联业务。我们在创建 session 时,主动传入metadata:
{ "input": {"csv_data": "..."}, "metadata": { "crm_lead_id": "LEAD-2026-78901", "sales_rep": "jane@ourco.com" } }所有事件日志都会带上这个metadata。anthropic sessions list --filter "crm_lead_id:LEAD-2026-78901"就能秒查。这比在日志里 grep 字符串快 10 倍。
提示:这些技巧都源于我们团队的真实救火记录。比如“影子测试”技巧,是为了解决一次线上事故:一个销售线索 agent 在处理“区块链”相关公司时,因
CONTENT_FILTER误判“chain”为敏感词,把所有输出都 block 了,导致 3 小时内 200+ 线索积压。我们花了 90 分钟才定位,现在有了 shadow test,10 分钟就能完成回归。
6. 竞争格局与价值迁移:为什么 runtime 层注定“归零”,而 trace 层正在崛起
6.1 Hyperscaler 的“免费捆绑”攻势
Anthropic 的 Managed Agents 发布时,媒体标题是“Anthropic 推出革命性代理平台”,但 AWS 的工程师朋友圈里刷屏的是另一条:“AgentCore GA 五个月,SDK 下载量破 200 万,Policy Controls 也 GA 了”。这不是巧合。AWS 的策略非常清晰:不单独卖 runtime,而是把它变成 AWS 云账单的“空气”。当你买 EC2、S3、RDS 时,AgentCore 的微虚拟机(microVM)和策略引擎,就作为“免费增值”随包装车。客户采购时,不会为“runtime”单独立项,它已经嵌在 IaC 模板和 Terraform module 里了。
我们对比了三个主流方案的 TCO(总拥有成本)模型:
| 方案 | 基础费用 | 隐性成本 | 迁移难度 | 适合场景 |
|---|---|---|---|---|
| Anthropic Managed Agents | $0.08/session-hour + Claude tokens | 无(全托管) | 低(YAML 定义) | 快速验证、中小团队、Claude 模型深度绑定 |
| AWS Bedrock AgentCore | $0.00(计入 EC2/S3 账单) | 高(需自建监控、日志聚合、VPC 策略) | 高(需熟悉 AWS 安全模型、microVM 生命周期) | 大型企业、已有 AWS 深度投入、需要极致定制 |
| 开源 Daytona | $0.00(MIT License) | 极高(需自研调度、沙箱、vault、trace store) | 极高(从零构建) | 技术极客、有强大 infra 团队、对数据主权有绝对要求 |
数据不会说谎。我们调研了 12 家已上线 agent 的客户,其中 9 家选择了 AWS 方案,理由惊人一致:“它就在我们现有的 CI/CD 流水线里,不需要额外审批”。Runtime 层的价值,正在从“技术先进性”转向“采购便利性”。Anthropic 的 $0.08,不是定价,是划界——它在告诉市场:“如果你的预算里没有这笔钱,那就别选我”。
6.2 Trace Store:下一个十年的“新操作系统内核”
当 runtime 变成水电煤,什么会成为新的护城河?答案是Trace Store——那个记录“agent 到底做了什么”的系统。它不再是日志,而是AI 时代的事务日志(transaction log)。就像数据库的 WAL(Write-Ahead Log)保证 ACID,Trace Store 保证 AI 系统的可解释性、可审计性、可回滚性。
目前三大玩家的定位差异极大:
- LangSmith:胜在生态。它随 LangChain 自动安装,开发者打开
langchain.debug = True就有 trace。但它本质是“开发期调试工具”,生产环境的高吞吐、低延迟、跨 runtime 迁移能力弱。 - Arize Phoenix:胜在开源。Apache 2.0 协议,任何人都能部署自己的 Phoenix 实例,它提供了强大的“diff trace”功能——对比两次相同输入的 trace,高亮模型输出、tool 调用、guardrail 触发的差异。这在 A/B 测试新 prompt 时是神器。
- Braintrust Brainstore:胜在 OLAP。它不是为工程师设计的,是为数据科学家和合规官设计的。它的 query language 支持
SELECT COUNT(*) FROM traces WHERE model_output LIKE '%risk%' AND tool_call.name = 'get_financials' AND timestamp > '7 days ago'。这直接对接 BI 工具,生成“agent 风险热力图”。
我们正在把 Brainstore 作为公司级 trace 标准。原因很简单:销售总监要的不是“某个 session 的详细日志”,而是“过去 30 天,所有销售线索 agent 中,有多少比例的评分建议提到了‘安全评级’?这些线索的成交率比平均值高多少?”。这需要的是聚合分析,不是单点追踪。Brainstore 的 OLAP 引擎,让这个问题从“需要数据工程师写 Spark 作业”变成“销售总监在 Tableau 里拖拽两个字段”。
注意:Trace Store 的终极价值,是“跨 runtime 可移植性”。今天你用 Anthropic,明天迁移到 Azure,trace 数据必须无缝迁移。目前没有任何一家原生支持。我们自己写了一个
trace-migrator工具,它读取 Anthropic 的 event log API,转换成 Phoenix 的 OpenTelemetry 格式,再批量导入。这个工具花了我们 3 人周,但它买下了未来三年的迁移自由。这就是为什么我说:现在不投资 trace,就是在为未来的迁移付双倍学费。
6.3 Governance & Policy:从“技术开关”到“采购准入”
OWASP Agentic Top 10 的发布,标志着 AI 安全正式进入企业采购流程。以前,安全团队只关心“API key 是否泄露”,现在他们要问:“这个 agent 被允许调用哪些外部 endpoint?它的输出是否经过 PII 扫描?谁批准了这个权限?审计日志保留多久?”
AWS AgentCore 的 Policy Controls GA,正是对此的回应。它允许你在 YAML 里写:
policies: - type: "NETWORK_RESTRICTION" allow: ["https://api.mycompany.com/*", "https://clearbit.com/*"] deny: ["*"] - type: "DATA_CLASSIFICATION" scan_output: true mask_fields: ["ssn", "credit_card"]但这只是开始。真正的战场在“策略即代码(Policy as Code)”的标准化。我们正在推动一个内部标准:所有 agent 的 policy 定义,必须用 Rego(Open Policy Agent 的语言)编写,并存入 Git。CI 流水线会自动用opa test验证 policy 逻辑,用conftest检查 YAML 格式。这样,当法务部要求“所有金融相关 agent 必须开启 PCI-DSS 模式”,我们只需要在 Git 里提交一个新 Rego 文件,所有 agent 的 CI 就会自动失败,直到它们声明兼容。
实操心得:Policy 不是越严越好。我们曾设过一条 policy:“禁止所有
curl命令”,结果导致所有 tool 都无法调用外部 API。后来改为“禁止curl未授权 endpoint”,并建立一个白名单 registry。这告诉我们:治理的本质,是建立可验证、可审计、可灰度的规则体系,而不是设置一道无法逾越的墙。
7. 个人实操体会:在 runtime 归零的时代,工程师的生存法则
我在 2024 年初,用 3