向量存储:Chroma 与 FAISS
创建并持久化向量存储、相似度搜索、MMR 检索和混合搜索。
向量存储:Chroma 与 FAISS 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。
什么是向量存储
向量存储保存嵌入后的分块,并找出与查询向量最相似的分块。它是 RAG 的核心搜索引擎。两个常用的选择是 Chroma 和 FAISS。
pip install langchain-chroma faiss-cpu创建 Chroma 存储
Chroma.from_documents 会在一次调用中为您的分块创建嵌入并建立索引。传入文档和嵌入对象即可。Chroma 会返回一个可以立即进行搜索的存储。
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
db = Chroma.from_documents(chunks, embeddings)将 Chroma 持久化到磁盘
传入 persist_directory,即可将索引保存到磁盘,并在重启后继续使用。之后使用相同的目录和嵌入对象构造 Chroma,即可重新加载索引,避免重复创建嵌入的成本。
db = Chroma.from_documents(
chunks, embeddings,
persist_directory="./chroma_db"
)
# Reload later
db = Chroma(persist_directory="./chroma_db", embedding_function=embeddings)相似性搜索
使用 similarity_search(query, k=4) 进行查询。它会为查询创建嵌入,找出距离最近的 k 个分块,并将它们作为文档返回。k 控制检索的段落数量。
results = db.similarity_search("How do I reset my password?", k=4)
for doc in results:
print(doc.page_content[:80])获取搜索分数
使用 similarity_search_with_score,还可以获取每个结果的距离分数。距离越小,表示越相似。分数可以帮助您在将结果发送给 LLM 之前筛除较弱的匹配项。
pairs = db.similarity_search_with_score("password reset", k=4)
for doc, score in pairs:
print(round(score, 3), doc.page_content[:60])认识 FAISS
FAISS(Facebook 人工智能相似性搜索)是一个高性能向量搜索库。它速度极快且内存效率高,非常适合在不使用独立服务器的情况下构建大型本地索引。
创建 FAISS 存储
它的 API 与 Chroma 相似:FAISS.from_documents 会建立索引。FAISS 会将索引保存在内存中,因此非常适合读取密集型的进程内搜索。
from langchain_community.vectorstores import FAISS
db = FAISS.from_documents(chunks, embeddings)
results = db.similarity_search("refund policy", k=3)保存和加载 FAISS
使用 save_local 持久化 FAISS 索引,并使用 load_local 重新加载。由于索引使用 pickle,重新加载时必须设置 allow_dangerous_deserialization=True。
db.save_local("faiss_index")
db = FAISS.load_local(
"faiss_index", embeddings,
allow_dangerous_deserialization=True
)相关性与多样性
普通相似性搜索可能返回四个几乎完全相同的分块。有时您希望结果多样化,能够覆盖答案的不同方面。这正是 MMR 发挥作用的地方。
MMR 检索
最大边际相关性(MMR)会在相关性和多样性之间取得平衡,选择相关但不重复的分块。请通过检索器接口使用 search_type="mmr"。
retriever = db.as_retriever(
search_type="mmr",
search_kwargs={"k": 4, "fetch_k": 20}
)
docs = retriever.invoke("password reset")选择 Chroma 还是 FAISS
Chroma 使用方便、支持持久化,适合原型和小型应用。FAISS 在大规模场景下速度更快,适合内存中的搜索。两者都提供 similarity_search 和 as_retriever,因此切换十分容易。
快速检查
测试您对向量存储的理解。
回顾:Chroma 与 FAISS
您使用 Chroma.from_documents(配合 persist_directory)和 FAISS.from_documents 构建了向量存储,使用 similarity_search(query, k=4) 进行搜索,并保存和加载了两者。您还结合 as_retriever 和 MMR 获取多样化结果,并学会了在不同情况下选择合适的存储。
常见问题解答
「向量存储:Chroma 与 FAISS」课时是免费的吗?
是的 — 「向量存储:Chroma 与 FAISS」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。
「向量存储:Chroma 与 FAISS」这节课中我会学到什么?
创建并持久化向量存储、相似度搜索、MMR 检索和混合搜索。 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn AI with Python 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「向量存储:Chroma 与 FAISS」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn AI with Python 课中编写并运行代码吗?
能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- LangChain 架构与 LCEL
- 文档加载、拆分与嵌入
- 向量存储:Chroma 与 FAISS
- 端到端构建 RAG 问答系统