LangChain Messages模块
本文介绍了LangChain中消息(Messages)的核心概念和使用方法。消息作为模型交互的基本单元,包含角色、内容和元数据三部分,支持系统消息、人类消息、AI消息和工具消息四种类型。文章详细说明了三种调用格式(文本提示、消息对象列表和字典格式)以及完整的工作流程示例。高级功能包括工具调用、令牌使用统计和流式响应处理。消息内容支持字符串、原生格式和标准内容块三种表示形式,并具备多模态输入能力,可
1. 消息核心概念
消息(Messages) 是LangChain中模型交互的基本上下文单元,代表着模型输入和输出的结构化数据载体。每个消息对象包含三个核心组成部分:
- 角色(Role):标识消息类型(如system、user、assistant)
- 内容(Content):消息的实际内容,支持文本、图像、音频、文档等
- 元数据(Metadata):可选字段,如响应信息、消息ID和令牌使用情况
在LangChain架构中,消息既是对话状态的表现形式,也是模型调用的标准接口,为LLM交互提供了统一的抽象层。
2. 消息类型详解
2.1 系统消息(SystemMessage)
系统消息用于引导模型行为和设置交互上下文,是对话的初始化指令:
from langchain.messages import SystemMessage
# 基础指令
system_msg = SystemMessage("You are a helpful coding assistant.")
# 详细角色定义
detailed_system_msg = SystemMessage("""
You are a senior Python developer with expertise in web frameworks.
Always provide code examples and explain your reasoning.
Be concise but thorough in your explanations.
""")
2.2 人类消息(HumanMessage)
人类消息代表用户输入,支持多模态内容:
from langchain.messages import HumanMessage
# 文本内容
human_msg = HumanMessage("What is machine learning?")
# 带元数据的人类消息
human_msg_with_metadata = HumanMessage(
content="Hello!",
name="alice", # 可选:标识不同用户
id="msg_123", # 可选:用于追踪的唯一标识符
)
2.3 AI消息(AIMessage)
AI消息表示模型输出,包含响应内容、工具调用和元数据:
from langchain.messages import AIMessage
# 从模型获取的响应
response = model.invoke("Explain AI")
print(type(response)) # <class 'langchain.messages.AIMessage'>
# 手动创建AI消息(用于对话历史)
manual_ai_msg = AIMessage("I'd be happy to help you with that question!")
2.4 工具消息(ToolMessage)
工具消息用于传递工具执行结果给模型:
from langchain.messages import ToolMessage
# 创建工具消息
tool_message = ToolMessage(
content="Sunny, 72°F", # 工具执行结果
tool_call_id="call_123", # 必须与AI消息中的工具调用ID匹配
name="get_weather", # 被调用工具的名称
artifact={"document_id": "doc_123", "page": 0} # 不发送给模型的附加数据
)
3. 基本使用方式
3.1 三种调用格式
文本提示(适用于单次独立请求):
response = model.invoke("Write a haiku about spring")
消息对象列表(适用于多轮对话):
from langchain.messages import SystemMessage, HumanMessage, AIMessage
messages = [
SystemMessage("You are a poetry expert"),
HumanMessage("Write a haiku about spring"),
AIMessage("Cherry blossoms bloom...")
]
response = model.invoke(messages)
字典格式(OpenAI兼容格式):
messages = [
{"role": "system", "content": "You are a poetry expert"},
{"role": "user", "content": "Write a haiku about spring"},
{"role": "assistant", "content": "Cherry blossoms bloom..."}
]
response = model.invoke(messages)
3.2 完整工作流程示例
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage, AIMessage, SystemMessage
# 初始化模型
model = init_chat_model("gpt-5-nano")
# 创建消息序列
system_msg = SystemMessage("You are a helpful assistant.")
human_msg = HumanMessage("Hello, how are you?")
# 调用模型
messages = [system_msg, human_msg]
response = model.invoke(messages) # 返回AIMessage
4. 高级功能特性
4.1 工具调用
当模型绑定工具时,AI消息中会包含工具调用信息:
from langchain.chat_models import init_chat_model
model = init_chat_model("gpt-5-nano")
# 定义工具函数
def get_weather(location: str) -> str:
"""Get the weather at a location."""
...
# 绑定工具并调用
model_with_tools = model.bind_tools([get_weather])
response = model_with_tools.invoke("What's the weather in Paris?")
# 处理工具调用
for tool_call in response.tool_calls:
print(f"Tool: {tool_call['name']}")
print(f"Args: {tool_call['args']}")
print(f"ID: {tool_call['id']}")
4.2 令牌使用统计
AI消息包含详细的令牌使用元数据:
response = model.invoke("Hello!")
print(response.usage_metadata)
# 输出示例:
# {
# 'input_tokens': 8,
# 'output_tokens': 304,
# 'total_tokens': 312,
# 'input_token_details': {'audio': 0, 'cache_read': 0},
# 'output_token_details': {'audio': 0, 'reasoning': 256}
# }
4.3 流式响应处理
处理流式响应时,接收的是AIMessageChunk对象:
chunks = []
full_message = None
for chunk in model.stream("Hi"):
chunks.append(chunk)
print(chunk.text)
full_message = chunk if full_message is None else full_message + chunk
5. 内容格式详解
5.1 内容表示方式
消息内容支持三种表示形式:
from langchain.messages import HumanMessage
# 1. 字符串形式
human_message = HumanMessage("Hello, how are you?")
# 2. 提供者原生格式
human_message = HumanMessage(content=[
{"type": "text", "text": "Hello, how are you?"},
{"type": "image_url", "image_url": {"url": "https://example.com/image.jpg"}}
])
# 3. 标准内容块(类型安全接口)
human_message = HumanMessage(content_blocks=[
{"type": "text", "text": "Hello, how are you?"},
{"type": "image", "url": "https://example.com/image.jpg"},
])
5.2 多模态内容支持
LangChain支持多种多模态输入格式:
# 从URL加载图像
message = {
"role": "user",
"content": [
{"type": "text", "text": "Describe the content of this image."},
{"type": "image", "url": "https://example.com/path/to/image.jpg"},
]
}
# 从base64数据加载
message = {
"role": "user",
"content": [
{"type": "text", "text": "Describe the content of this image."},
{
"type": "image",
"base64": "AAAAIGZ0eXBtcDQyAAAAAGlzb21tcDQyAAACAGlzb2...",
"mime_type": "image/jpeg",
},
]
}
# 使用提供者管理的文件ID
message = {
"role": "user",
"content": [
{"type": "text", "text": "Describe the content of this image."},
{"type": "image", "file_id": "file-abc123"},
]
}
6. 最佳实践指南
6.1 消息组织原则
- 明确角色分配:正确使用系统、用户和助手角色
- 合理使用元数据:为消息添加ID和名称以支持追踪和调试
- 保持对话状态:将完整对话历史作为消息序列传递
6.2 性能优化建议
- 使用内容块标准表示:跨提供者的一致接口
- 合理设置环境变量:使用
LC_OUTPUT_VERSION="v1"以获得标准内容块表示 - 监控令牌使用:通过
usage_metadata分析成本和使用模式
6.3 错误处理策略
- 验证工具调用ID匹配:确保
ToolMessage的tool_call_id与AI消息中的调用ID一致 - 检查模型支持能力:确认目标模型支持所需的多模态格式和文件类型
- 处理提供者差异:注意不同提供者对消息字段(如
name)的支持差异
总结
LangChain的Messages模块提供了强大而灵活的消息抽象层,支持从简单的文本对话到复杂的多模态交互和工具调用。通过掌握消息的核心概念、类型系统和使用模式,开发者可以构建出高效、可靠且可维护的LLM应用。
消息作为LangChain中模型交互的统一接口,其设计平衡了灵活性与类型安全,同时保持了与主流提供者API的兼容性。在实际应用中,建议根据具体需求选择适当的消息格式和调用方式,并结合最佳实践进行优化。
更多推荐


所有评论(0)