衡水市网站建设_网站建设公司_服务器部署_seo优化
2026/1/22 2:07:34 网站建设 项目流程

Qwen3-1.7B多轮对话实现:LangChain记忆机制实战

1. Qwen3-1.7B 模型简介

Qwen3(千问3)是阿里巴巴集团于2025年4月29日开源的新一代通义千问大语言模型系列,涵盖6款密集模型和2款混合专家(MoE)架构模型,参数量从0.6B至235B。其中,Qwen3-1.7B 是该系列中的一款中等规模密集模型,兼顾推理速度与生成质量,特别适合部署在资源有限的边缘设备或开发环境中进行快速实验。

这款模型不仅支持标准文本生成任务,还具备较强的上下文理解能力,尤其适用于需要低延迟响应的交互式场景,如智能客服、个人助手、教育辅导等。得益于其轻量化设计,Qwen3-1.7B 可以在单张消费级显卡上高效运行,极大降低了开发者本地调试和原型验证的技术门槛。

更重要的是,Qwen3 系列全面支持开放调用接口,兼容 OpenAI 类协议,使得它能够无缝集成到主流 AI 开发框架中,比如 LangChain、LlamaIndex 等。这为构建具备记忆能力、工具调用能力和流程编排能力的复杂应用提供了坚实基础。


2. 环境准备与模型调用

2.1 启动镜像并进入 Jupyter 环境

要使用 Qwen3-1.7B 进行多轮对话开发,首先需要启动一个预置了模型服务和依赖库的容器镜像。CSDN 提供的一键式 GPU 镜像已内置 Qwen3 推理服务和 LangChain 支持环境,用户只需完成以下步骤即可快速上手:

  1. 登录 CSDN 星图平台,选择“Qwen3 全系列模型”镜像;
  2. 创建实例并等待初始化完成;
  3. 打开 Web 终端,确认服务是否正常启动;
  4. 启动 Jupyter Notebook 或 Lab,通过浏览器访问指定端口(通常是 8000);
  5. 新建 Python 脚本文件,开始编写代码。

此时,模型推理服务已在本地8000端口监听请求,可通过 HTTP 协议进行调用。

2.2 使用 LangChain 调用 Qwen3-1.7B

LangChain 是当前最流行的 LLM 应用开发框架之一,提供了统一的接口抽象,让不同来源的大模型可以像“插件”一样自由替换。由于 Qwen3 支持 OpenAI 兼容 API,我们可以直接使用langchain_openai模块中的ChatOpenAI类来调用它。

以下是具体的调用示例:

from langchain_openai import ChatOpenAI import os chat_model = ChatOpenAI( model="Qwen3-1.7B", temperature=0.5, base_url="https://gpu-pod69523bb78b8ef44ff14daa57-8000.web.gpu.csdn.net/v1", # 替换为当前 Jupyter 实例的实际地址 api_key="EMPTY", extra_body={ "enable_thinking": True, "return_reasoning": True, }, streaming=True, ) response = chat_model.invoke("你是谁?") print(response.content)

说明

  • base_url必须指向你当前运行的服务地址,并确保端口号为8000
  • api_key="EMPTY"表示无需认证,这是本地部署常见的配置;
  • extra_body中启用了“思维链”功能(Thinking Mode),允许模型返回中间推理过程,增强可解释性;
  • streaming=True开启流式输出,提升用户体验,尤其适合网页或聊天界面。

执行上述代码后,你会看到类似如下输出:

我是通义千问3(Qwen3),由阿里云研发的超大规模语言模型。我可以回答问题、创作文字、编程、表达观点等。

这表明模型已经成功加载并响应了你的第一条消息。


3. 实现多轮对话的关键:LangChain 记忆机制

虽然单次调用已经能完成基本问答,但真正的智能对话系统必须具备“记住历史”的能力。否则每次提问都像是第一次见面,无法维持连贯交流。

LangChain 提供了多种记忆管理组件,统称为Memory模块。我们可以通过这些模块自动保存和注入对话历史,从而实现自然的多轮交互。

3.1 对话缓冲记忆:ConversationBufferMemory

最简单的记忆方式是将所有过往对话内容拼接成一段文本,作为上下文传给模型。这种策略称为“对话缓冲”,对应ConversationBufferMemory类。

from langchain.memory import ConversationBufferMemory from langchain.chains import LLMChain from langchain.prompts import PromptTemplate # 定义提示模板 template = """你是一个友好的AI助手,请根据以下对话历史回答用户问题。 历史对话: {chat_history} 用户:{input} AI:""" prompt = PromptTemplate(input_variables=["chat_history", "input"], template=template) # 初始化记忆对象 memory = ConversationBufferMemory(memory_key="chat_history") # 构建带记忆的链 conversation_chain = LLMChain( llm=chat_model, prompt=prompt, memory=memory, verbose=True # 显示内部执行过程 ) # 第一轮对话 output1 = conversation_chain.invoke({"input": "你好,你能做什么?"}) print("AI:", output1["text"]) # 第二轮对话 output2 = conversation_chain.invoke({"input": "你能帮我写一篇关于春天的短文吗?"}) print("AI:", output2["text"])

在这个例子中,ConversationBufferMemory会自动记录每一次输入和输出,并在下次调用时填充到{chat_history}字段中。这样模型就能感知到之前的交流内容,做出更合理的回应。

3.2 更高效的记忆方式:ConversationSummaryBufferMemory

当对话轮数增多时,简单地拼接全部历史会导致上下文过长,增加计算负担甚至超出模型最大长度限制。为此,LangChain 提供了ConversationSummaryBufferMemory—— 它会用一个小模型对早期对话进行摘要,只保留关键信息。

from langchain.memory import ConversationSummaryBufferMemory summary_memory = ConversationSummaryBufferMemory( llm=chat_model, max_token_limit=512, # 控制总上下文长度 memory_key="short_memory" ) # 单独测试记忆更新 summary_memory.save_context({"input": "我喜欢看电影"}, {"output": "那你喜欢什么类型的电影呢?"}) summary_memory.save_context({"input": "我喜欢科幻片"}, {"output": "《星际穿越》是个不错的选择!"}) # 查看自动生成的摘要 print(summary_memory.load_memory_variables({}))

输出可能类似于:

{ "short_memory": "用户表示喜欢看电影,特别是科幻类;AI推荐了《星际穿越》作为观影建议。" }

这种方式既能保留语义核心,又能有效控制 token 消耗,非常适合长期对话场景。


4. 完整的多轮对话系统实现

结合前面的知识,我们可以搭建一个完整的、可持续对话的交互系统。

4.1 使用 RunnableWithMessageHistory 管理会话状态

为了更好地组织多用户、多会话的应用结构,LangChain 推荐使用RunnableWithMessageHistory配合内存存储(InMemoryStore)来管理多个独立的对话线程。

from langchain_core.runnables.history import RunnableWithMessageHistory from langchain_community.chat_message_histories import InMemoryChatMessageHistory from langchain_core.messages import HumanMessage, AIMessage def get_session_history(session_id: str): store = {} if session_id not in store: store[session_id] = InMemoryChatMessageHistory() return store[session_id] # 构建可记忆的 runnable with_message_history = RunnableWithMessageHistory( chat_model, get_session_history, input_messages_key="input", history_messages_key="history", ) # 模拟两次不同会话 config1 = {"configurable": {"session_id": "user_001"}} config2 = {"configurable": {"session_id": "user_002"}} # 用户1提问 response_a1 = with_message_history.invoke([HumanMessage(content="讲个笑话")], config=config1) print("User1 ->", response_a1.content) # 用户1继续提问 response_a2 = with_message_history.invoke([HumanMessage(content="再讲一个")], config=config1) print("User1 ->", response_a2.content) # 用户2提问(不受用户1影响) response_b1 = with_message_history.invoke([HumanMessage(content="你会唱歌吗?")], config=config2) print("User2 ->", response_b1.content)

这种方法天然支持多用户隔离,每个session_id对应独立的历史记录,非常适合构建 Web 聊天机器人或 API 服务。

4.2 添加用户友好交互循环

最后,封装一个简单的命令行交互循环,方便实时体验多轮对话效果:

print("🎙 已启动与 Qwen3-1.7B 的多轮对话(输入 'quit' 退出)\n") session_id = "default" while True: user_input = input("👤 你说:") if user_input.lower() in ['quit', 'exit']: print("👋 对话结束") break response = with_message_history.invoke( [HumanMessage(content=user_input)], config={"configurable": {"session_id": session_id}} ) print(f" AI:{response.content}\n")

运行后,你可以连续提问,例如:

👤 你说:你是谁? AI:我是通义千问3,阿里巴巴推出的大型语言模型…… 👤 你说:你能帮我学习Python吗? AI:当然可以!我可以教你基础语法、函数定义、面向对象编程等内容。你想从哪部分开始? 👤 你说:先讲讲列表吧。 AI:Python 中的列表是一种有序、可变的数据结构,用来存储多个元素……

整个过程中,AI 始终记得你们之前聊过的内容,实现了真正意义上的“上下文感知”。


5. 总结

本文带你完整实践了如何利用 LangChain 的记忆机制,实现基于 Qwen3-1.7B 的多轮对话系统。我们从最基础的模型调用入手,逐步引入对话历史管理、摘要压缩、会话隔离等高级特性,最终构建出一个具备真实交互能力的聊天应用。

回顾关键点:

  1. Qwen3-1.7B 是一款高性能、易部署的中型语言模型,适合本地开发与测试;
  2. 通过 OpenAI 兼容接口 + LangChain,可快速接入主流生态,无需额外封装;
  3. LangChain 的 Memory 模块是实现多轮对话的核心,包括缓冲记忆与摘要记忆两种主流策略;
  4. 使用RunnableWithMessageHistory可轻松管理多会话状态,为后续扩展为 Web 服务打下基础;
  5. 开启streamingthinking mode能显著提升交互体验和透明度

这套方案不仅适用于 Qwen3-1.7B,也可迁移到其他支持 RESTful 接口的大模型上,具有很强的通用性和工程价值。

如果你正在尝试打造自己的 AI 助手、客服机器人或教育陪练系统,那么今天学到的内容就是一个绝佳的起点。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询