介绍
使用下面的类封装角色:
- SystemMessage:系统角色
- HumanMessage:用户角色
- AIMessage:AI角色
角色的作用详见 链接
案例1
对于简单的使用,如:只有一轮对话,且简单提问,可以只用 用户角色
提示:在 只有一轮对话,且简单提问,执行结果与调用普通大模型相同
创建用户角色
如下:
HumanMessage(content="我要学习大模型,给我列个简单的学习计划,10点即可")
代码
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_core.messages import HumanMessage
# 初始化模型
chat = ChatTongyi(model="qwen3-max", api_key="填你的阿里前文api key")
# 准备消息list
messages = [
# 设置用户角色
HumanMessage(content="我要学习大模型,给我列个简单的学习计划,10点即可")
]
# 调用stream向模型提问,返回 generator类型
res = chat.stream(input=messages)
print("res类型:", type(res))
# 流式输出
for chunk in res:
print(chunk.content, end="", flush=True)
代码解释1
messages = [
HumanMessage(content="我要学习大模型,给我列个简单的学习计划,10点即可")
]
- HumanMessage:用户角色,封装 用户的提问
- messages:将用户的提问放到该
list中,在一轮对话中,没有体现出用处
代码解释2
for chunk in res:
print(chunk.content, end="", flush=True)
在聊天模型中,需要调用 chunk.content 获取到模型返回的内容
案例2
只有一轮对话,但有场景时,可以设置 系统角色 + 用户角色
提示:虽然比上个例子稍微复杂,但执行结果与调用普通大模型相同
创建系统角色
SystemMessage(content="你是一名侦探小说家")
代码
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_core.messages import HumanMessage, SystemMessage
# 初始化模型
chat = ChatTongyi(model="qwen3-max", api_key="填你的阿里前文api key")
# 准备消息list
messages = [
# 设置系统角色
SystemMessage(content="你是一名侦探小说家"),
# 设置用户角色
HumanMessage(content="给我写100字的侦探小说")
]
# 调用stream向模型提问,返回 generator类型
res = chat.stream(input=messages)
print("res类型:", type(res))
# 流式输出
for chunk in res:
print(chunk.content, end="", flush=True)
代码解释
messages = [
SystemMessage(content="你是一名侦探小说家"),
HumanMessage(content="给我写100字的侦探小说")
]
- SystemMessage:系统角色
- HumanMessage:用户的提问,封装在该类中
- messages:将系统角色,用户的提问放到该
list中,在一轮对话中,没有体现出用处
案例3(真实场景)
多轮对话时,且有使用场景时,应该设置 系统角色 + 用户角色 + AI角色
AI角色:代表 AI 上一轮的回答,用于多轮对话的 上下文记忆
创建AI角色
AIMessage(content=res_txt)
代码
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_core.messages import HumanMessage, SystemMessage, AIMessage
# 初始化模型
chat = ChatTongyi(model="qwen3-max", api_key="填你的阿里前文api key")
# 准备消息list
messages = [
# 设置系统角色
SystemMessage(content="你是一个温柔的小学数学老师,回答问题时用“亲”、“小朋友”,并且简短回答问题,回答问题不要用markdown格式"),
]
"""
第一次提问:3x+5=20,x 等于多少?
第二次提问:把x=6代入公式,等于多少
"""
def printMessages(messages):
"""
打印消息列表
:param messages:
:return:
"""
print("------messages内容:")
for item in messages:
print(item.__class__.__name__, ":", item.content)
print("------messages内容结束")
print("===== 小学数学老师对话助手 =====\n")
while True:
# 4. 用户角色:获取当前轮次的用户提问(变量输入)
user_input = input("请提问:")
# 设置用户角色
user_msg = HumanMessage(content=user_input)
# 将用户提问加入对话历史
messages.append(user_msg)
printMessages(messages)
# 5. 通过 stream() 流式调用,调用模型生成回答(AI角色的「实时回答」)。
res = chat.stream(messages)
# 将回答的内容拼装到该字符串
res_txt = ""
# 输出AI回答
print("\n\nAI老师的回答:")
# 流式输出
for chunk in res:
print(chunk.content, end="", flush=True)
res_txt = res_txt + chunk.content
print("\n回答完毕!\n")
# 删除上次用户的提问
messages.pop()
# 6. 设置AI角色
ai_msg = AIMessage(content=res_txt)
# 将本次回答加入历史(核心!作为下一轮的上下文)
messages.append(ai_msg)
代码解释1
由于是多轮对话,所以代码结构与之前完全不同,是在循环中,获取用户提问,并调用大模型
代码解释2
messages = [
SystemMessage(content="你是一个温柔的小学数学老师,回答问题时用“亲”、“小朋友”,并且简短回答问题,回答问题不要用markdown格式"),
]
初始化时,消息列表中,只有系统角色
代码解释3
# 4. 用户角色:获取当前轮次的用户提问(变量输入)
user_input = input("请提问:")
# 将用户提问加入对话历史
user_msg = HumanMessage(content=user_input)
messages.append(user_msg)
在循环中,获取用户的提问,并封装到 HumanMessage 中,然后放入 messages 消息列表中
代码解释4
ai_msg = AIMessage(content=res_txt)
messages.append(ai_msg)
最后将大模型的回答内容,封装到 AIMessage 中,并放入 messages 消息列表中,这样,第二轮提问时,大模型才只能上下文内容,才能正确回答
执行1-有3个角色
第一轮提问:3x+5=20,x 等于多少?
第二轮提示:把x=6代入公式,等于多少
执行2-没有ai角色
将下面代码注释掉,没有ai角色:
# ai_msg = AIMessage(content=res_txt)
# messages.append(ai_msg)
第一轮的提问,能正确回答
第二轮的提问,会无法回答,显示如下:

必须携带AI 助手角色的场景
只要对话存在 上下文依赖,就必须携带关键历史,比如:
- 用户追问:先问 “什么是 RAG”,再问 “它的核心步骤是什么”(后一个问题依赖前一个的定义);
- 多轮纠错:用户指出 “你刚才的代码有问题”,模型需要知道 “刚才的代码是什么”;
- 场景化交互:电商客服中,用户先提 “我的订单没发货”,再问 “能退款吗”(依赖 “订单” 这个上下文)。
无需带的场景
用户先问 “写一首唐诗”,再问 “计算 1+2+3 的和”(两个问题无关联,无需带前一轮历史)。