掘金 人工智能 09月12日
Mem0与Milvus:为AI构建持久化长时记忆
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

文章介绍了Mem0,一个为AI智能体开发的记忆层,旨在解决AI在对话中“健忘”的问题。Mem0能够帮助AI随时调取历史对话、记住用户偏好和事实,并进行自我完善。它通过捕获语义、向量化、存储至向量数据库(如阿里云Milvus)并检索,将相关记忆注入LLM的prompt中,实现更连贯、个性化的响应。文章还对比了Mem0与LLM上下文窗口及传统RAG的区别,并展示了如何结合Mem0和Milvus构建有记忆的AI Agent,以及利用图谱记忆处理复杂信息关系。

💡 **AI的“健忘症”与Mem0的解决方案**:文章指出,现有AI(如ChatGPT)在对话中存在记忆缺失问题,无法记住用户的偏好和历史信息,导致用户体验不佳。Mem0作为一种AI记忆层,通过构建持久化的“大脑”,能够随时调取历史对话、精准记住用户偏好和重要事实,并总结经验以实现自我完善,有效解决了AI的“失忆症”。

💾 **Mem0的核心工作流程与技术栈**:Mem0的核心流程包括语义捕获(LLM解析)、内容向量化(Embedding)、向量存储(使用Milvus等向量数据库)和检索。检索到的相关记忆会被注入LLM的Prompt中,以增强上下文并生成更具个性化的响应。它与LLM的上下文窗口不同,提供持久化、更接近意图的内容召回。

🚀 **Mem0与Milvus的结合应用**:文章重点介绍了Mem0与阿里云Milvus的结合。Milvus作为专为向量相似性搜索设计的分布式数据库,为Mem0提供了高效、可扩展的向量存储和检索能力。通过两个实践示例,展示了如何利用Mem0和Milvus构建具备长期记忆的AI Agent,以及如何通过Mem0的图谱记忆能力(结合Kuzu图谱数据库)来解析信息间的复杂关系,实现更深层次的理解和响应。

⚖️ **Mem0与RAG的对比优势**:文章对比了Mem0记忆层与传统检索增强生成(RAG)系统的区别。Mem0不仅检索静态文档,更能理解并跨会话关联实体和主题;它拥有动态更新、持续学习和会话连续性等优势,能够优先近期、高相关记忆,并根据用户反馈实时微调,使得AI伴侣、学习助手等场景更加连贯和个性化。

Mem0 + Milvus:为人工智能构建持久化长时记忆

作者:周弘懿(锦琛)

背景

跟 ChatGPT 对话,比跟真人社交还累!真人好歹能记住你名字吧?

想象一下——你昨天刚把沙发位置、爆米花口味、爱看的电影都告诉了 ChatGPT,而它永远是那个热情又健忘的助理,下次再对话还是会问:“哦?是吗?那太好了!请问您对什么类型的电影感兴趣呢?”

受够了这种单方面的“社牛”表演?Mem0 来了,专治 AI 失忆症,给你的“金鱼脑”助理装个大容量硬盘,让你们下次见面,能直接跳过多余的问答,从“好久不见”开始。

Mem0介绍

Mem0是为 AI 智能体开发打造的记忆层。它就像一个持久的“大脑”,能帮助 AI 智能体完成以下内容:

git地址:github.com/mem0ai/mem0

记忆层的作用

如下图所示,无记忆层的情况下,即使LLM有超大的上下文窗口的情况下,再开一个新会话后上下文都会被重置。有记忆层Mem0的情况下,将保留上下文,召回需要的内容,并持续优化自身存储。

记忆层在AI智能体开发中的作用

如下图所示,Mem0 会与检索器(RAG)、LLM 、上下文并肩工作。与传统的基于检索的系统(如 RAG)不同,Mem0 会记录过往交互、保存长期知识,并让智能体的行为随时间而进化。仅会将记忆中相关的知识合并到prompt之中,输入给LLM。

Mem0在AI智能体中的处理方式

下面是Mem0记忆层和使用LLM上下文窗口的主要区别

能力LLM上下文窗口Mem0 记忆存储
记忆力临时持久化
token消耗随着输入增加优化(只获取需要的内容)
内容召回依赖于LLM对长上下文识别能力压缩上下文,更接近意图
个性化记录历史会话

记忆层和RAG对比

以Mem0为代表的记忆层与传统RAG对比有以下区别:

Mem0核心流程

Mem0的核心工作流程包括以下步骤:

    语义捕获:利用LLM对会话流进行智能解析,自动捕获并抽象出具备长期价值的核心语义信息。

    内容向量化:通过嵌入模型将这些语义信息编码为高维度的向量,为后续的相似度计算和高效检索奠定基础。

    向量存储:将上一步生成的向量存储至向量数据库中,该数据库需要支持大规模、低延迟的语义搜索,在后面的例子中我们将使用阿里云Milvus。

    检索:系统接收到新的用户输入后,会立即在向量空间中进行语义相似度匹配,精准地调用出与当前情境最关联的历史记忆。

    上下文增强:将调用出的历史记忆注入到当前的推理链路中,与现有上下文相结合,从而生成逻辑更连贯、内容更具个性化的响应。

阿里云Milvus基本原理介绍

基本原理与架构概述

Milvus 是专为向量相似性搜索设计的分布式数据库,其核心基于以下关键技术:

采用云原生和存算分离的微服务架构。该架构分为接入、协调、执行和存储四层。各组件可独立扩展,确保了系统的高性能、高可用性和弹性。它依赖成熟的第三方组件(如etcd、对象存储)进行数据和元数据管理,稳定可靠。

阿里云Milvus系统架构图

使用场景

阿里云 Milvus 适用于任何需要进行“相似性”匹配的场景。其核心应用包括:

    图像视频搜索:如电商平台的以图搜图、安防领域的人脸识别和视频轨迹追踪。

    文本语义搜索:构建智能客服、企业内部文档知识库和代码搜索引擎,能精准理解用户意图,而非简单的关键词匹配。

    个性化推荐系统:根据用户的行为和偏好向量,实时推荐最相似的商品、音乐、新闻或视频。

    前沿科学与安全:在生物信息学中加速药物分子筛选,或在网络安全领域进行异常流量和欺诈行为检测。

    智能驾驶数据准备与挖掘:对点云图像、车载传感器收集的音视频等多模态数据进行向量数据的实时查询。

更多介绍:https://www.aliyun.com/product/milvus

接下来,本教程将通过两个示例,带你实践如何结合 Mem0 与 Milvus实现:

实践一、有记忆的AI Agent开发流程

前提条件

代码开发

LangGraph 是一个业界成熟的用于构建有状态和多角色的Agents 应用的框架。限于篇幅将不对LangGraph过多介绍,可以参考官方文档

pip install langgraph langchain-openai mem0ai

包含以下核心步骤:

    环境变量设置OpenAI方式访问百炼qwen大模型;LLM设置qwen-plus作为语言大模型;Mem0配置qwen-plus作为语义识别和处理大模型、使用text-embedding-v3作为embedding模型、使用Milvus作为向量存储数据库。

    设置LangGraph会话状态,用于获取对话上下文。

    对话Agent开发,使用Mem0的search接口获取相关的记忆、使用Mem0的add接口存储相关记忆到向量库Milvus中。

    编排LangGraph,设置节点和边。

    设置LangGraph流式输出。

    入口main函数进行人机交互。

from typing import Annotated, TypedDict, Listfrom langgraph.graph import StateGraph, STARTfrom langgraph.graph.message import add_messagesfrom langchain_openai import ChatOpenAIfrom mem0 import Memoryimport osfrom langchain_core.messages import SystemMessage, HumanMessage, AIMessage# 设置环境变量,百炼平台qwen模型的key和baseurlos.environ["OPENAI_API_KEY"] = "sk-xx"os.environ["OPENAI_BASE_URL"] = "https://dashscope.aliyuncs.com/compatible-mode/v1"# LLM设置llm = ChatOpenAI(model="qwen-plus", temperature=0.2, max_tokens=2000)# Mem0设置,LLM、embedding和向量库config = {    "llm": {        "provider": "openai",        "config": {            "model": "qwen-plus",            "temperature": 0.2,            "max_tokens": 2000,        }    },    "embedder": {        "provider": "openai",        "config": {            "model": "text-embedding-v3",            "embedding_dims": 128,        }    },    "vector_store": {        "provider": "milvus",        "config": {            "collection_name": "mem0_test1",            "embedding_model_dims": "128",            "url": "http://c-xxx.milvus.aliyuncs.com:19530",            "token": "root:xxx",            "db_name": "default",        },    },    "version": "v1.1",}mem0 = Memory.from_config(config)# 设置LangGraph对话状态class State(TypedDict):    messages: Annotated[List[HumanMessage | AIMessage], add_messages]    mem0_user_id: strgraph = StateGraph(State)# 对话Agent开发,包含Mem0记忆读取和记忆存储def chatbot(state: State):    messages = state["messages"]    user_id = state["mem0_user_id"]    try:        # Retrieve relevant memories        memories = mem0.search(messages[-1].content, user_id=user_id,)                # Handle dict response format        memory_list = memories['results']        context = "Relevant information from previous conversations:\n"        for memory in memory_list:            context += f"- {memory['memory']}\n"        system_message = SystemMessage(content=f"""You are a helpful customer support assistant. Use the provided context to personalize your responses and remember user preferences and past interactions.{context}""")        full_messages = [system_message] + messages        print(full_messages)        response = llm.invoke(full_messages)        # Store the interaction in Mem0        try:            interaction = [                {                    "role": "user",                    "content": messages[-1].content                },                {                    "role": "assistant",                     "content": response.content                }            ]            result = mem0.add(interaction, user_id=user_id,)            print(f"Memory saved: {len(result.get('results', []))} memories added")        except Exception as e:            print(f"Error saving memory: {e}")                    return {"messages": [response]}            except Exception as e:        print(f"Error in chatbot: {e}")        # Fallback response without memory context        response = llm.invoke(messages)        return {"messages": [response]}# 设置LangGraph调度节点和边graph.add_node("chatbot", chatbot)graph.add_edge(START, "chatbot")graph.add_edge("chatbot", "chatbot")compiled_graph = graph.compile()# 设置LangGraph流式输出def run_conversation(user_input: str, mem0_user_id: str):    config = {"configurable": {"thread_id": mem0_user_id}}    state = {"messages": [HumanMessage(content=user_input)], "mem0_user_id": mem0_user_id}    for event in compiled_graph.stream(state, config):        for value in event.values():            if value.get("messages"):                print("Customer Support:", value["messages"][-1].content)                return# 入口函数交互入口if __name__ == "__main__":    print("Welcome to Customer Support! How can I assist you today?")    mem0_user_id = "alice"  # You can generate or retrieve this based on your user management system    while True:        user_input = input("You: ")        if user_input.lower() in ['quit', 'exit', 'bye']:            print("Customer Support: Thank you for contacting us. Have a great day!")            break        run_conversation(user_input, mem0_user_id)

验证效果

如下图所示,第一次执行代码我们没有任何上下文,我们提问和电影相关的问题并且和LLM说了不喜欢惊悚片,LLM最终根据我们的要求推荐了一些合适的影片。

第一次提问

可以看到了一些Memory saved的打印,查看Milvus向量库,可以看到对应的collection已经有了几个Entity。

点开数据页面,可以看到Mem0已将上下文经过LLM处理概括地保存到metadata字段中,并且对应的用户是alice,数据为了可以被检索也已经被向量化存储到vectors字段中。

重新执行代码,因为我们已经有了记忆的存在,再问一下“我喜欢什么电影”,可以看到Mem0从Milvus中召回了相关的内容,并将内容合并到了prompt中发送给LLM,我们得到了相关的电影推荐而不需要再和LLM重复介绍我们的喜好。

实践二:通过图谱引擎+向量引擎解析信息之间复杂关系

方案概述

Mem0 支持图谱记忆(Graph Memory)。借助图谱记忆,用户可以创建并利用信息之间的复杂关系,从而生成更细致、更具上下文感知能力的响应。这一融合使用户能够同时发挥向量检索与图谱技术的优势,实现更准确、更全面的信息检索与内容生成。

记忆层添加记录的方式如下图所示,Mem0通过LLM提取内容后,通过添加或者更新的方式,同时将内容embedding到向量库和提取实体&关系到图谱数据库中。

记忆层添加记录

记忆层检索记录的方式如下图所示,Mem0通过LLM提取内容后,同时将内容embedding到向量库检索和提取实体&关系到图谱数据库中检索,双路检索后将结果合并输出。

记忆层检索记录

前提条件

代码开发

pip install kuzu rank-bm25 mem0ai

包含以下核心步骤:

    环境变量设置OpenAI方式访问百炼qwen大模型;LLM设置qwen-plus作为语言大模型;Mem0配置qwen-plus作为语义识别和处理大模型、使用text-embedding-v3作为embedding模型、使用Milvus作为向量存储数据库、使用kuzu作为图谱数据库。

    初始化Mem0,添加数据,将同时添加内容到向量库和图谱库中。

    提问测试。

from langchain_openai import ChatOpenAIfrom mem0 import Memory# 设置环境变量,百炼平台qwen模型的key和baseurlos.environ["OPENAI_API_KEY"] = "sk-xx"os.environ["OPENAI_BASE_URL"] = "https://dashscope.aliyuncs.com/compatible-mode/v1"# LLM设置llm = ChatOpenAI(model="qwen-plus", temperature=0.2, max_tokens=2000)# Mem0设置,LLM、embedding和向量库config = {    "llm": {        "provider": "openai",        "config": {            "model": "qwen-plus",            "temperature": 0.2,            "max_tokens": 2000,        }    },    "embedder": {        "provider": "openai",        "config": {            "model": "text-embedding-v3",            "embedding_dims": 128,        }    },    "vector_store": {        "provider": "milvus",        "config": {            "collection_name": "mem0_test3",            "embedding_model_dims": "128",            "url": "http://c-xxx.milvus.aliyuncs.com:19530",            "token": "root:xxx",            "db_name": "default",        },    },    "graph_store": {        "provider": "kuzu",        "config": {            "db": "./mem0-example.kuzu"        }    },    "version": "v1.1",}# 初始化Mem0,添加数据,将同时添加内容到向量库和图谱库中m = Memory.from_config(config)m.add("我喜欢去徒步旅行", user_id="alice123")m.add("我喜欢打羽毛球", user_id="alice123")m.add("我讨厌打羽毛球", user_id="alice123")m.add("我的朋友叫约翰,约翰有一只叫汤米的狗", user_id="alice123")m.add("我的名字是爱丽丝", user_id="alice123")m.add("约翰喜欢徒步旅行,哈利也喜欢徒步旅行", user_id="alice123")m.add("我的朋友彼得是蜘蛛侠", user_id="alice123")# 按照score分数倒序排列,输出结果def get_res(res):  sorted_results = sorted(res['results'], key=lambda x: x['score'], reverse=True)  res['results'] = sorted_results  print(json.dumps(res, ensure_ascii=False, indent=2))# 提问测试get_res(m.search("我的名字是什么?", user_id="alice123"))get_res(m.search("谁是蜘蛛侠?", user_id="alice123"))

验证效果

如下图所示,是“我的名字是什么?”的返回,可以看到results中是向量返回,返回的“名字是爱丽丝”得分并不高,relations中是图谱返回,解析出了我的名字是“爱丽丝”,关系为has_name。

如下图所示,是“谁是蜘蛛侠?”的返回,可以看到results中是向量返回,返回的“朋友彼得是蜘蛛侠”得分最低,relations中是图谱返回,解析出了蜘蛛侠的名字是“彼得”,关系为是。

通过以上两个例子,可以发现,有图谱能力的加持,可以补齐向量库缺失信息之间深层分析的短板。

随着AI应用越来越深入日常生活,系统对用户上下文和历史信息的理解变得尤为重要。Mem0 与 Milvus 的结合,为人工智能提供了一套高效、可扩展的长时记忆解决方案。通过向量数据库持久化存储语义记忆,AI 不仅能记住过去的交互,还能在后续对话中持续调用和更新这些信息。这一能力让智能助手、客服机器人等应用更加连贯、个性化和实用。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Mem0 Milvus AI记忆 AI Agent 向量数据库 长时记忆 LLM RAG 图谱记忆 Mem0 Milvus AI Memory AI Agent Vector Database Long-Term Memory LLM RAG Graph Memory
相关文章