向量数据库实战案例
本文档提供了多个完整的向量数据库实战案例,帮助您从零开始构建向量数据库应用。
案例1:文档检索系统
项目概述
构建一个基于向量数据库的文档检索系统,能够快速检索相似文档。
技术栈
- 向量数据库:ChromaDB
- 嵌入模型:sentence-transformers
- 框架:Python + FastAPI
实施步骤
步骤1:环境准备
pip install chromadb sentence-transformers fastapi uvicorn
步骤2:创建向量数据库
import chromadb
from sentence_transformers import SentenceTransformer
from chromadb.config import Settings
# 初始化ChromaDB
client = chromadb.Client(Settings(
chroma_db_impl="duckdb+parquet",
persist_directory="./chroma_db"
))
# 创建集合
collection = client.create_collection(
name="documents",
metadata={"hnsw:space": "cosine"}
)
# 加载嵌入模型
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
步骤3:添加文档
def add_documents(documents, collection, model):
"""添加文档到向量数据库"""
# 生成嵌入向量
embeddings = model.encode(documents).tolist()
# 生成ID
ids = [f"doc_{i}" for i in range(len(documents))]
# 添加到集合
collection.add(
embeddings=embeddings,
documents=documents,
ids=ids
)
print(f"已添加 {len(documents)} 个文档")
# 使用示例
documents = [
"人工智能是计算机科学的一个分支",
"机器学习是人工智能的一个子领域",
"深度学习使用神经网络进行学习",
"自然语言处理是AI的重要应用领域"
]
add_documents(documents, collection, model)
步骤4:检索文档
def search_documents(query, collection, model, n_results=3):
"""检索相似文档"""
# 生成查询向量
query_embedding = model.encode([query]).tolist()
# 搜索
results = collection.query(
query_embeddings=query_embedding,
n_results=n_results,
include=["documents", "distances", "metadatas"]
)
return results
# 使用示例
query = "什么是机器学习?"
results = search_documents(query, collection, model)
print(f"查询: {query}")
print("\n检索结果:")
for i, (doc, distance) in enumerate(zip(results['documents'][0], results['distances'][0])):
print(f"{i+1}. {doc} (相似度: {1-distance:.4f})")
案例2:RAG知识库系统
项目概述
构建一个RAG(检索增强生成)知识库系统,结合向量数据库和LLM。
实施步骤
from langchain.vectorstores import Chroma
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.llms import OpenAI
from langchain.chains import RetrievalQA
# 初始化嵌入模型
embeddings = HuggingFaceEmbeddings(
model_name="paraphrase-multilingual-MiniLM-L12-v2"
)
# 加载文档
from langchain.document_loaders import TextLoader
loader = TextLoader("knowledge_base.txt")
documents = loader.load()
# 分割文档
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
texts = text_splitter.split_documents(documents)
# 创建向量数据库
vectorstore = Chroma.from_documents(
documents=texts,
embedding=embeddings,
persist_directory="./chroma_db"
)
# 创建检索链
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(search_kwargs={"k": 3})
)
# 使用示例
query = "如何使用向量数据库?"
answer = qa_chain.run(query)
print(f"问题: {query}")
print(f"答案: {answer}")