rag混合检索

文章目录

rag检索分类

(1)向量查询

python 复制代码
# 单一向量
.query_points(query=vector, limit=10)

# 多个向量(加权平均)
.query_points(query=[vec1, vec2], query_weights=[0.7, 0.3])

(2) 过滤查询

python 复制代码
.query_points(
    query=vector,
    query_filter=Filter(
        must=[FieldCondition(key="category", match=MatchValue(value="AI"))]
    ),
    limit=10
)

(3) 预置查询(Named Vectors)

复制代码
# 如果入库时给向量起了名字
.query_points(
    collection_name="docs",
    query_name="document_vector",  # 指定使用哪个向量字段
    using="text_vector",           # 使用命名的向量
    with_vector=True
)

(4) 稀疏向量查询(Sparse Vector / BM25)

复制代码
# 需要配置 sparse vector 索引
.query_points(
    query=sparse_vector,  # 稀疏向量(词袋表示)
    using="sparse_text"    # 指定稀疏向量字段
)

(5) 混合查询(Hybrid Search)

复制代码
# 结合稠密和稀疏向量
.query_points(
    prefetch=[
        Prefetch(query=dense_vector, using="dense", limit=100),
        Prefetch(query=sparse_vector, using="sparse", limit=100),
    ],
    query=Filter(...),  # 重排序阶段
    limit=10
)

入库和检索

入库

入库

python 复制代码
# 创建 collection 时配置
from qdrant_client.http.models import (
    VectorParams, 
    HnswConfigDiff,
    PayloadIndexType
)

client.create_collection(
    collection_name="my_docs",
    vectors_config={
        "text_vector": VectorParams(
            size=768,           # 向量维度
            distance=Distance.COSINE,
            hnsw_config=HnswConfigDiff(
                m=16,           # 每个节点最大连接数
                ef_construct=100
            )
        )
    },
    # 对 payload 字段建索引(用于过滤)
    optimizers_config=OptimizersConfigDiff(
        indexing_threshold=10000
    )
)

# 对 payload 字段创建倒排索引(用于快速过滤)
client.create_payload_index(
    collection_name="my_docs",
    field_name="category",
    field_type=PayloadIndexType.KEYWORD
)

# 对 text 内容建全文索引(稀疏向量/BM25)
client.create_payload_index(
    collection_name="my_docs",
    field_name="text_content",
    field_type=PayloadIndexType.TEXT
)

混合检索工程方案

python 复制代码
class HybridRetriever:
    async def retrieve(self, query: str, top_k: int = 10):
        # 1. 扩大召回
        dense_limit = max(top_k * 3, 10)
        
        # 2. 并行检索
        dense_task = self._dense_search(query, dense_limit)
        bm25_task = self._bm25_search(query, dense_limit)
        
        dense_hits, bm25_hits = await asyncio.gather(dense_task, bm25_task)
        
        # 3. 融合(RRF 或加权)
        combined = self._reciprocal_rank_fusion(dense_hits, bm25_hits)
        
        # 4. 重排序(Cross-Encoder)
        reranked = await self._cross_encoder_rerank(query, combined[:top_k*2])
        
        # 5. 返回最终 top_k
        return reranked[:top_k]

需要注意的是混合检索不能直接采用并集,

错误代码如下,不可用于实际生产环境,(最优解应该使用加权融合)

python 复制代码
        results = self.client.query_points(
            collection_name=self.collection_name,
            prefetch=[
                # 语义检索(稠密向量)
                Prefetch(
                    query=dense_embedding,
                    using="dense_text",  # 使用稠密向量字段
                    limit=recall_limit,
                    filter=query_filter
                ),
                # 关键词检索(稀疏向量)
                Prefetch(
                    query=sparse_embedding,
                    using="sparse_text",  # 使用稀疏向量字段
                    limit=recall_limit,
                    filter=query_filter
                )
            ],
            # query参数在这里用于最终的融合和排序
            # 传入None表示只做融合,不再额外检索
            query=None,
            limit=top_k,
            with_payload=True,
            with_vectors=False
        )

但是以下代码又是可以的

复制代码
response = client.query_points(
    collection_name="my_collection",
    prefetch=[
        models.Prefetch(
            query=models.Document(
                text=query,
                model="Qdrant/bm25",  
            ),
            using="sparse",
            limit=20,
        ),
        models.Prefetch(
            query=models.Document(
                text=query,
                model="sentence-transformers/all-MiniLM-L6-v2", 
            ),
            using="dense",
            limit=20,
        )
    ],
    query=models.FusionQuery(fusion=models.Fusion.RRF),  
    limit=10,
)
相关推荐
天诚智能门锁1 小时前
天诚公租房管控平台CAT.1人脸猫眼智能锁助力青神县公租房管理
人工智能·嵌入式硬件·物联网·智能家居·智能硬件
PaperData1 小时前
2000-2023年地级市数字基础设施评价指标体系
大数据·网络·数据库·人工智能·数据分析·经管
政安晨2 小时前
政安晨【OpenClaw与Hermes指南】AI Coding Agent行为约束之道:Karpathy CLAUDE.md技能体系深度解读
人工智能·ai coding·karpathy·agent行为约束之道·karpathy claude·技能体系解读·agent技能
ZYH_Core2 小时前
DeepSeek V4 实战测评
人工智能·ai·ai编程
70asunflower2 小时前
从Token到芯片:AI推理时代的效率竞争与市场逻辑
人工智能
xrgs_shz2 小时前
MATLAB 纹理特征提取:一文读懂 graycomatrix 与 graycoprops
人工智能·计算机视觉·matlab
BlockChain8882 小时前
AI+区块链深度探索:算法与账本的共生时代
人工智能·算法·区块链
生成论实验室2 小时前
《源·觉·知·行·事·物:生成论视域下的统一认知语法》第一章 源:不可言说的生成之源
人工智能·科技·算法·生活·创业创新
jinglong.zha2 小时前
AI萌宠短剧实战:从0孵化动物IP,用AI制作爆款短视频
人工智能·ai·音视频·网赚教程·萌宠