LangChain教程:调用阿里千问聊天模型chat model(使用Message类封装角色) 作者:马育民 • 2026-02-24 07:38 • 阅读:10003 # 介绍 使用下面的类封装角色: - SystemMessage:系统角色 - HumanMessage:用户角色 - AIMessage:AI角色 角色的作用详见 [链接](https://www.malaoshi.top/show_1GW2poSGZZqf.html "链接") # 案例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 的和”(两个问题无关联,无需带前一轮历史)。 原文出处:http://malaoshi.top/show_1GW2praxl83S.html