黑马大模型RAG与Agent智能体实战教程LangChain提示词——11、RAG开发——LangChain调用聊天模型(三种聊天消息类型、ChatTongyi、ChatOllama)维护多轮对话历史
"""使用 LangChain 调用通义聊天模型(ChatTongyi)示例本示例演示如何使用 LangChain 的 ChatTongyi 进行多轮对话,包括:- SystemMessage:设置系统角色- HumanMessage:用户消息- AIMessage:AI 回复消息- 流式输出:实时显示模型生成的内容核心概念:- ChatTongyi:聊天模型,与 Tongyi LLM 不同,专门
教程:https://www.bilibili.com/video/BV1yjz5BLEoY
代码:https://github.com/shangxiang0907/HeiMa-AI-LLM-RAG-Agent-Dev
文章目录
RAG开发-08、LangChain调用聊天模型
三种聊天消息类型介绍(AIMessage、HumanMessage、SystemMessage)

演示单独使用HumanMessage

演示SystemMessage+HumanMessage

演示SystemMessage+HumanMessage+AIMessage

演示Langchain Ollama调用

→提示词:帮我根据图中内容,创建代码13,演示langchain调用聊天模型

←AI回复

13_LangChain_Tongyi_Chat_Model.py
"""
使用 LangChain 调用通义聊天模型(ChatTongyi)示例
本示例演示如何使用 LangChain 的 ChatTongyi 进行多轮对话,包括:
- SystemMessage:设置系统角色
- HumanMessage:用户消息
- AIMessage:AI 回复消息
- 流式输出:实时显示模型生成的内容
核心概念:
- ChatTongyi:聊天模型,与 Tongyi LLM 不同,专门用于对话场景
- SystemMessage:设置 AI 的角色和行为
- HumanMessage:用户输入的消息
- AIMessage:AI 的回复消息
- stream 方法:流式输出,逐段返回结果
在此基础上,我们做了以下增强:
- 使用 .env / 环境变量中读取 API Key
- 演示多轮对话场景
- 演示流式输出的实时效果
"""
import os
from dotenv import load_dotenv
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_core.messages import AIMessage, HumanMessage, SystemMessage
def init_chat_model() -> ChatTongyi:
"""
初始化 ChatTongyi 聊天模型实例。
优先从以下环境变量中读取密钥(依次回退):
- DASHSCOPE_API_KEY(阿里云官方推荐)
- API_KEY(与本项目其他示例保持兼容)
注意:使用 qwen3-max,这是聊天模型,适合对话场景
"""
load_dotenv()
# 兼容两种环境变量命名方式
api_key = os.getenv("DASHSCOPE_API_KEY") or os.getenv("API_KEY")
if not api_key:
raise ValueError(
"未找到 DASHSCOPE_API_KEY 或 API_KEY 环境变量,请先在 .env 或系统环境中配置后再运行。"
)
# LangChain 的 ChatTongyi 封装会自动从环境变量中读取 key,
# 这里设置一份到 DASHSCOPE_API_KEY,确保兼容性。
os.environ["DASHSCOPE_API_KEY"] = api_key
# 使用 qwen3-max 聊天模型
chat = ChatTongyi(model="qwen3-max")
return chat
def chat_with_system_message_demo(chat: ChatTongyi) -> None:
"""
演示使用 SystemMessage + HumanMessage + AIMessage 进行多轮对话。
这个示例展示了:
1. 通过 SystemMessage 设置 AI 的角色(边塞诗人)
2. 用户请求写一首唐诗
3. AI 回复一首示例诗
4. 用户要求按照上一首的格式再写一首
5. 使用流式输出显示 AI 的回复
"""
print("=" * 80)
print("【示例1】演示 SystemMessage + HumanMessage + AIMessage 多轮对话")
print("-" * 80)
# 准备消息列表
messages = [
SystemMessage(content="你是一名来自边塞的诗人"),
HumanMessage(content="给我写一首唐诗"),
AIMessage(content="锄禾日当午,汗滴禾下土,谁知盘中餐,粒粒皆辛苦。"),
HumanMessage(content="给予你上一首的格式,再来一首"),
]
print("消息列表:")
for i, msg in enumerate(messages, 1):
if isinstance(msg, SystemMessage):
print(f" {i}. [系统] {msg.content}")
elif isinstance(msg, HumanMessage):
print(f" {i}. [用户] {msg.content}")
elif isinstance(msg, AIMessage):
print(f" {i}. [AI] {msg.content}")
print("\n模型回复(流式输出):")
print("-" * 80)
# 流式输出
for chunk in chat.stream(input=messages):
print(chunk.content, end="", flush=True)
print("\n")
print("-" * 80)
print()
def simple_chat_demo(chat: ChatTongyi) -> None:
"""
演示简单的对话场景:只有 SystemMessage 和 HumanMessage。
"""
print("=" * 80)
print("【示例2】简单对话:SystemMessage + HumanMessage")
print("-" * 80)
messages = [
SystemMessage(content="你是一名专业的 Python 编程助手,擅长编写清晰、高效的代码。"),
HumanMessage(content="请用 Python 写一个计算斐波那契数列的函数,并给出使用示例。"),
]
print("消息列表:")
for i, msg in enumerate(messages, 1):
if isinstance(msg, SystemMessage):
print(f" {i}. [系统] {msg.content}")
elif isinstance(msg, HumanMessage):
print(f" {i}. [用户] {msg.content}")
print("\n模型回复(流式输出):")
print("-" * 80)
# 流式输出
for chunk in chat.stream(input=messages):
print(chunk.content, end="", flush=True)
print("\n")
print("-" * 80)
print()
def multi_turn_conversation_demo(chat: ChatTongyi) -> None:
"""
演示多轮对话:展示如何维护对话历史。
"""
print("=" * 80)
print("【示例3】多轮对话:维护对话历史")
print("-" * 80)
# 初始化对话历史
messages = [
SystemMessage(content="你是一个友好的聊天助手,喜欢用简洁、幽默的方式回答问题。"),
]
# 第一轮对话
print("--- 第一轮对话 ---")
user_msg_1 = HumanMessage(content="你好,请介绍一下你自己。")
messages.append(user_msg_1)
print(f"[用户] {user_msg_1.content}")
print("\n[AI] ", end="", flush=True)
ai_response_1 = ""
for chunk in chat.stream(input=messages):
ai_response_1 += chunk.content
print(chunk.content, end="", flush=True)
messages.append(AIMessage(content=ai_response_1))
print("\n")
# 第二轮对话
print("\n--- 第二轮对话 ---")
user_msg_2 = HumanMessage(content="你能帮我做什么?")
messages.append(user_msg_2)
print(f"[用户] {user_msg_2.content}")
print("\n[AI] ", end="", flush=True)
for chunk in chat.stream(input=messages):
print(chunk.content, end="", flush=True)
print("\n")
print("-" * 80)
print()
def main() -> None:
"""
主函数:演示如何使用 LangChain 调用通义聊天模型。
"""
print("=" * 80)
print("LangChain 通义聊天模型(ChatTongyi)示例")
print("=" * 80)
print()
chat = init_chat_model()
# 示例1:SystemMessage + HumanMessage + AIMessage 多轮对话
chat_with_system_message_demo(chat)
# 示例2:简单对话
simple_chat_demo(chat)
# 示例3:多轮对话维护历史
multi_turn_conversation_demo(chat)
print("=" * 80)
print("演示结束")
print("=" * 80)
if __name__ == "__main__":
main()
运行代码
python AI_LLM_RAG_Agent_Dev/13_LangChain_Tongyi_Chat_Model.py
运行结果:
================================================================================
LangChain 通义聊天模型(ChatTongyi)示例
================================================================================
================================================================================
【示例1】演示 SystemMessage + HumanMessage + AIMessage 多轮对话
--------------------------------------------------------------------------------
消息列表:
1. [系统] 你是一名来自边塞的诗人
2. [用户] 给我写一首唐诗
3. [AI] 锄禾日当午,汗滴禾下土,谁知盘中餐,粒粒皆辛苦。
4. [用户] 基于你上一首的格式,再来一首
模型回复(流式输出):
--------------------------------------------------------------------------------
烽火照边城,霜刃映寒星。
黄沙埋骨处,犹闻战马鸣。
(注:此诗沿用五言绝句体,以边塞意象续写——首句"烽火"呼应戍守,次句"霜刃"暗喻将士,后两句以黄沙埋骨与战马嘶鸣勾连生死苍茫,末句平仄转韵处藏有未尽悲声)
--------------------------------------------------------------------------------
================================================================================
【示例2】简单对话:SystemMessage + HumanMessage
--------------------------------------------------------------------------------
消息列表:
1. [系统] 你是一名专业的 Python 编程助手,擅长编写清晰、高效的代码。
2. [用户] 请用 Python 写一个简单函数。
模型回复(流式输出):
--------------------------------------------------------------------------------
当然!以下是一个简单的 Python 函数,它接收两个数字并返回它们的和:
def add_numbers(a, b):
"""
返回两个数字的和。
参数:
a (int 或 float): 第一个数字
b (int 或 float): 第二个数字
返回:
int 或 float: 两数之和
"""
return a + b
# 示例用法
result = add_numbers(3, 5)
print(result) # 输出: 8
如果你有其他具体需求(比如处理字符串、列表或其他功能),也可以告诉我,我可以为你定制一个函数!
--------------------------------------------------------------------------------
================================================================================
【示例3】多轮对话:维护对话历史
--------------------------------------------------------------------------------
--- 第一轮对话 ---
[用户] 你好,请简单介绍一下你自己。
[AI] 嘿!我是你的AI小伙伴,擅长用大白话解答问题,偶尔还会冒个冷幽默~
能帮你查资料、写故事、算数学,甚至陪你吐槽。不过别让我干坏事哈,我可是有原则的!
有什么想聊的或需要帮忙的?😄
--- 第二轮对话 ---
[用户] 你能帮我做什么?简单回答
[AI] 帮你查资料、写文案、解题目、出点子、改错字、讲笑话……
简单说:动脑的活,我来搭把手!😄
--------------------------------------------------------------------------------
================================================================================
演示结束
================================================================================
ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ
ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ ᅟᅠ
更多推荐


所有评论(0)