LangChain Agent 从入门到实战:创建与调用参数全解析

本文基于 LangChain v1 / LangGraph 的 Agent 体系,系统梳理 create_agent 创建时和 invoke 调用时的关键参数,帮你彻底搞懂"记忆"和"会话隔离"是怎么实现的。

一、从一个例子说起

先看一段很多教程里都会出现的代码:

python

python 复制代码
from langchain.messages import HumanMessage

# 设定 thread_id,作为会话标识
config = {"configurable": {"thread_id": "thread_1"}}

# 第一次调用,告知 AI 我的信息
response = agent.invoke(
    {"messages": [HumanMessage(content="你好,我叫虎哥,我最喜欢猫猫。")]},
    config  # 调用时添加 thread_id,区分不同会话
)

print(response)

这段代码的核心是 会话记忆(Memory)/ 多轮对话 。它通过 thread_id 区分不同会话,让 AI 能记住上下文。

但很多初学者会有疑问:

  • thread_id 到底是什么?为什么能记住我说的话?

  • 创建 Agent 时哪些参数必须传?

  • invoke 时又能传哪些参数?

下面逐个拆解。


二、创建 Agent 时的关键参数

结论先行:只有 model 是强制必须传的 。tools 虽然通常都会传,但技术上可以为空,此时 Agent 会退化为一个普通 LLM 调用。

1. model(必传)

必须传入一个支持工具调用的 LangChain 聊天模型。可以是:

  • 模型字符串标识,如 "openai:gpt-4o"

  • 模型实例,如 ChatOpenAI(...)

传实例时,可以在实例化阶段配置温度、API Key 等所有底层参数。

2. tools(强烈建议传)

工具列表,可以是 BaseTool、普通函数或字典。如果不传或传空列表,Agent 就没有工具调用循环,基本等同于普通 LLM。

3. checkpointer(记忆的关键)

这是实现会话记忆的核心。 如果不传 checkpointer,那么 invoke 时传的 thread_id 没有任何意义,Agent 不会记住任何历史。

常见的 checkpointer:

  • MemorySaver:内存存储,适合开发调试

  • SqliteSaver / PostgresSaver:持久化存储,适合生产环境

python

python 复制代码
from langgraph.checkpoint.memory import MemorySaver

agent = create_agent(
    model="openai:gpt-4o",
    tools=[...],
    checkpointer=MemorySaver(),  # 创建时就传,之后 invoke 配 thread_id 才生效
)

4. 其他重要可选参数

参数 作用
system_prompt 设定 Agent 角色和行为准则,字符串会自动转 SystemMessage
response_format 需要结构化输出时传入(如 Pydantic 模型)
middleware LangChain v1 扩展机制,用于人在回路、脱敏、对话摘要等
state_schema / context_schema 自定义状态字段或运行上下文
interrupt_before / interrupt_after 在 "agent" 或 "tools" 节点前后中断,用于用户确认流程

典型生产级写法

python

python 复制代码
from langchain.agents import create_agent
from langgraph.checkpoint.memory import MemorySaver

agent = create_agent(
    model="openai:gpt-4o",          # 必传
    tools=[search, calculator],      # 通常必传
    system_prompt="你是一个助手",     # 建议传
    checkpointer=MemorySaver(),      # 需要记忆时必传
)

三、invoke 调用时的关键参数

agent.invoke() 的参数分两块:输入状态 (必须传)和运行时配置 config(可选但常用)。

1. 输入状态:messages 是核心

输入必须是一个包含 messages 键的字典,支持几种写法。

最简写法------消息对象列表:

python

python 复制代码
from langchain_core.messages import HumanMessage
response = agent.invoke({"messages": [HumanMessage(content="你好")]})

字典写法------更简洁:

python

python 复制代码
response = agent.invoke({"messages": [{"role": "user", "content": "你好"}]})

动态 system prompt:

python

python 复制代码
agent.invoke({
    "messages": [
        {"role": "system", "content": "你是一个金融顾问"},
        {"role": "user", "content": "什么是ETF?"}
    ]
})

完整对话历史: 把全部消息按顺序传入,Agent 能感知完整上下文。

2. config:控制运行时行为

config 是第二个参数,thread_id 就在这里面。

thread_id(会话隔离):

python 复制代码
config = {"configurable": {"thread_id": "thread_1"}}

python

复制代码

同一个 id 共享历史,不同 id 相互隔离。这是多用户/多会话各自独立记忆的标准做法。

recursion_limit(递归限制):

控制 Agent 的最大循环次数,默认 25 次。任务复杂、需要多轮工具调用时可能触顶,可以调大:

python

python 复制代码
config = {
    "configurable": {"thread_id": "thread_1"},
    "recursion_limit": 50
}

其他字段: config 本质是 LangGraph 的 RunnableConfig,还支持 callbacks、tags、metadata 等通用运行时配置。

3. 返回的是什么

invoke 返回的也是字典,核心是 messages 列表,包含本次执行产生的全部消息:输入、AI 工具调用消息、工具返回结果、最终 AI 回答。

通常取最后一条即可拿到最终答案:

python

python 复制代码
response["messages"][-1].content

四、完整示例:验证记忆效果

python

python 复制代码
from langchain.agents import create_agent
from langchain_core.messages import HumanMessage
from langgraph.checkpoint.memory import MemorySaver

# 创建带记忆的 Agent
agent = create_agent(
    model="openai:gpt-4o",
    tools=[],
    checkpointer=MemorySaver(),
)

config = {"configurable": {"thread_id": "thread_1"}}

# 第一次:告诉它信息
agent.invoke(
    {"messages": [HumanMessage(content="你好,我叫虎哥,我最喜欢猫猫。")]},
    config
)

# 第二次:同一 thread_id,它应该记得
response = agent.invoke(
    {"messages": [HumanMessage(content="我叫什么?喜欢什么?")]},
    config
)
# 预期回答:你叫虎哥,最喜欢猫猫

# 换一个 thread_id,它就"失忆"了
config2 = {"configurable": {"thread_id": "thread_2"}}
agent.invoke({"messages": [HumanMessage(content="我叫什么?")]}, config2)
# 预期回答:不知道

五、核心要点速查表

创建 Agent 时

参数 是否必传 作用
model ✅ 必传 底层聊天模型
tools 强烈建议 工具列表,缺失则退化为普通 LLM
checkpointer 需要记忆时必传 按 thread_id 存取历史消息
system_prompt 建议 角色与行为准则
response_format 按需 结构化输出
middleware 按需 人在回路、脱敏等扩展

invoke 调用时

参数位置 关键字段 作用
第一个参数(输入字典) messages 对话内容,必须传
第二个参数(config) configurable.thread_id 会话隔离与记忆
第二个参数(config) recursion_limit 控制最大循环次数

六、一句话总结

  • 创建时 决定"Agent 有什么能力、记不记得住"------model 必传,checkpointer 决定记忆。

  • 调用时 决定"这次问什么、属于哪个会话"------messages 必传,thread_id 决定会话隔离。

  • 只有创建时配了 checkpointer,调用时的 thread_id 才有意义。

搞懂这两组参数,就掌握了 LangChain Agent 的核心用法。


如果本文对你有帮助,欢迎点赞、收藏、关注三连~有问题欢迎评论区交流!

相关推荐
2601_962885721 小时前
如何用 Python 把多只股票对齐成一张宽表?
开发语言·python
李福春4 小时前
技术思考问题17:上了LangChain框架就等于AI-Agent工程化吗?
大数据·人工智能·langchain·深圳同盟·腾讯云架构师技术同盟·llm应用架构·编排抽象
IT_Octopus9 小时前
【零基础入门 LLM 开发 · Day 13】:LangChain 的对话记忆——Message 对象版
人工智能·python·langchain
Jmyd01239 小时前
Web端3D营销展厅技术实现路径:从素材上云到线索回流的数据链路
前端·3d·性能优化·三维数字化
半个落月9 小时前
LangChain Agent 中间件实战(上):生命周期、状态、短路与工具包
javascript·langchain
砚凝霜9 小时前
【软考信息安全】第二十二章 Web服务器安全分析与增强——Apache与IIS
服务器·前端·安全
2603_965148119 小时前
社区与学习资源:从入门到精通的API选品学习路径
数据库·人工智能·python·学习·数据挖掘
半个落月9 小时前
LangChain Agent 中间件实战(下):DeepAgents文件权限、长期记忆与对话摘要
javascript·langchain
CCblandy11 小时前
令牌桶在 0.9 倍负载超发 19%、固定窗口边界放行 20 个:四种限流算法同构实测
后端·python·算法·性能优化·架构