3.3 向量数据库实现 — Agent记忆系统设计 本节导读:深入理解向量数据库在记忆系统中的应用,学习如何高效存储和检索向量数据,实现语义搜索和相似性匹配。 学习目标 掌握向量数据库的基本原理和选型方法 学会使用Qdrant进行向量存储和检索 理解向量嵌入和相似度计算算法 实现向量化的记忆搜索功能 核心概念 向量数据库是记忆系统的关键组件,专门用于处理高维向量数据的存储和检索。在记忆系统中,向量数据库承担着语义搜索、相似性匹配、推荐系统等重要功能,将非结构化的文本信息转化为可计算的向量表示。
本节导读:深入理解向量数据库在记忆系统中的应用,学习如何高效存储和检索向量数据,实现语义搜索和相似性匹配。
向量数据库是记忆系统的关键组件,专门用于处理高维向量数据的存储和检索。在记忆系统中,向量数据库承担着语义搜索、相似性匹配、推荐系统等重要功能,将非结构化的文本信息转化为可计算的向量表示。
首先搭建Qdrant向量数据库环境,为记忆系统提供向量存储能力。
# Qdrant环境搭建 import qdrant_client from qdrant_client.http import models from qdrant_client.http.models import Distance, VectorParams import os import subprocess import time class QdrantManager: def __init__(self, host='localhost', port=6333): self.host = host self.port = port self.client = None def setup_local_qdrant(self): """搭建本地Qdrant实例""" try: # 使用Docker启动Qdrant docker_command = [ 'docker', 'run', '-d', '--name', 'qdrant-memory', '-p', f'{self.port}:{self.port}', 'qdrant/qdrant:latest' ] result = subprocess.run(docker_command, capture_output=True, text=True) if result.returncode == 0: print("Qdrant容器启动成功") # 等待服务启动 time.sleep(10) return self.connect() else: print(f"Docker启动失败: {result.stderr}") return False except Exception as e: print(f"环境搭建失败: {e}") return False def connect(self): """连接到Qdrant""" try: self.client = qdrant_client.QdrantClient( host=self.host, port=self.port ) # 测试连接 collections = self.client.get_collections() print("Qdrant连接成功") return True except Exception as e: print(f"连接失败: {e}") return False def create_memory_collection(self): """创建记忆向量集合""" try: collection_name = "memory_vectors" # 检查集合是否已存在 try: self.client.get_collection(collection_name) print(f"集合 {collection_name} 已存在") return True except: pass # 创建新的向量集合 self.client.create_collection( collection_name=collection_name, vectors_config=VectorParams( size=1536, # OpenAI embedding维度 distance=Distance.COSINE ), optimizers_config=models.OptimizersConfigDiff( indexing_threshold=20000 ), hnsw_config=models.HnswConfigDiff( m=16, # 连接数 ef=64 # 搜索时考虑的候选数 ) ) print(f"集合 {collection_name} 创建成功") return True except Exception as e: print(f"集合创建失败: {e}") return False # 使用示例 qdrant_manager = QdrantManager() qdrant_manager.setup_local_qdrant() qdrant_manager.create_memory_collection()
实现文本到向量的转换,为记忆条目生成向量表示。
# 向量嵌入生成 import numpy as np from typing import List, Dict, Optional import openai from sentence_transformers import SentenceTransformer class MemoryEmbeddingGenerator: def __init__(self, model_name='all-MiniLM-L6-v2'): self.model_name = model_name self.local_model = None self.openai_api_key = None def setup_local_model(self): """设置本地嵌入模型""" try: self.local_model = SentenceTransformer(self.model_name) print(f"本地模型 {self.model_name} 加载成功") return True except Exception as e: print(f"本地模型加载失败: {e}") return False def generate_embedding_local(self, text: str) -> List[float]: """使用本地模型生成嵌入""" if not self.local_model: raise ValueError("请先设置本地模型") try: embedding = self.local_model.encode(text) return embedding.tolist() except Exception as e: print(f"本地嵌入生成失败: {e}") raise e def calculate_similarity(self, embedding1: List[float], embedding2: List[float]) -> float: """计算两个向量的余弦相似度""" try: vec1 = np.array(embedding1) vec2 = np.array(embedding2) dot_product = np.dot(vec1, vec2) norm1 = np.linalg.norm(vec1) norm2 = np.linalg.norm(vec2) if norm1 == 0 or norm2 == 0: return 0.0 similarity = dot_product / (norm1 * norm2) return float(similarity) except Exception as e: print(f"相似度计算失败: {e}") return 0.0 # 使用示例 embedding_generator = MemoryEmbeddingGenerator() embedding_generator.setup_local_model() # 生成嵌入 text = "Python是一种高级编程语言" embedding = embedding_generator.generate_embedding_local(text) print(f"生成向量维度: {len(embedding)}")
实现记忆条目的向量存储和检索功能。
# 向量数据库操作实现 class MemoryVectorRepository: def __init__(self, qdrant_client, collection_name="memory_vectors"): self.client = qdrant_client self.collection_name = collection_name def add_memory_vector(self, memory_id: str, text: str, embedding: List[float], metadata: Dict = None) -> bool: """添加记忆向量""" try: point_id = f"memory_{memory_id}" point = models.PointStruct( id=point_id, vector=embedding, payload={ "memory_id": memory_id, "text": text, "metadata": metadata or {}, "created_at": self._get_current_time(), "type": "memory_vector" } ) # 批量添加点 self.client.upsert( collection_name=self.collection_name, points=[point] ) return True except Exception as e: print(f"添加记忆向量失败: {e}") return False def search_similar_memories(self, query_embedding: List[float], limit: int = 10, score_threshold: float = 0.7) -> List[Dict]: """搜索相似记忆""" try: search_result = self.client.search( collection_name=self.collection_name, query_vector=query_embedding, limit=limit, score_threshold=score_threshold, with_payload=True, search_filter=models.Filter( must=[models.FieldCondition( key="type", match=models.MatchValue(value="memory_vector") )] ) ) # 转换结果 results = [] for point in search_result: results.append({ "memory_id": point.payload["memory_id"], "text": point.payload["text"], "score": point.score, "metadata": point.payload["metadata"], "created_at": point.payload["created_at"] }) return results except Exception as e: print(f"搜索相似记忆失败: {e}") return [] # 使用示例 qdrant_client = qdrant_client.QdrantClient(host='localhost', port=6333) vector_repo = MemoryVectorRepository(qdrant_client) # 添加记忆向量 memory_data = { 'memory_id': 'test_memory_001', 'text': 'Python是一种强大的编程语言', 'embedding': embedding_generator.generate_embedding_local( 'Python是一种强大的编程语言' ), 'metadata': {'category': 'programming', 'importance': 0.8} } success = vector_repo.add_memory_vector( memory_data['memory_id'], memory_data['text'], memory_data['embedding'], memory_data['metadata'] ) print(f"添加记忆向量: {'成功' if success else '失败'}")
# 完整的记忆系统向量数据库实现 class MemoryVectorSystem: def __init__(self, qdrant_config): self.qdrant_client = qdrant_client.QdrantClient( host=qdrant_config['host'], port=qdrant_config['port'] ) self.embedding_generator = MemoryEmbeddingGenerator() self.embedding_generator.setup_local_model() self.vector_repo = MemoryVectorRepository(self.qdrant_client) def initialize_system(self): """初始化系统""" self.vector_repo.client.create_collection( collection_name="memory_vectors", vectors_config=VectorParams( size=384, distance=Distance.COSINE ) ) print("记忆向量系统初始化完成") def add_memory(self, memory_data: Dict) -> str: """添加记忆到向量数据库""" text = memory_data['content'] embedding = self.embedding_generator.generate_embedding_local(text) metadata = { 'title': memory_data.get('title', ''), 'category': memory_data.get('category', ''), 'type': memory_data.get('type', 'fact'), 'importance': memory_data.get('importance', 0.5) } success = self.vector_repo.add_memory_vector( memory_data['memory_id'], text, embedding, metadata ) if success: return memory_data['memory_id'] else: raise Exception("记忆添加失败") def search_memories(self, query_text: str, limit: int = 10) -> List[Dict]: """搜索相似记忆""" query_embedding = self.embedding_generator.generate_embedding_local(query_text) return self.vector_repo.search_similar_memories(query_embedding, limit=limit) # 使用示例 memory_vector_system = MemoryVectorSystem({'host': 'localhost', 'port': 6333}) memory_vector_system.initialize_system() # 添加记忆 memory_data = { 'memory_id': 'memory_001', 'title': 'Python函数', 'content': 'Python函数是代码重用的基本单位', 'category': 'programming', 'type': 'fact', 'importance': 0.9 } memory_vector_system.add_memory(memory_data) # 搜索记忆 results = memory_vector_system.search_memories("如何定义函数", limit=5) print(f"搜索结果数量: {len(results)}")
A:选择嵌入模型时需要考虑以下因素:
A:优化向量数据库性能的策略:
A:应对大规模数据的策略:
A:保证搜索准确性的方法:
A:制定完善的备份策略:
本节详细介绍了向量数据库在记忆系统中的实现方法。通过Qdrant的搭建、嵌入模型的集成和向量检索的实现,我们构建了一个强大的语义搜索系统。向量数据库让记忆系统具备了理解语义和进行智能匹配的能力,大大提升了系统的智能化水平。
在下一节中,我们将探讨缓存系统的实现,为记忆系统提供高性能的数据访问能力。
关键词:Agent记忆系统设计, 向量数据库实现, Qdrant, 语义搜索, 相似性匹配
难度:进阶
预计阅读:35 分钟