陈予安 · 后端开发 · 更新于 2026 年 8 月

Agent 开发笔记

平时做 Agent 相关项目,有些问题查文档不如自己记一笔。 主要是工具调用、流程编排和上线排错,写到哪算哪。

文章

工具 Schema 怎么写才不容易出错

上周排查工具调用失败,发现模型经常选错工具或者漏填参数。 回头改 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"]
  }
}

用 LangGraph 把 Agent 流程拆成状态机

早期用链式调用写 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)

MCP 接入:统一工具层,少写重复 Adapter

第三个项目还在手写 GitHub 和 Postgres 的 wrapper,实在不想复制粘贴了。 MCP 把服务发现和调用协议标准化之后,Agent 侧只维护一个 client 就够。 权限还是在业务层做,别指望 MCP 帮你管。

Agent 上线之后,靠 trace 和 eval 查问题

用户反馈「回答不对」,打开日志全是 token,根本没法定位是哪一步出的问题。 现在每个 run 有 trace_id,工具调用单独记 span,还攒了大概 80 条 eval case 跑 CI。 不算完美,但至少不是完全摸黑。

分类

关于

这是 dianwan66.com 上的个人笔记,不是教程站,也不接广告。 内容来自实际项目里遇到的问题,能帮到同类场景就好。

有建议或勘误可以发邮件到 hello@dianwan66.com。

常用技术

Python、TypeScript、LangGraph、PostgreSQL、OpenTelemetry

FAQ

朋友和同事问得比较多的几个问题。

Agent 和 Chatbot 有什么区别?
Chatbot 以对话为主;Agent 多了规划、调工具、记状态这几层, 能连着做查库、改文件、跑脚本这类多步操作。有没有 action loop 和可验证的结果,是主要分界。
应该先选框架还是先定架构?
先定架构。任务边界、工具列表、失败怎么处理、哪里要人工介入——这些定了, 再选 LangGraph 或自研都不迟。框架管不了权限和数据隔离。
RAG 和 Agent 什么关系?
RAG 多半是 Agent 里的一个检索工具,不是全部。 Agent 决定什么时候查、查什么、结果怎么用。
MCP 生产环境能用吗?
要接的系统多,MCP 能少写不少 Adapter。但要注意权限、连接管理和版本兼容。 小项目直接写 Function 往往更快。
怎么判断 Agent 够不够用?
准备一批真实任务的 eval case,看工具成功率、平均步数、要不要人工兜底。 Demo 跑通一次说明不了什么。