向量数据库是 RAG 的地基。大模型无法直接理解文字——所有语义都会经过嵌入模型压缩成一串数字向量,Qdrant 就是专门高效储存和检索这些向量的数据库。
传统数据库存精确值(name="张三"),向量数据库存高维数值向量。
| 对比 | 传统数据库 | 向量数据库 |
|---|---|---|
| 匹配方式 | 精准字面匹配 | 语义相似度匹配 |
| 查询"好吃的苹果" | 只找到含"苹果"的记录 | 能找到"美味的水果" |
| 核心算法 | B-Tree 索引 | 近似最近邻(ANN) |
| 常用度量 | =/LIKE | 余弦相似度 / 欧氏距离 |
本地低配服务器流畅运行,Rust 编写性能优异
Docker 一行命令,零配置
大数据自动分片存储
检索叠加元数据过滤
内置重复内容剔除
Rust 核心,毫秒级响应
Cosine/Euclidean/Dot
REST + gRPC + 多语言 SDK
| 概念 | 对应 | 说明 |
|---|---|---|
| Collection | 表 | 一组向量集合 = 一个知识库 |
| Point | 行 | 一个向量 + payload |
| Payload | JSON | 元数据:来源、时间、标签 |
| Vector | 数组 | float32 向量 |
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, PointStruct
from sentence_transformers import SentenceTransformer
client = QdrantClient(host="localhost", port=6333)
client.create_collection("my_kb", vectors_config=VectorParams(
size=768, distance=Distance.COSINE
))
model = SentenceTransformer('BAAI/bge-small-zh-v1.5')
docs = ["公司营收50亿", "张三任CEO", "总部北京"]
vectors = model.encode(docs)
client.upsert("my_kb", [
PointStruct(id=i, vector=v.tolist(),
payload={"text": d})
for i, (v, d) in enumerate(zip(vectors, docs))
])
# 检索
query = "公司赚了多少钱?"
results = client.search("my_kb",
query_vector=model.encode(query).tolist(), limit=3)
for r in results:
print(f"相似度:{r.score:.3f} | {r.payload['text']}")
# 相似度:0.921 | 公司营收50亿 ✅
| 🏠 本地知识库 | 私有化部署,数据不出门 |
| 📄 企业文档问答 | 员工手册、制度文档智能检索 |
| 🖼️ 图文内容比对 | 图片向量化后语义检索 |
| 🤖 智能客服 | 基于知识库的精准回答 |