·
工具调用
上周排查工具调用失败,发现模型经常选错工具或者漏填参数。
回头改 Schema:名字改具体了,参数加了 description,失败返回也统一成 JSON。
成功率从 71% 涨到 93%,改动不大,效果倒是很明显。
看代码示例
{
"name": "query_order_by_id",
"description": "根据订单号查询订单状态,仅支持已登录用户自己的订单",
"parameters": {
"type": "object",
"properties": {
"order_id": {
"type": "string",
"pattern": "^ORD-[0-9]{8}$",
"description": "格式 ORD-12345678"
}
},
"required": ["order_id"]
}
}
·
编排框架
早期用链式调用写 demo 还行,一上生产就乱:要加重试、要人工审核、某步失败了得回退。
后来把 planner、executor、reviewer 拆成三个节点,用条件边控制走向,代码反而更好读了。
看代码示例
from langgraph.graph import StateGraph, END
graph = StateGraph(AgentState)
graph.add_node("plan", plan_step)
graph.add_node("execute", execute_tools)
graph.add_node("review", human_review)
graph.set_entry_point("plan")
graph.add_edge("plan", "execute")
graph.add_conditional_edges(
"execute",
route_after_execute,
{"retry": "plan", "review": "review", "done": END}
)
graph.add_edge("review", END)
·
协议与集成
第三个项目还在手写 GitHub 和 Postgres 的 wrapper,实在不想复制粘贴了。
MCP 把服务发现和调用协议标准化之后,Agent 侧只维护一个 client 就够。
权限还是在业务层做,别指望 MCP 帮你管。
·
生产实践
用户反馈「回答不对」,打开日志全是 token,根本没法定位是哪一步出的问题。
现在每个 run 有 trace_id,工具调用单独记 span,还攒了大概 80 条 eval case 跑 CI。
不算完美,但至少不是完全摸黑。