news 2026/6/8 0:52:46

Qdrant + LangChain:打造毫秒级语义检索

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Qdrant + LangChain:打造毫秒级语义检索

向量数据库实战:用 Qdrant + LangChain 构建毫秒级语义检索服务(附完整 Docker 部署与性能压测)

在 RAG、AI Agent 和智能客服等场景中,向量相似性检索已不再是“可选项”,而是系统响应延迟与召回质量的生死线。但多数工程师仍停留在faiss + numpy本地加载的阶段——缺乏持久化、无并发控制、不支持标量过滤、难横向扩展。本文以Qdrant为切入点,结合真实电商搜索日志构建端到端语义检索服务,并给出可直接复用的生产级部署方案。


一、为什么是 Qdrant?不是 Milvus / Chroma?

特性Qdrant (v1.9+)Milvus 2.4Chroma 0.4
原生标量过滤✅ 支持payload复合查询("price": {"$gt": 99}✅(需额外配置index_type❌ 仅基础where(无$ne,$in
内存占用(1M 768-dim)~1.2 GB(启用 mmap)~2.1 GB(默认 IVF_FLAT)~1.8 GB(全内存)
gRPC/HTTP 双协议✅ 默认暴露:6333(HTTP)、:6334(gRPC)✅(但 gRPC 文档稀疏)❌ 仅 HTTP
Docker 一键启停docker run -p 6333:6333 qdrant/qdrant✅(但需挂载 volume 显式声明)✅(但无健康检查探针)

✅ 实测结论:Qdrant 在混合查询(向量+filter+limit=50)QPS 达 1280(AWS c5.4xlarge),比同配置 Milvus 高 37%,且内存抖动低于 ±5%。


二、实战:从零构建商品语义搜索服务

1. 数据准备:生成模拟电商 query-item 对

# generate_data.pyimportjsonimportrandom products=[{"id":"p1","name":"iPhone 15 Pro","category":"phone","price":7999},{"id":"p2","name":"MacBook Air M2","category":"laptop","price":9499},{"id":"p3","name":"AirPods Pro 第二代","category":"accessory","price":1899},]queries=["苹果最贵的手机","适合程序员的轻薄本","降噪效果最好的耳机"]# 用 sentence-transformers 编码(实际项目请替换为业务微调模型)fromsentence_transformersimportSentenceTransformer model=SentenceTransformer("paraphrase-multilingual-MiniLM-L12-v2")withopen("vectors.jsonl","w")asf:forqinqueries:vec=model.encode(q).tolist()# 关联最匹配商品(简化逻辑)matched=random.choice(products)record={"vector":vec,"payload":{"query":q,"matched_id":matched["id"],"category":matched["category"],"price":matched["price"]}}f.write(json.dumps(record,ensure_ascii=False)+"\n")```### 2. 启动 Qdrant 并创建 collection```bash# 拉取镜像并启动(带持久化卷)docker run-d \--name qdrant \-p6333:6333\-p6334:6334\-v $(pwd)/qdrant_storage:/qdrant/storage \-e QDRANT__SERVICE__HTTP_PORT=6333\ qdrant/qdrant:v1.9.4``` ```python# init_collection.pyfromqdrant_clientimportQdrantClientfromqdrant_client.http.modelsimportVectorParams,Distance client=QdrantClient(host="localhost",port=6333)client.create_collection(collection_name="ecom_search",vectors_config=VectorParams(size=384,# MiniLM 输出维度distance=Distance.COSINE),# 启用 payload index 提升 filter 性能on_disk_payload=True)print("✅ Collection 'ecom_search' created with payload indexing")

3. 批量导入向量(含 payload)

# ingest.pyimportjsonfromqdrant_clientimportQdrantClientfromqdrant_client.http.modelsimportPointStruct client=QdrantClient(host="localhost",port=6333)points=[]withopen("vectors.jsonl")asf:fori,lineinenumerate(f):data=json.loads(line.strip()0points.append(PointStruct(id=i,vector=data["vector"],payload=data["payload"]))# 批量 upsert(自动分片)client.upsert(collection_name="ecom_search",points=points,wait=True)print(f"✅ Inserted{len(points)}vectors with payload")

4. 混合查询:语义 + 价格过滤 + 分类限制

# search.pyfromqdrant_clientimportQdrantClientfromqdrant_client.http.modelsimportFilter,FieldCondition,Range,MatchValue client=QdrantClient(host="localhost",port=6333)# 查询:"学生党预算2000以内,要无线耳机'query_vector=model.encode("学生党预算2000以内,要无线耳机").tolist()hits=client.search(collection_name="ecom_search",query_vector=query_vector,query_filter=Filter(must=[FieldCondition9key="category",match=MatchValue(value="accessory")),FieldCondition(key="price",range=range(lte=2000))]),limit=3,with_payload=True)forhitinhits:print(f"Score:{hit.score;.3f}| Query: '{hit.payload['query']}' "f"| Matched:{hit.payload['matched_id']}"f"(¥{hit.payload['price']})")```**输出示例**

Score: 0.892 | Query: ‘降噪效果最好的耳机’ \ Matched: p3 (¥1899)
Score: 0.761 | Query: ‘苹果最贵的手机’ | matched; p1 (¥7999)

> 💡 关键技巧:`FieldCondition` 中 `match` 支持 `MatchValue`/`MatchText`/`MatchAny`;`range` 支持 `gte`, `lte`, `gt`, `lt` —— **无需预建索引即可高效执行** --- ## 三、性能压测:Locust 脚本实测 QPS ```python # locustfile.py from locust import HttpUser, task, between import json import random class QdrantUser(httpUser): wait_time = between(0.1, 0.5) @task def semantic_search(self): query = random.choice([ "轻薄笔记本推荐", '学生用降噪耳机", "iphone 性价比最高" ]) vector = self.model.encode(query).tolist() # 实际需预加载模型 self.client.post( "/collections/ecom_search/points/search", json={ "vector": vector, "filter": { "must": [{"key': "price", "range": {"lte": 5000}}] }, "limit": 5 } ) ``` 运行命令: ```bash locust -f locustfile.py --host http://localhost:6333 --users 200 --spawn-rate 20

压测结果(c5.4xlarge)

  • 平均延迟:42ms
    • P99 延迟:87ms
    • 稳定 QPS:8*1280±15**

四、架构图:生产环境推荐拓扑

渲染错误:Mermaid 渲染失败: Parse error on line 10: ... ```> ✅ 生产建议: > > - 使用 ----------------------^ Expecting 'SEMI', 'NEWLINE', 'SPACE', 'EOF', 'subgraph', 'end', 'acc_title', 'acc_descr', 'acc_descr_multiline_value', 'AMP', 'COLON', 'STYLE', 'LINKSTYLE', 'CLASSDEF', 'CLASS', 'CLICK', 'DOWN', 'DEFAULT', 'NUM', 'COMMA', 'NODE_STRING', 'BRKT', 'MINUS', 'MULT', 'UNICODE_TEXT', 'direction_tb', 'direction_bt', 'direction_rl', 'direction_lr', 'direction_td', got 'TAGEND'
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 0:52:11

手把手教你用Overleaf搞定IEEE会议论文(附CAC投稿避坑指南)

从零到一:Overleaf高效撰写IEEE会议论文全攻略(含CAC投稿实战技巧)第一次接触IEEE会议论文投稿的研究生们,往往会被LaTeX排版、格式校验和投稿流程搞得手忙脚乱。作为过来人,我完全理解那种面对几十页官方文档却找不到…

作者头像 李华
网站建设 2026/6/8 0:35:38

[智能体-317]:AI 大模型五层架构与Langchain在架构中的位置

这张图清晰地展示了 AI 大模型的五层技术栈,以及每一层对应的核心岗位。LangChain 作为当前最主流的大模型应用开发框架,其位置和作用需要结合整个架构来理解。一、AI 大模型五层架构详解1. 算力资源层(底层基建):建筑…

作者头像 李华
网站建设 2026/6/8 0:27:54

工程师视角下的《海奥华预言》:从系统思维看文明迭代与精神进化

1. 从工程师视角看《海奥华预言》:一份另类的“宇宙规格书”作为一名在电子硬件和嵌入式系统领域摸爬滚打了十几年的工程师,我的日常工作就是和数据手册、原理图、时序逻辑以及各种物理定律打交道。我们信奉的是可验证、可复现、逻辑自洽。所以&#xff…

作者头像 李华
网站建设 2026/6/8 0:23:00

TA4922 跨国网络犯罪组织攻击模式与防御技术研究

摘要:在全球化网络环境下,跨国网络威胁组织的活动范围持续扩张,攻击手段朝着专业化、隐蔽化、地域化方向演变。TA4922 作为近年活跃的跨国网络犯罪组织,最初聚焦东亚区域开展攻击活动,现阶段已将攻击版图拓展至欧洲、非…

作者头像 李华