LangChain createAgent 源码:模型调用与 Middleware 执行
《Agent 大模型 0 到 1 系统课》 · 程序员 Sunday
你正在阅读本节的免费试读。完整课程 ¥499,可在文末添加作者微信购买。
上一小节最后,ReactAgent 已经把 Agent 编译成了一张可以执行的 CompiledStateGraph。
咱们也看到,调用 agent.invoke() 时,真正执行的是:
this.#graph.invoke(...)
但是,这里还有一个最关键的问题没有解决。
Graph 运行起来以后,第一个执行的 model_request 里面到底做了什么?
比如用户输入:
查询 TASK-1024 的任务状态和最近一次测试结果。
面对这个请求,Agent 首先要完成一次模型调用,让模型判断下一步应该做什么。
但是,这次调用并不是简单执行一句 model.invoke()。
用户传入的 messages 怎样成为 Agent State?AgentNode 怎样整理 ModelRequest?LangChain 又怎样把 Tool Schema 绑定到模型,并最终得到包含 Tool Call 的 AIMessage?
这一小节,咱们先把第一次模型调用完整走通。
至于模型返回 Tool Call 以后,ToolNode 怎样执行 Tool、结果怎样回注,以及 Agent Loop 怎样结束,统一放到下一小节继续讲。
从 demo 开始
之前大家看源码都是直接从下载好的源码开始看的。
这次咱们稍微变一变,从一个写好的 demo 开始看,先看运行的结果,然后根据结果再来看源码流程。要是还像之前一样,估计很多同学会看不懂。
本小节的代码在:
/Code/Node/第五章/11-langchain-source-agent-run
我在 scripted-model.js 中准备了一个固定回复的模拟模型,保证大家每次运行都能得到相同的 Tool Call
真正要看的代码是:
agent-run-trace.js
进入项目目录,安装依赖并运行:
cd /Code/Node/第五章/11-langchain-source-agent-run
npm install
npm run trace
这里需要使用 Node.js 20 或更高版本。如果运行时出现
ReadableStream is not defined,先通过node -v检查当前终端是不是还在使用 Node.js 16。
先看下完整的输出:
完整输出稍微有点长,大家主要看 [最终 messages] 里面的内容,就是下面这些:
[最终 messages]
01. HumanMessage → 查询 TASK-1024 的任务状态和最近一次测试结果。
02. AIMessage → Tool Call
get_task({"taskId":"TASK-1024"}) id=call_get_task
03. ToolMessage(get_task) → {"taskId":"TASK-1024","title":"实现任务优先级筛选","status":"active"}
tool_call_id=call_get_task
04. AIMessage → Tool Call本节试读已结束
继续学习,解锁完整课程
购买《Agent 大模型 0 到 1 系统课》,
继续阅读本节剩余内容与后续课程。
