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都是这样

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐