news 2026/7/26 11:21:59

LangChain实战:构建带记忆的智能对话系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LangChain实战:构建带记忆的智能对话系统

1. 基于LangChain实现带记忆的对话系统实战

在构建对话系统时,记忆功能是让AI对话更自然、更智能的关键要素。想象一下,如果你每次和客服对话都要重新说明问题背景,那体验会有多糟糕。今天我们就用Python+LangChain框架,结合开源大模型API,实现一个真正具备上下文记忆能力的对话系统。

这个方案的核心优势在于:

  • 使用轻量级内存存储对话历史,无需复杂数据库
  • 通过session_id实现多用户对话隔离
  • 完整保留对话上下文,让AI回复更连贯
  • 代码简洁但功能完整,适合快速集成到各类应用中

2. 环境准备与核心组件解析

2.1 基础环境配置

首先确保你的Python环境是3.8+版本,然后安装必要的依赖包:

pip install langchain-core langchain-openai

这里我们使用LangChain的核心组件而非全量安装,避免引入不必要的依赖。特别说明几个关键包的作用:

  • langchain-core:包含所有基础接口和运行机制
  • langchain-openai:提供与OpenAI兼容API的对接能力

2.2 核心组件选型解析

代码中出现的几个关键类需要特别理解:

from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage from langchain_core.runnables.history import RunnableWithMessageHistory from langchain_core.chat_history import BaseChatMessageHistory, InMemoryChatMessageHistory
  • ChatOpenAI:虽然是OpenAI的类名,但实际兼容所有遵循OpenAI API标准的服务
  • HumanMessage:标准化用户输入的消息格式
  • RunnableWithMessageHistory:为链式调用添加历史记录能力的装饰器
  • BaseChatMessageHistory:对话历史的抽象接口
  • InMemoryChatMessageHistory:内存实现的对话历史存储

提示:虽然使用内存存储简单快捷,但在生产环境中建议替换为持久化存储方案,我们会在后续章节详细讨论。

3. 模型初始化与记忆系统实现

3.1 大模型API配置

model = ChatOpenAI( model="Qwen/Qwen2.5-7B-Instruct", api_key=Key1, base_url="https://api.siliconflow.cn/v1" )

这里有几个关键参数需要注意:

  • model:指定使用的模型路径,这里用的是通义千问的开源模型
  • base_url:指向兼容OpenAI API的第三方服务端点
  • api_key:服务访问凭证(实际使用时应从环境变量读取)

3.2 记忆系统实现机制

记忆功能的核心是这段代码:

store = {} def get_session_history(session_id:str) ->BaseChatMessageHistory: if session_id not in store: store[session_id] = InMemoryChatMessageHistory() return store[session_id] bot = RunnableWithMessageHistory(model, get_session_history)

实现原理拆解:

  1. 使用Python字典store作为全局存储
  2. 每个session_id对应一个独立的历史记录实例
  3. RunnableWithMessageHistory将模型包装为支持历史记录的形式
  4. 每次对话时自动关联对应的历史记录

注意:这里的store是全局变量,在Web服务等多进程场景下需要改为线程安全实现。

4. 完整对话流程实现

4.1 主循环逻辑解析

def main(): print("已启动") session_id = "user_001" while True: user_input = input("\n human:") if user_input.lower() in ["quit", "exit"]: print("再见") break if not user_input.strip(): continue try: response = bot.invoke( [HumanMessage(content=user_input)], config={"configurable": {"session_id": session_id}} ) print(f"AI: {response.content}") except Exception as e: print(f"\n 出错了: {e}")

关键点说明:

  • 使用session_id区分不同对话场景(实际应用可改为用户ID)
  • 输入处理包含退出指令和空输入检查
  • bot.invoke调用时自动关联历史记录
  • 异常捕获确保对话不会意外终止

4.2 历史记录的工作机制

当第一次发送消息时:

  1. 系统创建新的InMemoryChatMessageHistory实例
  2. 将用户输入存储为HumanMessage
  3. 模型生成回复后存储为AIMessage

后续对话时:

  1. 自动加载该session的全部历史记录
  2. 新旧消息组合后发送给模型
  3. 模型基于完整上下文生成回复

5. 生产环境优化方案

5.1 持久化存储改造

内存存储简单但不适合生产环境,下面是改用Redis的实现:

from redis import Redis from langchain_community.chat_message_histories import RedisChatMessageHistory redis_client = Redis(host='localhost', port=6379) def get_redis_history(session_id: str) -> RedisChatMessageHistory: return RedisChatMessageHistory( session_id=session_id, url="redis://localhost:6379/0" ) bot = RunnableWithMessageHistory(model, get_redis_history)

优势对比:

  • 支持服务重启后历史记录不丢失
  • 天然支持分布式部署
  • 可通过TTL设置自动过期时间

5.2 性能优化技巧

  1. 历史记录截断
# 在调用模型前截断过长的历史 messages = history.messages[-10:] # 保留最近10条
  1. 异步调用优化
async def async_invoke(message): return await bot.ainvoke(...)
  1. 缓存策略: 对高频但内容相似的查询可添加缓存层

6. 常见问题与调试技巧

6.1 典型错误排查表

错误现象可能原因解决方案
模型不响应API密钥错误检查密钥和base_url
历史记录不生效session_id不一致确保每次调用使用相同ID
内存持续增长未清理历史记录实现定期清理机制
回复不连贯历史记录丢失检查存储实现是否正确

6.2 调试日志添加

在关键位置添加日志输出:

import logging logging.basicConfig(level=logging.INFO) def get_session_history(session_id: str): logging.info(f"Accessing history for session: {session_id}") # ...原有实现...

6.3 历史记录可视化

添加检查历史记录的函数:

def show_history(session_id: str): history = get_session_history(session_id) for msg in history.messages: print(f"{msg.type}: {msg.content}")

7. 扩展应用场景

这个基础框架可以轻松扩展更多功能:

  1. 多模态对话
from langchain_core.messages import ImageMessage messages = [ HumanMessage(content="描述这张图片"), ImageMessage(image_url="...") ]
  1. 工具调用集成
from langchain.tools import Tool weather_tool = Tool( name="get_weather", func=get_weather, description="查询天气" ) bot = model.bind_tools([weather_tool])
  1. 对话分析功能
from langchain.chains import LLMChain from langchain.prompts import ChatPromptTemplate analyzer_prompt = ChatPromptTemplate.from_template("分析对话情绪: {history}") analyzer_chain = LLMChain(llm=model, prompt=analyzer_prompt)

在实际项目中,我发现合理控制历史记录长度对保持对话质量至关重要。通常保留最近5-10轮对话效果最佳,太短会丢失上下文,太长则可能让模型混淆重点。另外,为不同session设置适当的过期时间(如30天无交互则清除)能有效控制存储空间占用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/26 11:21:07

大模型应用开发:从Demo到生产级交付的工程范式

大模型应用开发:从Demo到生产级交付的工程范式 2026年,大模型应用开发正在经历一场深刻的范式转变。AI Agent市场规模已突破420亿美元,年增速超过110%,但繁荣背后隐藏着一个令人不安的数据:73%的企业部署Agent是为了提…

作者头像 李华
网站建设 2026/7/26 11:20:35

如何快速配置ESLyric歌词源:面向新手的完整指南

如何快速配置ESLyric歌词源:面向新手的完整指南 【免费下载链接】ESLyric-LyricsSource Advanced lyrics source for ESLyric in foobar2000 项目地址: https://gitcode.com/gh_mirrors/es/ESLyric-LyricsSource ESLyric-LyricsSource是一款专为foobar2000播…

作者头像 李华
网站建设 2026/7/26 11:18:19

Python流域划分终极指南:用pysheds快速处理数字高程模型

Python流域划分终极指南:用pysheds快速处理数字高程模型 【免费下载链接】pysheds Simple and fast watershed delineation in python 项目地址: https://gitcode.com/gh_mirrors/py/pysheds 在水文分析和地理信息系统领域,流域划分是一个基础而重…

作者头像 李华
网站建设 2026/7/26 11:16:48

继续教育学生必备:9款AI降重工具实测与使用指南

1. 为什么继续教育学生需要AI降重工具?在继续教育领域,学术写作是每个学生必须面对的挑战。与全日制学生不同,继续教育学员往往需要兼顾工作、家庭和学习,时间碎片化严重。这种情况下,很容易在论文写作中陷入"借鉴…

作者头像 李华
网站建设 2026/7/26 11:16:27

SongGeneration:腾讯开源AI音乐生成工具让音乐创作更简单

SongGeneration:腾讯开源AI音乐生成工具让音乐创作更简单 【免费下载链接】SongGeneration 腾讯开源SongGeneration项目,基于LeVo架构实现高品质AI歌曲生成。它采用混合音轨与双轨并行建模技术,既能融合人声与伴奏达到和谐统一,也…

作者头像 李华
网站建设 2026/7/26 11:16:26

KMS_VL_ALL_AIO:3分钟免费激活Windows和Office的终极方案

KMS_VL_ALL_AIO:3分钟免费激活Windows和Office的终极方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活而烦恼吗?每次开机看到烦人的激活提醒&am…

作者头像 李华