AI Agent 与工作流自动化
AI Agent 和工作流自动化一般分两层:便宜的小模型把邮件、工单、表单转成固定结构的 JSON,程序据此决定走哪条流程;主力模型通过工具调用(function calling)查询系统、起草回复,退款、发信这类有副作用的操作先进入人工审批,每一步都记审计日志。按每月 5 万条事件、其中 1 万个任务交给 Agent 处理估算,用各模型最低价分组的实时价格计算,模型费用每月约 ¥331。
价格更新于 2026年11月13日 17:53
月成本估算
假设:每月 5 万条事件(邮件、工单、表单)先做分类抽取,每条输入约 800 tokens、输出约 120 tokens;其中 1 万条交给 Agent 处理,每个任务平均 4 次模型调用(3 次工具调用加 1 次最终回复),每次输入约 3,500 tokens(系统提示和工具定义约 1,500、任务和之前步骤的结果约 2,000),输出约 250 tokens。
业务问题
很多后台工作是固定套路:看一封邮件或一张工单,去几个系统里查信息,按规则处理,再答复或登记。规则一多、例外一多,写死的规则代码就覆盖不了,全靠人工处理又慢又容易漏。
大模型能读懂这些非结构化的输入,也能通过工具调用去查订单、查库存、建工单。但它会选错工具、编造参数,或者在不该行动的时候行动。让模型直接执行退款、发邮件、改数据,风险很难控制。
更稳的做法是把流程拆开:模型负责理解和起草,程序负责校验和执行;只读的查询可以自动调用,有副作用的操作必须经过人工审批;每一步的输入、输出和调用的工具都记下来,出了问题能追溯。
推荐模型组合
推荐模型按实时目录自动选取,价格取各模型最低价分组,更新于 2026年11月13日 17:53。点模型名可查看全部分组价格。
分类与结构化输出(小模型)
gpt-5.4-nanoOpenAI
输入 ¥0.4 / 输出 ¥2.5 每百万 tokens标准分组
把邮件、工单、表单内容转成固定字段的 JSON,例如类型、订单号、是否紧急,再由程序按字段决定走哪条流程。任务简单、调用量大,用单价低的小模型。优先用 response_format 的 json_schema 约束输出,模型不支持时改用 json_object,两种方式都要在代码里校验字段。
工具调用与多步执行(主力模型)
gpt-5.4-miniOpenAI
输入 ¥1.5 / 输出 ¥9 每百万 tokens标准分组
根据任务和工具定义决定调用哪个函数、传什么参数,拿到结果后继续下一步,直到给出结论或草稿。每一步都要带上工具定义和之前的结果,输入 tokens 增长很快,所以要限制步数。不同模型对工具调用的支持程度不同,上线前用你自己的工具定义实测;步骤多、判断复杂的流程,再拿备选模型做对比评测。
参考架构
- 1
接入事件
事件来自邮件、工单系统、表单提交或定时任务。可以在 n8n、Dify 里搭工作流接入,也可以在你自己的服务里消费消息队列,模型的调用方式都一样。
- 2
分类与抽取
小模型把原始内容转成固定结构的 JSON(类型、订单号、金额、是否紧急),程序按 JSON Schema 校验;校验不过的重试一次,仍不过就转人工。
- 3
工具调用
主力模型拿到任务和工具定义(查订单、查库存、查知识库、起草回复等),自己决定调用顺序。工具由你的代码执行,结果再交回模型;单个任务限制最大步数,例如 6 步。
- 4
人工审批
退款、发邮件、改数据这类有副作用的操作,模型只能提交申请:程序把操作和参数放进审批队列,有人确认后再由程序执行。只读的查询可以自动执行。
- 5
审计记录
记录每一步的输入、使用的模型、调用的工具和参数、工具返回、审批人和时间,以及响应里的 usage(tokens 用量),方便复盘,也方便和控制台的用量明细对账。
- 6
额度与监控
给自动化流程单独建一把 API Key 并设置额度上限;盯住失败率、转人工比例和单个任务的 tokens 用量,异常时暂停自动执行,全部转人工。
成本估算
假设:每月 5 万条事件(邮件、工单、表单)先做分类抽取,每条输入约 800 tokens、输出约 120 tokens;其中 1 万条交给 Agent 处理,每个任务平均 4 次模型调用(3 次工具调用加 1 次最终回复),每次输入约 3,500 tokens(系统提示和工具定义约 1,500、任务和之前步骤的结果约 2,000),输出约 250 tokens。
| 项目 | 模型 | 用量假设 | 费用 |
|---|---|---|---|
| 事件分类与结构化抽取 | gpt-5.4-nano | 50,000 次 × 输入 800 + 输出 120 tokens | ¥31 |
| Agent 多步工具调用 | gpt-5.4-mini | 40,000 次 × 输入 3,500 + 输出 250 tokens | ¥300 |
| 合计(每月) | ¥331 | ||
按各模型最低价分组的实时价格计算,价格更新于 2026年11月13日 17:53。
只含模型调用费用,不含工作流平台、服务器和人工审批成本。Agent 的费用主要看步数:每多一步,工具定义和之前的结果都要再发送一次,所以要限制最大步数。系统提示词和工具定义每次都一样,模型支持上下文缓存时命中部分按缓存读取价计费;推理模型的思考过程按输出计费,部分模型可以用 reasoning_effort 调低思考强度。事件量翻倍,费用大致翻倍。
示例代码
小模型先把消息转成固定字段的 JSON;需要处理的任务交给 Agent 循环:只读工具直接执行,退款这类有副作用的工具只进审批队列,每一步都写审计日志,超过最大步数就转人工。
import json
import os
from openai import OpenAI
client = OpenAI(base_url="https://www.tutujin.com/v1", api_key=os.environ["TUTUJIN_API_KEY"])
audit_log, approval_queue = [], []
TICKET = {"name": "ticket", "strict": True, "schema": {
"type": "object",
"properties": {
"category": {"type": "string", "enum": ["refund", "shipping", "invoice", "other"]},
"order_id": {"type": ["string", "null"]},
"urgent": {"type": "boolean"},
},
"required": ["category", "order_id", "urgent"],
"additionalProperties": False,
}}
def classify(text):
"""Small model: free text in, fixed fields out. Code decides the workflow."""
resp = client.chat.completions.create(
model="gpt-5.4-nano",
messages=[{"role": "system", "content": "Extract the ticket fields."}, {"role": "user", "content": text}],
# models without json_schema support: {"type": "json_object"}, then check the fields yourself
response_format={"type": "json_schema", "json_schema": TICKET},
)
return json.loads(resp.choices[0].message.content)
TOOLS = [
{"type": "function", "function": {
"name": "get_order", "description": "Look up an order. Read-only.",
"parameters": {"type": "object", "properties": {"order_id": {"type": "string"}}, "required": ["order_id"]},
}},
{"type": "function", "function": {
"name": "refund", "description": "Refund an order. Runs only after a person approves it.",
"parameters": {"type": "object", "properties": {
"order_id": {"type": "string"}, "amount": {"type": "number"}, "reason": {"type": "string"}},
"required": ["order_id", "amount", "reason"]},
}},
]
def run_tool(name, args):
if name == "get_order":
return {"order_id": args["order_id"], "status": "delivered", "paid": 129.0} # call your order API here
if name == "refund":
approval_queue.append(args) # side effect: a person approves, then your code executes it
return {"status": "waiting_for_approval"}
return {"error": "unknown tool"}
def run_agent(task, max_steps=6):
messages = [
{"role": "system", "content": "You handle after-sales requests with the tools. Never promise a refund before it is approved."},
{"role": "user", "content": task},
]
for step in range(max_steps):
resp = client.chat.completions.create(model="gpt-5.4-mini", messages=messages, tools=TOOLS)
msg = resp.choices[0].message
audit_log.append({"step": step, "model": resp.model, "usage": resp.usage.model_dump() if resp.usage else None})
if not msg.tool_calls:
return msg.content
messages.append({"role": "assistant", "content": msg.content, "tool_calls": [c.model_dump() for c in msg.tool_calls]})
for call in msg.tool_calls:
try:
args = json.loads(call.function.arguments or "{}")
result = run_tool(call.function.name, args)
except (json.JSONDecodeError, KeyError) as e:
args, result = call.function.arguments, {"error": "bad arguments: " + str(e)}
audit_log.append({"step": step, "tool": call.function.name, "args": args, "result": result})
messages.append({"role": "tool", "tool_call_id": call.id, "content": json.dumps(result)})
return "Step limit reached, handing over to a person."
text = "Order 10086 arrived broken. I want my money back."
if classify(text)["category"] == "refund":
print(run_agent(text))
print("waiting for approval:", approval_queue)常见问题
AI Agent 每月要花多少钱?
按每月 5 万条事件做分类抽取、其中 1 万个任务交给 Agent、每个任务平均 4 次模型调用估算,用最低价分组计算约 ¥331。Agent 的费用主要看步数和每一步带的上下文长度。
在 Dify 或 n8n 里能用吗?
可以。Dify 通过 OpenAI-API-compatible 模型供应商接入;n8n 把 OpenAI 凭据的 Base URL 改成 https://www.tutujin.com/v1 即可。模型名填模型广场里的名称,具体步骤见下方的 Dify 和 n8n 接入文档。在 Dify 里用工具调用,需要模型本身支持,并在添加模型时开启 Function calling。
怎么防止 Agent 乱操作?
只给模型完成任务必需的工具;退款、发信、改数据这类有副作用的工具只生成申请,人工确认后由你的代码执行;工具参数在执行前由程序再校验一次,金额、收件人这类字段不直接信任模型给的值;单个任务限制最大步数,超出就转人工。
模型不按格式输出 JSON 怎么办?
优先用 response_format 的 json_schema,把字段、类型和可选值写进 schema;模型不支持时用 json_object,并在提示词里写清字段。无论哪种方式,都要在代码里按 schema 校验,失败就重试一次或转人工。
审计日志要记哪些内容?
至少记录:触发事件、每一步使用的模型、调用的工具和参数、工具返回、审批人和审批时间、最终结果,以及响应里的 usage。出了问题能还原过程,也能和控制台的用量明细对账。
一个流程里用到不同分组的模型怎么办?
一把 Key 可以按优先级设置多个分组,每次请求使用第一个提供该模型的分组,按实际使用的分组计价;也可以给不同的流程各建一把 Key,分别设置额度上限,账单按 Key 分开看。
