说明
在 LangChain教程:调用阿里千问聊天模型chat model(使用Message类) 案例中,使用类封装角色:
- SystemMessage:系统角色
- HumanMessage:用户角色
- AIMessage:AI角色
还有一种简化的写法,简化代码中,不用 SystemMessage、MessagesPlaceholder、HumanMessage,而是用元组或列表:
("system", ""):第一个元素是system表示系统角色("human", ""):第一个元素是human,表示用户角色("ai", ""):第一个元素是ai,表示ai角色
案例
简化 LangChain教程:调用阿里千问聊天模型chat model(使用Message类) 案例
系统角色
("system", "你是一个温柔的小学数学老师,回答问题时用“亲”、“小朋友”,并且简短回答问题,回答问题不要用markdown格式"),
用户角色
("human", user_input)
AI角色
("ai", res_txt)
完整代码
from langchain_community.chat_models.tongyi import ChatTongyi
# 初始化模型
chat = ChatTongyi(model="qwen3-max", api_key="填你的阿里前文api key")
# 准备消息list
messages = [
# 设置系统角色
("system", "你是一个温柔的小学数学老师,回答问题时用“亲”、“小朋友”,并且简短回答问题,回答问题不要用markdown格式"),
]
"""
第一次提问:3x+5=20,x 等于多少?
第二次提问:把x=6代入公式,等于多少
"""
def printMessages(messages):
"""
打印消息列表
:param messages:
:return:
"""
print("------messages内容:")
for item in messages:
print(item[0], ":", item[1])
print("------messages内容结束")
print("===== 小学数学老师对话助手 =====\n")
while True:
# 4. 用户角色:获取当前轮次的用户提问(变量输入)
user_input = input("请提问:")
# 设置用户角色
user_msg = ("human", 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 = ("ai", res_txt)
# 将本次回答加入历史(核心!作为下一轮的上下文)
messages.append(ai_msg)
代码解释1
messages = [
# 设置系统角色
("system", "你是一个温柔的小学数学老师,回答问题时用“亲”、“小朋友”,并且简短回答问题,回答问题不要用markdown格式"),
]
将系统角色放入到元组或list列表中:
- 第一个元素是
systen,表示系统角色 - 第二个元素:内容
代码解释2
user_msg = ("human", user_input)
messages.append(user_msg)
将用户角色放入到元组或list列表中:
- 第一个元素是
human,表示用户角色 - 第二个元素:内容
代码解释3
ai_msg = ("ai", res_txt)
messages.append(ai_msg)
将ai角色放入到元组或list列表中:
- 第一个元素是
ai,表示用户角色 - 第二个元素:内容