Day24:向量数据库 Chroma/FAISS 入门
引言:
上期咱们搞定了 Embedding 向量化,把文字变成了机器能懂的数字向量。但很多同学把向量生成后就 "乱扔",导致检索慢、找不到、甚至丢失! 今天咱们就给向量找个 "智能豪宅"------ 向量数据库!Chroma 新手友好,FAISS 性能炸裂,保姆级教程 + 完整代码,看完直接写进简历!
🎯 今日核心任务(人话翻译)
-
搞懂向量数据库:为什么不用 Excel 存向量?它到底牛在哪?
-
Chroma 入门实战:创建数据库→插入向量→智能检索,新手零压力
-
FAISS 初体验:感受一下什么叫 "闪电般的检索速度"
-
双版本代码:通义千问在线版,直接复制就能跑
🧠 一、向量数据库:大白话秒懂(拒绝晦涩)
❌ 劝退式定义(别看)
向量数据库是专门用于存储、索引、查询高维稠密向量的数据库系统,通过近似最近邻搜索(ANN)实现毫秒级检索...
✅ 人话版讲解(醍醐灌顶)
把向量数据库当成 "智能图书馆管理员":
-
普通数据库(MySQL/Excel):只会按 "书名" 找书,你问 "讲 LPR 利率的书在哪",它直接懵圈
-
向量数据库:不仅存书,还懂每本书的 "内容语义",你问 "讲 LPR 的书",它一秒给你找出最相关的 3 本!
核心优势:
-
毫秒级检索:百万级向量库,0.1 秒出结果
-
语义匹配:不是找关键词,是找 "意思最像" 的内容
-
自动索引:不用你手动建索引,它自动帮你优化
🛠️ 二、环境一键安装(复制即跑)
打开终端,执行命令:
shell
# 核心依赖:Chroma轻量向量库 + FAISS高性能向量库 + 通义千问
pip install langchain langchain-community chromadb faiss-cpu dashscope sentence-transformers -i https://pypi.tuna.tsinghua.edu.cn/simple/
-
chromadb:新手首选,轻量易上手 -
faiss-cpu:Facebook 开源,性能炸裂(有 N 卡可装faiss-gpu)
💻 三、实战一:Chroma 入门保姆级(新手闭眼冲)
Chroma 是 LangChain 官方推荐的新手向量库,零配置、开箱即用,适合学习和小规模项目。
完整代码(通义千问版)
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Day24:Chroma向量数据库入门实战(通义千问版)
import os
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.document_loaders import TextLoader
# ===================== 核心配置 =====================
os.environ["DASHSCOPE_API_KEY"] = "sk-你的通义千问API Key"
PERSIST_DIRECTORY = "./chroma_library" # 向量库存储路径(智能图书馆)
# ===================== 1. 准备"图书"(文档) =====================
# 加载测试文档(替换成你的LPR公告/金融知识)
loader = TextLoader("lpr_2026.txt", encoding="utf-8")
docs = loader.load()
# 智能分块(把厚书拆成薄册子)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=300,
chunk_overlap=50,
separators=["\n\n", "\n", "。", "!", "?"]
)
split_docs = text_splitter.split_documents(docs)
print(f"✅ 准备了{len(split_docs)}本"小书"")
# ===================== 2. 初始化"智能图书馆"(Chroma) =====================
print("🔧 正在建造智能图书馆...")
embedding = DashScopeEmbeddings(model="text-embedding-v3")
# 创建Chroma向量库,自动持久化到本地
vector_db = Chroma.from_documents(
documents=split_docs,
embedding=embedding,
persist_directory=PERSIST_DIRECTORY
)
vector_db.persist()
print("🎉 智能图书馆建造完成!向量已入库")
# ===================== 3. 智能检索(找书) =====================
print("\n" + "="*60)
user_question = "2026年3月的1年期LPR是多少?"
print(f"🤖 正在图书馆找书:{user_question}")
# 相似度搜索:找出最相关的3个文本块
results = vector_db.similarity_search(user_question, k=3)
print("\n📚 找到最相关的3本"小书":")
for i, doc in enumerate(results):
print(f"\n--- 第{i+1}本 ---\n{doc.page_content}")
print("="*60)
💻 四、实战二:FAISS 初体验(感受闪电速度)
FAISS 是 Facebook AI Research 开源的高性能向量库 ,检索速度是 Chroma 的 5-10 倍,适合百万级以上向量库。
完整代码(通义千问版)
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Day24:FAISS向量数据库初体验(通义千问版)
import os
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.document_loaders import TextLoader
# ===================== 核心配置 =====================
os.environ["DASHSCOPE_API_KEY"] = "sk-你的通义千问API Key"
FAISS_SAVE_PATH = "./faiss_index"
# ===================== 1. 文档加载+分块 =====================
docs = TextLoader("lpr_2026.txt", encoding="utf-8").load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=50)
split_docs = text_splitter.split_documents(docs)
# ===================== 2. FAISS向量库构建 =====================
print("⚡ 正在构建FAISS闪电向量库...")
embedding = DashScopeEmbeddings(model="text-embedding-v3")
vector_db = FAISS.from_documents(documents=split_docs, embedding=embedding)
# 保存FAISS索引到本地
vector_db.save_local(FAISS_SAVE_PATH)
print("🎉 FAISS闪电库构建完成!")
# ===================== 3. 闪电检索 =====================
user_question = "2026年3月的5年期LPR是多少?"
print(f"\n⚡ 闪电检索中:{user_question}")
results = vector_db.similarity_search(user_question, k=2)
print("\n📚 闪电找到结果:")
for i, doc in enumerate(results):
print(f"\n--- 结果{i+1} ---\n{doc.page_content}")
📊 五、Chroma vs FAISS:新手怎么选?
| 维度 | Chroma | FAISS |
|---|---|---|
| 上手难度 | ⭐ 超级简单,零配置 | ⭐⭐⭐ 需要了解索引 |
| 检索速度 | ⭐⭐ 适合万级向量 | ⭐⭐⭐⭐⭐ 百万级毫秒级 |
| 持久化 | ✅ 原生支持,自动保存 | ⚠️ 需手动保存索引 |
| 适用场景 | 学习、小规模项目、原型验证 | 生产环境、大规模向量库 |
⚠️ 六、新手避坑指南
-
路径问题 :
persist_directory必须是文件夹,不是文件 -
Embedding 混用 :建库和检索必须用同一个 Embedding 模型
-
FAISS 保存 :FAISS 索引必须手动
save_local,否则重启就没了 -
分块不合理:别把句子砍断,坚持用递归分块
🎯 今日总结
今天咱们给向量安了家!
-
学会了 Chroma:新手友好,零配置入门
-
体验了 FAISS:性能炸裂,感受闪电速度
-
完成了向量入库 + 智能检索,RAG 全链路打通!