深度解析向量数据库:从核心原理到 Chroma 与 Faiss 实战指南

48 阅读3分钟

在传统的开发场景中,我们习惯于使用 SQL 进行关键字检索。但在大语言模型(LLM)驱动的 RAG(检索增强生成) 架构中,我们需要的是语义搜索

向量数据库(Vector Store) 正是为此而生:它将文本转换为高维向量,通过计算向量间的“相似度”来寻找答案,而非死板的字面匹配。


一、 为什么需要向量数据库?

传统数据库(如 MySQL)擅长精确匹配,但在处理“意思相近但用词不同”的情况时显得力不从心。向量数据库的核心逻辑是:

  1. 向量化:将非结构化数据(文本、图像)转化为数学上的高维向量。
  2. 相似度搜索:给定一个查询向量,在海量库中快速找到距离最近(最相似)的向量并返回。

目前主流的向量数据库包括 Chroma(LangChain 官方主推)、Faiss(Meta 出品,高性能)、Milvus 等。


二、 Chroma 实战:从加载到 RAG 生成

Chroma 是一个开源、易用且功能丰富的向量数据库,非常适合快速原型开发。

1. 环境准备

pip install langchain-chroma

2. 核心操作流程

以下展示了从加载文档到最终调用大模型生成答案的完整链路。

from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.embeddings import BaichuanTextEmbeddings
from langchain_community.vectorstores import Chroma

# 第一步:加载与分块
raw_documents = TextLoader('sora.txt', encoding="utf-8").load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=20)
documents = text_splitter.split_documents(raw_documents)

# 第二步:向量化(以百川模型为例)
embeddings_model = BaichuanTextEmbeddings(api_key="your_api_key")

# 第三步:存储并持久化
db = Chroma.from_documents(documents, embeddings_model, persist_directory="./chroma_db")

# 第四步:相似性检索
query = "什么是Sora"
docs = db.similarity_search(query, k=2) # 返回最相关的2个片段

3. 加入 RAG 生成阶段

将检索到的上下文(Context)喂给 LLM,生成最终答案:

from langchain.chat_models import ChatOpenAI

# 获取检索到的第一个片段
context_str = docs[0].page_content

# 构建 Prompt
template = f"参考信息:{context_str}\n问题:{query}\n你的回答:"

# 调用 LLM(以 DeepSeek 为例)
llm = ChatOpenAI(
    model="deepseek-chat",
    api_key="sk-xxx", 
    base_url="https://api.deepseek.com"
)
response = llm.invoke(template)
print(response.content)

从磁盘加载向量数据库

db3 = Chroma(persist_directory="./chroma_db", embeddings_model)
docs = db3.similarity_search(query)
print(docs[0].page_content)

三、 高阶管理:更新与删除

在生产环境中,我们需要对向量库进行增删改查。这需要通过 ids 来标识每个 Chunk。

Python

import uuid

# 1. 为每个分块分配唯一 ID
ids = [str(uuid.uuid4()) for _ in documents]
new_db = Chroma.from_documents(documents, embeddings_model, ids=ids)

# 2. 更新文档
new_db.update_document(ids[0], docs[0])

# 3. 统计与删除
print(f"当前 Chunk 总数: {new_db._collection.count()}")
new_db._collection.delete(ids=[ids[-1]]) # 删除最后一个片段

四、 进阶选型:Faiss vs Chroma

Faiss (Facebook AI Similarity Search) 是由 Meta 开发的高性能向量搜索工具。

  • 安装pip install -U faiss-cpu (或 faiss-gpu)

  • 代码实现:与 Chroma 基本一致,仅类名切换。

    from langchain_community.vectorstores import FAISS
    db = FAISS.from_documents(docs, embeddings_model)
    

如何选择?

维度ChromaFaiss
数据规模中小型数据、本地原型海量数据(百万/千万级)
硬件支持侧重 CPU/本地存储完美支持 GPU 加速
易用性开箱即用,API 简单需要手动管理索引结构,门槛略高
功能集成支持过滤、复杂管理专注于核心检索速度

五、 总结

  • 如果你是初学者或快速构建 DemoChroma 是不二之选,它与 LangChain 集成度最高,操作直观。
  • 如果你追求极致性能或处理海量特征向量,则应选择 Faiss,并结合 GPU 加速来实现毫秒级响应。