因素01:自然语言到工具调用
大约 2 分钟
因素01:自然语言到工具调用
来源:12-Factor Agents / Factor 1(Natural Language to Tool Calls)
一句话先懂
把“人话需求”翻译成“结构化动作”,让模型负责理解,让代码负责执行。
奶奶版先理解
你跟家里人说:
- “帮我交电费 500”
这句话要真正落地,必须变成明确单据:
- 任务:交电费
- 金额:500
- 账户:国家电网 xx 户号
- 截止时间:今晚 20:00
这张单据就是工具调用参数。没有这张单据,执行就会靠猜。
原文核心思想(我拆成 4 步)
- 模型做语义理解:提取意图与参数。
- 输出结构化对象:通常是 JSON(intent + args)。
- 确定性代码执行:权限校验、参数补全、调用 API。
- 执行结果回灌:把结果放回上下文,进入下一步决策。
真实业务例子:支付链接创建
用户在 Slack 发:
- “给 Terri 创建 750 美元活动赞助支付链接。”
模型应输出:
{
"intent": "create_payment_link",
"amount": 750,
"customer": "Terri",
"memo": "AI meetup sponsorship"
}后端代码做:
- customer 名称映射到 customer_id
- amount 与币种校验
- 权限检查(是否允许创建支付链接)
- 调 Stripe API
可执行落地步骤
- 先定义
intent白名单,禁止自由发挥。 - 每个 intent 定义必填参数与类型(JSON Schema)。
- 执行前统一做
validate -> authorize -> execute。 - 执行后记录事件(谁触发、调用参数、结果、耗时)。
if step.intent == "create_payment_link":
validate(step)
authorize(user, "payment_link:create")
result = stripe.create(step.args)
append_event("create_payment_link_result", result)常见误区
- 只让模型输出自然语言,不输出结构化字段。
- 没有 unknown intent 兜底,导致异常流程。
- 把模型输出直接执行,跳过权限和风控。
我的思考
这条看似简单,其实是“AI 工程化分界线”。
- Demo 阶段:模型一句话就能看起来很聪明。
- 生产阶段:必须可审计、可回放、可追责。
所以我认同原文:模型最擅长“决定做什么”,但不该直接拥有“做了算”的权力。
小结
- 人话要变成结构化动作。
- 模型负责决策,代码负责责任。
- 可控性来自校验、权限和审计。
