当前位置: 首页 > ai >正文

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

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

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


文章目录

  • 【AI大模型学习路线】第二阶段之RAG基础与架构——第七章(【项目实战】基于RAG的PDF文档助手)query搜索与文档排序?
  • 前言
    • 一、查询搜索(Query Search)
      • 1.1 查询编码(Query Encoding)
      • 1.2 初步检索(ANN / Hybrid Retrieval)
      • 1.3 性能调优
    • 二、文档排序(Document Ranking)
      • 2.1 初筛结果的局限
      • 2.2 Cross‑Encoder 重排序(Re‑ranking)
      • 2.3 端到端监控与反馈
    • 三、Python 示例:检索 + 重排序


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

大多数高校硕博生毕业要求需要参加学术会议,发表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 助手中构建一套高效、可控且可审计的检索管道,为下游大模型生成模块提供最相关的知识上下文。

http://www.xdnf.cn/news/6488.html

相关文章:

  • win10-django项目与mysql的基本增删改查
  • 从代码学习深度学习 - 实战Kaggle比赛:狗的品种识别(ImageNet Dogs)PyTorch版
  • 关于nginx浏览器访问.php直接被当做文件下载相关问题
  • Github 2025-05-16 Java开源项目日报 Top9
  • OM和SCADA的区别
  • 目标检测指标计算
  • C++ I/O多路复用
  • uniapp自定义日历计划写法(vue2)
  • 生信分析进阶15 - 从GTF文件提取起始密码子、终止密码子、外显子剪切供体和受体
  • 基于大模型的脑出血智能诊疗与康复技术方案
  • 计算机组成原理——数据的表示
  • 使用 Docker 部署 React + Nginx 应用教程
  • 4.2.3 Thymeleaf标准表达式 - 5. 片段表达式
  • mac M芯片运行docker-desktop异常问题
  • 保姆教程-----安装MySQL全过程
  • minio存储文件迁移磁盘
  • SpringBoot + Shiro + JWT 实现认证与授权完整方案实现
  • 《k-means 散点图可视化》实验报告
  • 在服务器上安装AlphaFold2遇到的问题(3)_cat: /usr/include/cudnn_version.h: 没有那个文件或目录
  • 从概念到可工程化智能体的转变路径——以“知识奇点工程师”为例
  • Secs/Gem第四讲(基于secs4net项目的ChatGpt介绍)
  • Python零基础入门到高手8.4节: 元组与列表的区别
  • 深度学习中--模型调试与可视化
  • 易境通海外仓WMS系统:赋能海外仓多元化业务场景管理
  • 【通知】2025元宇宙数字人设计大赛启动,大赛线上报名阶段开启!
  • ROOM 数据库 | 实现自定义 ContentProvider 具有条件的批量删除、查询功能
  • 傻子学编程之——Java并发编程的问题与挑战
  • WHAT - 前端开发流程 SOP(标准操作流程)参考
  • 芋道项目,商城模块数据表结构
  • NetSuite CSV导入Item Fulfillment的功能测试