一、前言

  • 上下文记忆(Contextual Memory)解决方案的作用:
    • 提升 AI(尤其是大语言模型,LLM)的对话连贯性个性化
  • 本文将介绍几个主流的实现方式。

二、🧠 什么是上下文记忆?

  • 在对话系统中,上下文记忆的目标是让模型记住:
    • 你过去说过什么(对话历史
    • 你的一些偏好/背景(长期记忆
    • 你最近的意图(短期记忆

三、✅ 实现方案一:对话历史拼接(最基础)

描述:将所有之前的对话作为 prompt 的一部分,一起传给模型。
示例:
history = [{"role": "user", "content": "我叫小明"},{"role": "assistant", "content": "你好,小明"},{"role": "user", "content": "我喜欢篮球"}
]
new_input = {"role": "user", "content": "我最喜欢的球星是谁?"}messages = history + [new_input]
response = llm.chat(messages=messages)
缺点:token长度易爆;对长时间记忆力弱。

四、✅ 实现方案二:嵌入向量 + 检索记忆(RAG + Memory)

描述:
  • 将用户历史对话或知识用向量化方式存入向量数据库
  • 后续查询时根据当前问题检索“相关记忆”,再加到 prompt 里。
结构:
当前用户输入 → 嵌入查询 → 找相关记忆 → 构造 prompt → LLM回答
示例步骤:
  • 1.用户说:“我住在北京”
  • 2.你将这句话嵌入并存入向量库(如 Weaviate)
  • 3.用户说:“最近北京天气咋样?”
  • 4.向量检索出“我住在北京”这一记忆,构造 prompt:
记忆:你住在北京
问题:最近北京天气咋样?

五、✅ 实现方案三:显式记忆管理框架(如 mem0 / LangChain)

描述:使用专门的“记忆管理器”
  • 自动保存每轮对话为 memory
  • 检索、插入相关 memory
  • 支持短期、长期、多用户等场景
示例:伪代码
memory = Memory()
memory.add(messages, user_id="user1")# 下一轮输入
relevant_memory = memory.search("北京天气")
prompt = format_prompt(relevant_memory, user_input)
response = llm.call(prompt)

六、✅ Demo:简单聊天机器人,带上下文记忆

1,技术栈:Python、OpenAI、Mem0(上下文记忆实现框架)
2.📦 安装依赖(确保你安装了 mem0 和 openai):
pip install mem0 openai
  • (⚠️ 注意:mem0 目前默认支持 OpenAI,你可以手动适配 DashScope 等其他 LLM)
3.📁 文件:mem0_chat_demo.py
from mem0 import Memory
import openai
import os# ✅ 设置 API key
openai.api_key = os.getenv("OPENAI_API_KEY") or "sk-xxx"  # 替换为你的 OpenAI Key# ✅ 初始化 memory 管理器(默认使用 OpenAI Chat 和 Embedding)
memory = Memory()# ✅ 聊天方法:结合历史记忆生成回复
def chat_with_memory(user_input, user_id="user1"):# 1️⃣ 检索相关历史记忆(最近与本轮问题相似的历史记录)relevant = memory.search(user_input, user_id=user_id)memories_str = "\n".join([f"- {r['memory']}" for r in relevant["results"]])# 2️⃣ 构造提示词 prompt:加入历史“记忆”+当前输入system_prompt = f"""
你是一个有记忆的智能助手,请根据以下用户记忆回答问题:
用户记忆:
{memories_str}
"""messages = [{"role": "system", "content": system_prompt.strip()},{"role": "user", "content": user_input}]# 3️⃣ 向 LLM 发起请求response = openai.ChatCompletion.create(model="gpt-3.5-turbo",messages=messages)answer = response.choices[0].message.content# 4️⃣ 添加对话内容进 memorymessages.append({"role": "assistant", "content": answer})memory.add(messages, user_id=user_id)return answer# ✅ 启动交互
if __name__ == "__main__":print("开始对话(输入 'exit' 退出)")while True:user_input = input("你:")if user_input.lower() == "exit":breakreply = chat_with_memory(user_input)print(f"AI:{reply}")
4.🔍 Demo 解读
  • (1)✳️ 上下文记忆体现在哪?
    • 使用 memory.search(user_input) 从过往对话中检索与当前输入 最相关的内容
    • 使用 memory.add(messages) 保存本轮的对话内容
    • 模型不仅根据当前提问回答,还会利用“过去的你说过的话”,这就是“记忆”
  • (2)🔁 示例对话:
你:我喜欢篮球
AI:好的,我记住了你喜欢篮球。
你:我最喜欢的球星是谁?
AI:你可能最喜欢的球星是篮球相关的,例如科比或詹姆斯。tag: 即使你没说球星是谁,模型可以结合“你喜欢篮球”的历史信息做推理。
  • (3)✳️ 提示词 Prompt 如何构建的?
你是一个有记忆的智能助手,请根据以下用户记忆回答问题:
用户记忆:
- 我喜欢篮球
- 我的城市是北京
  • 这种方式称为:增强提示词(prompt augmentation)
  • 通过把 memory 拼接进 prompt,引导模型在更具上下文的条件下回答问题。
小总结
要素实现方式
记忆存储memory.add(messages)
记忆检索memory.search(user_input)
提示词构建把相关记忆拼接进 system prompt
LLM 响应生成用拼接后的 prompt 交给 OpenAI 的 Chat 模型处理

七、方案选择建议 / 总结

适用场景方案
简单对话拼接历史 messages
长对话、知识 Q&A向量数据库 + RAG
多用户、多记忆管理mem0 / LangChain Memory
  • 上下文记忆实现本质是解决 模型无法长期记忆的问题,常见方法包括:
    • Prompt 拼接
    • 向量数据库检索(RAG)
    • 显式框架(如 mem0, LangChain Memory)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/81919.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/81919.shtml
英文地址,请注明出处:http://en.pswp.cn/web/81919.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C/C++ 面试复习笔记(2)

C语言如何实现快速排序算法? 答案:快排是一种分治算法,选择一个基准元素,将数据划分成两部分,然后递归排序 补充: void quick_sort(int arr[], int start, int end) {//判断是否需要排序if (start > …

2025吉林CCPC 题解(前六题)

// Problem: J - Odd-Even Game // Contest: Virtual Judge - sdccpc20250527 // URL: https://vjudge.net/contest/719585#problem/J // Memory Limit: 1024 MB // Time Limit: 1000 ms // 签到题 // Powered by CP Editor (https://cpeditor.org)#include <bits/std…

Q: dify知识库模块主要库表和字段

【回到目录】~~~~【回到问题集】 Q: dify知识库模块主要库表和字段 A: 表1&#xff1a;datasets 知识库表 name 知识库名称 index_struct 向量索引node 表2&#xff1a;document 文档表 name 文档名称 word_count 字数 doc_form 分段类型(hierarchical_model、qa_model、te…

NodeMediaEdge快速上手

NodeMediaEdge快速上手 简介 NodeMediaEdge是一款部署在监控摄像机网络前端中&#xff0c;拉取Onvif或者rtsp/rtmp/http视频流并使用rtmp/kmp推送到公网流媒体服务器的工具。 通过云平台协议注册到NodeMediaServer后&#xff0c;可以同NodeMediaServer结合使用。使用图形化的…

通用前端框架项目静态部署到Hugging Face Space的实践指南

背景介绍 在轻量级展示前端项目的场景中,Hugging Face Space 提供了一个便捷的静态托管平台。需求是将无后端服务的Vite的 Vue项目部署到Hugging Face Space 上。其实无论是基于Vite的Vue/React项目,还是使用Webpack构建的工程化方案,都可以通过两种方式将其部署到Space:自…

Android studio 查看aar源码出现/* compiled code */

如图查看aar源码时看不到具体实现&#xff0c;在排除是sdk版本导致的问题后&#xff0c;下面说解决方法 打开设置&#xff0c;找到插件 输入decompiler 搜索 这个是自带的反编译工具&#xff0c;启用就好了

Spark实时流数据处理实例(SparkStreaming通话记录消息处理)

所用资源&#xff1a; 通过网盘分享的文件&#xff1a;spark-streaming-kafka-0-8-assembly_2.11-2.4.8.jar等4个文件 链接: https://pan.baidu.com/s/1zYHu29tLgDvS_L2Ud-22ZA?pwdhnpg 提取码: hnpg 1.需求分析 &#xff1a; 假定有一个手机通信计费系统&#xff0c;用户通…

Vue3处理number输入框避免NaN

在 Vue3 中处理 number 类型输入框避免显示 NaN&#xff0c;核心在于正确处理用户输入的非数字值。以下是几种解决方案&#xff1a; 方案1&#xff1a;使用字符串中转 计算属性&#xff08;推荐&#xff09; vue 复制 下载 <template><input v-model"input…

Python自动化之selenium语句——浏览器设置显示尺寸、截图、刷新网页

目录 一、浏览器设置最大化、最小化 1.浏览器最大化 2.浏览器最小化 二、浏览器打开的位置、尺寸 1.浏览器打开位置 2.浏览器打开尺寸 三、浏览器截图 1.截图语句 2.运行成功后查看 四、刷新网页 上一节实现了打开浏览器、打开指定网址、关闭浏览器的操作&#xff0c…

model.classifier:分类头

model.classifier:分类头 分类头(model.classifier)含义 在基于Transformer架构的模型(如BERT、GPT等 )用于分类任务时,“分类头(model.classifier)” 是模型的一个重要组成部分。以Hugging Face的Transformers库为例,许多预训练模型在完成通用的预训练任务(如语言…

4.1.2 操作数据集

在本实战中&#xff0c;我们深入学习了Spark SQL的操作数据集&#xff0c;包括了解Spark会话、准备数据文件、启动Spark Shell以及获取和操作学生数据集。通过Spark Shell&#xff0c;我们可以直接使用SparkSession实例来加载、转换和处理数据。我们学习了如何将文本文件加载为…

LangChain整合Milvus向量数据库实战:数据新增与删除操作

导读&#xff1a;在AI应用开发中&#xff0c;向量数据库已成为处理大规模语义搜索和相似性匹配的核心组件。本文通过详实的代码示例&#xff0c;深入探讨LangChain框架与Milvus向量数据库的集成实践&#xff0c;为开发者提供生产级别的向量数据管理解决方案。 文章聚焦于向量数…

从根源解决Augment免费额度限制问题:Windows详细教程

从根源解决Augment免费额度限制问题&#xff1a;Windows详细教程 本文将详细介绍如何在Windows系统上解决Augment AI助手的"Too many free trials"限制问题&#xff0c;通过清理VS Code缓存和修改设备ID实现无限制使用Augment的方法。 视频地址 augment从根源上解决免…

IoTDB 集成 DBeaver,简易操作实现时序数据清晰管理

数据结构一目了然&#xff0c;跨库分析轻松实现&#xff0c;方便 IoTDB “内部构造”管理&#xff01; 随着物联网场景对时序数据处理需求激增&#xff0c;时序数据库与数据库管理工具的集成尤为关键。作为数据资产的 “智能管家”&#xff0c;借助数据库管理工具的可视化操作界…

应用层协议http(无代码版)

目录 认识URL urlencode 和 urldecode HTTP 协议请求与响应格式 HTTP 的请求方法 GET 方法 POST 方法 HTTP 的状态码 HTTP 常见 Header Location 关于 connection 报头 HTTP版本 远程连接服务器工具 setsockopt 我们来学习应用层协议http。 虽然我们说, 应用层协…

Cangjie 中的值类型与引用类型

1. 值类型和引用类型 1.1 值的存储方式 所有变量在底层实现中&#xff0c;都会关联一个具体的“值”&#xff0c;这个值可能存储在 内存地址 或 寄存器 中。 寄存器用于优化常用变量的访问速度。只有局部、小、频繁使用的变量才更可能被分配到寄存器中。实际行为由编译器根据…

使用el-input数字校验,输入汉字之后校验取消不掉

先说说复现方式 本来input是只能输入数字的&#xff0c;然后你不小心输入了汉字&#xff0c;触发校验了&#xff0c;然后这时候&#xff0c;你发现校验取消不掉了 就这样了 咋办啊&#xff0c;你一看校验没错啊&#xff0c;各种number啥的也写了,发现没问题啊 <el-inputv…

使用 Zabbix 监控 MySQL 存储空间和性能指标的完整实践指南

目录 引言 一、最终目标支持功能 二、监控方案设计 2.1 技术选型 2.2 设计思路 三、实现步骤 3.1 准备工作 3.11 创建 MySQL 监控账号 3.12 配置 .my.cnf 文件 3.2 编写统一脚本 3.3 配置 Zabbix Agent UserParameter 3.4 Zabbix 前端配置建议 四、总结 引言 MySQL …

多元素纳米颗粒:开启能源催化新纪元

在能源转型的浪潮中&#xff0c;纳米催化剂正成为推动能源技术突破的关键力量。多元素纳米颗粒&#xff08;Polyelemental Nanoparticles&#xff09;凭借其独特的元素协同效应&#xff0c;展现出在能源催化领域的巨大潜力。然而&#xff0c;合成这些复杂体系的纳米颗粒面临着诸…

铁路行业数字化应用建设方案

数字化转型面临的挑战 铁路行业正处于数字化转型的关键时期&#xff0c;铁路行业应用场景复杂&#xff0c;数据量巨大&#xff0c;传统信息化建设模式难以满足日益增长的业务需求。铁路企业亟需引入敏捷高效的数字化工具&#xff0c;加速推进业务创新&#xff0c;实现提质增效…