LangChain教程:调用阿里千问聊天模型chat model(使用Message类封装角色)

介绍

使用下面的类封装角色:

  • 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 的和”(两个问题无关联,无需带前一轮历史)。


原文出处:/show_1GW2praxl83S.html