Messages 是 LangChain 中模型的基本上下文单元。它们代表模型的输入和输出,在与 LLM 交互时,携带内容和元数据来表示对话状态。Message的组成:
- role: 消息是由哪个角色发出的
- content: 表示消息的实际内容(如文本、图像、音频、文档等)
- metadata: 可选字段,如响应信息、消息 ID 和令牌使用情况
LangChain 提供了一种标准消息类型,可在所有模型提供者之间通用,确保无论调用哪个模型都能保持一致的行为。
一、不同类型的提示词
1、Text prompts
python
model.invoke("在这里面写的就是文本提示词")
2、Message prompts
可以通过提供消息对象列表将消息列表传递给模型。当你想要包含系统指令、管理多轮对话和处理多模态内容(图像、音频、文件)的时候使用Message prompts
python
messages = [
SystemMessage("你是一个乐于助人的小助手"),
HumanMessage("我叫小呆,你好"),
AIMessage("你好!很高兴见到你,我是你的AI助手"),
HumanMessage("我叫什么?")
]
3、OpenAI 消息格式的 prompts
python
messages = [
{"role": "system", "content": "你是一个乐于助人的小助手"},
{"role": "user", "content": "我叫小呆,你好"},
{"role": "assistant", "content": "你好!很高兴见到你,我是你的AI助手"},
{"role": "user", "content": "我叫什么?"},
]
model.invoke(messages)
二、创建消息对象
使用消息最简单的方法是创建消息对象,并在调用模型时将其传递给模型。
四种消息对象类型:
- HumanMessages 模型生成的响应,包括文本内容、工具调用和元数据
- AImessages 代表用户输入和与模型的交互
- ToolMessages 表示工具调用的输出
- SystemMessages 告知模型如何行为并提供交互上下文
python
from langchain.messages import (
HumanMessage,
AIMessage,
SystemMessage,
ToolMessage
)
我们一起看一个例子
python
from langchain.chat_models import init_chat_model
from langchain.messages import (
HumanMessage,
AIMessage,
SystemMessage,
ToolMessage
)
from dotenv import load_dotenv
load_dotenv(override=True)
model = init_chat_model(
model="deepseek-chat"
)
# 看看创建出来的Message对象长什么样
HumanMessage("你好")
# 还可以再
HumanMessage(
content="你好",
name="小呆", # 可选:识别不同的用户,但是name字段的行为因模型提供者而异,有些用于用户识别,有些则忽略它。
id="msg-xiaodai" # 可选:跟踪的唯一标识符
)
SystemMessage("你是一个乐于助人的小助手")
messages = [
SystemMessage("你是一个乐于助人的小助手"),
HumanMessage("你好")
]
model.invoke(messages)
messages消息列表中使用Langchain之前的元组形式也是可以的
python
# 如果你不创建Message对象,也是可以的,之前的代码中就是直接一个字符串。
model.invoke("你好")
# 但直接传入字符串的缺点是无法指定角色,所以可以用下面这种方式
messages = [
("system", "你是一个乐于助人的小助手"),
("user", "你好")
]
model.invoke(messages)
HumanMessage支持多模态输入
python
# 换成glm,因为deepseek-chat不支持多模态
from langchain_community.chat_models import ChatZhipuAI
glm_model = ChatZhipuAI(model='glm-4.6v-flash')
# 直接使用OpenAI格式
glm_model.invoke(input=[
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": "https://cloudcovert-1305175928.cos.ap-guangzhou.myqcloud.com/%E5%9B%BE%E7%89%87grounding.PNG"
}
},
{
"type": "text",
"text": "Where is the second bottle of beer from the right on the table? Provide coordinates in [[xmin,ymin,xmax,ymax]] format"
}
]
}
])
# HumanMessage支持多模特
human_message = HumanMessage(content=[
{
"type": "image_url",
"image_url": {
"url": "https://cloudcovert-1305175928.cos.ap-guangzhou.myqcloud.com/%E5%9B%BE%E7%89%87grounding.PNG"
}
},
{
"type": "text",
"text": "Where is the second bottle of beer from the right on the table? Provide coordinates in [[xmin,ymin,xmax,ymax]] format"
}
])
# 使用HumanMessage
glm_model.invoke([human_message])