From 264462b9774be6d915855116073d58cdaed3a3eb Mon Sep 17 00:00:00 2001 From: Windpicker-owo <3431391539@qq.com> Date: Thu, 6 Nov 2025 19:52:32 +0800 Subject: [PATCH] =?UTF-8?q?fix(vector=5Fstore):=20=E4=BF=AE=E5=A4=8D=20ids?= =?UTF-8?q?=20=E5=88=97=E8=A1=A8=E6=A3=80=E6=9F=A5=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E9=81=BF=E5=85=8D=20numpy=20=E6=95=B0=E7=BB=84?= =?UTF-8?q?=E6=AD=A7=E4=B9=89=20fix(memory=5Ftools):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=82=BB=E5=B1=85=E8=8A=82=E7=82=B9=E6=95=B0=E6=8D=AE=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E9=80=BB=E8=BE=91=EF=BC=8C=E7=A1=AE=E4=BF=9D=E5=B5=8C?= =?UTF-8?q?=E5=85=A5=E6=95=B0=E6=8D=AE=E6=9C=89=E6=95=88=20fix(manager):?= =?UTF-8?q?=20=E6=9B=B4=E6=96=B0=E9=85=8D=E7=BD=AE=E9=A1=B9=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=E4=B8=BA=20search=5Fmax=5Fexpand=5Fdepth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/memory_graph/manager.py | 2 +- src/memory_graph/storage/vector_store.py | 31 +++++++++++++++--------- src/memory_graph/tools/memory_tools.py | 6 +++-- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/memory_graph/manager.py b/src/memory_graph/manager.py index 72c15ef46..d80d08616 100644 --- a/src/memory_graph/manager.py +++ b/src/memory_graph/manager.py @@ -137,7 +137,7 @@ class MemoryManager: graph_store=self.graph_store, persistence_manager=self.persistence, embedding_generator=self.embedding_generator, - max_expand_depth=getattr(self.config, 'max_expand_depth', 1), # 从配置读取默认深度 + max_expand_depth=getattr(self.config, 'search_max_expand_depth', 1), # 从配置读取默认深度 ) self._initialized = True diff --git a/src/memory_graph/storage/vector_store.py b/src/memory_graph/storage/vector_store.py index 9d5b92695..ff5d433d4 100644 --- a/src/memory_graph/storage/vector_store.py +++ b/src/memory_graph/storage/vector_store.py @@ -210,15 +210,19 @@ class VectorStore: import orjson similar_nodes = [] # 修复:检查 ids 列表长度而不是直接判断真值(避免 numpy 数组歧义) - if results.get("ids") is not None and len(results["ids"]) > 0 and len(results["ids"][0]) > 0: - for i, node_id in enumerate(results["ids"][0]): + ids = results.get("ids") + if ids is not None and len(ids) > 0 and len(ids[0]) > 0: + distances = results.get("distances") + metadatas = results.get("metadatas") + + for i, node_id in enumerate(ids[0]): # ChromaDB 返回的是距离,需要转换为相似度 # 余弦距离: distance = 1 - similarity - distance = results["distances"][0][i] if results["distances"] else 0.0 # type: ignore + distance = distances[0][i] if distances is not None and len(distances) > 0 else 0.0 # type: ignore similarity = 1.0 - distance if similarity >= min_similarity: - metadata = results["metadatas"][0][i] if results["metadatas"] else {} # type: ignore + metadata = metadatas[0][i] if metadatas is not None and len(metadatas) > 0 else {} # type: ignore # 解析 JSON 字符串回列表/字典 for key, value in list(metadata.items()): @@ -368,13 +372,18 @@ class VectorStore: try: result = self.collection.get(ids=[node_id], include=["metadatas", "embeddings"]) - # 修复:检查 ids 列表长度而不是直接判断真值(避免 numpy 数组歧义) - if result and result.get("ids") is not None and len(result["ids"]) > 0: - return { - "id": result["ids"][0], - "metadata": result["metadatas"][0] if result["metadatas"] else {}, - "embedding": np.array(result["embeddings"][0]) if result["embeddings"] else None, - } + # 修复:直接检查 ids 列表是否非空(避免 numpy 数组的布尔值歧义) + if result is not None: + ids = result.get("ids") + if ids is not None and len(ids) > 0: + metadatas = result.get("metadatas") + embeddings = result.get("embeddings") + + return { + "id": ids[0], + "metadata": metadatas[0] if metadatas is not None and len(metadatas) > 0 else {}, + "embedding": np.array(embeddings[0]) if embeddings is not None and len(embeddings) > 0 and embeddings[0] is not None else None, + } return None diff --git a/src/memory_graph/tools/memory_tools.py b/src/memory_graph/tools/memory_tools.py index fddc151b0..e8b600540 100644 --- a/src/memory_graph/tools/memory_tools.py +++ b/src/memory_graph/tools/memory_tools.py @@ -910,10 +910,12 @@ class MemoryTools: continue neighbor_vector_data = await self.vector_store.get_node_by_id(neighbor_id) - if not neighbor_vector_data or neighbor_vector_data.get("embedding") is None: + if neighbor_vector_data is None: continue - neighbor_embedding = neighbor_vector_data["embedding"] + neighbor_embedding = neighbor_vector_data.get("embedding") + if neighbor_embedding is None: + continue # 计算语义相似度 semantic_sim = self._cosine_similarity(