langchain基础教程(4)---短期记忆和长期记忆
在langchain官方文档中,store是在工具中使用,但是我个人认为,store放在中间件(before_model,after_model)中使用更方便。然而随着聊天轮数越来越多, 聊天记录越来越长,然后送入模型的数据会越来越长,终究会超过大模型的上下文长度;但上述都有缺点,随着聊天轮数的增多,聊天记录总归会超过大模型上下文窗口上限, 无论是截断/精简/摘要都会丢失一些消息或者细节;长期记忆
agent的记忆来源,是将你与大模型的聊天记录一块发送给大模型,大模型根据聊天记录做出回答
(有点像医院门诊坐诊的医生,根据病人的病历,判断病人需要怎么样的治疗)
短期记忆: 实现方式很简单; 就是将聊天记录存在内存中,然后将聊天记录一块送入大模型;
然而随着聊天轮数越来越多, 聊天记录越来越长,然后送入模型的数据会越来越长,终究会超过大模型的上下文长度; 而且过长的上下文,还会影响推理速度;
常用解决方案有:
① 截断消息(使用中间件,在送入大模型前,裁剪消息,只保留最新几轮消息)
② 删除/精简消息: 对消息进行去冗余,减少无效数据
③ 总结/摘要消息: 使用内置的SummarizationMiddleware(总结)中间件,ConversationSummaryMemory(摘要)
但上述都有缺点,随着聊天轮数的增多,聊天记录总归会超过大模型上下文窗口上限, 无论是截断/精简/摘要都会丢失一些消息或者细节;
所以解决方案是:
短期记忆(最近几轮的对话)放在内存中,
长期记忆(历史对话)放入外部存储环境中(如向量数据库,数据库,文档,redis),然后根据需要加载 相关的对话历史;
LangGraph 将长期记忆作为 JSON 文档存储在存储中。store
每个记忆都组织在一个自定义的 namespace(类似于文件夹)和一个独特的 key(像文件名)下。命名空间通常包括用户或组织 ID 或其他标签,以便于组织信息。
这种结构支持记忆的分层组织。然后通过内容过滤器支持跨命名空间搜索。
InMemoryStore使用案例(开发与测试使用,生产环境使用PostgresStore 或其他存储方式)
①基本操作:
store = InMemoryStore()
# 存储键值对
namespace = ("users", "123", "profile") # namespace是一个元组
key = "info"
value = {"name": "Alice", "age": 30}
store.put(namespace, key, value)
# 获取值
item = store.get(namespace, key)
store.delete(namespace, key)
②启用语义搜索(需要配置嵌入模型)
# 使用魔搭下载嵌入模型
# modelscope download --model BAAI/bge-small-zh-v1.5 --local_dir ./.model/embedding/bge-small-zh-v1.5
from langchain_huggingface import HuggingFaceEmbeddings
# 使用本地嵌入模型
embeddings = HuggingFaceEmbeddings(
model_name=r"D:\MyWork\GitProject\LLM\my_llm\.model\embedding\bge-small-zh-v1.5",
model_kwargs={
"device": "cpu",
"trust_remote_code": True,
},
encode_kwargs={"normalize_embeddings": True},
)
store = InMemoryStore(
index={
"embed": embeddings,
"dims": 1536,
}
)
# 存储带索引的数据
store.put(
namespace=("docs",),
key="doc1",
value={"title": "LangChain 简介", "content": "LangChain 是一个 LLM 框架"},
index=["title", "content"] # 索引字段
)
# 语义搜索
results = store.search(
("docs",),
query="LangChain 框架",
limit=5
)
#结果输出
for result in results:
print(result.value)
在langchain官方文档中,store是在工具中使用,但是我个人认为,store放在中间件(before_model,after_model)中使用更方便
LangChain 中常用VectorStore(向量存储) + Retriever(检索器)实现,这种基本就是RAG的实现方式。
但现在有专门的长期记忆框架如:Mem0, letta,MemoryScope等
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)