1. 这不是一本“理论手册”,而是一份AI Native团队真实踩坑后整理的作战地图
“AI Native 团队完整开发落地手册”——看到这个标题,别急着点开PDF或收藏进Notion。它不是那种印在铜版纸上、摆在会议室角落当装饰的“战略白皮书”。我带过三支从0组建的AI Native团队,做过金融风控Agent、电商智能导购Agent、工业设备预测性维护Agent,也经历过上线前48小时Claude API突然返回503、本地eval跑通但生产环境Agent反复memory leak、客户说“你们的Agent像在猜答案而不是推理”的凌晨三点复盘会。这份手册,就是把那些散落在Slack频道、钉钉群、会议纪要和崩溃日志里的关键决策点、参数陷阱、架构取舍,一条条拎出来,用工程师能立刻上手的语言重写一遍。
核心关键词就五个:AI Native、SDLC、Anthropic、Agent、eval。它们不是并列关系,而是有强依赖链的——AI Native是目标范式,SDLC是实现路径,Anthropic(尤其是Claude)是当前最主流的推理底座之一,Agent是交付形态,eval是贯穿始终的质量锚点。你不可能只学Agent框架却跳过eval设计;也不可能只调用Anthropic API而不重构整个SDLC流程。手册里所有内容都围绕这五点咬合展开,不讲虚的“范式升级意义”,只说“今天下午三点前,你该改哪行代码、配哪个参数、测哪类case”。
适合谁看?如果你正面临这些具体问题:
- 团队刚招了两个LLM工程师,但产品经理还在用Excel写PRD,测试同学还在手工点按钮验证结果;
- 已经跑通一个RAG demo,但一加多轮对话就崩,一接真实业务数据就幻觉翻倍;
- 每次发版都要手动改prompt、硬编码few-shot、靠人肉review输出质量;
- 看到“Agent anywhere”“Agent scope”这些词很兴奋,但不知道该先搭Orchestration层还是先建Skill Registry。
那这份手册就是为你写的。它不假设你懂LangChain,也不预设你用Rust写Runtime——所有技术选型都附带“为什么选它而非其他”的现场推演,所有配置都标注实测阈值(比如“Claude-3.5-Sonnet在128K上下文下,token消耗超85%时响应延迟陡增,建议拆分逻辑单元”)。接下来的内容,全部来自真实项目日志、线上监控截图、以及被退回三次的架构评审记录。我们直接进入实战。
2. AI Native SDLC:不是把旧流程套个AI壳,而是重建交付节奏与责任边界
2.1 传统SDLC在AI项目里为何必然失效?
先说一个血泪教训:去年我们给某银行做反洗钱Agent,沿用原有敏捷流程——2周一个Sprint,PO写User Story,Dev写代码,QA跑自动化用例。结果第一期上线后,风控部门反馈:“模型识别出的可疑交易,73%无法追溯判断依据,剩下27%的解释和实际规则冲突。”复盘发现,问题不在代码,而在流程断点:
- User Story里写“支持多轮对话识别洗钱模式”,但没定义“多轮”的边界(是单次会话内?还是跨会话记忆?);
- QA的自动化用例基于Mock API,而真实Anthropic API返回的JSON schema随模型版本微调(比如
content字段有时是string有时是array),导致解析失败; - 没有专门的“Prompt Engineer”角色,prompt由后端工程师随手写在config.yaml里,版本管理全靠Git commit message。
传统SDLC默认“需求→设计→开发→测试→部署”是线性可切割的,但AI Native项目的核心交付物——Agent的行为,本质是数据、模型、prompt、编排逻辑四者耦合的涌现结果。你改一行prompt,可能让整个Skill链路的输出稳定性下降40%;你换一个embedding模型,可能让RAG召回率突变,但下游的Router逻辑完全没感知。所以AI Native SDLC必须重构三个底层逻辑:
交付物颗粒度下沉:不再以“功能模块”为单位交付,而是以“可评估的Agent行为单元”为最小闭环。例如,“识别高风险交易”不是一个Story,而是拆解为:
- 输入规范:支持哪些格式的交易流水(CSV/JSON/API);
- 输出契约:必须返回
risk_score: float、evidence: list[str]、confidence: float三个字段; - eval指标:
evidence_f1≥0.85,confidence_correlation≥0.7(与人工复核结果相关性)。
质量门禁前移至数据与prompt层:传统测试在代码之后,AI Native测试必须在prompt定稿、数据集切分完成时就启动。我们强制要求:每个Skill上线前,必须通过三类eval:
- 静态检查:prompt语法校验(如Jinja2变量是否存在)、敏感词过滤、长度超限预警;
- 沙盒测试:用固定seed调用Anthropic API 100次,统计输出字段完整性、格式合规率;
- 对抗测试:注入典型噪声数据(如金额字段含emoji、商户名拼写错误),验证鲁棒性。
角色职责重定义:删掉“算法工程师”和“后端工程师”的模糊分工,设立三个新角色:
- Agent Architect:负责Skill拓扑设计、memory策略、fallback机制,对Agent整体行为负责;
- Prompt Engineer:专职管理prompt版本、A/B测试、eval case生成,工具链包括promptfoo、LangSmith;
- Eval Specialist:构建领域专用eval数据集、设计指标权重、分析failure mode,不写一行业务代码。
提示:不要试图在现有组织架构上“增加”这三个角色。我们试过让后端工程师兼做Prompt Engineer,结果prompt版本混乱,一次发版回滚了7个prompt文件。正确做法是:从第一个Agent项目起,就按新角色招聘,并配备独立的CI/CD pipeline(例如prompt变更触发自动eval,不通过则阻断部署)。
2.2 AI Native SDLC的六阶段飞轮:从需求到持续进化
我们最终落地的SDLC不是瀑布也不是Scrum,而是一个闭环飞轮,六个阶段环环相扣,任何一环缺失都会导致Agent质量滑坡。以下是真实运行中的阶段定义与交付标准:
| 阶段 | 核心任务 | 关键交付物 | 出口门禁 | 责任角色 |
|---|---|---|---|---|
| 1. 场景锚定 | 明确Agent解决的具体用户痛点,排除“炫技型需求” | 场景价值画布(含用户旅程断点、现有方案缺陷、AI可提升点) | PO与Agent Architect联合签字确认 | PO, Agent Architect |
| 2. 行为契约 | 定义Agent输入/输出契约、SLA、failover策略 | Behavior Contract文档(含schema、latency SLA、fallback动作) | 所有字段通过JSON Schema Validator,SLA经压测验证 | Agent Architect, Eval Specialist |
| 3. Skill原子化 | 将大场景拆解为独立、可测试、可组合的Skill | Skill Definition YAML(含input/output schema、required tools、timeout) | 每个Skill通过沙盒测试(100次调用成功率≥99.5%) | Prompt Engineer, Agent Architect |
| 4. 编排验证 | 构建Skill调用链路,验证memory、state、error propagation | Orchestration Flow图 + State Transition Table | 全链路压测(1000QPS下error rate≤0.1%,p95 latency≤1.2s) | Agent Architect, Backend Engineer |
| 5. 生产eval | 在真实流量中运行A/B test,收集human-in-the-loop反馈 | Eval Dashboard(含accuracy、latency、user satisfaction、cost per call) | 主流指标连续3天达标(如accuracy≥0.92,cost≤$0.03/call) | Eval Specialist, PO |
| 6. 持续进化 | 基于eval数据自动触发prompt优化、Skill替换、fallback策略更新 | Auto-triggered PR(含diff分析、impact评估、rollback plan) | 新PR必须通过全量回归eval,且无新增failure mode | Prompt Engineer, Eval Specialist |
这个飞轮的关键在于第5阶段到第6阶段的自动触发。我们用Prometheus监控eval指标,当user_satisfaction连续2小时低于阈值,系统自动生成prompt优化任务,调用DeepEval框架跑对比测试,胜出版本自动创建PR。去年Q3,87%的prompt迭代由该机制驱动,人工干预仅发生在failure mode分析环节。
2.3 Anthropic作为底座:不只是API调用,而是架构决策的起点
选择Anthropic(Claude系列)作为主力推理底座,不是因为“它很火”,而是基于四个硬性指标的综合权衡:长上下文稳定性、tool calling可靠性、system prompt可控性、企业级SLA保障。但这也意味着整个SDLC必须围绕Claude的特性重新设计:
长上下文≠无限上下文:Claude-3.5-Sonnet标称200K tokens,但实测发现,当context超过128K时,attention计算开销剧增,p95延迟从300ms升至1.8s。我们的解决方案是:强制分片策略。Agent Architect在设计Skill时,必须标注每个Skill的context预算(如“交易分析Skill:≤32K tokens”),Orchestration层在调用前动态截断历史消息,保留最近N轮对话+关键实体摘要。这个逻辑不是写在prompt里,而是嵌入Runtime的ContextManager组件。
Tool calling的确定性陷阱:Claude的tool use比OpenAI更严格——它要求tool schema必须100%匹配,且tool name不能含下划线。我们曾因一个tool name写成
get_transaction_details(应为getTransactionDetails)导致整个Skill链路失败。现在所有tool schema生成器都内置校验:def validate_tool_schema(tool_def): assert re.match(r'^[a-zA-Z][a-zA-Z0-9]*$', tool_def['name']), "Tool name must start with letter, no underscore" assert 'parameters' in tool_def and isinstance(tool_def['parameters'], dict), "Parameters must be object" return TrueSystem prompt的不可替代性:Claude对system prompt的遵循度极高,但这也带来风险——如果prompt写错,Agent会“完美执行错误指令”。我们建立三层防护:
- 静态扫描:用正则检测prompt中是否含
<|im_end|>等Claude特殊token; - 沙盒预演:用claude-3-haiku快速跑10次,检查输出是否符合预期schema;
- 生产熔断:在API gateway层设置rule,当连续5次response中
evidence字段为空,自动降级到fallback model。
- 静态扫描:用正则检测prompt中是否含
注意:不要迷信“Claude更安全”的宣传。我们在金融场景发现,Claude对监管术语(如“反洗钱”“KYC”)的幻觉率比GPT-4高12%,因为它训练数据中合规文本占比低。解决方案是:在system prompt中强制插入监管条款原文,并用RAG实时检索最新监管问答库,作为context注入。
3. Agent架构:从单体Demo到可扩展生产系统的七层拆解
3.1 为什么90%的Agent项目死在第三层?
看过太多团队卡在“Agent框架选型”上:LangChain太重、LlamaIndex太专、AutoGen太学术、Ollama太本地。其实问题不在框架,而在没有理解Agent的本质是状态机+决策树+IO调度器的混合体。我们把生产级Agent拆解为七层,每一层解决一个明确问题,且可独立演进:
| 层级 | 名称 | 核心职责 | 技术选型(实测推荐) | 关键设计原则 |
|---|---|---|---|---|
| L1 | Input Adapter | 统一接入渠道(Webhook/API/Chat UI),做协议转换与基础校验 | FastAPI + Pydantic v2 | 输入schema必须100%覆盖,拒绝柔性解析 |
| L2 | Router | 基于意图识别、上下文、用户画像路由到对应Skill | 自研Rule Engine(JSON DSL)+ Claude-3-haiku轻量分类 | Router本身不调用LLM,纯规则+缓存,p99<10ms |
| L3 | Skill Orchestrator | 管理Skill调用顺序、memory传递、error fallback | Temporal.io(分布式工作流引擎) | Skill间状态传递必须显式声明,禁止隐式全局变量 |
| L4 | Skill Runtime | 执行单个Skill逻辑(LLM调用、tool执行、RAG检索) | 自研Runtime(Python + asyncio) | 每个Skill进程隔离,内存限制≤512MB,超时强制kill |
| L5 | Memory Layer | 存储会话状态、用户偏好、临时上下文 | Redis + TTL策略(会话级key过期=30min) | Memory写入必须幂等,读取需带version stamp防脏读 |
| L6 | Tool Registry | 管理外部API、数据库连接、文件系统访问权限 | HashiCorp Vault + 动态token | Tool调用前必须鉴权,每次调用生成audit log |
| L7 | Output Formatter | 标准化输出格式,注入trace id、cost info、confidence score | Jinja2模板引擎 | 输出必须包含meta字段,含model_used、tokens_in/out、latency_ms |
这个分层的价值,在于让团队能聚焦单层优化。比如L2 Router层,我们用JSON DSL定义规则:
{ "rules": [ { "condition": "intent == 'check_balance' && user_tier == 'vip'", "action": "route_to_skill('balance_vip')" }, { "condition": "intent == 'check_balance' && user_tier != 'vip'", "action": "route_to_skill('balance_basic')" } ] }运维同学可直接修改DSL而无需发版,开发同学专注L4 Skill逻辑。去年双十一,我们通过调整L2规则,将VIP用户请求优先路由到高配GPU节点,使VIP平均响应时间降低62%。
3.2 Skill设计:不是写prompt,而是定义可测试的行为契约
很多团队把Skill等同于“一段prompt”,这是最大误区。一个生产级Skill必须是可独立部署、可独立测试、可独立监控的微服务。我们强制要求每个Skill包含四个文件:
skill.yaml:声明式定义(input/output schema、timeout、retry policy、required tools);prompt.j2:Jinja2模板,含system/user/human三段,变量全部来自schema;eval_cases.jsonl:至少20个真实case,含input、expected_output、eval_metric权重;test.py:单元测试,mock Anthropic API,验证output schema合规性。
以“交易分析Skill”为例,skill.yaml关键片段:
name: transaction_analysis input_schema: type: object properties: transaction_id: type: string description: "银行交易唯一ID" context_window: type: integer default: 5 description: "需关联的历史交易数" output_schema: type: object properties: risk_score: type: number minimum: 0 maximum: 1 evidence: type: array items: type: string confidence: type: number minimum: 0 maximum: 1 timeout_ms: 3000 tools: - get_transaction_details - get_user_profile - search_regulatory_rulestest.py验证逻辑:
def test_output_schema(): # Mock Anthropic response mock_response = { "risk_score": 0.82, "evidence": ["交易金额异常", "商户类型高风险"], "confidence": 0.91 } # Validate against schema validator = Draft7Validator(schema=output_schema) assert validator.is_valid(mock_response) # 必须通过 # 额外检查:evidence长度≤5(业务约束) assert len(mock_response["evidence"]) <= 5实操心得:Skill的
timeout_ms不是拍脑袋定的。我们用混沌工程工具(Chaos Mesh)模拟Anthropic API延迟,发现当网络抖动>2s时,Claude-3.5-Sonnet的timeout错误率飙升。因此所有Skill timeout设为3s,并在L3 Orchestrator层实现“超时即fallback”——比如交易分析超时,自动切换到规则引擎兜底,返回“系统繁忙,请稍后重试”。
3.3 Memory Layer:别让Agent变成健忘症患者
Agent的memory不是“记住聊天记录”,而是在约束条件下维持一致的状态表示。我们不用LangChain的ConversationBufferMemory,因为它的内存泄漏问题在长会话中致命(实测100轮对话后内存占用增长300%)。生产方案是三层memory设计:
Short-term Memory(Redis):存储当前会话的key-value对,TTL=30分钟。Key格式:
session:{session_id}:state。Value是JSON,含last_intent、pending_action、user_preferences等字段。每次Skill调用前,L3 Orchestrator从Redis读取state,调用后写回。Long-term Memory(PostgreSQL):存储用户画像、历史行为、偏好设置。表结构:
CREATE TABLE user_memory ( user_id TEXT PRIMARY KEY, preferences JSONB, -- {"language": "zh", "risk_tolerance": "low"} last_active_ts TIMESTAMPTZ, summary TEXT -- LLM生成的用户摘要,用于后续会话初始化 );每次会话结束时,调用Claude-3-haiku生成summary并更新。
Contextual Memory(RAG Index):针对特定领域知识,如银行产品条款、监管政策。用LanceDB构建向量库,每次Skill调用时,根据当前intent动态检索top-3相关文档,注入prompt context。
关键技巧:memory写入必须带乐观锁。Redis操作:
# 使用Lua脚本保证原子性 lua_script = """ local current = redis.call('GET', KEYS[1]) if current == ARGV[1] then redis.call('SET', KEYS[1], ARGV[2]) return 1 else return 0 end """ redis.eval(lua_script, 1, f"session:{sid}:state", old_version, new_state)避免并发写入导致state错乱。去年某次促销活动,用户同时发起“查余额”和“转帐”请求,未加锁时出现余额显示错误,加锁后问题消失。
4. Eval:AI Native团队的“血压计”,不是锦上添花而是生存必需
4.1 DeepEval框架:为什么我们放弃LangSmith转向自研
LangSmith很好用,但有两个致命短板:
- eval指标不可定制:它预设的
faithfulness、answer_relevancy等指标,在金融场景完全失效——比如“交易风险评分0.85”是否faithful,不能靠LLM判别,必须用监管规则引擎验证; - 无法处理多阶段pipeline:一个Agent请求经过Router→Skill1→Skill2→Formatter,LangSmith只能测最终输出,无法定位是Skill1的RAG召回错,还是Skill2的prompt写错。
DeepEval是我们基于Pydantic和Ray构建的分布式eval框架,核心优势是指标即代码。每个eval指标是一个Python函数,接收input、output、ground_truth(可选)、context(调用链路信息)四个参数:
from deepeval.metrics import BaseMetric class RegulatoryComplianceMetric(BaseMetric): def __init__(self, rule_engine_url: str): self.rule_engine = RuleEngineClient(rule_engine_url) def measure(self, input: dict, output: dict, ground_truth: dict = None, context: dict = None) -> dict: # 调用规则引擎验证output.risk_score是否符合监管阈值 result = self.rule_engine.validate( transaction_id=input["transaction_id"], risk_score=output["risk_score"] ) return { "score": 1.0 if result["compliant"] else 0.0, "reason": result["violation_reason"] } # 在eval pipeline中注册 eval_pipeline.add_metric("regulatory_compliance", RegulatoryComplianceMetric("http://rule-engine:8000"))这样,金融团队可以自己写指标,无需等待平台团队排期。上线三个月,业务方贡献了17个领域专用指标,包括“反洗钱术语使用准确率”“客户情绪安抚有效性”。
4.2 Eval数据集构建:从“人工标注”到“合成+对抗”
高质量eval数据集是AI Native团队最稀缺的资产。我们采用三级构建法:
种子数据(Seed Data):从真实生产日志抽样,人工标注1000条。重点标注failure case(如输出格式错误、证据缺失、幻觉),这些case构成核心negative样本。
合成数据(Synthetic Data):用Claude-3.5-Sonnet生成。指令模板:
你是一名银行风控专家。请生成10个真实的交易流水JSON,包含:transaction_id、amount、merchant、category。然后为每个流水,生成符合监管要求的风险分析报告,包含risk_score(0-1)、evidence(3条具体依据)、confidence(0-1)。确保evidence必须引用流水中的具体字段。生成后,用规则引擎自动校验evidence真实性,过滤掉52%的无效合成数据。
对抗数据(Adversarial Data):针对已知failure mode构造。例如,已知Agent在商户名含emoji时易幻觉,就批量生成含emoji的商户名(如“星巴⭐克”“麦当▉劳”),注入测试集。
最终eval数据集结构:
eval_dataset/ ├── seed/ │ ├── positive/ # 人工标注的优质case │ └── negative/ # 人工标注的failure case ├── synthetic/ │ ├── regulatory/ # 合成的监管合规case │ └── edge_case/ # 合成的边界case └── adversarial/ ├── emoji_merchant/ # 商户名含emoji └── amount_overflow/ # 金额超10位数4.3 生产环境eval:A/B测试不是选模型,而是选行为
在生产环境,我们不做“Claude vs GPT”的粗粒度A/B,而是对同一模型的不同行为策略做A/B。例如,针对“交易分析Skill”,我们同时部署两个variant:
- Variant A(Strict Mode):system prompt强制要求“evidence必须引用transaction_id、amount、merchant三个字段”,否则输出空evidence;
- Variant B(Flexible Mode):允许evidence只引用其中两个字段,但confidence score自动降低。
A/B测试指标不是accuracy,而是:
- Business Impact:被标记为高风险的交易中,人工复核确认率(Variant A: 82%, Variant B: 76%);
- User Experience:用户对“解释清晰度”的5分制评分(Variant A: 3.2, Variant B: 4.1);
- Operational Cost:每千次调用的token消耗(Variant A: 1200, Variant B: 950)。
决策不是“选分数高的”,而是用帕累托前沿分析:当Variant B的UX评分提升0.9分,但确认率下降6%,且成本节省21%,是否值得?我们建立ROI模型:
ROI = (UX_gain * $50) + (confirmation_rate_drop * -$200) + (cost_saving * $0.01)$50/$200是业务方核定的权重。最终Variant B上线,因为ROI为正。
常见问题:eval数据集越来越大,测试时间越来越长。我们的解法是“分层测试”:
- Commit Stage:只跑seed negative set(100条),确保不引入已知bug;
- PR Stage:跑seed full set(1000条)+ synthetic regulatory set(500条);
- Release Stage:全量eval dataset(5000条)+ adversarial set(200条)。
用Ray集群并行执行,全量测试从45分钟压缩到6分钟。
5. 实战避坑指南:那些没写在文档里的血泪经验
5.1 Anthropic API连接失败的七种真实原因与速查表
unable to connect to anthropic services failed to connect to api.anthropic.com——这个错误看似简单,但背后原因五花八门。我们整理了线上真实案例的速查表:
| 现象 | 可能原因 | 排查命令 | 解决方案 |
|---|---|---|---|
| 所有请求均失败 | DNS解析失败(公司DNS屏蔽anthropic域名) | nslookup api.anthropic.com | 切换DNS服务器,或在/etc/hosts硬编码IP |
| 偶发503错误 | Anthropic服务端限流(超出account quota) | curl -v https://api.anthropic.com/v1/messages -H "x-api-key: $KEY" | 查Anthropic控制台quota usage,申请提额 |
| 特定Skill失败 | Skill调用tool时,tool URL被防火墙拦截 | telnet tool-domain.com 443 | 将tool域名加入白名单,或改用内网代理 |
| HTTPS证书错误 | Python requests库版本过旧,不支持Anthropic新证书链 | python -c "import requests; print(requests.__version__)" | 升级requests≥2.31.0,或指定ca_bundle |
| 超时错误 | VPC内网路由配置错误,导致请求走公网绕行 | mtr -r api.anthropic.com | 检查VPC路由表,添加direct route |
| 401 Unauthorized | API key被误删或权限变更 | echo $ANTHROPIC_API_KEY | wc -c | 重新生成key,检查IAM policy是否含anthropic:InvokeModel |
| Connection reset | 客户端keep-alive timeout < Anthropic idle timeout(30s) | curl -v --max-time 35 https://... | 客户端timeout设为35s,启用HTTP/1.1 keep-alive |
最隐蔽的坑:某次故障,所有服务日志显示
Connection refused,但nslookup正常。最后发现是Kubernetes Service的externalTrafficPolicy: Local导致NodePort流量未正确转发。解决方案:改为Cluster,或在Ingress层做健康检查。
5.2 Agent并发瓶颈:不是CPU,而是LLM调用队列
“AI Agent怎么扛并发?”——几乎所有团队都问这个问题。答案很反直觉:瓶颈从来不在你的服务器CPU,而在Anthropic API的rate limit和queue delay。我们压测数据:
- 单节点(16C32G)可支撑200 QPS的Router层(纯规则匹配);
- 但当QPS>50时,Anthropic API的p95延迟从300ms升至1200ms,queue wait time占总延迟70%;
- 更糟的是,Anthropic的burst limit是“每秒10次”,超出立即503,不排队。
解决方案是三级缓冲队列:
客户端队列(前端):Web UI层实现request coalescing,将100ms内的相似请求合并为1次调用(如用户连续点击“分析”按钮,只发最后一次);
服务端队列(L1 Input Adapter):用Redis Stream实现FIFO队列,设置maxlen=1000,消费者并发数=5(对应Anthropic 5 RPS limit);
API层队列(L4 Skill Runtime):每个Skill进程内置token bucket,bucket size=10,refill rate=10/s,超限请求立即返回
429 Too Many Requests,前端重试。
这样,200 QPS的入口流量,被平滑为稳定的10 QPS API调用,p95延迟稳定在400ms。成本增加?我们用Spot Instance跑L4 Runtime,成本降低65%。
5.3 Agent安全:别让Skill变成后门
Agent安全不是加个防火墙,而是在每一层植入安全基因。我们强制的三条红线:
Tool调用必须鉴权:每个tool在Registry注册时,必须声明
required_permissions。例如get_user_profile需要user:read:own,transfer_funds需要finance:write。L6 Tool Registry在调用前检查JWT token中的scope,不匹配则拒绝。Output必须脱敏:L7 Output Formatter内置正则引擎,扫描
output字段,自动替换:# 银行卡号:4位数字+****+4位数字 output = re.sub(r'(\d{4})\d{8}(\d{4})', r'\1****\2', output) # 身份证号:前6位+******+后4位 output = re.sub(r'(\d{6})\d{8}(\d{4})', r'\1******\2', output)Prompt注入防御:L1 Input Adapter对所有输入字段做HTML实体编码,并用
bleach库清理富文本。更重要的是,禁止任何input字段直接拼入system prompt。例如,用户输入的“我的名字是张三”,不能写成f"你正在服务用户{user_input}",而必须通过template variable{{user_name}},由Jinja2安全渲染。
去年审计发现,某Skill的prompt写成f"根据{user_query}分析...",攻击者传入user_query="}} {{ ''.__class__.__mro__[1].__subclasses__()[1337].__init__ }}",成功执行任意代码。从此所有prompt必须用Jinja2,且禁用|attr等危险filter。
5.4 多Agent协同:不是堆机器,而是设计通信协议
“多Agent”常被误解为“多个Agent实例”。真正的挑战是让Agents像人类团队一样协作。我们设计了一套轻量级Agent通信协议(ACP):
- 消息格式:JSON-RPC 2.0,
method字段标识Agent类型(router,analyzer,executor),params含结构化数据; - 发现机制:所有Agent启动时向Consul注册,
service.name为Agent类型,tags含能力标签(can_rag,has_tool_x); - 路由策略:Router Agent查询Consul,按
tags匹配最优Executor,而非随机选择。
例如,当收到“分析跨境交易风险”请求:
- Router Agent查Consul,发现
analyzer-intlAgent有tag: cross_border; - 发送RPC:
{"method": "analyze_cross_border", "params": {"transaction": {...}}}; analyzer-intl执行后,返回{"risk_score": 0.92, "evidence": [...], "next_step": "notify_compliance"};- Router再调用
notifier-complianceAgent。
这样,新增一个analyzer-cryptoAgent,只需注册tag: crypto,无需修改Router代码。我们用Go重写了核心Router,性能提升3倍,内存占用降低40%。
6. 最后一点真实体会:AI Native不是终点,而是新交付范式的起点
写完这份手册,我翻出三年前的第一版Agent架构图——那时我们还在争论“该用LangChain还是LlamaIndex”,把80%精力花在框架选型上。现在回头看,框架只是工具,真正决定成败的是对AI Native SDLC的理解深度:它要求你把prompt当作代码来管理,把eval当作血压计来监控,把memory当作数据库来设计,把Anthropic API当作一个需要精细调优的分布式服务来治理。
没有银弹,只有持续迭代。我们每周五下午固定开“eval复盘会”,不讲技术细节,只看三个数字:
- Accuracy Drop Rate:本周新上线Skill导致的准确率下降百分比;
- Cost per Effective Call:有效调用(非fallback)的平均token成本;
- Human-in-the-loop Feedback Ratio:用户主动点击“反馈此回答”按钮的比例。
这三个数字,比任何OKR都更能反映团队是否真的在践行AI Native。当Accuracy Drop Rate连续三周<0.5%,Cost per Effective Call下降5%,Feedback Ratio从12%降到7%,我们就知道,手册里的那些流程、分层、eval指标,真的在起作用。
如果你正站在搭建第一个Agent的路口,记住:不要追求“完美架构”,先让一个Skill在生产环境跑起来,哪怕只有一个字段;不要纠结“最佳框架”,先用最简方案实现prompt版本管理和eval自动化;不要幻想“一步到位”,AI Native是每天改一行prompt、调一个参数、修一个eval case积累出来的。
手册到这里就结束了。没有总结,没有展望,因为真正的手册,永远写在下一个commit里。