Skip to content

Vector Stores 向量存储

向量存储(Vector Store)是 LangChain 中用于存储和检索向量嵌入的组件。它将文档的嵌入向量与原始内容一起存储,并提供高效的相似性搜索功能,是 RAG 系统的核心基础设施。

概述

向量存储的工作流程:

文本 → 嵌入模型 → 向量 → 存入向量存储
查询 → 嵌入模型 → 查询向量 → 相似性搜索 → 返回相似文档
python
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_openai import OpenAIEmbeddings

# 初始化嵌入模型
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

# 创建向量存储
vector_store = InMemoryVectorStore(embeddings)

常用向量存储

InMemoryVectorStore(内存存储)

内存向量存储,适用于原型开发和小数据集:

python
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vector_store = InMemoryVectorStore(embeddings)

# 添加文档
vector_store.add_texts(
    texts=["LangChain 是一个 LLM 框架", "文档加载器用于加载数据"],
    metadatas=[{"source": "doc1"}, {"source": "doc2"}]
)

# 相似性搜索
results = vector_store.similarity_search("LangChain 是什么", k=2)
for doc in results:
    print(doc.page_content, doc.metadata)

Chroma

Chroma 是一个开源向量数据库,适合中小规模应用:

python
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

# 创建 Chroma 向量存储
vector_store = Chroma(
    collection_name="my_collection",
    embedding_function=embeddings,
    persist_directory="./chroma_db"  # 持久化目录
)

# 添加文档
vector_store.add_texts(
    texts=["文档内容一", "文档内容二"],
    metadatas=[{"chapter": 1}, {"chapter": 2}]
)

# 搜索
results = vector_store.similarity_search("查询内容", k=3)

# 持久化存储
vector_store.persist()

FAISS

FAISS(Facebook AI Similarity Search)是 Meta 开发的高效相似性搜索库:

python
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

# 从文本创建
vector_store = FAISS.from_texts(
    texts=["文档一", "文档二", "文档三"],
    embedding=embeddings,
    metadatas=[{"id": 1}, {"id": 2}, {"id": 3}]
)

# 保存到本地
vector_store.save_local("faiss_index")

# 从本地加载
loaded_store = FAISS.load_local(
    "faiss_index",
    embeddings,
    allow_dangerous_deserialization=True
)

Pinecone(云向量数据库)

适用于生产级大规模应用:

python
from langchain_pinecone import PineconeVectorStore
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

vector_store = PineconeVectorStore(
    index_name="my-index",
    embedding=embeddings,
    pinecone_api_key="YOUR_API_KEY"
)

# 添加文档
vector_store.add_texts(
    texts=["云上存储的文档"],
    metadatas={"project": "demo"}
)

Milvus

python
from langchain_milvus import Milvus
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()

vector_store = Milvus(
    embedding_function=embeddings,
    collection_name="LangChainCollection",
    connection_args={"host": "localhost", "port": "19530"}
)

Qdrant

python
from langchain_qdrant import QdrantVectorStore
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()

vector_store = QdrantVectorStore(
    url="http://localhost:6333",
    collection_name="my_collection",
    embedding=embeddings
)

核心操作

添加文档

python
# 方式一:添加文本
vector_store.add_texts(
    texts=["文档一", "文档二"],
    ids=["id1", "id2"],
    metadatas=[{"source": "a"}, {"source": "b"}]
)

# 方式二:从 Document 对象创建
from langchain_core.documents import Document

docs = [
    Document(page_content="内容一", metadata={"id": 1}),
    Document(page_content="内容二", metadata={"id": 2}),
]
vector_store.add_documents(docs)

相似性搜索

python
# 基本相似性搜索
docs = vector_store.similarity_search("查询文本", k=5)

# 带分数的相似性搜索
docs_with_scores = vector_store.similarity_search_with_score(
    "查询文本", k=5
)
for doc, score in docs_with_scores:
    print(f"分数: {score:.4f}, 内容: {doc.page_content[:50]}")

# 向量相似性搜索(直接使用向量)
query_vector = embeddings.embed_query("查询文本")
docs = vector_store.similarity_search_by_vector(query_vector, k=5)

过滤(元数据过滤)

python
# Chroma 过滤
results = vector_store.similarity_search(
    "查询",
    k=3,
    filter={"source": "技术文档"}
)

# FAISS 过滤
results = vector_store.similarity_search(
    "查询",
    k=3,
    filter=lambda meta: meta["chapter"] > 2
)

删除文档

python
vector_store.delete(ids=["id1", "id2"])

完整示例:文档索引与检索

python
from langchain_community.document_loaders import DirectoryLoader, TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS

# 1. 加载文档
loader = DirectoryLoader(
    "./docs/",
    glob="**/*.txt",
    loader_cls=TextLoader,
    show_progress=True
)
documents = loader.load()

# 2. 分割文档
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50
)
chunks = text_splitter.split_documents(documents)

# 3. 初始化和构建向量存储
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vector_store = FAISS.from_documents(chunks, embeddings)

# 4. 保存索引
vector_store.save_local("docs_index")

# 5. 检索
query = "什么是 RecursiveCharacterTextSplitter"
results = vector_store.similarity_search_with_score(query, k=3)

print(f"查询: {query}\n")
for i, (doc, score) in enumerate(results):
    print(f"结果 {i+1} (相似度: {score:.4f}):")
    print(f"  内容: {doc.page_content[:100]}...")
    print(f"  来源: {doc.metadata.get('source', 'unknown')}")
    print()

向量存储选择指南

存储场景特点
InMemoryVectorStore原型/小数据集无需外部服务,速度快
Chroma中小型项目开源,本地持久化
FAISS单机高效检索Meta 出品,性能优秀
Pinecone生产级大规模云服务,托管运维
Milvus企业级大规模分布式,功能丰富
Qdrant生产级部署性能好,Rust 实现
Weaviate云原生支持混合搜索

最佳实践

  1. 选择合适的向量存储:根据数据规模和预算选择合适的方案
  2. 元数据过滤:善用元数据过滤缩小搜索范围
  3. 持久化:生产环境务必持久化索引,避免重复构建
  4. 批量操作:大批量添加文档时使用批量 API
  5. 异步支持:使用异步版本提高并发性能
python
# 异步操作
await vector_store.asimilarity_search("异步查询", k=5)
await vector_store.aadd_documents(docs)

下一步

本站为非官方中文学习站点,不代表 LangChain 官方。部分内容参考官方文档并重新整理为中文学习笔记。