🚀 速通 · 向量数据库实战
1425 words
7 minutes
🚀 速通 · 向量数据库实战
🚀 速通 · 向量数据库实战
🎯 你要做到什么级别的小Demo
做一个用Chroma向量数据库驱动的语义搜索系统:
你准备3份文档(简历、岗位说明、技术笔记),全部存入Chroma。然后你可以输入自然语言查询,比如:"这个岗位要求什么编程语言?"系统会找到最相关的文档片段并返回。
关键是你还能做"混合搜索"——同时按关键词和语义搜。为什么是这个Demo: RAG的核心就是向量数据库。面试官问”你对向量数据库了解多少”,你一句”我用Chroma做过语义搜索和RAG”就能证明你真的用过,不是只会背书。
📄 核心代码框架(逐行解释)
# ===== 使用 Chroma(最轻量、最适合学习) =====import chromadbfrom 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 -dfrom 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 选型对比
| 特性 | Chroma | Milvus | Pinecone |
|---|---|---|---|
| 部署 | 嵌入应用,零依赖 | 需单独部署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_向量数据库实战/