本文基于 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 的核心用法。
如果本文对你有帮助,欢迎点赞、收藏、关注三连~有问题欢迎评论区交流!