【AI大模型学习路线】第二阶段之RAG基础与架构——第七章(【项目实战】基于RAG的PDF文档助手)query搜索与文档排序?

【AI大模型学习路线】第二阶段之RAG基础与架构——第七章(【项目实战】基于RAG的PDF文档助手)query搜索与文档排序?

【AI大模型学习路线】第二阶段之RAG基础与架构——第七章(【项目实战】基于RAG的PDF文档助手)query搜索与文档排序?



欢迎宝子们点赞、关注、收藏!欢迎宝子们批评指正!
祝所有的硕博生都能遇到好的导师!好的审稿人!好的同门!顺利毕业!

大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可关注VX “学术会议小灵通”或参考学术信息专栏:https://fighting.blog.csdn.net/article/details/147360609


前言

在基于 RAG 的 PDF 文档助手中,“查询搜索(Query Search)”负责将用户的自然语言问题转化为可检索的向量或关键词并快速召回初步相关文档块,“文档排序(Document Ranking)”则对这些候选块进行精细评分与重排,以保证最终输入生成模型的上下文高度相关,从而显著提升回答准确性与减少幻觉。下文首先概述两大环节的原理与方法,然后给出 Python 端到端示例。

一、查询搜索(Query Search)

1.1 查询编码(Query Encoding)

  • 将用户的自然语言 Query 输入到双塔(Siamese)或单塔嵌入模型中,输出查询向量(dense embedding)。常用模型有 Sentence‑Transformers(如 all‑MiniLM‑L6‑v2)​与 OpenAI Embeddings API​。
  • 对于 keyword‑based 需求,可并行执行 BM25 稀疏检索,增加对专有名词或长尾术语的召回能力​。

1.2 初步检索(ANN / Hybrid Retrieval)

  • Dense Retrieval(ANN):将 Query 向量送入向量数据库(如 FAISS、Pinecone、Milvus),执行近似最近邻(ANN)搜索,迅速召回 Top‑k 文档块(k≈5–20)​。
  • Sparse & Hybrid 检索:可同时运行 BM25 与向量检索,将两者得分按权重合并(hybrid search),兼顾召回率与精度​。

1.3 性能调优

  • 调整向量模型维度与索引参数(HNSW 层数、efSearch)以权衡延迟与召回率​
  • 针对 PDF 文档特征,设置合理的 chunk 大小(如 500 字±10% 重叠)以保证上下文完整性​。

二、文档排序(Document Ranking)

2.1 初筛结果的局限

  • ANN 或 BM25 检索虽快,但往往带来部分低相关或主题偏离的文档块,直接送入 LLM 会增加 hallucination 风险​。

2.2 Cross‑Encoder 重排序(Re‑ranking)

  • 使用 Cross‑Encoder(如 cross-encoder/ms-marco-MiniLM-L-6-v2)对 Query 与每个候选块进行逐对评分,得到更精细的相关度得分​。
  • 将候选块按照 Cross‑Encoder 得分重新排序,只保留 Top‑n(n≈3–5)最相关块进入生成模块​。

2.3 端到端监控与反馈

  • 记录每次检索与重排序的文档 ID、得分与用户点击/满意度,用于动态微调重排序模型与混合检索权重​。
  • 定期在开发集上评估 Recall@k、MRR(Mean Reciprocal Rank)与最终生成质量(ROUGE、EM)指标,优化管道配置​。

三、Python 示例:检索 + 重排序

from sentence_transformers import SentenceTransformer, CrossEncoder
import faiss
import numpy as np

# --- 初始化检索与重排序模型 ---
# Dense retriever
bi_encoder = SentenceTransformer('multi-qa-MiniLM-L6-cos-v1')      # Bi‑Encoder for embeddings :contentReference[oaicite:12]{index=12}
# Cross‑Encoder for re‑ranking
cross_encoder = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2')  # Cross‑Encoder :contentReference[oaicite:13]{index=13}

# --- 构建向量索引(FAISS) ---
# 假设已有文档块列表 `chunks`
chunks = [...]  # List[str]
embs = bi_encoder.encode(chunks, convert_to_numpy=True, show_progress_bar=True)  # :contentReference[oaicite:14]{index=14}
dim = embs.shape[1]
index = faiss.IndexHNSWFlat(dim, 32)  # HNSW index :contentReference[oaicite:15]{index=15}
index.add(embs)

def retrieve_and_rerank(query: str, top_k=10, rerank_k=5):
    # 1. Query 编码 & ANN 检索
    q_emb = bi_encoder.encode([query], convert_to_numpy=True)
    D, I = index.search(q_emb, top_k)  # Top‑k 初筛 :contentReference[oaicite:16]{index=16}
    candidate_chunks = [chunks[i] for i in I[0]]
    
    # 2. Cross‑Encoder 重排序
    pairs = [[query, doc] for doc in candidate_chunks]
    scores = cross_encoder.predict(pairs)  # 得到每对 Query‑Doc 的相关度得分 :contentReference[oaicite:17]{index=17}
    reranked = [doc for _, doc in sorted(zip(scores, candidate_chunks), reverse=True)]
    
    return reranked[:rerank_k]

# 示例调用
top_docs = retrieve_and_rerank("如何实现 RAG 中的重排序?")
for doc in top_docs:
    print(doc)

  • Bi‑Encoder + FAISS:快速召回粗排 Top‑k 文档块,保证低延迟检索​。
  • Cross‑Encoder 重排序:对初筛结果逐条精排,只传递最相关块给 LLM,显著降低 hallucination 并提高回答精度。

通过上述查询搜索与文档重排序的设计与示例,可以在 RAG‑PDF 助手中构建一套高效、可控且可审计的检索管道,为下游大模型生成模块提供最相关的知识上下文。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

985小水博一枚呀

祝各位老板前程似锦!财源滚滚!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值