向量数据库:LLM时代的基础设施
--- title: "向量数据库:LLM时代的基础设施" description: "深入理解向量数据库的核心原理、应用场景以及主流解决方案,掌握RAG系统的关键组件" tags: ["向量数据库", "向量检索", "相似度搜索", "RAG"] category: "llm" icon: "🧠"
向量数据库:LLM时代的基础设施
什么是向量数据库
向量数据库是一种专门用于存储、管理和检索高维向量数据的数据库系统。在大语言模型时代,向量数据库成为连接非结构化数据与AI应用的关键桥梁。它通过将文本、图像等数据转换为高维向量表示,实现语义级别的相似性搜索。
传统数据库基于精确匹配进行查询,而向量数据库则通过计算向量间的距离来找到语义上最相似的结果。例如,搜索"如何学习Python"时,向量数据库能够返回"Python入门教程"、"Python学习路线"等语义相关的内容,即使这些文本不包含完全相同的关键词。
核心原理
向量嵌入
向量嵌入是将高维数据映射到低维连续向量空间的过程。使用Embedding模型(如OpenAI的text-embedding-ada-002或开源的sentence-transformers),可以将文本转换为固定长度的数值向量:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
sentences = ["向量数据库是AI应用的基础", "相似度搜索是核心功能"]
embeddings = model.encode(sentences)
print(embeddings.shape) # (2, 384)
相似度度量
向量数据库支持多种距离计算方式:
- 余弦相似度:衡量向量方向的相似性,值域为[-1, 1]
- 欧氏距离:计算向量间的直线距离
- 点积:考虑向量长度的相似度计算
- 汉明距离:用于二进制向量的比较
import numpy as np
def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
索引结构
为了实现高效的近似最近邻(ANN)搜索,向量数据库采用多种索引算法:
- HNSW(分层可导航小世界图):构建多层图结构,查询时从顶层开始逐层下降
- IVF(倒排文件索引):将向量空间划分为多个聚类,查询时只搜索最近的聚类
- PQ(乘积量化):通过量化压缩向量,在精度和效率间取得平衡
主流向量数据库对比
Chroma
轻量级开源向量数据库,适合快速原型开发。支持Python原生API,集成简单:
import chromadb
client = chromadb.Client()
collection = client.create_collection("my_collection")
collection.add(
documents=["文档1内容", "文档2内容"],
ids=["doc1", "doc2"]
)
results = collection.query(query_texts=["查询文本"], n_results=2)
Pinecone
全托管的云原生向量数据库,支持实时索引和自动扩缩容。提供毫秒级查询延迟,适合生产环境:
import pinecone
pinecone.init(api_key="YOUR_API_KEY", environment="us-west1-gcp")
index = pinecone.Index("my-index")
index.upsert(vectors=[("id1", embedding.tolist(), {"metadata": "value"})])
results = index.query(vector=query_embedding.tolist(), top_k=5)
Weaviate
开源的AI原生向量数据库,支持混合搜索(向量+关键词)。内置多种向量izer模块:
import weaviate
client = weaviate.Client("http://localhost:8080")
result = client.query.get("Article", ["title", "content"])
.with_near_text({"concepts": ["人工智能"]})
.with_limit(5)
.do()
RAG系统中的应用
向量数据库是检索增强生成(RAG)系统的核心组件。典型流程:
- 文档处理:将文档分块并转换为向量
- 索引构建:将向量存入向量数据库
- 查询检索:根据用户问题检索最相关的文档块
- 生成回答:将检索结果作为上下文输入LLM
# 简单的RAG检索流程
def rag_retrieve(query, vector_db, top_k=3):
query_embedding = embed_model.encode(query)
results = vector_db.search(query_embedding, top_k=top_k)
context = "\n".join([r.text for r in results])
return context
性能优化建议
- 选择合适的索引类型:HNSW适合高精度场景,IVF+PQ适合大规模数据
- 优化分块策略:保持块大小在200-1000 token之间
- 使用元数据过滤:结合结构化字段缩小搜索范围
- 定期更新索引:保持数据的时效性
向量数据库作为LLM应用的基础设施,将持续演进以满足更复杂的AI应用需求。