🎯 课程主题
讲解Agent的 invoke() 调用方式,包括输入消息格式和输出响应结构。
📝 核心知识点
1. invoke() 输入格式
- 概念说明:
agent.invoke()接收一个字典,key为messages,value是一个消息列表。 - 关键细节:
- 字典结构:
{"messages": [消息1, 消息2, ...]} - 每条消息可以用字典格式指定 role 和 content,也可以简写为纯字符串(默认为 human/user 消息)
- 完整格式:
- 字典结构:
{"messages": [
{"role": "system", "content": "你是一个数学老师"},
{"role": "user", "content": "100 + 20 * 3 = ?"}
]}
- 简写格式(纯字符串默认为 user message):
{"messages": ["你好"]}
# 等价于
{"messages": [{"role": "user", "content": "你好"}]}
2. invoke() 输出格式
- 概念说明:返回一个字典,同样含
messages字段,value为整个交互过程中产生的所有消息列表。 - 关键细节:
- 响应结构:
{"messages": [SystemMessage, HumanMessage, AIMessage, ...]} - 整个交互过程中的所有消息(用户消息、AI回复、工具调用消息等)都存放其中
- 获取最终AI回复内容:
- 响应结构:
response = agent.invoke({"messages": ["你好"]})
final_content = response["messages"][-1].content
3. 支持System Message
- 概念说明:可以在消息列表开头传入系统提示词来设定Agent的角色和行为。
- 关键细节:按顺序传入
system→user消息即可。
🏗️ 架构与工作流
- 输入 → Agent(LangGraph图)→ 内部可能经过 model 节点推理 → 输出(完整消息列表)
- 无工具时:只有 HumanMessage → AIMessage 两轮消息
- 有工具时:消息列表会更长,包含 ToolMessage 等中间消息
💻 代码实战
from dotenv import load_dotenv
from langchain.agents import create_agent
from langchain_deepseek import ChatDeepSeek
from rich import print as rprint
load_dotenv()
model = ChatDeepSeek(model="deepseek-chat")
agent = create_agent(model=model)
# ========== 示例一:简单问候 ==========
response = agent.invoke({
"messages": [{"role": "user", "content": "你好"}]
})
rprint(response)
# 输出结构:{"messages": [HumanMessage(...), AIMessage(...)]}
# ========== 示例二:带系统提示词 ==========
response = agent.invoke({
"messages": [
{"role": "system", "content": "你是一个精通数学的老师,擅长以通俗易懂的方式讲解数学问题。"},
{"role": "user", "content": "100 + 20 * 3 等于多少?"}
]
})
rprint(response)
# 输出:包含 SystemMessage、HumanMessage、AIMessage
# ========== 获取最终AI回复 ==========
final_reply = response["messages"][-1].content
print(final_reply) # "160"
⚠️ 常见问题与避坑指南
- 消息列表的顺序很重要:system message 应放在最前面。
- 简写方式传入纯字符串时,会自动封装为
HumanMessage,适合快速测试。 - 输出结构始终是字典,始终通过
["messages"]字段获取消息列表。
💡 个人总结与延伸
invoke() 的输入输出设计沿用了LangChain统一的 Runnable 接口模式。理解输出是整个交互过程的"完整消息历史"这一点很重要——它为后续实现记忆功能(将历史消息回传)和多轮对话奠定了基础。在流式输出场景下,消息的产出方式会有所不同,后续高级用法中会涉及。