当前位置: 首页 > news >正文

ChatBot 还能记住我是谁?深度解析对话系统中的记忆机制

网罗开发(小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!


文章目录

    • 摘要
    • 为什么“记忆”这么关键?
    • 如何实现短期记忆:Session Buffer
      • 构建一个带 Session 记忆的简单 ChatBot
    • 用户画像:让 Bot 记住你这个“人”
      • 示例代码:构建基础用户画像机制
    • 向量化记忆:让 ChatBot 拥有“长久记忆”
      • 示例代码:使用 FAISS 实现简单向量记忆检索
    • 应用场景举例
      • 场景1:客服机器人识别上下文
      • 场景2:教育类 ChatBot 记住学生知识盲区
      • 场景3:企业知识问答
    • QA 环节:常见问题答疑
    • 总结

摘要

很多人做 ChatBot,总感觉“对话像一问一答的客服机器人”,用户刚提到的话,下一句就忘了。我们明明已经告诉系统“我叫小明”,它却立马问“您贵姓?”——这就暴露了:没有记忆的对话系统,根本无法支持真正的多轮交互

这篇文章我们就来聊聊,如何通过 session buffer、embedding memory、用户画像等方式,搭建一个真正能“记住你说过什么”的 ChatBot。我们会结合可运行的 Python Demo,让每一段设计都能落地,同时分享多个实际场景中的使用方式。

为什么“记忆”这么关键?

传统的 ChatBot 模型一般都是单轮问答(Single-turn QA),每次用户提问都当作一个全新的问题来处理。比如你问“我昨天订的酒店有确认吗?”,如果模型不记得你昨天聊过酒店预订,它根本没法给出正确回答。

而像我们现在常见的 ChatGPT、小度小度这类多轮对话系统,都靠一种或多种“记忆机制”来维护上下文,才能让机器人像人一样“接得住话”。

本篇内容主要围绕这几种记忆实现方式:

  • 短期记忆(Session Buffer)
  • 用户画像(User Profile)
  • 向量化记忆(Embedding-based Memory)
  • 外部知识图谱辅助(Knowledge Graph)

如何实现短期记忆:Session Buffer

最简单的方式,就是把每一轮对话上下文缓存下来,在模型响应时统一送进去处理。这就叫 session buffer,适用于上下文长度不太长的场景。

构建一个带 Session 记忆的简单 ChatBot

我们用 transformerslangchain 搭个简单框架:

from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory# 初始化模型和记忆体
llm = ChatOpenAI(temperature=0)
memory = ConversationBufferMemory()# 创建会话链
conversation = ConversationChain(llm=llm,memory=memory,verbose=True
)# 模拟多轮对话
print(conversation.predict(input="我叫小明"))
print(conversation.predict(input="我几岁了?"))

输出:

你好,小明!
你没有告诉我你的年龄,你能说一下吗?

这个例子里,模型已经记住了“我叫小明”,并且能在下一轮对话里准确回应。

用户画像:让 Bot 记住你这个“人”

如果你希望 ChatBot 能记住“用户是谁”,比如姓名、年龄、兴趣爱好、VIP等级、历史偏好……就需要构建一个“用户画像”。

示例代码:构建基础用户画像机制

# 用户画像存储
user_profiles = {"user_123": {"name": "小明","age": 25,"interest": ["旅游", "烘焙"]}
}# 模拟用户输入
user_input = "你知道我喜欢干嘛吗?"
user_id = "user_123"# 提取用户画像补充上下文
profile_context = f"用户叫{user_profiles[user_id]['name']},兴趣是{user_profiles[user_id]['interest']}。"# 拼接对话输入
final_input = profile_context + user_input# 推理
response = conversation.predict(input=final_input)
print(response)

这样做之后,Bot 的回应就会更加贴合“你是谁”,不是每次都从零开始。

向量化记忆:让 ChatBot 拥有“长久记忆”

短期 session buffer 一旦关闭会话就会丢失,而 embedding memory 可以把历史对话编码成向量,存入向量数据库(如 FAISS、ChromaDB),在新问题进来时用相似度检索历史上下文片段。

示例代码:使用 FAISS 实现简单向量记忆检索

from langchain.vectorstores import FAISS
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.document_loaders import TextLoader# 初始化向量存储
embedding = OpenAIEmbeddings()
vector_store = FAISS(embedding_function=embedding)# 加入历史对话
vector_store.add_texts(["我叫小明", "我昨天预订了北京酒店", "我喜欢甜点"])# 查询相似内容
query = "我预订的酒店有消息吗?"
similar_docs = vector_store.similarity_search(query, k=2)print(similar_docs)

只要设计得当,就可以把几十轮聊天内容编码存储,并在之后随时调用回来。

应用场景举例

场景1:客服机器人识别上下文

用户一开始说“我账户出问题了”,接着说“对,就是那个绑定不了的问题”,如果没有上下文,这句根本没法理解。

实现方式:session buffer + 用户画像(识别是 VIP 客户)

场景2:教育类 ChatBot 记住学生知识盲区

学生每次错的知识点都记录下来,下次再考到类似问题,Bot 会自动提示。

实现方式:embedding memory + profile 结构化记录错题列表

场景3:企业知识问答

员工问“公司调休怎么申请”,Bot 检索员工手册文档中最相关的段落并返回。

实现方式:将文档转向量存入 FAISS 或 Chroma,使用 langchain 的 RetrievalQA 模式。

QA 环节:常见问题答疑

Q1:Session Buffer 会爆内存吗?

一般建议控制对话轮次,比如最多保留最近 10 轮,同时合并相邻对话。大模型上下文窗口有限,超过就会截断。

Q2:多个用户同时使用怎么区分上下文?

给每个用户 ID 建一个独立的 memory 实例,比如:

memory_map = defaultdict(ConversationBufferMemory)
conversation = ConversationChain(llm=llm, memory=memory_map[user_id])

Q3:Embedding memory 会失效吗?

会。尤其当用户表达变化很大时,相似度下降就查不到。但可以使用 hybrid search(关键词+向量)提高效果。

总结

一个真正“会聊天”的 ChatBot,离不开“记忆”。本文我们从最常用的三种方式:

  • 短期 Session Buffer(应对连续对话)
  • 用户画像系统(理解你是谁)
  • Embedding Memory(查找你说过的话)

配合 langchain 等工具链,可以低成本搭建多轮对话系统,并落地在实际项目中。不论你是做客服、教育、问答助手,只要你做对话系统,都值得尝试“加点记忆”。

http://www.dtcms.com/a/286213.html

相关文章:

  • 一文通晓25G多模光模块:SFP-25G-SR和SFP-25G-ESR的区别
  • 机器学习基础:线性回归算法详解(原理+代码+实战)
  • 视频讲解:XGBoost梯度提升树原理及用Python对房价等数据集多案例应用分析
  • 网络(TCP)
  • 百炼MCP与IoT实战(三):手搓自定义MCP Server与阿里云FC配置
  • CMU-15445(2024fall)——PROJECT#0
  • iOS 文件深度调试实战 查看用户文件 App 沙盒 系统文件与日志全指南
  • 【橘子分布式】gRPC(编程篇-上)
  • vue2 面试题及详细答案150道(91 - 100)
  • 人工智能概念之九:深度学习概述
  • kafka 单机部署指南(KRaft 版本)
  • 基于MATLAB的GA遗传算法优化BP神经网络的数据分类预测方法应用
  • 在ComfyUI中CLIP Text Encode (Prompt)和CLIPTextEncodeFlux的区别
  • docker gitlab 备份 恢复 版本升级(16.1.1到18.2.0)
  • SpringAI核心特性与Prompt工程
  • 六个直播回放的功能,助力在线教育蓬勃发展!
  • AR技术重塑电力巡检:效率提升与智能升级
  • Kubernetes (k8s)、Rancher 和 Podman 的异同点分析
  • 题解:CF1617C Paprika and Permutation
  • Redis学习其二(事务,SpringBoot整合,持久化RDB和AOF)
  • MySQL查询优化与事务实战指南
  • 【PTA数据结构 | C语言版】我爱背单词
  • 前端埋坑之element Ui 组件el-progress display:flex后不显示进度条解决方案
  • Java实战:实时聊天应用开发(附GitHub链接)
  • http性能测试命令ab
  • IntelliJ IDEA大括号格式设置:换行改行尾
  • Java 核心工具类 API 详解(一):从 Math 到 Runtime 的实用指南
  • 【AI News | 20250717】每日AI进展
  • 【解码文本世界的“隐形分界线”:Windows与Linux回车换行之谜】
  • 基于单片机智能充电器系统设计