Appearance
向量数据库 = 按"相似度"而非"完全匹配"检索的数据库,是 RAG(检索增强生成)和 AI 应用的核心基础设施。
一句话定义
向量数据库 = 智能推荐的图书馆
| 对比 | 传统数据库 | 向量数据库 |
|---|---|---|
| 查找方式 | 精确匹配 | 语义相似度 |
| 例子 | 搜"苹果手机",必须匹配"苹果手机" | "苹果手机"和"iPhone"距离很近,能找到 |
为什么需要向量数据库:
- 传统数据库:搜"苹果手机"找不到"iPhone"
- 向量数据库:理解语义相似性,精准匹配
实际例子:
你问 ChatGPT:"最近的咖啡店在哪?"
↓
它在向量数据库里搜索相似的文档
↓
找到"附近 café 推荐""咖啡馆地址"等语义相似的内容
↓
结合这些内容生成回答核心要点(3个)
1. 向量数据库的基本原理
什么是向量(Vector):
- 向量 = 一串数字,表示文字/图片的"语义指纹"
- 例子:"猫"可能是
[0.2, -0.5, 0.8, ..., 0.1](实际是几百到几千维) - 相似的词,向量距离近(如"猫"和"小猫"距离近)
Embedding(嵌入):
把文字转换成向量的过程叫 Embedding。
| 工具 | 说明 |
|---|---|
| OpenAI text-embedding-3 系列 | 最常用 |
| BERT | Google出品 |
| sentence-transformers | 开源方案 |
核心操作:
- 存储:把文档转成向量,存入数据库
- 检索:把查询转成向量,找最相似的N个向量
- 返回:返回原始文档
相似度计算:
| 方法 | 特点 |
|---|---|
| 余弦相似度 | 最常用 |
| 欧氏距离 | 适合图片向量 |
| 点积 | 适合推荐系统 |
2. 主要应用场景
| 场景 | 说明 | 案例 |
|---|---|---|
| RAG(检索增强生成) | 让AI回答基于真实数据 | 客服机器人、知识库问答 |
| 语义搜索 | 理解意图,不只是关键词 | 搜索引擎、商品搜索 |
| 推荐系统 | 基于相似度推荐 | 抖音推荐、电商推荐 |
| 图片检索 | 以图搜图 | 淘宝拍照搜索 |
| 异常检测 | 找离群点 | 金融欺诈检测 |
3. 主流产品对比
| 产品 | 类型 | 特点 | 适合场景 |
|---|---|---|---|
| Pinecone | 云服务 | 托管、免运维 | 企业级应用 |
| Milvus | 开源 | 功能强大、可私有部署 | 大规模数据 |
| Chroma | 开源 | 轻量、简单易用 | 个人项目、原型 |
| Weaviate | 开源 | 混合搜索 | 多种数据类型 |
| Qdrant | 开源 | Rust开发、高性能 | 高性能需求 |
快速实战
方案1:Chroma(最简单)
python
# 安装
pip install chromadb
# 使用
import chromadb
client = chromadb.Client()
collection = client.create_collection("my_docs")
# 添加文档
collection.add(
documents=["苹果手机很好用", "iPhone性能很强"],
ids=["doc1", "doc2"]
)
# 查询
results = collection.query(
query_texts=["苹果手机怎么样?"],
n_results=2
)
print(results)方案2:Milvus(大规模数据)
python
# 安装
pip install pymilvus
# 连接
from pymilvus import connections, Collection
connections.connect("default", host="localhost", port="19530")
# 查询
collection = Collection("my_collection")
collection.load()
results = collection.search(
data=[[0.1, 0.2, 0.3]],
anns_field="vector",
param={"metric_type": "L2"},
limit=10
)方案3:Pinecone(云服务)
python
# 安装
pip install pinecone-client
# 初始化
from pinecone import Pinecone
pc = Pinecone(api_key="your-api-key")
index = pc.Index("my-index")
# 查询
results = index.query(
vector=[0.1, 0.2, 0.3],
top_k=10
)RAG应用完整流程
用户问题
↓
Embedding模型转成向量
↓
向量数据库检索(Top-K相似)
↓
检索结果 + 用户问题 → LLM
↓
LLM生成最终回答代码示例:
python
from openai import OpenAI
# 1. 检索相关文档
docs = collection.query(
query_texts=[user_question],
n_results=3
)
# 2. 构建提示词
context = "\n".join(docs["documents"][0])
prompt = f"""基于以下信息回答问题:
{context}
问题:{user_question}
"""
# 3. 调用LLM
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}]
)
print(response.choices[0].message.content)选型建议
| 场景 | 推荐 | 原因 |
|---|---|---|
| 个人项目/学习 | Chroma | 零配置、5分钟上手 |
| 原型快速验证 | Pinecone | 免运维、免费额度 |
| 企业级应用 | Pinecone / Milvus | 稳定、扩展性强 |
| 超大规模数据 | Milvus | 支持十亿级向量 |
| 高性能需求 | Qdrant | Rust开发、性能最佳 |
| 需要混合搜索 | Weaviate | 支持向量+关键词 |
常见问题
Q:向量数据库和传统数据库有什么区别?
A: 传统数据库是精确匹配,向量数据库是相似度匹配。比如搜"苹果手机",传统DB要匹配"苹果手机"这个字符串,向量DB能理解"苹果手机"和"iPhone"是相似的。
Q:Embedding模型怎么选?
A: 中文推荐 text-embedding-3-small 或 m3e-large,英文推荐 text-embedding-3-large。
Q:向量维度越高越好吗?
A: 不一定。维度越高精度越高,但存储和计算成本也越高。一般 768-1536 维足够。
Q:需要多少数据才适合用向量数据库?
A: 一般超过100条数据就值得用。少于100条直接存数组就行。
一句话总结
向量数据库是AI时代的"智能图书馆",按语义相似度检索,而非精确匹配。
入门推荐:
- 个人项目 → Chroma(5分钟上手)
- 企业应用 → Pinecone(免运维)
- 大规模数据 → Milvus(十亿级支持)
