You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Weaviate迁移至Qdrant,寻求类似的简易混合搜索实现方案

解决Qdrant替代Weaviate时的混合搜索需求

1. 手动实现加权混合搜索(对齐Weaviate核心逻辑)

Weaviate的混合搜索本质是向量相似度与BM25文本得分的加权融合,你可以在Qdrant中手动复刻这一逻辑,步骤如下:

  • 前提配置:创建Qdrant集合时,确保需要检索的文本字段已开启BM25索引(设置text_config={"type": "bm25"})
  • 双搜索并行执行:分别发起BM25文本搜索和向量搜索,获取两个独立结果集
  • 加权合并排序:对两类结果的得分按自定义比例加权,合并去重后按综合得分排序

示例代码:

from qdrant_client import QdrantClient
from qdrant_client.http.models import SearchRequest

# 初始化Qdrant客户端
client = QdrantClient("localhost", port=6333)
COLLECTION_NAME = "your_collection"
QUERY_TEXT = "你的搜索关键词"
QUERY_VECTOR = [0.1, 0.2, ...]  # 替换为你的查询向量
TEXT_WEIGHT = 0.4  # 文本得分权重,可根据原Weaviate效果调整
VECTOR_WEIGHT = 0.6  # 向量相似度权重

# 1. 执行BM25文本搜索
text_results = client.search(
    collection_name=COLLECTION_NAME,
    query=QUERY_TEXT,
    limit=50,
    using="content"  # 替换为你配置了BM25的字段名
)

# 2. 执行向量搜索
vector_results = client.search(
    collection_name=COLLECTION_NAME,
    query_vector=QUERY_VECTOR,
    limit=50
)

# 3. 合并结果并计算加权得分
result_dict = {}

# 处理文本搜索结果,赋予对应权重
for hit in text_results:
    result_dict[hit.id] = {
        "score": hit.score * TEXT_WEIGHT,
        "payload": hit.payload
    }

# 处理向量搜索结果,叠加得分
for hit in vector_results:
    if hit.id in result_dict:
        result_dict[hit.id]["score"] += hit.score * VECTOR_WEIGHT
    else:
        result_dict[hit.id] = {
            "score": hit.score * VECTOR_WEIGHT,
            "payload": hit.payload
        }

# 按综合得分降序排序,取前10个结果
final_results = sorted(
    result_dict.values(),
    key=lambda x: x["score"],
    reverse=True
)[:10]

2. 结合重排序模型优化召回精度

如果需要更贴近Weaviate混合搜索的精排效果,可以在初步混合结果基础上,用CrossEncoder类重排序模型进一步优化:

from sentence_transformers import CrossEncoder

# 初始化重排序模型(可根据需求更换其他模型)
reranker = CrossEncoder("cross-encoder/ms-marco-MiniLM-L-6-v2")

# 提取候选文档的文本内容
candidate_texts = [res["payload"]["content"] for res in final_results]
# 构造查询-文档对
query_doc_pairs = [(QUERY_TEXT, text) for text in candidate_texts]

# 计算重排序得分
rerank_scores = reranker.predict(query_doc_pairs)

# 按重排序得分重新排列结果
reranked_results = sorted(
    zip(final_results, rerank_scores),
    key=lambda x: x[1],
    reverse=True
)

3. 利用Qdrant多阶段搜索减少计算量

Qdrant支持多阶段搜索,你可以先通过预过滤或向量搜索获取小范围候选集,再对候选集执行文本搜索并合并得分,在保证效果的同时降低资源消耗。

关键说明

  • Weaviate的混合搜索无特殊黑盒逻辑,核心就是向量+文本的加权融合,你可以通过调整权重比例,完全对齐原Weaviate的召回效果
  • Qdrant的on_disk模式可正常配合上述所有混合搜索逻辑,不会影响功能使用

内容的提问来源于stack exchange,提问作者W1nTer003

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 12:50:17