记忆网络:为AI Agent构建长期记忆体
记忆网络:为AI Agent构建长期记忆体
一、引言
钩子
你有没有过这样的经历:上周你刚跟自己的AI助理说过你对芒果过敏、养了一只叫年糕的3岁银渐层、国庆要去杭州参加AI开发者大会,这周再问它“国庆出行我要注意什么”,它给你的建议里赫然写着“可以尝尝当地特色芒果糯米饭”?你愤怒地提醒它你芒果过敏,它才连忙道歉,但下一次你问“我家猫多大了”,它又会一脸茫然地反问你“你养的是什么猫呀?”。
这不是AI傻,而是它根本记不住。当前绝大多数的大模型应用都只有“临时记忆”:所有的交互内容只存在于当前会话的上下文窗口里,一旦会话关闭、或者上下文长度超过模型窗口阈值,之前的内容就会被彻底丢弃,仿佛从未发生过。
定义问题/阐述背景
随着AI Agent的落地场景越来越广:从个人生产力助理、企业智能客服,到游戏NPC、工业巡检Agent、自动驾驶决策助手,长期记忆能力已经成为AI Agent从“玩具”走向“实用”的核心瓶颈。
我们可以算一笔账:即使是目前上下文窗口最大的GPT-4 Turbo(128K Tokens,约等于9万字),也只能存储一个普通用户不到1个月的日常交互内容;如果是企业级的客服Agent,需要存储数十万用户的历史咨询、偏好、订单数据,128K的窗口连一个用户一年的交互记录都存不下。更不要说大模型的参数记忆更新成本极高:每次微调都要耗费数万甚至数十万的算力成本,还会出现灾难性遗忘问题——学了新知识就忘了旧知识。
而记忆网络(Memory Network)正是解决这一问题的核心技术:它相当于给AI Agent外接了一个“无限容量的大脑硬盘”,可以持久化存储所有的交互、知识、经验数据,并且可以根据当前需求快速检索出相关内容,拼入大模型的上下文窗口,让AI真正拥有“过目不忘”的能力。
亮明观点/文章目标
读完这篇文章,你将:
- 彻底理解记忆网络的核心原理、分层架构,以及和RAG、KV缓存等相关技术的区别;
- 从零开始搭建一个生产可用的AI Agent长期记忆体,支持语义检索、时间加权、记忆摘要、自动遗忘等核心功能;
- 掌握记忆网络落地的常见坑点、最佳实践,以及未来的发展趋势。
本文所有代码都已开源在GitHub:SimpleMem: 轻量级AI Agent长期记忆引擎,可以直接拿去用到自己的Agent项目里。
二、基础知识/背景铺垫
核心概念定义
1. 什么是记忆网络
记忆网络(Memory Network, MemNN)最早由Facebook AI研究院在2014年的论文《Memory Networks》中提出,核心思想是将记忆存储和推理逻辑解耦:用独立的存储模块持久化保存数据,用专门的推理控制器负责记忆的写入、索引、检索、更新、遗忘全流程,大模型只需要负责基于检索到的记忆完成推理生成,不需要修改自身参数。
和人类的记忆机制类似,完整的记忆网络包含5个核心流程:
- 编码:把输入的文本、图片、音频等内容转化为可存储的结构化格式和向量嵌入;
- 存储:把编码后的记忆持久化保存在对应的存储介质中;
- 索引:为存储的记忆建立索引,包括语义索引、关键词索引、时间索引、标签索引等,方便后续快速检索;
- 检索:根据当前的查询请求,从存储中召回最相关的记忆,经过排序后输出给大模型;
- 更新/遗忘:定期更新记忆的访问频率、重要度等属性,自动删除无效、低价值的记忆,避免记忆库冗余。
2. AI Agent的记忆分层模型
目前行业普遍参考人类的记忆分层机制,把AI Agent的记忆分为三层:
| 记忆层级 | 对应人类记忆 | 存储位置 | 生命周期 | 容量 | 用途 |
|---|---|---|---|---|---|
| 感觉记忆 | 瞬时记忆 | 输入预处理模块 | <1秒 | 极小 | 临时保存传感器输入的原始数据,比如语音转文本的中间结果 |
| 工作记忆(短期记忆) | 工作记忆 | 大模型KV缓存、会话上下文 | 会话级 | 等于大模型上下文窗口 | 保存当前会话的交互内容、正在处理的任务数据 |
| 长期记忆 | 长期记忆 | 外部存储(向量数据库、关系型数据库、对象存储等) | 永久 | 无限 | 持久化保存用户偏好、历史交互、知识文档、经验数据等 |
| 我们本文讨论的记忆网络,核心就是负责长期记忆层的实现。 |
3. 相关技术概念辨析
很多人会把记忆网络和RAG、KV缓存等概念混淆,我们这里做一个清晰的对比:
| 技术 | 核心定位 | 存储位置 | 生命周期 | 检索方式 | 适用场景 |
|---|---|---|---|---|---|
| 记忆网络 | 通用长期记忆引擎 | 外部多模态存储 | 永久 | 混合检索(语义+关键词+时间+重要度) | 所有需要长期记忆的AI Agent场景 |
| RAG(检索增强生成) | 文档记忆的落地实现 | 外部向量数据库 | 永久 | 语义检索为主 | 知识库问答、文档摘要等静态知识场景 |
| Memory Stream(记忆流) | 情景记忆的落地实现 | 外部存储+时间序列索引 | 永久 | 时间加权+重要度加权检索 | 游戏NPC、个人助理等需要情景记忆的场景 |
| KV缓存 | 短期工作记忆 | 大模型推理内存 | 推理级 | 顺序读取 | 加速当前会话的大模型推理 |
| 我们可以用下面的ER实体关系图表示各个概念之间的关系: |
记忆网络的核心组件交互关系如下图所示:
为什么需要独立的记忆网络?
很多人会问:大模型本身已经有参数记忆了,为什么还要额外做记忆网络?核心有三个不可替代的优势:
- 无限容量,成本极低:1T的云存储成本只需要100元/年,可以存储上亿条记忆,而大模型每增加1B参数的训练成本就高达数十万美元,完全不在一个量级;
- 动态更新,无灾难性遗忘:新的记忆直接写入存储即可,不需要微调大模型,不会影响原来的知识;
- 可解释、可编辑:用户可以随时查看、修改、删除AI的记忆,出现错误可以立刻修正,而大模型的参数记忆是黑盒,根本不知道它记了什么、哪里错了。
三、核心内容/实战演练:从零搭建AI Agent长期记忆体
我们本次实战的项目叫SimpleMem,是一个轻量级、可私有化部署的AI Agent长期记忆引擎,支持以下核心功能:
- 多模态记忆存储(文本、图片、音频)
- 混合检索(语义+BM25关键词+时间衰减+重要度加权)
- 自动记忆去重、摘要合并
- LRU+重要度自动遗忘机制
- RESTful API接口,支持多Agent接入
步骤一:环境安装
我们的技术栈选择如下:
- 开发语言:Python 3.10+
- 向量数据库:Chroma(轻量级,支持本地部署,不需要额外服务)
- 嵌入模型:BGE-small-zh-v1.5(中文效果最好的轻量级嵌入模型,本地部署不需要调用API)
- 重排模型:BGE-reranker-small
- 接口框架:FastAPI
- 大模型:支持OpenAI API、通义千问、Llama 3等所有主流模型
首先安装依赖:
pip install fastapi uvicorn langchain langchain-community chromadb sentence-transformers rank_bm25 pydantic python-multipart torch
如果需要用本地开源大模型,可以额外安装llama-cpp-python或者transformers库。
步骤二:系统设计
1. 功能设计
我们的SimpleMem包含以下核心功能模块:
| 功能模块 | 描述 |
|---|---|
| 记忆写入 | 支持单条/批量写入记忆,自动生成嵌入、去重、打标签 |
| 记忆检索 | 支持混合检索,返回Top N相关记忆,可自定义权重 |
| 记忆更新 | 支持修改记忆内容、重要度、标签等属性 |
| 记忆删除 | 支持单条/批量删除,支持按时间、标签等条件删除 |
| 记忆优化 | 自动去重、合并相似记忆、生成记忆摘要、自动遗忘低价值记忆 |
| 多租户支持 | 支持多用户/多Agent隔离记忆数据 |
2. 架构设计
SimpleMem采用三层架构,从上到下分别是接入层、逻辑层、存储层:
3. 数据结构设计
每条记忆的结构化数据如下:
from pydantic import BaseModel
from datetime import datetime
from typing import List, Optional
class Memory(BaseModel):
memory_id: str # 唯一ID
user_id: str # 所属用户/Agent ID
content: str # 记忆内容
content_type: str = "text" # 内容类型:text/image/audio/video
embedding: Optional[List[float]] = None # 向量嵌入
created_at: datetime = datetime.now() # 创建时间
updated_at: datetime = datetime.now() # 最后更新时间
last_accessed_at: datetime = datetime.now() # 最后访问时间
access_count: int = 0 # 访问次数
importance: float = 1.0 # 重要度,1-5分,越高越重要
tags: List[str] = [] # 标签,方便分类检索
source: Optional[str] = None # 记忆来源,比如会话ID、文档地址等
4. 核心算法设计
(1)时间衰减算法
我们用指数衰减函数计算记忆的时间权重,时间越久的记忆权重越低,但重要度高的记忆会被保留:
t i m e _ s c o r e = e − λ ∗ Δ t time\_score = e^{-\lambda * \Delta t} time_score=e−λ∗Δt
其中 λ \lambda λ是衰减系数,默认取0.01(单位:小时), Δ t \Delta t Δt是当前时间和记忆创建时间的差值,单位为小时。
(2)混合检索得分算法
最终的检索得分是语义相似度、时间得分、重要度得分、BM25关键词得分的加权和:
f i n a l _ s c o r e = w 1 ∗ s i m + w 2 ∗ t i m e _ s c o r e + w 3 ∗ i m p o r t a n c e + w 4 ∗ b m 25 _ s c o r e final\_score = w_1 * sim + w_2 * time\_score + w_3 * importance + w_4 * bm25\_score final_score=w1∗sim+w2∗time_score+w3∗importance+w4∗bm25_score
其中 w 1 + w 2 + w 3 + w 4 = 1 w_1+w_2+w_3+w_4=1 w1+w2+w3+w4=1,默认权重分别为0.4、0.2、0.2、0.2,可以根据场景自定义调整。
(3)自动遗忘算法
我们采用LRU+重要度的混合遗忘策略,当记忆库的占用率超过阈值(默认80%)时,自动删除满足以下条件的记忆:
( a c c e s s _ c o u n t < 3 ) ∧ ( i m p o r t a n c e < 2 ) ∧ ( Δ t > 720 ) (access\_count < 3) \land (importance < 2) \land (\Delta t > 720) (access_count<3)∧(importance<2)∧(Δt>720)
也就是访问次数少于3次、重要度低于2分、创建时间超过30天的记忆,会被自动删除。
(4)算法流程图
步骤三:核心实现源代码
1. 嵌入和重排模块实现
from sentence_transformers import SentenceTransformer, CrossEncoder
from typing import List
class EmbeddingService:
def __init__(self, embedding_model_name: str = "BAAI/bge-small-zh-v1.5", reranker_model_name: str = "BAAI/bge-reranker-small"):
self.embedding_model = SentenceTransformer(embedding_model_name)
self.reranker = CrossEncoder(reranker_model_name)
def get_embedding(self, text: str) -> List[float]:
"""生成文本的嵌入向量"""
return self.embedding_model.encode(text, normalize_embeddings=True).tolist()
def rerank(self, query: str, candidates: List[str], top_k: int = 5) -> List[int]:
"""对候选记忆进行重排,返回排序后的索引"""
pairs = [[query, candidate] for candidate in candidates]
scores = self.reranker.predict(pairs)
# 按得分降序排序,返回前top_k的索引
ranked_indices = sorted(range(len(scores)), key=lambda i: scores[i], reverse=True)[:top_k]
return ranked_indices
2. 记忆存储模块实现
import chromadb
from datetime import datetime
from typing import List, Optional, Dict
from .schema import Memory
import uuid
import json
class MemoryStore:
def __init__(self, persist_directory: str = "./mem_data"):
self.client = chromadb.PersistentClient(path=persist_directory)
self.embedding_service = EmbeddingService()
def _get_collection(self, user_id: str):
"""获取对应用户的记忆集合,自动隔离多用户数据"""
return self.client.get_or_create_collection(name=f"mem_{user_id}", metadata={"hnsw:space": "cosine"})
def add_memory(self, memory: Memory) -> str:
"""添加单条记忆"""
if not memory.memory_id:
memory.memory_id = str(uuid.uuid4())
if not memory.embedding:
memory.embedding = self.embedding_service.get_embedding(memory.content)
collection = self._get_collection(memory.user_id)
# 先检查是否有重复记忆
duplicates = collection.query(query_embeddings=[memory.embedding], n_results=1, where={"content_type": memory.content_type})
if len(duplicates['ids'][0]) > 0 and duplicates['distances'][0][0] < 0.1: # 余弦距离小于0.1认为是重复
# 合并记忆,更新访问次数
existing_id = duplicates['ids'][0][0]
existing_meta = duplicates['metadatas'][0][0]
existing_meta['access_count'] = int(existing_meta['access_count']) + 1
existing_meta['last_accessed_at'] = datetime.now().isoformat()
collection.update(ids=[existing_id], metadatas=[existing_meta])
return existing_id
# 写入新记忆
collection.add(
ids=[memory.memory_id],
embeddings=[memory.embedding],
documents=[memory.content],
metadatas=[{
"content_type": memory.content_type,
"created_at": memory.created_at.isoformat(),
"updated_at": memory.updated_at.isoformat(),
"last_accessed_at": memory.last_accessed_at.isoformat(),
"access_count": memory.access_count,
"importance": memory.importance,
"tags": json.dumps(memory.tags),
"source": memory.source or ""
}]
)
return memory.memory_id
def retrieve_memory(self, user_id: str, query: str, top_k: int = 5, weights: Dict = None) -> List[Memory]:
"""检索相关记忆"""
if weights is None:
weights = {"sim": 0.4, "time": 0.2, "importance": 0.2, "bm25": 0.2}
collection = self._get_collection(user_id)
query_embedding = self.embedding_service.get_embedding(query)
# 第一步:召回Top 100候选
candidates = collection.query(query_embeddings=[query_embedding], n_results=100, include=["documents", "metadatas", "embeddings", "distances"])
if not candidates['ids'][0]:
return []
# 第二步:计算各维度得分
now = datetime.now()
scored_candidates = []
for i in range(len(candidates['ids'][0])):
mem_id = candidates['ids'][0][i]
content = candidates['documents'][0][i]
meta = candidates['metadatas'][0][i]
sim_score = 1 - candidates['distances'][0][i] # 余弦距离转相似度
# 计算时间得分
created_at = datetime.fromisoformat(meta['created_at'])
delta_hours = (now - created_at).total_seconds() / 3600
time_score = pow(2.71828, -0.01 * delta_hours)
# 重要度得分
importance_score = float(meta['importance']) / 5 # 归一化到0-1
# BM25得分简化实现,这里可以替换为成熟的BM25库
bm25_score = len([word for word in query.split() if word in content]) / len(query.split()) if query.split() else 0
# 加权总得分
total_score = weights['sim'] * sim_score + weights['time'] * time_score + weights['importance'] * importance_score + weights['bm25'] * bm25_score
scored_candidates.append({
"memory_id": mem_id,
"content": content,
"meta": meta,
"score": total_score
})
# 第三步:按得分排序,取Top 20给重排模型
scored_candidates.sort(key=lambda x: x['score'], reverse=True)
top_candidates = scored_candidates[:20]
candidate_contents = [c['content'] for c in top_candidates]
# 第四步:重排
reranked_indices = self.embedding_service.rerank(query, candidate_contents, top_k=top_k)
result = []
for idx in reranked_indices:
c = top_candidates[idx]
# 更新访问次数和时间
collection.update(
ids=[c['memory_id']],
metadatas=[{
**c['meta'],
"access_count": int(c['meta']['access_count']) + 1,
"last_accessed_at": now.isoformat()
}]
)
# 转为Memory对象
result.append(Memory(
memory_id=c['memory_id'],
user_id=user_id,
content=c['content'],
content_type=c['meta']['content_type'],
created_at=datetime.fromisoformat(c['meta']['created_at']),
updated_at=datetime.fromisoformat(c['meta']['updated_at']),
last_accessed_at=now,
access_count=int(c['meta']['access_count']) + 1,
importance=float(c['meta']['importance']),
tags=json.loads(c['meta']['tags']),
source=c['meta']['source']
))
return result
3. FastAPI接口实现
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List, Optional, Dict
from .store import MemoryStore
from .schema import Memory
import uvicorn
app = FastAPI(title="SimpleMem API", version="1.0")
store = MemoryStore()
class AddMemoryRequest(BaseModel):
user_id: str
content: str
content_type: str = "text"
importance: float = 1.0
tags: List[str] = []
source: Optional[str] = None
class RetrieveMemoryRequest(BaseModel):
user_id: str
query: str
top_k: int = 5
weights: Optional[Dict] = None
@app.post("/memory/add", response_model=str)
def add_memory(req: AddMemoryRequest):
try:
memory = Memory(
user_id=req.user_id,
content=req.content,
content_type=req.content_type,
importance=req.importance,
tags=req.tags,
source=req.source
)
mem_id = store.add_memory(memory)
return mem_id
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.post("/memory/retrieve", response_model=List[Memory])
def retrieve_memory(req: RetrieveMemoryRequest):
try:
memories = store.retrieve_memory(req.user_id, req.query, req.top_k, req.weights)
return memories
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
步骤四:功能测试
我们可以用下面的代码测试SimpleMem的功能:
import requests
# 先添加几条记忆
memories = [
{"user_id": "test_user", "content": "我对芒果过敏,不能吃任何芒果相关的食物", "importance": 5.0, "tags": ["健康", "偏好"]},
{"user_id": "test_user", "content": "我养了一只叫年糕的银渐层猫,今年3岁,喜欢吃冻干", "importance": 4.0, "tags": ["宠物"]},
{"user_id": "test_user", "content": "2024年国庆我要去杭州参加AI开发者大会,住西湖附近的酒店", "importance": 4.0, "tags": ["日程"]},
{"user_id": "test_user", "content": "今天天气真好,中午吃了黄焖鸡米饭", "importance": 1.0, "tags": ["日常"]}
]
for mem in memories:
res = requests.post("http://localhost:8000/memory/add", json=mem)
print(f"添加记忆成功,ID:{res.text}")
# 测试检索
query = {"user_id": "test_user", "query": "国庆去杭州要注意什么?", "top_k": 3}
res = requests.post("http://localhost:8000/memory/retrieve", json=query)
result = res.json()
print("检索结果:")
for mem in result:
print(f"内容:{mem['content']},重要度:{mem['importance']}")
运行后你会看到检索结果优先返回了芒果过敏、国庆去杭州的记忆,大模型拿到这些记忆后就会给出正确的建议:“国庆去杭州要注意不要吃当地的芒果糯米饭,你对芒果过敏…”
四、进阶探讨/最佳实践
常见陷阱与避坑指南
1. 记忆冗余陷阱
问题描述:很多人在做记忆系统的时候,不管什么内容都往里面存,导致记忆库很快就被大量重复、低价值的内容填满,检索的时候噪音极大,有用的记忆被淹没。
避坑方案:
- 写入前做重复检测:相似度超过0.9的记忆直接合并,不重复存储;
- 加入过滤规则:自动过滤无意义的语气词、重复的问候语、临时的计算中间结果;
- 重要度自动打分:写入时用大模型判断记忆的重要度,1分的低价值记忆设置自动过期时间,7天后自动删除。
2. 检索精度陷阱
问题描述:只用语义检索,经常出现“相关的记忆没召回,不相关的召回了一堆”的情况,比如用户问“我对什么过敏?”,结果召回的是“我家猫对猫草过敏”的记忆。
避坑方案:
- 必须用混合检索:语义+BM25关键词+时间+重要度加权,不要只靠语义相似度;
- 加入重排环节:召回Top 100候选后用重排模型二次排序,精度可以提升30%以上;
- 支持按标签过滤:检索的时候可以指定标签,比如查询健康相关的记忆只在
["健康"]标签的记忆里检索。
3. 记忆漂移陷阱
问题描述:记忆在多次更新、摘要合并后,逐渐偏离原来的意思,比如原来的记忆是“我2024年国庆去杭州”,合并几次后变成“我2024年国庆去苏州”,出现错误。
避坑方案:
- 永远保留原始记忆:所有的摘要、合并都是生成新的关联记忆,不要修改原始记忆的内容;
- 记忆溯源:每个生成的记忆都要关联原始记忆的ID,出现错误可以回溯到原始内容;
- 支持用户手动修正:给用户开放记忆编辑、删除的入口,错误的记忆可以手动修正。
性能优化/成本考量
性能优化
- 分层存储:热记忆(最近7天访问过的)存在内存级的向量库(比如Redis Vector),温记忆(3个月内的)存在普通向量库(Chroma、Pinecone),冷记忆(超过3个月的)存在对象存储,需要的时候再加载到向量库,检索速度可以提升10倍以上;
- 索引优化:向量索引用HNSW算法,虽然占用的存储空间大一点,但查询速度比IVF快5倍以上,适合高并发场景;
- 高频记忆缓存:把用户常用的记忆(比如过敏信息、个人基本信息)缓存到本地,不用每次都查向量库。
成本考量
- 云厂商向量库成本优化:大多数云厂商的向量库都是按存储容量和调用次数收费,我们可以把冷记忆存在对象存储,只把热记忆存在向量库,成本可以降低80%以上;
- 本地部署优先:如果是个人使用或者对隐私要求高的场景,优先用本地部署的轻量级向量库,比如Chroma、FAISS,不需要支付云服务费用;
- 嵌入模型轻量化:用轻量级的嵌入模型(比如BGE-small),生成嵌入的速度比大模型快10倍,算力成本只有大模型的1/10,而且中文效果更好。
最佳实践总结
- 记忆分层永远是第一原则:按照访问频率、重要度把记忆分成热、温、冷三层,不要所有记忆都存在同一个存储里;
- 安全第一:所有的记忆数据都要加密存储,敏感数据(身份证、银行卡、病历等)要做脱敏处理,或者本地端侧存储,不要上传到云端;
- 可解释性优先:每个AI的回复都要标注用到了哪些记忆,用户可以随时查看、编辑、删除,避免AI用错误的记忆给出错误的建议;
- 不要过度设计:初期不要追求完美的记忆机制,先满足核心需求,再逐步迭代优化,很多场景下简单的语义检索+时间加权就足够用了。
五、结论
核心要点回顾
记忆网络是AI Agent实现长期记忆的核心技术,它将记忆存储和大模型推理解耦,解决了大模型上下文窗口有限、参数记忆更新成本高、不可解释的问题。我们本次实战搭建的SimpleMem记忆引擎,通过混合检索、自动遗忘、记忆去重等机制,可以满足绝大多数AI Agent的长期记忆需求,只需要简单修改就可以用到个人助理、企业客服、游戏NPC等各种场景。
行业发展与未来趋势
记忆网络的发展经历了以下几个阶段,未来的发展方向也非常清晰:
| 时间 | 发展阶段 | 核心事件 | 特点 |
|---|---|---|---|
| 2014年 | 概念提出 | Facebook发布《Memory Networks》论文 | 首次提出记忆和推理解耦的思想,仅支持简单的文本记忆 |
| 2017-2020年 | 技术积累 | Transformer发布、RAG概念提出 | 记忆的编码、检索技术逐渐成熟,开始落地文档问答场景 |
| 2023年 | 爆发落地 | 斯坦福发布Generative Agents,提出Memory Stream | 情景记忆、时间加权、自动摘要等机制成熟,开始在AI Agent中大规模应用 |
| 2024年 | 生态完善 | 各大Agent框架(LangChain、AutoGPT、MetaGPT)都集成了记忆模块 | 记忆引擎成为AI Agent的标配组件,开始出现专门的记忆云服务 |
| 2025-2027年 | 通用记忆引擎 | 跨模态记忆、联想记忆、跨Agent记忆共享落地 | 记忆引擎像现在的数据库一样成为通用基础设施,AI可以像人类一样拥有联想、回忆、经验学习的能力 |
| 未来的记忆网络会越来越接近人类的记忆机制:不仅能记住事实,还能记住情景、情绪、经验,甚至可以在多个Agent之间共享记忆,实现群体智慧。 |
行动号召
现在你可以把我们的SimpleMem代码下载下来,改成适合自己的AI Agent的记忆体:如果是个人助理,可以加入图片、语音记忆的支持;如果是企业客服,可以加入多租户、权限控制的功能。如果你在使用过程中有任何问题,欢迎在评论区留言交流,也可以给我们的GitHub项目提Issue和PR。
学习资源推荐
- 原论文:Memory Networks (2014)
- 斯坦福Generative Agents论文:Generative Agents: Interactive Simulacra of Human Behavior
- LangChain记忆模块文档:Memory | 🦜️🔗 LangChain
- Chroma向量数据库官方文档:Chroma - the AI-native open-source embedding database
(全文完,总字数:约12800字)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)