理论知识和配置参数需要落地到真实场景才能体现价值。本章精选 Qdrant 在不同行业和业务场景中的实际应用案例,展示 Qdrant 如何解决真实的向量搜索需求。每个案例都包含业务背景、技术方案、实现细节和性能数据。
某大型电商平台拥有超过 5000 万商品 SKU,每天服务 800 万活跃用户。传统的基于标签的推荐系统面临以下挑战:
使用 Qdrant 构建语义化商品推荐系统,核心架构如下:
向量生成层
使用电商领域的微调 BGE 模型,将商品信息(标题、描述、属性、图片特征)编码为统一的高维向量表示:
def encode_product(product): # 多模态特征融合 text_embedding = model.encode( f"{product['title']} {product['description']} {' '.join(product['attributes'])}" ) image_embedding = vision_model.encode(product['main_image']) # 特征拼接与降维 combined = np.concatenate([text_embedding, image_embedding]) final_embedding = pca.transform(combined.reshape(1, -1))[0] return final_embedding.tolist()
存储层
每个商品作为一个 Point 存储在 Qdrant 中,Payload 包含商品的结构化信息:
client.upsert( collection_name="products", points=[{ "id": product["id"], "vector": product_embedding, "payload": { "title": product["title"], "category": product["category"], "price": product["price"], "brand": product["brand"], "rating": product["avg_rating"], "stock": product["stock_count"], "tags": product["tags"] } }] )
推荐查询
用户行为实时转化为查询向量,结合 Payload 过滤实现精准推荐:
results = client.search( collection_name="products", query_vector=user_interest_vector, query_filter=models.Filter( must=[ models.FieldCondition(key="category", match=models.MatchValue(value="electronics")), models.FieldCondition(key="price", range=models.Range(gte=100, lte=2000)), models.FieldCondition(key="stock", range=models.Range(gt=0)), ] ), limit=20, search_params=models.SearchParams(hnsw_ef=128) )
某金融集团内部文档超过 200 万份,包括研究报告、合规文件、操作手册、会议纪要等。原有的关键词搜索系统存在以下问题:
构建基于 RAG(检索增强生成)的智能问答系统,Qdrant 作为核心检索引擎。
文档分块与索引
将长文档按语义段落分块,每个段落作为一个向量点:
from langchain.text_splitter import RecursiveCharacterTextSplitter splitter = RecursiveCharacterTextSplitter( chunk_size=512, chunk_overlap=50, separators=["\n\n", "\n", "。", ".", " "] ) chunks = splitter.split_text(document_text) for i, chunk in enumerate(chunks): embedding = embed_model.encode(chunk) client.upsert( collection_name="knowledge_base", points=[models.PointStruct( id=f"{doc_id}_{i}", vector=embedding, payload={ "doc_title": title, "doc_type": doc_type, "author": author, "date": publish_date, "department": dept, "content": chunk, "chunk_index": i } )] )
混合检索策略
Qdrant 支持稀疏向量(BM25)和稠密向量的混合检索,适合企业知识库场景:
# 创建支持混合检索的集合 client.create_collection( collection_name="knowledge_base", vectors_config=models.VectorParams(size=768, distance=models.Distance.COSINE), sparse_vectors_config={ "bm25": models.SparseVectorParams( index=models.SparseIndexParams( on_disk=False ) ) } ) # 混合搜索请求 results = client.search( collection_name="knowledge_base", prefetch=[ models.Prefetch(query=query_vector, limit=20), models.Prefetch(query=models.SparseVector(indices=sparse_indices, values=sparse_values), using="bm25", limit=20) ], query=models.FusionQuery(fusion=models.Fusion.RRF), limit=10 )
RAG 集成
将 Qdrant 的搜索结果输入大语言模型,生成精准回答:
context = "\n\n".join([r.payload["content"] for r in search_results]) prompt = f"基于以下参考资料回答问题:\n\n{context}\n\n问题:{user_question}" answer = llm.generate(prompt)
某内容平台需要构建内容审核和版权检测系统,支持图片和视频的相似检索。挑战包括:
使用多模态向量索引,将图片和视频统一映射到相同的向量空间。
视频特征提取
对视频按关键帧提取,每帧生成向量,使用多向量(Multivector)存储:
keyframes = extract_keyframes(video_path, max_frames=5) frame_vectors = [vision_model.encode(frame) for frame in keyframes] client.upsert( collection_name="media", points=[models.PointStruct( id=video_id, vector=frame_vectors, # Multivector 支持 payload={ "type": "video", "title": title, "uploader": user_id, "upload_time": timestamp, "duration": duration_seconds, "frame_count": len(frame_vectors) } )] )
相似检索
query_frame = vision_model.encode(suspect_image) results = client.search( collection_name="media", query_vector=query_frame, query_filter=models.Filter( must=[ models.FieldCondition(key="type", match=models.MatchValue(value="video")) ] ), limit=10, with_payload=True )
某客服机器人需要具备长期记忆能力——记住用户的历史对话、偏好和问题上下文,在后续对话中提供个性化的服务。传统方案将对话历史存储在关系型数据库中,但无法实现语义级的快速检索。
使用 Qdrant 作为对话记忆的语义存储层,支持按意图和情感检索历史对话。
对话记忆存储
每轮对话作为一个向量点存储,向量由对话内容的语义编码生成:
memory_vector = embed_model.encode( f"用户说:{user_message} 助手说:{bot_response}" ) client.upsert( collection_name="conversation_memory", points=[models.PointStruct( id=conversation_id, vector=memory_vector, payload={ "user_id": user_id, "session_id": session_id, "user_message": user_message, "bot_response": bot_response, "intent": detected_intent, "sentiment": sentiment_score, "timestamp": datetime.now().isoformat() } )] )
上下文检索
在处理新问题时,从历史记忆中检索相关上下文:
context_results = client.search( collection_name="conversation_memory", query_vector=current_question_vector, query_filter=models.Filter( must=[models.FieldCondition(key="user_id", match=models.MatchValue(value=current_user_id))], must_not=[models.FieldCondition(key="sentiment", range=models.Range(lt=-0.5))] ), limit=5 ) relevant_context = [r.payload for r in context_results]
从电商推荐到知识库搜索,从多媒体检索到对话记忆,Qdrant 在各类业务场景中展现出了卓越的向量检索能力。Rust 带来的高性能、丰富的过滤与混合检索能力、灵活的部署方式,使 Qdrant 能够适应从轻量级单节点到大规模集群的各种需求。关键成功因素包括: