基于 LangChain 实现带记忆功能的智能对话

在 AI 应用开发中,对话记忆是提升用户体验的核心能力之一 ------ 让 AI 能够记住上下文、理解用户过往的对话内容,才能实现真正的 "多轮智能对话"。本文将基于 LangChain 框架,结合阿里云通义千问模型,手把手教你实现一个具备完整对话记忆功能的 AI 助手。

一、技术原理与依赖库

1.1核心依赖库说明

  • LangChain:一站式 LLM 应用开发框架,提供了对话记忆、提示词模板、模型调用等开箱即用的工具,是构建对话系统的核心。

  • LangChain-OpenAI:LangChain 适配 OpenAI API 规范的模型调用模块,可兼容阿里云通义千问(通过兼容模式)。

  • OpenAI SDK:基础的 API 调用工具,本文中主要用于对比展示,核心对话逻辑仍基于 LangChain 实现。

1.2 对话记忆的核心逻辑

对话记忆的本质是存储用户与 AI 的历史交互内容,并在每次新对话时将历史内容传入模型,让模型基于完整上下文生成回复。本文使用ConversationBufferMemory(对话缓冲记忆),它会按顺序存储所有对话内容,是最基础且易理解的记忆组件。

二、完整代码实现

2.1初始化配置

配置模型密钥、基础 URL(适配阿里云通义千问),并初始化模型和记忆组件:

python 复制代码
from langchain.memory import ConversationBufferMemory
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_openai import ChatOpenAI

# 1. 初始化ChatOpenAI模型(适配通义千问)
model = ChatOpenAI(
    model="qwen3.5-plus",  # 通义千问3.5版本
    api_key="sk-8a107f8b6d8a48b0a19bca255554484a",  # 替换为你的API Key
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",  # 阿里云兼容模式地址
    temperature=1.2,  # 生成随机性,值越大越灵活
    max_tokens=100    # 最大生成token数
)

# 2. 初始化对话记忆组件
# return_messages=True:以消息对象列表形式存储(推荐),False则存储为字符串
memory = ConversationBufferMemory(return_messages=True)

2.2手动存储历史对话(基础演示)

先手动存入两轮对话,验证记忆组件的存储功能:

python 复制代码
# 存储第一轮对话:用户告知名字
memory.save_context(
    {"input": "我的名字是陆天宇"},  # 用户输入
    {"output": "你好,陆天宇"}     # AI输出
)

# 存储第二轮对话:用户告知所在学院
memory.save_context(
    {"input": "我在兰智数模学院"},
    {"output": "好的,我记住了"}
)

# 查看已存储的历史对话
print("当前记忆内容:", memory.load_memory_variables({}))

2.4 构建带记忆的提示词模板

提示词模板是连接历史记忆和新对话的关键,通过MessagesPlaceholder预留历史消息位置:

复制代码
# 构建提示词模板
prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "你是一个AI助手,必须基于历史对话回答问题。"),  # 系统角色
        MessagesPlaceholder(variable_name="history"),  # 历史消息占位符
        ("human", "{user_input}")  # 新的用户输入占位符
    ]
)

2.5 构建对话链并实现多轮交互

将提示词模板与模型串联成 "对话链",实现带记忆的智能回复:

复制代码
# 构建对话链:提示词模板 → 模型
chain = prompt | model

# 第一轮交互:询问名字(验证记忆)
user_input = "你知道我的名字吗?"
# 加载历史记忆
history = memory.load_memory_variables({})["history"]
# 调用模型生成回复
result = chain.invoke({
    "user_input": user_input,
    "history": history
})
# 存储本轮对话到记忆中
memory.save_context({"input": user_input}, {"output": result.content})
print(f"AI回复:{result.content}")

# 第二轮交互:询问上一个问题(验证上下文理解)
user_input = "根据对话历史告诉我,我上一个问题问你的是什么?请重复一遍"
history = memory.load_memory_variables({})["history"]
result = chain.invoke({
    "user_input": user_input,
    "history": history
})
print(f"AI回复:{result.content}")

核心代码解析

  • ConversationBufferMemory:

    • load_memory_variables({}):加载所有历史对话,返回字典(key 为 "history")。

    • save_context(inputs, outputs):存储单轮对话,inputs 是用户输入字典,outputs 是 AI 输出字典。

  • MessagesPlaceholder:必须与记忆组件的输出格式匹配(return_messages=True 时,历史消息是消息对象列表),否则会导致格式错误。

相关推荐
哥本哈士奇14 小时前
LangChain Deepagent 版本0.6.1中间件一个bug
中间件·langchain·bug
萤萤七悬14 小时前
基于本地模型yolov11识别广告关闭按钮
人工智能·airtest·poco
醒李14 小时前
盲人出行辅助系统原型
人工智能·python·目标检测
惊鸿一博14 小时前
Transformer模型图解(简单易懂版)
人工智能·深度学习·transformer
黎阳之光14 小时前
视听融合新范式!黎阳之光打破视觉边界,声影协同赋能全域智慧管控
大数据·人工智能·物联网·算法·数字孪生
Ian在掘金14 小时前
SSE 还是 WebSocket?从 AI 流式输出聊到实时通信选型
前端·人工智能
雨雨雨雨雨别下啦14 小时前
心理健康AI助手 - 项目总结
前端·javascript·vue.js·人工智能·信息可视化
PILIPALAPENG15 小时前
第4周 Day 3:多 Agent 协作——让 Agent 们"组队干活"
前端·人工智能·python
AI绘画哇哒哒15 小时前
Agent三种思考模式深度解析:CoT/ReAct/Plan-and-Execute,小白程序员必看,助你轻松掌握大模型精髓(收藏版)
人工智能·学习·ai·程序员·大模型·产品经理·转行
塔能物联运维15 小时前
存量机房降本增效:两相液冷技术解锁全生命周期成本优化密码
大数据·人工智能