🗂️ Qdrant 向量数据库

向量数据库是 RAG 的地基。大模型无法直接理解文字——所有语义都会经过嵌入模型压缩成一串数字向量,Qdrant 就是专门高效储存和检索这些向量的数据库。

🔢 向量数据库是什么?

传统数据库存精确值(name="张三"),向量数据库存高维数值向量

"你好世界"Embedding[0.023, -0.451, 0.892, 0.134, …]
对比传统数据库向量数据库
匹配方式精准字面匹配语义相似度匹配
查询"好吃的苹果"只找到含"苹果"的记录能找到"美味的水果"
核心算法B-Tree 索引近似最近邻(ANN)
常用度量=/LIKE余弦相似度 / 欧氏距离

⭐ Qdrant 核心特性

🪶 轻量化

本地低配服务器流畅运行,Rust 编写性能优异

📦 易部署

Docker 一行命令,零配置

🧩 向量分片

大数据自动分片存储

🎯 向量过滤

检索叠加元数据过滤

🧹 降噪去重

内置重复内容剔除

⚡ 检索快速

Rust 核心,毫秒级响应

📏 距离排序

Cosine/Euclidean/Dot

🔌 API 完善

REST + gRPC + 多语言 SDK

🏗️ 核心概念

概念对应说明
Collection一组向量集合 = 一个知识库
Point一个向量 + payload
PayloadJSON元数据:来源、时间、标签
Vector数组float32 向量

🔄 工作流程 + 代码

原文EmbeddingQdrant检索LLM
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亿 ✅

🎯 适用场景

🏠 本地知识库私有化部署,数据不出门
📄 企业文档问答员工手册、制度文档智能检索
🖼️ 图文内容比对图片向量化后语义检索
🤖 智能客服基于知识库的精准回答
← RAG 详解 🕸️ Neo4j → ⚖️ 向量 vs 图 路线图