基于 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 时,历史消息是消息对象列表),否则会导致格式错误。

相关推荐
阳明山水2 小时前
销量预测2025—2026:从模型竞赛到系统融合的范式转型
人工智能·深度学习·算法·机器学习·架构
阿雄不会写代码2 小时前
【AI Agent】自学笔记
人工智能
克里斯蒂亚诺更新2 小时前
Transformer(注意力机制)不按顺序-全盘扫描
人工智能·深度学习·transformer
呆呆槑_Xiong2 小时前
国内GEO生成式引擎优化公司对比 2026
人工智能
Dawson Zhu2 小时前
大语言模型的本质:从条件概率预测到能力涌现的技术剖析
人工智能·语言模型·架构·aigc·agi
gzkuijing2 小时前
MDI1PRD23B7‑EQ|Novanta IMS一体化RS-485/422步进电机参数、选型要点与典型应用
人工智能·机器学习·编辑器
能源科技集2 小时前
不止于“大”:远景动力(AESC)790Ah电芯以系统级思维重塑储能技术路线
人工智能
骥龙2 小时前
模块五:n8n自动化工作流 + Ollama + Health-MCP
人工智能·ai编程
jonyleek2 小时前
工业物联网边缘计算架构设计:从数据采集到本地决策
人工智能·物联网·边缘计算·工业物联网·边缘网关·jvs物联网平台·iot架构
桐盛科技2 小时前
拒绝“漂绿”风险:基于边缘计算的碳排放数据清洗算法与实时校验逻辑
人工智能·算法·边缘计算