← Framework

源码阅读: langchain 源码

LangChain Agent Factory

[!NOTE] 从 2025 年 10 月开始,LangChain 大改后,Agent 创建入口主要挪到了这里。这个方法很重要。

Factory

agent 创建的工厂方法,有以下参数。特别重要的一点是,从 2025 年大改后,agent 底层走的是 graph 那一套。

要记住底层走 Graph 这一点。它后续的执行,以及整个 Agent 行为的构成,都是依照 LangGraph 的原则去设计的。

参数名类型描述
modelstr | BaseChatModel模型本身
toolsSequence[BaseTool | Callable[..., Any] | dict[str, Any]] | None初始化时传入的工具
system_promptstr | SystemMessage | Nonesys 的 prompt
middlewareSequence[AgentMiddleware[StateT_co, ContextT]]中间件,控制模型的 tool call、agent、model call 前后的行为,是很重要的改动
response_formatResponseFormat[ResponseT] | type[ResponseT] | dict[str, Any] | None模型的返回类型
state_schematype[AgentState[ResponseT]] | NoneAgent runtime 的 state 参数
context_schematype[ContextT] | None一些额外的上下文参数
checkpointerCheckpointer | Nonememory,LangChain 管理记忆的核心内容
storeBaseStore | NoneLangChain 管理记忆的核心内容
interrupt_beforelist[str] | NoneHIL 的打断参数,或者一些前后操作可用的,类似 AOP
interrupt_afterlist[str] | None同上
debugbool
namestr | None给 graph 起别名
cacheBaseCache[Any] | None给图的执行结果存 cache,类似 lru

create_agent 初始化流程

create_agent 初始化的时候经历了这样的流程:

  1. 初始化模型。初始化模型的时候用到了 init_chat_model。一般用 LangChain 时,更多情况下是直接把模型塞进去,这也是最简单的初始化方式。
  2. 合并消息 input。
  3. 合并 System Prompt。初始化带入的时候,它会直接使用 LangChain 专属的 BaseMessage 继承的 SystemMessage 进行转换。
  4. 处理 Structured Output。

init_chat_model

其它的 init_chat_model 方法下又提供了几个参数,主要有两个工程上比较重要:

configurable_fields: Literal["any"] | list[str] | tuple[str, ...] | None = None
config_prefix: str | None = None

字面意思就是:可配置/可变的模型变量,以及可配置模型的前缀。

原文是:

configurable_fields: Which model parameters are configurable at runtime.
config_prefix: Useful when you have multiple configurable models in the same application.

模型运行时参数的可变,以及给模型上别名,会有很大的可玩空间。比如 A 模型欠费、宕机、不想用了,或者不同任务需要不同价格/类型的模型,就可以通过这种方式切换。

不过 agent 更新之后有了 Middleware,也可以通过 request override 重写当前用的模型,我觉得这个更方便一点。

config_prefix 就更不用说了。有了前缀,不同角色的 Agent 以及不同任务,可以通过前缀使用指定模型去处理。

structured_output

规定了结构化输出的一堆格式:AutoStrategy、ProviderStrategy、ToolStrategy。

主要是用于 response_format 的输出策略。

AutoStrategy 选择最优的 response strategy,具体会在后续的代码中判断。

ToolStrategy 官方是这样说的:

For models that don’t support native structured output, LangChain uses tool calling to achieve the same result. This works with all models that support tool calling.

对于原生不支持结构化输出的模型,LangChain 会把这部分内容封装成 Tool Calling 的形式,去实现稳定的结构化 Response 效果。

ProviderStrategy 是各大厂商自己的模型原生支持输出结构化结果。

LangChain 本身规定了三种方式:

  1. tool strategy
  2. auto strategy
  3. provider strategy

这三种 strategy 都是针对 response_format 这个参数进行构建的,目的就是迫使模型输出 Structured 的格式。