【LangChain】langchain_core.messages 模块:定义和管理消息对象的核心组件
在 LangChain 中,langchain_core.messages 模块是用于定义和管理消息对象的核心组件,广泛应用于聊天模型、代理(Agents)和对话链(Conversational Chains)。消息对象表示用户、模型、工具或其他实体之间的交互内容,通常用于构建对话上下文、传递工具调用结果或维护对话历史。核心类:HumanMessage:用户输入。AIMessage:模型响应,支持
在 LangChain 中,langchain_core.messages 模块是用于定义和管理消息对象的核心组件,广泛应用于聊天模型、代理(Agents)和对话链(Conversational Chains)。消息对象表示用户、模型、工具或其他实体之间的交互内容,通常用于构建对话上下文、传递工具调用结果或维护对话历史。该模块提供了一套标准化的消息类型,支持结构化对话管理,适用于多轮对话、工具调用和上下文增强等场景。
以下是对 langchain_core.messages 模块的详细介绍,涵盖其定义、核心类、功能、实现方式、应用场景、代码示例、优化建议、注意事项以及与 LangChain 生态的结合。
1. 什么是 langchain_core.messages?
langchain_core.messages 模块定义了一组消息类,用于表示对话中的不同角色或类型的消息。它是 LangChain 对话系统的基础,允许开发者:
- 标准化消息格式:统一表示用户输入、模型响应、工具调用等。
- 支持多轮对话:通过消息列表维护对话历史。
- 集成工具调用:处理工具调用请求和结果。
- 增强上下文:将消息与提示模板、记忆(Memory)或代理结合。
消息对象通常作为列表传递给聊天模型或代理,代表完整的对话上下文。每个消息包含角色(role)、内容(content)和其他元数据(如工具调用信息)。
核心目标:
- 提供一致的消息表示,简化对话管理。
- 支持复杂交互,如工具调用和多模态输入。
- 便于与 LangChain 的其他模块(如提示模板、代理、记忆)集成。
2. 核心消息类
langchain_core.messages 模块定义了以下主要消息类,位于 langchain_core.messages 命名空间中:
| 类名 | 描述 | 主要字段 | 适用场景 |
|---|---|---|---|
BaseMessage |
所有消息的基类,定义通用属性。 | content(str 或 List)、role(str)、additional_kwargs(Dict) |
自定义消息类型 |
HumanMessage |
表示用户发送的消息。 | content |
用户输入、查询 |
AIMessage |
表示模型生成的消息。 | content、tool_calls(List[Dict]) |
模型响应、工具调用 |
SystemMessage |
表示系统提示或指令。 | content |
设置对话上下文、定义模型行为 |
ToolMessage |
表示工具调用的结果。 | content、tool_call_id(str) |
工具执行结果反馈 |
FunctionMessage |
表示函数调用结果(已废弃,推荐使用 ToolMessage)。 |
content、name(str) |
旧版函数调用(OpenAI Functions) |
ChatMessage |
表示任意角色的消息。 | content、role(str) |
自定义角色对话 |
字段说明:
content:消息的主要内容,可以是字符串或多模态内容(如图像、文本混合的列表)。role:消息的角色(如"human"、"assistant"、"system")。additional_kwargs:附加元数据,如时间戳、ID 或模型特定参数。tool_calls(仅AIMessage):工具调用请求的列表,包含工具名称和参数。tool_call_id(仅ToolMessage):关联的工具调用 ID,用于匹配请求和结果。
3. 功能与特点
langchain_core.messages 模块提供以下功能:
- 统一消息表示:
- 标准化不同角色的消息格式,便于模型和代理处理。
- 支持字符串和多模态内容(如文本+图像)。
- 对话上下文管理:
- 通过消息列表维护多轮对话历史。
- 与
ConversationBufferMemory等记忆模块集成。
- 工具调用支持:
AIMessage支持生成工具调用请求。ToolMessage用于反馈工具执行结果。
- 灵活扩展:
- 支持自定义消息类型,继承
BaseMessage。 - 通过
additional_kwargs传递元数据。
- 支持自定义消息类型,继承
- 序列化与解析:
- 消息对象可序列化为 JSON,便于存储或传输。
- 支持从 JSON 反序列化为消息对象。
- 多模态支持:
content可以是字符串或包含文本、图像等的列表。- 适用于支持多模态输入的模型(如 GPT-4o)。
特点:
- 模块化:消息类独立且可扩展,适合各种对话场景。
- 类型安全:使用 Pydantic 模型确保字段验证。
- 跨模型兼容:支持 OpenAI、Anthropic、HuggingFace 等模型的对话格式。
- 生态集成:与提示模板、代理、工具、记忆等无缝协作。
4. 使用方式与代码示例
以下是 langchain_core.messages 模块的主要使用方式,结合代码示例说明:
(1) 基本消息创建与使用
创建不同类型的消息并传递给聊天模型:
from langchain_core.messages import HumanMessage, SystemMessage, AIMessage
from langchain_openai import ChatOpenAI
# 初始化模型
llm = ChatOpenAI(api_key="your-openai-key")
# 创建消息列表
messages = [
SystemMessage(content="你是一个量子计算专家,回答要简洁且准确。"),
HumanMessage(content="量子计算是什么?"),
]
# 调用模型
response = llm.invoke(messages)
print(response.content)
输出:
量子计算是一种基于量子力学原理的计算范式,使用量子比特进行计算。
说明:
SystemMessage设置模型行为。HumanMessage表示用户查询。- 消息列表作为上下文传递给模型。
(2) 对话历史管理
使用消息列表维护多轮对话:
from langchain_core.messages import HumanMessage, AIMessage
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(api_key="your-openai-key")
# 初始化对话历史
messages = [
HumanMessage(content="量子计算是什么?"),
AIMessage(content="量子计算是一种基于量子力学原理的计算范式。"),
HumanMessage(content="有哪些最新进展?")
]
# 调用模型
response = llm.invoke(messages)
print(response.content)
输出:
最新进展包括超导量子比特的突破和量子纠错技术的改进。
说明:
- 消息列表模拟对话历史,模型根据上下文生成响应。
- 可结合
ConversationBufferMemory自动管理历史。
(3) 工具调用与 ToolMessage
处理工具调用请求和结果:
from langchain_core.messages import HumanMessage, AIMessage, ToolMessage
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
# 定义工具
@tool
def calculator(expression: str) -> str:
"""执行数学计算"""
return str(eval(expression))
# 初始化模型并绑定工具
llm = ChatOpenAI(api_key="your-openai-key").bind_tools([calculator])
# 创建消息
messages = [HumanMessage(content="计算 5 + 3")]
# 调用模型
response = llm.invoke(messages)
# 处理工具调用
if response.tool_calls:
tool_call = response.tool_calls[0]
tool_result = calculator.invoke(tool_call["args"])
messages.extend([
AIMessage(content="", tool_calls=[tool_call]),
ToolMessage(content=tool_result, tool_call_id=tool_call["id"])
])
# 继续对话
final_response = llm.invoke(messages)
print(final_response.content)
输出:
计算结果为 8。
说明:
AIMessage包含tool_calls,指定要调用的工具和参数。ToolMessage反馈工具执行结果,通过tool_call_id关联。- 模型根据工具结果生成最终响应。
(4) 多模态消息
使用多模态内容(需要支持多模态的模型,如 GPT-4o):
from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o", api_key="your-openai-key")
# 创建多模态消息
messages = [
HumanMessage(content=[
{"type": "text", "text": "描述这张图片的内容。"},
{"type": "image_url", "image_url": {"url": "https://example.com/image.jpg"}}
])
]
# 调用模型
response = llm.invoke(messages)
print(response.content)
输出(假设图片可用):
图片显示一台量子计算机的实验设备,周围有冷却装置和控制面板。
说明:
content为列表,包含文本和图像 URL。- 仅支持多模态模型(如 GPT-4o)。
(5) 与记忆结合
结合 ConversationBufferMemory 管理对话历史:
from langchain_core.messages import HumanMessage, AIMessage
from langchain_openai import ChatOpenAI
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
# 初始化模型和记忆
llm = ChatOpenAI(api_key="your-openai-key")
memory = ConversationBufferMemory(return_messages=True)
conversation = ConversationChain(llm=llm, memory=memory)
# 第一轮对话
response = conversation.invoke("量子计算是什么?")
print(response["response"])
# 第二轮对话
response = conversation.invoke("有哪些最新进展?")
print(response["response"])
# 查看对话历史
print(memory.chat_memory.messages)
输出:
量子计算是一种基于量子力学原理的计算范式。
最新进展包括超导量子比特的突破和量子纠错技术的改进。
[
HumanMessage(content='量子计算是什么?'),
AIMessage(content='量子计算是一种基于量子力学原理的计算范式。'),
HumanMessage(content='有哪些最新进展?'),
AIMessage(content='最新进展包括超导量子比特的突破...')
]
说明:
ConversationBufferMemory自动存储消息对象。return_messages=True确保返回HumanMessage和AIMessage实例。
6. 应用场景
langchain_core.messages 模块适用于以下场景:
- 多轮对话:
- 构建聊天机器人,维护对话历史。
- 示例:回答连续问题,如“量子计算是什么?”和“它有什么应用?”。
- 工具调用:
- 处理代理或链中的工具交互。
- 示例:代理调用搜索工具并反馈结果。
- 上下文增强:
- 为模型提供系统提示或历史上下文。
- 示例:设置“以专家身份回答”并提供背景。
- 多模态交互:
- 处理文本+图像或文本+音频的对话。
- 示例:描述图片内容或分析多模态输入。
- 对话记忆:
- 结合记忆模块存储和检索对话历史。
- 示例:实现长期对话的上下文保持。
- 代理工作流:
- 在代理中管理用户、模型和工具的消息流。
- 示例:代理搜索最新信息并总结。
7. 优化建议
(1) 提高消息管理效率
- 精简消息:
- 仅保留必要的对话历史,减少 token 消耗。
- 示例:使用
ConversationSummaryMemory压缩历史。
from langchain.memory import ConversationSummaryMemory memory = ConversationSummaryMemory(llm=llm) - 批量处理:
- 批量传递多组消息,减少 API 调用。
results = llm.batch([messages1, messages2])
(2) 提高工具调用可靠性
- 验证工具调用:
- 检查
tool_calls是否有效。
if not response.tool_calls: print("无工具调用") return response.content - 检查
- 匹配 tool_call_id:
- 确保
ToolMessage的tool_call_id与AIMessage一致。
tool_message = ToolMessage(content=result, tool_call_id=tool_call["id"]) - 确保
(3) 提高性能
- 缓存对话:
- 使用 LangChain 的缓存机制存储常见对话。
from langchain.globals import set_llm_cache from langchain.cache import SQLiteCache set_llm_cache(SQLiteCache(database_path="cache.db")) - 异步调用:
- 使用
ainvoke支持高并发。
response = await llm.ainvoke(messages) - 使用
(4) 监控与调试
- 回调:
- 使用回调记录消息生成和工具调用。
from langchain_core.callbacks import BaseCallbackHandler class MessageCallback(BaseCallbackHandler): def on_chat_model_start(self, serialized, messages, **kwargs): print(f"输入消息:{messages}") config = {"callbacks": [MessageCallback()]} response = llm.invoke(messages, config=config) - LangSmith:
- 分析消息流和性能。
from langsmith import Client config = {"callbacks": [Client(api_key="your-langsmith-key")]}
(5) 上下文优化
- 动态系统提示:
- 根据任务调整
SystemMessage。
system_message = SystemMessage(content=f"今天是 {datetime.now().strftime('%Y-%m-%d')},回答要简洁。") - 根据任务调整
- 消息截断:
- 限制历史消息数量,防止上下文超限。
messages = messages[-10:] # 保留最后 10 条消息
8. 注意事项
- 模型兼容性:
- 某些模型不支持多模态消息(如图像输入)。
- 检查模型文档是否支持
tool_calls(如 GPT-4、Claude)。
- 消息长度:
- 过多的消息或长内容可能超过模型的 token 限制。
- 使用
ConversationSummaryMemory或截断消息。
- 工具调用一致性:
- 确保
ToolMessage的tool_call_id与AIMessage的tool_calls匹配。 - 缺少
tool_call_id可能导致代理无法关联结果。
- 确保
- 序列化:
- 消息对象需正确序列化以存储或传输。
- 使用
to_json()和from_json()方法。
json_data = message.to_json() restored_message = BaseMessage.from_json(json_data) - 安全性:
- 避免在消息中包含敏感信息(如 API 密钥)。
- 验证用户输入,防止注入攻击。
- 废弃警告:
FunctionMessage已标记为废弃,推荐使用ToolMessage。- 检查代码是否使用最新消息类型。
9. 与 LangChain 生态的结合
- 提示模板(Prompt Templates):
- 使用
ChatPromptTemplate管理消息。
from langchain_core.prompts import ChatPromptTemplate prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个专家。"), ("human", "{input}") ]) - 使用
- 代理(Agents):
- 消息用于代理的输入和工具调用。
from langchain.agents import create_openai_tools_agent agent = create_openai_tools_agent(llm, tools, prompt) - 工具(Tools):
AIMessage和ToolMessage支持工具调用。
messages.append(ToolMessage(content=tool_result, tool_call_id=tool_call["id"])) - 记忆(Memory):
- 结合
ConversationBufferMemory存储消息。
memory = ConversationBufferMemory(return_messages=True) - 结合
- 回调(Callbacks):
- 监控消息生成和处理。
config = {"callbacks": [MessageCallback()]} - LangSmith:
- 分析消息流和对话性能。
10. 综合示例:代理工具调用
以下是一个结合消息、工具调用和代理的完整示例:
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage, AIMessage, ToolMessage
from langchain_core.tools import tool
from langchain.agents import create_openai_tools_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.callbacks import StdOutCallbackHandler
from langchain_core.runnables import RunnableConfig
# 定义工具
@tool
def search_web(query: str) -> str:
"""搜索网络信息"""
return f"搜索结果:{query} 的最新信息..."
# 初始化模型和工具
llm = ChatOpenAI(model="gpt-4o", api_key="your-openai-key")
tools = [search_web]
# 设置提示模板
prompt = ChatPromptTemplate.from_messages([
SystemMessage(content="你是一个研究助手,擅长搜索和总结信息。"),
MessagesPlaceholder(variable_name="messages"),
MessagesPlaceholder(variable_name="agent_scratchpad")
])
# 创建代理
agent = create_openai_tools_agent(llm=llm, tools=tools, prompt=prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 配置 RunnableConfig
config = RunnableConfig(
callbacks=[StdOutCallbackHandler()],
max_iterations=3,
metadata={"request_id": "req_001"}
)
# 执行任务
response = agent_executor.invoke({
"messages": [HumanMessage(content="量子计算的最新进展是什么?")]
}, config=config)
print(response["output"])
输出:
[AgentExecutor] 正在执行...
[Tool: search_web] 输入:量子计算的最新进展
[Tool Output] 搜索结果:量子计算的最新信息...
[Final Answer] 量子计算的最新进展包括超导量子比特的突破...
11. 学习资源
- 官方文档:https://python.langchain.com/docs/modules/messages
- GitHub 源码:https://github.com/langchain-ai/langchain/tree/master/libs/core/langchain_core/messages
- LangSmith:用于调试消息流(https://smith.langchain.com)。
- 社区教程:LangChain 官方博客、YouTube 视频。
12. 总结
- 定义:
langchain_core.messages模块定义消息类,用于表示对话中的用户、模型、工具等交互内容。 - 核心类:
HumanMessage:用户输入。AIMessage:模型响应,支持工具调用。SystemMessage:系统指令。ToolMessage:工具结果。ChatMessage:自定义角色。
- 功能:统一消息表示、对话管理、工具调用、多模态支持、序列化。
- 应用场景:多轮对话、工具调用、上下文增强、多模态交互、记忆管理、代理工作流。
- 优化点:消息管理、工具调用可靠性、性能、监控、上下文优化。
- 注意事项:模型兼容性、消息长度、工具调用一致性、序列化、安全性、废弃警告。
更多推荐


所有评论(0)