**摘要:**本文围绕 LangChain 中 Message 这一与大模型沟通的基本数据结构展开,系统讲解消息类型(system、user、assistant、tool)、消息内容(Content)与元数据(metadata)的构成,并通过 message 实例与带角色的类(SystemMessage、HumanMessage、AIMessage、ToolMessage)说明其用法。文章还结合 Agent 使用实例、普通使用实例以及提示词工程,演示如何正确设置系统提示词并调用大模型完成实际任务。
内容参考于:图灵AI大模型全栈
在LangChhain中Message是跟大模型沟通的基本数据结构,就是说知道message的结构后就能知道什么样子后才能和大语言模型进行交互
消息类型
system、user、assistant、tool
system是系统提示词,它最优先遵循的
user是用户提示词,就是我们向大模型提问的问题
assistant是大模型的回复
tool是工具的回复
消息内容
Content:它是实际的消息,消息内容包含文本、图片等,通过与消息类型的配合就能知道是谁的消息了
元数据
metadata:它是可选字段,可以用来描述 Content 的内容、消息的id、Token消耗情况等
message实例
json
{
"messages": [
{
"id": "msg_a1b2c3d4e5f6",
"role": "system",
"content": "你是一个专业的中文翻译助手,擅长将英文翻译成地道准确的中文。请保持原文的语气和语境。",
"metadata": {
"timestamp": "2026-06-10T13:40:00Z",
"version": "v1"
}
},
{
"id": "msg_b2c3d4e5f6g7",
"role": "user",
"content": "Could you please recommend some popular cafes near Koto Ward?",
"metadata": {
"timestamp": "2026-06-10T13:40:30Z",
"token_usage": {
"input_tokens": 12
}
}
},
{
"id": "msg_c3d4e5f6g7h8",
"role": "assistant",
"content": "你能给我推荐一些附近比较受欢迎的咖啡馆吗?",
"tool_calls": [],
"metadata": {
"timestamp": "2026-06-10T13:41:00Z",
"input_tokens": 12,
"output_tokens": 156,
"total_tokens": 168
}
}
]
}
LangChain为我们提供了带角色的类,从而让我们不需要手动写上方的 messages
SystemMessage, HumanMessage, AIMessage, ToolMessage
SystemMessage表示系统消息
HumanMessage表示用户消息
AIMessage表示助手消息
ToolMessage表示工具消息
Agent使用实例
效果图:通过LangSmith可以看出,它的系统提示词是用的 SystemMessage 里的内容
但是不要这样设置系统提示词,一般使用下图红框的 system_prompt 参数来设置系统提示词
代码
pythonfrom langchain.messages import SystemMessage, HumanMessage, AIMessage, ToolMessage # create_agent是LangChain提供的创建Agent的核心模块 from langchain.agents import create_agent # 引入调用模型的openai from langchain_openai import ChatOpenAI # 引入 把.env文件中的内容加载成环境变量 的库 from dotenv import load_dotenv import os 把.env文件中的内容加载成环境变量 load_dotenv() 初始化模型 llm = ChatOpenAI( model="qwen3.7-flash", api_key=os.getenv("DASHSCOPE_API_KEY"), base_url=os.getenv("DASHSCOPE_BASE_URL"), ) 创建一个工具,获取天气的工具 def get_weather(city): # 工具描述,新版本LangChain会获取这个字符串当做工具的描述写到提示词中 """ 获取指定城市的天气信息 """ # 工具逻辑 return f"{city}天气是美好的" agent = create_agent( model=llm, tools=[get_weather], # 系统提示词 system_prompt="你是一个智能助手,能够回答用户关于天气的问题,可以使用提供的天气工具来获取天气信息" ) system_msg = SystemMessage("你是一个助手") human_msg = HumanMessage("大模型是什么?") messages = {"messages":[system_msg, human_msg]} result = agent.invoke(messages) print(result)
普通使用实例
效果图:
代码,它跟create_agent有区别,它的message只需要一个数组就可以了,而create_agent需要一个字典对象,{"messages":\[\]}这样的格式,这个messages不能写错了,写错了就无作用
pythonfrom langchain.messages import SystemMessage, HumanMessage, AIMessage, ToolMessage from langchain.chat_models import init_chat_model from dotenv import load_dotenv import os # 加载环境变量 load_dotenv() 初始化模型 llm = init_chat_model(model="qwen3.7-flash", api_key=os.getenv("DASHSCOPE_API_KEY"), base_url=os.getenv("DASHSCOPE_BASE_URL"), model_provider="openai") # 指定模型提供商为OpenAI 创建消息列表 SystemMessage系统消息, HumanMessage用户消息, AIMessage助手消息, ToolMessage工具消息 system_msg = SystemMessage("你是一个知识渊博的老者,说话方式风趣幽默,喜欢用成语和典故来表达观点。") human_msg = HumanMessage("大模型是什么?") messages = [system_msg, human_msg] 也可以使用字典格式的消息列表 messages = [ {"role": "system", "content": "你是一个知识渊博的老者,说话方式风趣幽默,喜欢用成语和典故来表达观点。"}, {"role": "user", "content": "写一首关于春天的诗句。"} ] # 普通对话 result = llm.invoke(messages) # 会返回一个AIMessage print(result)
提示词工程
普通用户的提示词只需要提出问题,但是系统提示词是需要很专业的,一般由 系统指令、工具或函数、上下文或背景知识、历史消息、用户输入 组成
系统指令:设定大模型的角色,比如 你是一位xxx专家,请使用中文回答,通过这样的角色限定,大模型再回答问题时就会偏向找xxx相关的知识来回答
工具或函数:告诉大模型可以调用的外部工具或者函数,也就是Agent中的手和脚
上下文或背景知识:就是给大模型的参考资料,就是给大模型提问时,问题中需要到的资料
历史消息:就是大模型的记忆,我们跟大模型的聊天记录
用户输入:就是最新提问的问题,比如 今天天气怎么样
更细节的实例,去看第2节
代码实例效果图:
代码
pythonfrom langchain.agents import create_agent from langchain.messages import HumanMessage from langchain_openai import ChatOpenAI import os from dotenv import load_dotenv 加载环境变量 load_dotenv() 初始化模型 llm = ChatOpenAI(model="qwen3.7-flash", api_key=os.getenv("DASHSCOPE_API_KEY"), base_url=os.getenv("DASHSCOPE_BASE_URL") ) 创建系统提示词 system_prompt = """ 角色 你是一位小红书爆款推文作者。 目标 根据用户提供的主题,创作一篇小红书推文。 输出格式 Markdown 内容要求 标题:提供3个不同风格的爆款标题 公式:数字+形容词+关键词+情绪词(如:"3款巨显白发色 | 黄皮必冲!") 正文: 开头(2行内抓眼球):痛点提问或直接安利 中间:分点陈述(用emoji,加粗重点),写真实体验而非堆砌参数 结尾:引导互动("评论区聊聊你的看法~") 话题标签:提供10个精准标签,组合策略:大流量词+细分词+场景词 视觉建议:一句话描述封面/配图风格 风格要求 口语化、有情绪感、善用"绝了""谁懂啊""真的会谢"等小红书高频词。 """ 创建代理 agent = create_agent( model=llm, system_prompt=system_prompt ) 进行流式输出 for token, metadata in agent.stream( {"messages": [HumanMessage(content="-")]}, stream_mode="messages", ): print(token.content, end="", flush=True)




