消息是 LangChain 模型中的基本上下文单位。
它们代表模型的输入和输出,包含与大语言模型交互时所需的内容和元数据,以表示对话状态。
消息包含以下对象:
- 角色——标识消息类型 (例如系统、用户)
- Content——表示消息的实际内容 (如文本、图像、音频、文档等)
- 元数据——可选字段,如响应信息、消息 ID 和令牌使用
一、消息提示词
1.1 Text prompts
文本提示词是字符串——非常适合直接的生成任务。
特点及场景:
- 一个单独的请求
- 不需要对话历史
- 想要最小的代码复杂度
1.2 Message prompts
通过提供一个消息对象列表来向模型传递一个消息列表
特点及场景:
- 管理多模态对话
- 处理多模态内容 (图像、音频、文件)
- 包含系统说明
1.3 Dictionary format
二、消息类型
2.1 System message
SystemMessage 代表一组初始指令,用于预设模型的行为。
可以使用系统消息来设定基调、定义模型的角色,并建立响应指南。
system_msg = SystemMessage("你是一位乐于助人的编程助手.")
2.2 Human message
HumanMessage 代表用户输入和交互。
它们可以包含文本、图像、音频、文件以及任何其他多模态内容。
response = model.invoke([
HumanMessage("What is machine learning?")
])
2.3 AI message
AIMessage 表示模型调用的输出。
它们可以包含多模态数据、工具调用和供应商特定的元数据
AIMessage 对象由模型在调用时返回,其中包含响应中所有相关的元数据。
提供商对消息类型的权衡/上下文化方式不同,这意味着有时手动创建一个新的 AIMessage 对象并将其插入消息历史记录中会很有帮助,就像它来自模型一样
2.4 Tool message
对于支持工具调用的模型,AI 消息可以包含工具调用。
工具消息用于将单个工具执行的结果传递回模型。
工具可以直接生成 ToolMessage 对象
def get_weather(city: str) -> str:
"""获取城市的天气"""
return f"{city} 天气晴朗"
model_with_tools=model.bind_tools([get_weather])
ai_message = AIMessage(
role= "assistant",
content=[],
tool_calls=[{
"name": "get_weather",
"args": {"location": "北京"},
"id": "call_00_jggiuM640K3YPybhdcJa1173"
}]
)
tool_message = ToolMessage(
content="北京天气晴朗",
tool_call_id="call_00_jggiuM640K3YPybhdcJa1173"
)
# Continue conversation
messages = [
HumanMessage("北京天气怎么样?"),
ai_message, # Model's tool call
tool_message, # Tool execution result
]
response = model.invoke(messages) # Model processes the result
rprint(response)
三、其他消息
3.1 Message metadata
name 和id都属于元数据字段,当消息类型相同,对消息进行区分。
但不是所有模型都支持这一功能,是否支持取决于模型供应商,需要查看官方手册
from langchain_core.messages import HumanMessage
human_msg = HumanMessage(
content="Hello!",
name="alice", # 可选:识别不同的用户
id="msg_123", # 可选:用于追踪的唯一标识符
)
response=model.invoke([human_msg])
rprint(response)
3.2 Tool calls
3.3 Streaming and chunks
在流式传输过程中,可以组合成完整消息对象的 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
print(full_message.text)