🚀 速通 · 向量数据库实战

1425 words
7 minutes
🚀 速通 · 向量数据库实战

🚀 速通 · 向量数据库实战#


🎯 你要做到什么级别的小Demo#

做一个用Chroma向量数据库驱动的语义搜索系统

你准备3份文档(简历、岗位说明、技术笔记),全部存入Chroma。
然后你可以输入自然语言查询,比如:
"这个岗位要求什么编程语言?"
系统会找到最相关的文档片段并返回。
关键是你还能做"混合搜索"——同时按关键词和语义搜。

为什么是这个Demo: RAG的核心就是向量数据库。面试官问”你对向量数据库了解多少”,你一句”我用Chroma做过语义搜索和RAG”就能证明你真的用过,不是只会背书。


📄 核心代码框架(逐行解释)#

# ===== 使用 Chroma(最轻量、最适合学习) =====
import chromadb
from chromadb.utils import embedding_functions
# ===== 第1步:创建客户端和集合 =====
# 持久化模式:数据存磁盘,下次重启还在
client = chromadb.PersistentClient(path="./chroma_data")
# 使用默认的all-MiniLM-L6-v2 Embedding模型(免费、轻量)
sentence_transformer_ef = embedding_functions.SentenceTransformerEmbeddingFunction(
model_name="all-MiniLM-L6-v2"
)
# 创建或获取集合(类似数据库的表)
collection = client.get_or_create_collection(
name="my_knowledge_base",
embedding_function=sentence_transformer_ef,
metadata={"description": "我的个人知识库"}
)
# 解释:collection ≈ 数据库中的一张表
# embedding_function决定了怎么把文本变成向量
# ===== 第2步:添加文档 =====
documents = [
"Python是一种广泛使用的解释型高级编程语言",
"FastAPI是一个现代、快速(高性能)的Web框架,用于构建API",
"向量数据库专门存储和检索高维向量,常用于语义搜索",
"RAG(检索增强生成)通过检索外部知识来增强LLM的回答",
"LangGraph是一个用于构建有状态Agent的框架"
]
ids = [f"doc_{i}" for i in range(len(documents))]
collection.add(
documents=documents,
ids=ids,
metadatas=[{"source": "知识库", "type": "技术"} for _ in documents]
)
# 解释:add时自动调用embedding_function将文档转为向量存储
# metadata可附带额外信息,用于过滤(如只搜某类文档)
# ===== 第3步:语义搜索 =====
query = "什么框架可以用来构建API?"
results = collection.query(
query_texts=[query], # 自动把查询文本转为向量
n_results=2, # 返回最相似的2条
include=["documents", "distances", "metadatas"]
)
print("查询结果:")
for i, doc in enumerate(results["documents"][0]):
distance = results["distances"][0][i]
print(f" [{distance:.4f}] {doc}")
# 解释:distance是余弦距离,值越小表示越相似
# 输出:[0.2345] FastAPI是一个现代、快速(高性能)的Web框架,用于构建API
# ===== 第4步:带元数据过滤的搜索 =====
results = collection.query(
query_texts=["编程语言"],
n_results=5,
where={"type": "技术"}, # 只搜type="技术"的文档
where_document={"$contains": "Python"} # 只搜包含"Python"的文档
)
# 解释:where是针对metadata的过滤,where_document是对文档内容的过滤
# ===== 第5步:更新和删除 =====
collection.update(ids=["doc_0"], documents=["Python是最流行的AI开发语言"])
collection.delete(ids=["doc_3"])

进阶:用Milvus(生产级向量数据库)#

# ===== 使用 Milvus(云原生、分布式、适合生产) =====
# 需要先启动Milvus服务:docker-compose up -d
from pymilvus import connections, Collection, CollectionSchema, FieldSchema, DataType
# 连接Milvus服务
connections.connect(host="localhost", port="19530")
# 定义集合结构
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=1000),
FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=384) # Embedding维度
]
schema = CollectionSchema(fields, description="知识库集合")
collection = Collection(name="knowledge_base", schema=schema)
# 创建索引(加速检索)
index_params = {
"metric_type": "IP", # 内积(也可以用L2余弦)
"index_type": "IVF_FLAT", # 索引算法
"params": {"nlist": 128}
}
collection.create_index(field_name="vector", index_params=index_params)

🧠 Chroma vs Milvus vs Pinecone 选型对比#

特性ChromaMilvusPinecone
部署嵌入应用,零依赖需单独部署Docker云托管
规模小/中(百万级向量)大(十亿级)大(十亿级)
上手难度⭐(极简单)⭐⭐⭐⭐⭐
适合场景学习/原型/小项目生产/大规模不想自己运维
持久化本地文件分布式存储全托管
过滤功能基本matedata过滤丰富(标量+向量混合)丰富
成本免费免费(自托管)按量付费

面试官常问: “用Chroma做原型,生产环境切Milvus或Pinecone”——这句话展示了你对技术选型的理解。


❓ 面试官最爱问的3个问题#

问题满分回答要点
1. 向量数据库中向量索引的原理是什么?简单说说。向量数据库把文本/图片转为高维向量(如384维),然后使用近似最近邻算法(ANN)快速找到最相似的向量。常用索引算法:IVF(倒排文件,先聚类再搜索,快但可能不准)、HNSW(分层可导航小世界图,精度高但内存占用大)、FLAT(暴力搜索,最准但最慢)。核心是**「用空间换时间」**——建索引时多花时间预处理,查询时就能毫秒级返回。
2. 你怎么评估向量检索的效果?准确率不行怎么优化?常用指标:Recall@K(前K个结果中包含相关文档的比例),用DSPy或RAGAS工具评测。优化方法:① 换更好的Embedding模型(如bge-large → bge-m3)② 混合检索(稠密向量+稀疏向量BM25互补)③ Query改写(HyDE把问题转成回答再检索)④ ReRanker(第一轮粗筛后用Cross-Encoder精排)⑤ 调chunk_size和overlap
3. 什么是”维度诅咒”?为什么Embedding维度不是越高越好?维度诅咒:向量维度越高,数据越稀疏,距离度量越趋同——高维空间中,几乎所有点之间的距离都差不多,导致相似度排序失去意义。所以Embedding维度通常控制在384-1536之间,不是越高越好。实际项目中384维(all-MiniLM-L6-v2)已能胜任大部分场景,768维(bge-base)效果更好但检索成本等比增加。

⏱ 练熟时间: 1天(Chroma半天上手,Milvus半天) 面试杀伤力: ⭐⭐⭐⭐ 体现你对RAG基础设施的深度理解,比纯讲概念强太多了。

Share Article

If this article helped you, please share it with others!

🚀 速通 · 向量数据库实战
https://estars-blog.pages.dev/posts/精华-速通_08_向量数据库实战/
Author
Estars
Published at
2026-06-16
License
CC BY-NC-SA 4.0
Profile Image of the Author
Estars
这条路要走完,才能看到世界的终点,是海纳百川,还是星火燎原。
公告
欢迎来到我的博客!这是一则示例公告。
Music
Cover

Music

No playing

0:00 0:00
No lyrics available
Categories
Tags
Site Statistics
Posts
85
Categories
7
Tags
15
Total Words
218,958
Running Days
0 days
Last Activity
0 days ago

Table of Contents