langchain基础教程(5)---长期记忆实现---使用Mem0
·
git地址: https://github.com/mem0ai/mem0
我当前使用的mem0 是利用 ChatOpenAI, 本地嵌入模型, milvus(本地化部署)
python版本: 3.12
mem0 安装 pip install mem0ai
from langchain_openai import ChatOpenAI
from mem0 import Memory
from mem0.configs.base import MemoryConfig
llm = ChatOpenAI(
model=my_model_name,
openai_api_key=my_api_key,
openai_api_base=my_api_base, # 关键配置
temperature=0.7,
)
# 本地嵌入模型
embedding_model_name=r"D:/my_llm/.model/embedding/bge-small-zh-v1.5"
config = MemoryConfig(
# LLM 配置:ChatOpenAI(langchain 封装)
llm={
"provider": "langchain", # mem0 中用 langchain provider 对接 ChatOpenAI
"config": {
"model": llm
}
},
# 嵌入模型配置:本地 bge-small-zh-v1.5(通过魔搭下载)
# modelscope download --model BAAI/bge-small-zh-v1.5 --local_dir ./.model/embedding/bge-small-zh-v1.5
embedder={
"provider": "huggingface",
"config": {
"model": embedding_model_name, # 仅保留核心字段
"embedding_dims": 512,
# "output_dim": 512, # 强制输出 512 维
"model_kwargs":{
"device": "cpu",
"trust_remote_code": True,
}
}
},
# 向量库配置:Milvus
vector_store={
"provider": "milvus",
"config": {
"url": "http://ip:19530", # 替换之前的 uri → url(错误提示允许字段)
"collection_name": "mem0_memory", # 自定义集合名(允许字段)
"embedding_model_dims": 512, # 替换之前的 dim → embedding_model_dims(向量维度,允许字段)
"metric_type": "IP", # 距离度量(允许字段,支持 IP/L2)
"db_name": "default", # 数据库名(可选,允许字段) 最好就是这个
"token":""
}
}
,
)
user_id = "123"
memory = Memory(config =config)
messages = [
{"role": "user", "content": "你是小明,我是小红,咱俩是好朋友"},
{"role": "ai", "content": "好的,小红!我记住你的名字了"}
]
result_add = memory.add(messages, user_id=user_id,agent_id=user_id,run_id=user_id)
# # 打印写入结果(看是否有 ADD 事件)
print(f"写入结果:{result_add}")
print(f"写入结果中的 results 长度:{len(result_add.get('results', []))}")
sleep(2)
relevant_memories = memory.search(query="张三",user_id=user_id,limit=3)
print(relevant_memories)
print(memory.get_all(user_id=user_id,agent_id=user_id,run_id=user_id))
注意: 源码上需要修改BaseLlmConfig中最后一行修改为
self.http_client = httpx.Client(base_url=http_client_proxies) if http_client_proxies else None
# 查找路径 : Memory --> LlmFactory.create()--> mem0.llms.langchain.LangchainLLM ->mem0.llms.base import LLMBase --> BaseLlmConfig(**config)
milvus操作参考: https://milvus.io/docs/zh/manage-collections.md
milvus安装之后可以使用 http://ip:9091/webui 可视化页面查看
记忆框架 相比于直接使用其他持久化存储(向量数据库/数据库/redis等基础存储)区别在于
mem0(专业 LLM 记忆库):
① 专注于长期记忆、语义检索、动态更新。 基础存储无记忆管理逻辑,仅提供基础增删改查。
② 内置智能记忆管理,支持长期记忆,短期记忆,可配置遗忘策略
③支持复杂数据, 如自动处理记忆冲突(如用户前后说法矛盾时,可配置保留最新 / 合并信息);
这种记忆库就是利用大模型,将对话提取/总结, 其效果非常依赖大模型的质量和prompt(默认prompt可能效果不佳)
例如:
messages = [
{"role": "user", "content": "你是小明,我是小红,咱俩是好朋友"},
{"role": "ai", "content": "好的,小红!我记住你的名字了"}]
memory.add(messages, user_id=user_id,agent_id=user_id,run_id=user_id)
messages = [
{"role": "user", "content": "不对不对,我是小明,你才是小红"},
{"role": "ai", "content": "好的,小明!我记住你的名字了"}
]
memory.add(messages, user_id=user_id,agent_id=user_id,run_id=user_id)
然后第二次add时,大模型根据默认的prompt, 总结提取的消息和旧数据一样,
数据类型不是add,update,delete, 而是NONE,然后就无法更新
我试过千问和deepseek都是这样
更多推荐


所有评论(0)