当前位置: 首页 > news >正文

【大模型记忆-Mem0详解-6】核心组件-图形记忆

架构概述

Graph Memory 与 Mem0 的向量存储一起作为并行存储系统运行,自动从对话数据中提取实体和关系并将其存储在图形数据库中。该系统使用 LLM 进行实体提取和关系建立,然后将结构化数据存储在支持的图形数据库中。

系统集成

在这里插入图片描述

核心组件

MemoryGraph 类

MemoryGraph 类充当图形作的主要接口,具有针对不同图形数据库的特定于提供商的实现。

在这里插入图片描述

实体提取工具

该系统使用结构化的 LLM 工具从自然语言输入中提取实体并建立关系。

工具目的输入输出
EXTRACT_ENTITIES_TOOL从文本中提取实体和类型自然语言文本具有类型的实体列表
RELATIONS_TOOL建立实体之间的关系文本和实体列表源-关系-目标三元组列表
DELETE_MEMORY_TOOL_GRAPH确定要删除的关系现有关系和新文本要删除的关系

实体提取和关系管理

提取管道

图存储系统遵循多阶段流水线,将自然语言转换为结构化图数据。
在这里插入图片描述

实体解析和嵌入相似性

系统使用嵌入相似性来合并相似的实体并避免重复:

在这里插入图片描述

图作

核心业务

MemoryGraph 类提供了四个与主 Memory 类集成的主要作:

添加作

add() 方法处理新的对话数据并更新图表:

# From mem0/memory/graph_memory.py:75-93
def add(self, data, filters):entity_type_map = self._retrieve_nodes_from_data(data, filters)to_be_added = self._establish_nodes_relations_from_data(data, filters, entity_type_map)search_output = self._search_graph_db(node_list=list(entity_type_map.keys()), filters=filters)to_be_deleted = self._get_delete_entities_from_search_output(search_output, data, filters)deleted_entities = self._delete_entities(to_be_deleted, filters)added_entities = self._add_entities(to_be_added, filters, entity_type_map)return {"deleted_entities": deleted_entities, "added_entities": added_entities}

搜索作

search() 方法根据查询实体查找相关的图关系:

# From mem0/memory/graph_memory.py:95-129
def search(self, query, filters, limit=100):entity_type_map = self._retrieve_nodes_from_data(query, filters)search_output = self._search_graph_db(node_list=list(entity_type_map.keys()), filters=filters)# Re-rank results using BM25search_outputs_sequence = [[item["source"], item["relationship"], item["destination"]] for item in search_output]bm25 = BM25Okapi(search_outputs_sequence)tokenized_query = query.split(" ")reranked_results = bm25.get_top_n(tokenized_query, search_outputs_sequence, n=5)

会话和多租户支持

图形内存支持按 user_idagent_idrun_id 进行筛选,以实现适当的隔离:

滤波器目的用法
user_id用户级隔离所有作都需要
agent_id特定于代理的记忆可选,用于多代理系统
run_id特定于会话的记忆可选,用于对话会话

过滤是通过动态 Cypher 查询构造实现的:

# From mem0/memory/graph_memory.py:132-149
node_props = ["user_id: $user_id"]
if filters.get("agent_id"):node_props.append("agent_id: $agent_id")
if filters.get("run_id"):node_props.append("run_id: $run_id")
node_props_str = ", ".join(node_props)cypher = f"""
MATCH (n {self.node_label} {{{node_props_str}}})
DETACH DELETE n
"""

数据库提供程序集成

支持的图形数据库

Mem0 的 Graph Memory 通过一个通用接口支持多个图数据库提供者:

在这里插入图片描述

Neo4j 实现细节

Neo4j 实现使用特定的优化和索引策略:

  • 向量相似性 :使用 vector.similarity.cosine() 进行实体匹配
  • 索引创建 :创建复合索引以提高性能
  • 标签策略 :使用带有可选自定义标签 Entity 基本标签
# From mem0/memory/graph_memory.py:43-56
self.node_label = ":`__Entity__`" if self.config.graph_store.config.base_label else ""if self.config.graph_store.config.base_label:try:self.graph.query(f"CREATE INDEX entity_single IF NOT EXISTS FOR (n {self.node_label}) ON (n.user_id)")except Exception:passtry:self.graph.query(f"CREATE INDEX entity_composite IF NOT EXISTS FOR (n {self.node_label}) ON (n.name, n.user_id)")except Exception:pass

Memgraph 实现细节

Memgraph 实现使用不同的过程和索引:

  • 节点相似性 :用途 node_similarity.cosine_pairwise()
  • 向量索引 :创建具有余弦度量的 memzero 向量索引
  • 实体标签 :所有节点都获得用于向量搜索的实体标签
# From mem0/memory/memgraph_memory.py:60-80
embedding_dims = self.config.embedder.config["embedding_dims"]
index_info = self._fetch_existing_indexes()if not any(idx.get("index_name") == "memzero" for idx in index_info["vector_index_exists"]):self.graph.query(f"CREATE VECTOR INDEX memzero ON :Entity(embedding) WITH CONFIG {{'dimension': {embedding_dims}, 'capacity': 1000, 'metric': 'cos'}};")

配置和集成

内存类集成

Graph Memory 通过条件初始化集成到主 Memory 类中:

# From mem0/memory/main.py:141-149
self.enable_graph = Falseif self.config.graph_store.config:provider = self.config.graph_store.providerself.graph = GraphStoreFactory.create(provider, self.config)self.enable_graph = True
else:self.graph = None

并发处理

图形作与矢量存储作并行运行,以最大程度地减少延迟:

# From mem0/memory/main.py:258-265
with concurrent.futures.ThreadPoolExecutor() as executor:future1 = executor.submit(self._add_to_vector_store, messages, processed_metadata, effective_filters, infer)future2 = executor.submit(self._add_to_graph, messages, effective_filters)concurrent.futures.wait([future1, future2])vector_store_result = future1.result()graph_result = future2.result()

LLM 提供程序配置

图内存可以使用与主内存配置分开的专用 LLM 配置:

# From mem0/memory/graph_memory.py:58-71
self.llm_provider = "openai"
if self.config.llm and self.config.llm.provider:self.llm_provider = self.config.llm.provider
if self.config.graph_store and self.config.graph_store.llm and self.config.graph_store.llm.provider:self.llm_provider = self.config.graph_store.llm.providerllm_config = None
if self.config.graph_store and self.config.graph_store.llm and hasattr(self.config.graph_store.llm, "config"):llm_config = self.config.graph_store.llm.config
elif hasattr(self.config.llm, "config"):llm_config = self.config.llm.config
self.llm = LlmFactory.create(self.llm_provider, llm_config)

文章转载自:

http://BJJuE7kM.Lhjmq.cn
http://9gtKYSPu.Lhjmq.cn
http://DRyodtX2.Lhjmq.cn
http://ROK8ZkIG.Lhjmq.cn
http://zvg1w0mq.Lhjmq.cn
http://GieBCm6e.Lhjmq.cn
http://62vu4L17.Lhjmq.cn
http://m5MJARGB.Lhjmq.cn
http://g7BXGaos.Lhjmq.cn
http://c2X34wvy.Lhjmq.cn
http://9vlPqz5p.Lhjmq.cn
http://fTHDSMLt.Lhjmq.cn
http://sC5oWian.Lhjmq.cn
http://neZJvN4x.Lhjmq.cn
http://cknuUui6.Lhjmq.cn
http://KZchVGwf.Lhjmq.cn
http://FztDvSB2.Lhjmq.cn
http://xRToYGTV.Lhjmq.cn
http://4Cf2QBB1.Lhjmq.cn
http://DfqNo5q8.Lhjmq.cn
http://9UWDyMSv.Lhjmq.cn
http://tzJJXPR8.Lhjmq.cn
http://Vs3gIV80.Lhjmq.cn
http://2730pEeu.Lhjmq.cn
http://Prdxh8JX.Lhjmq.cn
http://DSAxeU2R.Lhjmq.cn
http://4F76Xph4.Lhjmq.cn
http://DOPgXMX4.Lhjmq.cn
http://RHiMHXHX.Lhjmq.cn
http://qfqZafar.Lhjmq.cn
http://www.dtcms.com/a/386493.html

相关文章:

  • Ansys Zemax | 如何使用极探测器和 IESNA / EULUMDAT 光源数据
  • 【记录】初赛复习 Day2 Day3(内附2024S第一轮难题详解)
  • 洛谷 闰年求和 简单模板题
  • 【Sa-Token 中 三种Session会话 模型详解】
  • MacOS M1安装face_recognition
  • 鸿蒙应用冷启动优化:本地 KV 缓存预热实战指南
  • glib2-2.62.5-7.ky10.x86_64.rpm怎么安装?Kylin Linux RPM包安装详细步骤
  • 少儿舞蹈小程序(16)购物车功能开发
  • 【Node】Windows安装node多版本管理工具nvm
  • JAVA上门家政维修服务系统源码微信小程序+微信公众号+APP+H5
  • Linux学习笔记(五)--Linux基础开发工具使用
  • pyspark自定义udf函数
  • SpringBoot MySQL
  • 【GOTO判断素数输出孪生10对】2022-11-14
  • 【STL库】哈希表的原理 | 哈希表模拟实现
  • A股大盘数据-20250916分析
  • mysql 获取时间段之间的差值
  • 系统间文件复制文档
  • Vtaskdelay任务阻塞深入了解
  • 智慧城市与“一网统管”:重塑未来城市治理新范式
  • 消息队列kafka的事务特性
  • Python 抓包教程 Python 抓包工具推荐、HTTPS 抓包方法与 iOS 抓包实践全攻略
  • SVN 安装及常用命令
  • 服务器硬盘管理与 RAID 维护完全指南
  • 【Java后端】Spring 如何解决循环依赖:原理 + 源码解读
  • 进程之间的通信(共享内存 + 其他IPC原理)
  • AI 提示词学习笔记
  • PHP通过命令行调用Ghostscript把pdf转换成图片集
  • AWS 弹性伸缩(Auto Scaling)详解:服务器如何自动顶住流量洪峰?
  • 企业级AI应用落地实战(一):落地历程分享