在传统的开发场景中,我们习惯于使用 SQL 进行关键字检索。但在大语言模型(LLM)驱动的 RAG(检索增强生成) 架构中,我们需要的是语义搜索。
向量数据库(Vector Store) 正是为此而生:它将文本转换为高维向量,通过计算向量间的“相似度”来寻找答案,而非死板的字面匹配。
一、 为什么需要向量数据库?
传统数据库(如 MySQL)擅长精确匹配,但在处理“意思相近但用词不同”的情况时显得力不从心。向量数据库的核心逻辑是:
- 向量化:将非结构化数据(文本、图像)转化为数学上的高维向量。
- 相似度搜索:给定一个查询向量,在海量库中快速找到距离最近(最相似)的向量并返回。
目前主流的向量数据库包括 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)
如何选择?
| 维度 | Chroma | Faiss |
|---|---|---|
| 数据规模 | 中小型数据、本地原型 | 海量数据(百万/千万级) |
| 硬件支持 | 侧重 CPU/本地存储 | 完美支持 GPU 加速 |
| 易用性 | 开箱即用,API 简单 | 需要手动管理索引结构,门槛略高 |
| 功能集成 | 支持过滤、复杂管理 | 专注于核心检索速度 |
五、 总结
- 如果你是初学者或快速构建 Demo,Chroma 是不二之选,它与 LangChain 集成度最高,操作直观。
- 如果你追求极致性能或处理海量特征向量,则应选择 Faiss,并结合 GPU 加速来实现毫秒级响应。