极客时间:用 FAISS、LangChain 和 Google Colab 模拟 LLM 的短期与长期记忆
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行! 订阅:https://rengongzhineng.io/
在一场技术实验中,我们在 Google Colab 上利用开源工具,演示了如何在不重新训练模型的前提下,为大型语言模型(LLM)添加“记忆”功能。通过集成 FAISS 向量检索、LangChain 工作流和 Sentence Transformers 嵌入模型,该系统实现了动态知识注入、模拟遗忘、处理记忆冲突以及时间偏好排序等行为。
🎯 实验目标
- 注入模型从未学过的事实(如:“狗狗 YoYo 喜欢胡萝卜”)
- 模拟“遗忘”机制
- 处理前后矛盾的信息(如:“YoYo 现在讨厌胡萝卜”)
- 实现“时间偏好”逻辑(更倾向于检索最近的信息)
🛠️ 技术配置:LangChain + FAISS + Sentence Transformers
系统构建过程如下:
pythonCopyEditfrom langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_core.documents import Document
import faiss
import numpy as np
import time# 加载嵌入模型
embedding_model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
print("Embedding model loaded.")# 创建 FAISS 索引
sample_embedding = embedding_model.embed_query("test")
dimension = np.array(sample_embedding).shape[0]
index = faiss.IndexFlatL2(dimension)
print("FAISS index initialized.")# 初始化 FAISS 向量存储
faiss_store = FAISS(embedding_model.embed_query, index, {}, {})
print("FAISS vector store initialized.")
🧠 添加记忆与查询记忆的函数
pythonCopyEdit# 添加记忆函数
def add_memory(text, reason):metadata = {'reason': reason, 'timestamp': time.time()}doc = Document(page_content=text, metadata=metadata)faiss_store.add_documents([doc])print(f"Added to memory: {text}")# 查询记忆函数
def retrieve_memory(query):retrieved_docs = faiss_store.similarity_search(query, k=1)if retrieved_docs:print(f"Retrieved: {retrieved_docs[0].page_content}")else:print("No relevant information found.")
🧪 实验部分:知识注入、遗忘、矛盾更新、时间偏好
1️⃣ 注入新知识
pythonCopyEditadd_memory("My dog's name is YoYo and he loves carrots.", "initial fact")
retrieve_memory("What does my dog love?")
输出结果:
vbnetCopyEditAdded to memory: My dog's name is YoYo and he loves carrots.
Retrieved: My dog's name is YoYo and he loves carrots.
📌 分析:系统成功存储并检索新事实,表明具备动态注入知识的能力。
2️⃣ 模拟遗忘机制
pythonCopyEdit# 清空 FAISS 索引
faiss_store.index.reset()
print("Memory cleared.")# 尝试再次检索
retrieve_memory("What does my dog love?")
输出结果:
pgsqlCopyEditMemory cleared.
No relevant information found.
📌 分析:通过清空向量索引,系统“遗忘”了原先的信息。
3️⃣ 处理前后矛盾的记忆更新
pythonCopyEditadd_memory("My dog's name is YoYo and he hates carrots.", "contradictory update")
retrieve_memory("What does my dog love?")
输出结果:
vbnetCopyEditAdded to memory: My dog's name is YoYo and he hates carrots.
Retrieved: My dog's name is YoYo and he hates carrots.
📌 分析:系统将新信息覆盖旧记忆,默认以“最近添加”为准,成功处理冲突。
4️⃣ 实现时间偏好(Recency Bias)
pythonCopyEditadd_memory("My dog's name is YoYo and he is indifferent to carrots.", "updated preference")
retrieve_memory("What does my dog feel about carrots?")
输出结果:
vbnetCopyEditAdded to memory: My dog's name is YoYo and he is indifferent to carrots.
Retrieved: My dog's name is YoYo and he is indifferent to carrots.
📌 分析:最新信息被成功检索,说明系统能根据时间排序优先返回更新内容。
📦 完整代码参考(含时间偏好查询与记忆清空)
pythonCopyEditimport time
from uuid import uuid4
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.docstore.in_memory import InMemoryDocstore
from langchain_core.documents import Document
import faiss
import numpy as np# 加载嵌入模型
embedding_model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
print("Loading embedding model...")# 初始化 FAISS 索引
dimension = np.array(embedding_model.embed_query("test")).shape[0]
index = faiss.IndexFlatL2(dimension)# 初始化文档存储
docstore = InMemoryDocstore()# 初始化索引到文档 ID 映射
index_to_docstore_id = {}# 创建 FAISS 向量存储
print("Initializing FAISS vector store...")
faiss_index = FAISS(embedding_function=embedding_model,index=index,docstore=docstore,index_to_docstore_id=index_to_docstore_id
)# 添加事实到记忆
def add_fact(fact_text, reason):print(f"\n Adding to memory: {fact_text}")metadata = {'reason': reason, 'timestamp': time.time()}doc = Document(page_content=fact_text, metadata=metadata)faiss_index.add_documents([doc])print(f"Fact added with metadata: {metadata}")# 查询记忆
def query_memory(query_text):print(f"\n Querying memory for: '{query_text}'")results = faiss_index.similarity_search(query_text, k=1)if results:top_result = results[0].page_contentprint(f" Retrieved: {top_result}")return top_resultelse:print("No relevant information found.")return None# 清除所有记忆
def clear_memory():print("\n Clearing memory...")faiss_index.index.reset()faiss_index.docstore = InMemoryDocstore()faiss_index.index_to_docstore_id = {}print("Memory cleared.")# 基于时间排序的查询
def query_with_recency(query_text):print(f"\n Querying with recency for: '{query_text}'")results = faiss_index.similarity_search(query_text, k=5)if not results:print("No relevant information found.")return Noneresults.sort(key=lambda x: x.metadata.get('timestamp', 0), reverse=True)top_result = results[0].page_contentprint(f"Retrieved (most recent): {top_result}")return top_result# 实验流程
add_fact("My dog's name is YoYo and he loves carrots.", reason="initial fact")
query_memory("What does my dog love?")
clear_memory()
query_memory("What does my dog love?")
add_fact("My dog's name is YoYo and he hates carrots.", reason="contradictory update")
query_memory("What does my dog love?")
add_fact("My dog's name is YoYo and he is indifferent to carrots.", reason="updated preference")
query_with_recency("What does my dog feel about carrots?")
📍 总结与未来展望
此次实验验证了在推理阶段通过外部记忆系统增强LLM能力的可行性,主要涵盖以下几点:
- ✅ 可即时注入新知识
- ✅ 能模拟“遗忘”行为
- ✅ 可处理信息矛盾
- ✅ 支持按时间优先级检索
🔭 后续优化建议
- 智能遗忘机制:引入时间衰减、容量限制或信息价值打分;
- 多版本记忆管理:保留多个版本并支持冲突检测;
- 混合排序策略:结合语义相似度与时间因素进行记忆排序;
- 扩展性提升:支持 Pinecone、Weaviate 等分布式向量存储;
- 与 LLM 提示融合:将检索出的记忆动态嵌入模型提示上下文;
- 构建结构化记忆体系:例如情节性、语义性与工作记忆等模块化架构。
本实验为理解和构建具“记忆力”的语言模型系统提供了重要起点。随着架构与逻辑不断优化,有望迈出通用型 AI 记忆系统的第一步。
相关文章:

极客时间:用 FAISS、LangChain 和 Google Colab 模拟 LLM 的短期与长期记忆
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

leetcode hot100刷题日记——35.子集
解答: 方法一:选or不选的dfs(输入视角) 思路:[1,2,3]的全部子集可以看成是对数组的每一位数字做选择。 eg.空集就是一个数字都不选,[1,2]就是1,2选,3不选。 class Solution { pub…...

MybatisPlus(含自定义SQL、@RequiredArgsConstructor、静态工具类Db)
大家在日常开发中应该能发现,单表的CRUD功能代码重复度很高,也没有什么难度。而这部分代码量往往比较大,开发起来比较费时。 因此,目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是…...
React 组件异常捕获机制详解
1. 错误边界(Error Boundaries)基础 在React应用开发中,组件异常的有效捕获对于保证应用稳定性至关重要。React提供了一种称为"错误边界"的机制,专门用于捕获和处理组件树中的JavaScript错误。 错误边界是React的一种…...

手眼标定:九点标定、十二点标定、OpenCV 手眼标定
因为一直使用6轴协作机器人,且主要应用是三维视觉,平常的手眼标定基本都是基于OpenCV来计算的,听说有九点标定和十二点标定,顺便了解下。 目录 1.九点标定1.1 基本原理1.2 关于最小二乘法1.3 具体示例 2.十二点标定3.OpenCV 手眼标…...

[总结]前端性能指标分析、性能监控与分析、Lighthouse性能评分分析
前端性能分析大全 前端性能优化 LightHouse性能评分 性能指标监控分析 浏览器加载资源的全过程性能指标分析 性能指标 在实现性能监控前,先了解Web Vitals涉及的常见的性能指标 Web Vitals 是由 Google 推出的网页用户体验衡量指标体系,旨在帮助开发者量…...

React-native的新架构
本文总结: 文章主要介绍了 React Native 的新架构,包括以下几个方面的内容:📱✨ 如何抹平 iOS 和 Android 样式差异,提升跨平台一致性; 分析了旧架构中存在的问题,如通信瓶颈、启动慢、维护复杂等&#x…...
【Android】MT6835 + MT6631 WiFi进入Meta模式出现WiFi_HQA_OpenAdapter failed
问题描述 WiFi进入Meta异常,出现WiFi_HQA_OpenAdapter failed [ 12.694501] mtk_wmtd_worker: [name:wlan_drv_gen4m_6835&][wlan][710]wlanProbeSuccessForLowLatency:(INIT INFO) LowLatency(ProbeOn) [ 12.699854] ccci_fsm: [name:ccci_md_all&][ccci1/fsm]M…...

Git 全平台安装指南:从 Linux 到 Windows 的详细教程
目录 一、Git 简介 二、Linux 系统安装指南 1、CentOS/RHEL 系统安装 2、Ubuntu/Debian 系统安装 3、Windows 系统安装 四、安装后配置(后面会详细讲解,现在了解即可) 五、视频教程参考 一、Git 简介 Git 是一个开源的分布式版本控制系…...

Tree 树形组件封装
整体思路 数据结构设计 使用递归的数据结构(TreeNode)表示树形数据每个节点包含id、name、可选的children数组和selected状态 状态管理 使用useState在组件内部维护树状态的副本通过deepCopyTreeData函数进行深拷贝,避免直接修改原始数据 核…...

AI书签管理工具开发全记录(五):后端服务搭建与API实现
文章目录 AI书签管理工具开发全记录(四):后端服务搭建与API实现前言 📝1. 后端框架选型 🛠️2. 项目结构优化 📁3. API路由设计 🧭分类管理书签管理 4. 数据模型定义 💾分类模型&…...

netTAP 100:在机器人技术中将 POWERLINK 转换为 EtherNet/IP
工业机器人服务专家 年轻的 More Robots 公司成立仅一年多,但其在许多应用领域的专业技术已受到广泛欢迎。这是因为More Robots提供 360 度全方位服务,包括从高品质工业机器人和协作机器人到咨询和培训。这包括推荐适合特定任务或应用的机器人࿰…...

多模态大语言模型arxiv论文略读(九十八)
Accelerating Pre-training of Multimodal LLMs via Chain-of-Sight ➡️ 论文标题:Accelerating Pre-training of Multimodal LLMs via Chain-of-Sight ➡️ 论文作者:Ziyuan Huang, Kaixiang Ji, Biao Gong, Zhiwu Qing, Qinglong Zhang, Kecheng Zhe…...

EXCEL--累加,获取大于某个值的第一个数
一、函数 LET(data,A1:A5,cumSum,SCAN(0,data,LAMBDA(a,b,ab)),idx,MATCH(TRUE,cumSum>C1,0),INDEX(data,idx)) 二、函数拆解 1、LET函数:LET(name1, value1, [name2, value2, ...], calculation) name1, name2...:自定义的变量名(需以字…...
【vscode】切换英文字母大小写快捷键如何配置
按 ⌘(Command) Shift P 打开命令面板搜索 "Transform to Uppercase" 或 "Transform to Lowercase" 点击Transform to Uppercase 命令后的齿轮图标 进入设置页面 然后就可以进行配置了 比如我是mac电脑, 切换大写可以配置为 shift alt…...
vue笔记-路由
文章目录 createWebHistory的使用router-linkrouter-link颜色是黑色,正常应该是蓝色router-link 跳转了但是不展示 其他 vue这个题目还是太大,路由单独拆出来。 createWebHistory的使用 推荐在vue-router4中使用。 1、导入。 import { createRouter, c…...

本地部署 DeepSeek R1(最新)【从下载、安装、使用和调用一条龙服务】
文章目录 一、安装 Ollama1.1 下载1.2 安装 二、下载 DeepSeek 模型三、使用 DeepSeek3.1 在命令行环境中使用3.2 在第三方软件中使用 一、安装 Ollama 1.1 下载 官方网址:Ollama 官网下载很慢,甚至出现了下载完显示 无法下载,需要授权 目…...
域名解析怎么查询?有哪些域名解析查询方式?
在互联网的世界里,域名就像是我们日常生活中的门牌号,帮助我们快速定位到想要访问的网站。而域名解析则是将这个易记的域名转换为计算机能够识别的IP地址的关键过程。当我们想要了解一个网站的域名解析情况,或者排查网络问题时,掌…...

win主机如何结束正在执行的任务进程并重启
最近遇到一个问题,一个java入库程序经常在运行了几个小时之后消息无法入库,由于已经没有研发人员来维护这个程序了,故此只能每隔一段时间来重启这个程序以保证一直有消息入库。 但是谁也不能保证一直有人去看这个程序,并且晚上也不…...

maven中的maven-resources-plugin插件详解
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 一、插件定位与核心功能 maven-resources-plugin是Maven构建工具的核心插件之一,主要用于处理项目中的资源文件(如…...

ROS云课基础篇-01-Linux-250529
ROS云课基础篇收到了很多反馈,正面评价比例高,还有很多朋友反馈需要写更具体一点。 ROS云课基础篇极简复习-C、工具、导航、巡逻一次走完-CSDN博客 于是,有了这篇以及之后的案例,案例均已经测试过8年,但没有在博客公…...
通俗易懂解析:@ComponentScan 与 @MapperScan 的异同与用法
在 Spring 和 MyBatis 集成开发中,ComponentScan 和 MapperScan 是两个核心注解,但它们的用途和工作机制截然不同。本文将通过通俗的语言和示例代码,带您轻松掌握它们的区别和使用方法。 一、基础概念 ComponentScan:Spring 的“通…...

深入了解 C# 异步编程库 AsyncEx
在现代应用程序开发中,异步编程已经成为提升性能和响应能力的关键,尤其在处理网络请求、I/O 操作和其他耗时任务时,异步编程可以有效避免阻塞主线程,提升程序的响应速度和并发处理能力。C# 提供了内建的异步编程支持(通…...
NodeJS全栈开发面试题讲解——P1Node.js 基础与核心机制
✅ 1.1 Node.js 的事件循环原理?如何处理异步操作? 面试官您好,我理解事件循环是 Node.js 的异步非阻塞编程核心。 Node.js 构建在 V8 引擎与 libuv 库之上。虽然 Node.js 是单线程模型,但它通过事件循环(event loop&a…...

Vulhub靶场搭建(Ubuntu)
前言:Vulhub 是一个开源的漏洞靶场平台,全称是 Vulhub: Vulnerable Web Application Environments,主要用于学习和复现各类 Web 安全漏洞。它的核心特征是通过 Docker 环境快速搭建出带有特定漏洞的靶场系统,适合渗透测试学习者、…...

C++:参数传递方法(Parameter Passing Methods)
目录 1. 值传递(Pass by Value) 2. 地址传递(Pass by Address) 3. 引用传递(Pass by Reference) 数组作为函数参数(Array as Parameter) 数组作为函数返回值 什么是函数ÿ…...

大语言模型的推理能力
2025年,各种会推理的AI模型如雨后春笋般涌现,比如ChatGPT o1/o3/o4、DeepSeek r1、Gemini 2 Flash Thinking、Claude 3.7 Sonnet (Extended Thinking)。 对于工程上一些问题比如复杂的自然语言转sql,我们可能忍受模型的得到正确答案需要更多…...
基于BERT和GPT2的实现来理解Transformer的结构和原理
Transformer 核心就是编码器和解码器,简单理解:编码器就是特征提取,解码器就是特征还原。 Transformer 完整架构 Transformer最初是一个Encoder-Decoder架构,用于机器翻译任务: 输入序列 → [Encoder] → 编码表示…...
.net consul服务注册与发现
.NET中Consul服务注册与发现的技术实践 在微服务架构中,服务的注册与发现是至关重要的环节,它能帮助各个服务之间实现高效的通信和协作。Consul作为一款功能强大的工具,为我们提供了优秀的服务注册与发现解决方案。今天,我们就来…...
WifiEspNow库函数详解
WifiEspNow库 项目地址https://github.com/yoursunny/WifiEspNow WifiEspNow 是 ESP-NOW 的 Arduino 库,ESP-NOW 是乐鑫定义的无连接 WiFi 通信协议。 有关 ESP-NOW 工作原理及其限制的更多信息,请参阅 ESP-NOW 参考。 WifiEspNow是 ESP-IDF 中 ESP-N…...