RAG(Retrieval-Augmented Generation)整体分为三个阶段:索引构建 → 检索 → 生成。
1. Reranking RAG -- 大海捞针
最精确场景: 知识库非常庞大,但问题很具体。
适用场景: 法律法规查询、技术手册检索、客服问答。
- 传统的向量搜索(Embedding)有时会因为语义接近但逻辑无关而召回错误片段。
- Reranker 就像一个精审员,会对初选出的前 50 个片段进行"深度阅读",剔除那些虽然关键词像但实际不对的干扰项。
- 局限性: 只能处理"已经搜到"的内容。如果初筛(召回)阶段就没搜到,重排也没用。
已实现的开源库
- AnswerDotAI 一个通用 reranker 库,支持多种常见交叉编码器 / re-ranking 模型(Apache-2.0 开源)。可直接用于 RAG pipeline 的第二阶段重排序。
- SentenceTransformers 你可以使用 CrossEncoder 直接做 re-ranking 评分,也是常见工程实践:例如
from sentence_transformers import CrossEncoder来构建自己的 reranker
2. GraphRAG -- "全局观"和"隐含关联"
最精确场景: 需要跨文档总结、分析复杂关系、回答"全局性"问题。
它预先提取了实体(人、事、地)和关系,并生成了社区摘要(Community Summaries)。它不是在找"相似的文字",而是在查询"知识网络"。
已实现的开源库
- Microsoft GraphRAG (官方开源): 微软于 2024 年开源的重量级框架,它是目前实现 GraphRAG 最标准的路径。也是目前学术界和工业界谈论
GraphRAG时最常指代的特定算法架构。它包含完整的 Indexer(提取实体、关系、生成社区报告)和 Query Engine(全局或局部检索)。
教程- a. 核心机制: 它不仅是把数据存进图数据库,核心在于**"社区摘要"(Community Summaries)
- b. 索引阶段: 它利用 LLM 提取实体和关系,构建图谱,然后使用图算法将节点分组(社区),并为每个社区生成总结报告。
- c. 直接安装
pip install graphrag,并使用它提供的命令行工具进行索引和查询
- LangChain的GraphRAG, LangChain 并没有一个唯一的
GraphRAG 算法,它提供的是工具箱,让你能够把 LLM 连接到像 Neo4j、NebulaGraph 这样的图数据库上。- a. 核心机制: 通常基于 Cypher 查询生成。
- b. 用户输入问题 -> LangChain 调用 LLM 将自然语言转为图查询语句(如 Cypher SQL)。
- c. 从图数据库中检索出相关的节点、属性和关系。
- d. 将这些结构化数据喂给 LLM 生成答案。
总结建议
- 如果你有 海量非结构化文档(如几百本行业报告),想让 AI 帮你做深度综述和全局关联分析,请直接使用 Microsoft GraphRAG。
- 如果你已经有 结构化程度较高的数据,或者需要对数据关系进行毫秒级的精确路径查询(如反洗钱、社交网络分析),请使用 LangChain + Neo4j 的方案。
3. Agentic RAG
Agentic RAG 指的是 带有检索规划和多轮决策逻辑的 RAG pipeline;这部分目前还没有一个官方单库统一实现
主流库:
- LangGraph (LangChain 官方推荐): 目前构建 Agentic RAG 的首选。它允许你将 RAG 流程设计为一个"有向有环图",让 LLM 决定是否需要重新检索、是否要修正查询,甚至是在生成答案后进行自我打分(Self-RAG)。
- LlamaIndex (Workflow/Agents): LlamaIndex 提供了 AgentRunner 和多种预定义的 Agent 策略(如 ReAct),支持复杂的循环判断逻辑。
问1:学术论文pdf,学术报告pdf,用哪种更合适?
答:最合适方案:Agentic RAG + Reranking
- 特点: 逻辑严密,包含大量的引用、公式、实验数据和图表。
- 为什么这么选: * Agentic RAG 能够模拟学者的阅读行为。比如你问"这篇文章的消融实验结果如何?",Agent 会先去搜索"Ablation Study"章节,如果没找到,它会聪明地去搜"Results"或查看实验表格。
- Reranking 必不可少。论文中很多术语在不同语境下含义相近,向量搜索容易混淆,重排序能确保模型读到的是最关键的那几行论据。
- 最佳实践: 使用 Layout-Aware Parsing(布局感知解析)。论文的多栏排版是 RAG 的噩梦,必须先用工具(如 Grobid 或 PyMuPDF4LLM)把公式和表格完美转为 Markdown。
问2:租房合同/买房合同pdf,用哪种更合适?
答:✅ 推荐:GraphRAG(强烈推荐)
原因:
- 合同是天然的"图结构"
- 条款之间有显式引用
- 关系推理非常关键
- 向量检索容易:
- 找到条款 4.2,但忽略 7.3 的例外
- Graph traversal 可以避免这种错误。
问3:如果包含1万条客户数据的EXCEL表格,用哪种更合适?
答:最佳方案是代码解释器 Text-to-code,这是目前分析 Excel 最精确、最高效的方式。
核心库:LangChain Pandas Agent / Gemini Code Execution
工作原理: Gemini 不去搜索数据,而是编写 Python 代码(使用 Pandas 库)来处理数据。
流程:
- a. 用户提问:"帮我分析 2025 年 Q3 季度利润增长最快的部门。"
- b. LLM 生成 Python 代码:df[df['quarter']=='Q3'].groupby('dept')['profit'].sum()...
- c. 系统在沙箱环境中运行代码。
- d. Gemini 获取计算结果,并以自然语言或图表返回给你。
- e. 优势: 100% 准确。只要代码逻辑对,计算结果就是物理准确的,不存在 RAG 的"幻觉"问题。
RAG 是:Semantic Retrieval → Generation
Excel 是:Deterministic Computation
自己开发一个RAG策略
LLM接收到文档后:ChatGPT和Gemini AI的第一步动作,往往不是"直接读",而是"分类与策略分发"。
上传 PDF
↓
Extract to MarkDown
↓
Chunking
↓
Embedding
↓
Storage
↓
Router Engine → 意图感知型数据预处理 (Intent-Aware Preprocessing)
↓
用户问题解析
↓
Retrieval (Query from Vector Database)
↓
Genection
I 文档内容提取
docling 分析不同格式的文件,
可支持:PDF, DOCX, PPTX, XLSX, HTML, WAV, MP3, WebVTT, images (PNG, TIFF, JPEG, ...), LaTeX
python
from docling.document_converter import DocumentConverter
source = "https://arxiv.org/pdf/2408.09869"
converter = DocumentConverter()
result = converter.convert(source)
print(result.document.export_to_markdown())
或者
Microsoft MarkItDown 是将多种格式的文件转换成MarkDown格式的内容,
支持PDF, PowerPoint, Word, Excel, Images (EXIF metadata and OCR), Audio, HTML, Text-based formats (CSV, JSON, XML), ZIP files (iterates over contents), Youtube URLs, EPubs, 还有很多
安装命令:pip install markitdown[all]
python
from markitdown import MarkItDown
md = MarkItDown(enable_plugins=False)
result = md.convert("Guide for applicants_MSCA PF 2024.pdf")
print(result.text_content)
python
# 将结果存储到markdown的文本文件里,以便于下次直接使用
with open("Guide_for_applicants_MSCA.md", "w", encoding="utf-8") as f:
f.write(result_a)
个人体验,在Google Colab上面,MarkItDown库的运行速度要超过docling。
II LlamaIndex
LlamaIndex: 像一个专业的数据库管理员。它在检索深度和数据结构化方面做得更好。如果你核心的需求是"让 AI 读文档、查数据且要回答得准",LlamaIndex 通常是首选。
第一步设置LLM和API参数
python
import os
from llama_index.core import Settings
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
os.environ["OPENAI_API_KEY"] = "sk-proj-xxxxxx"
# 全局模型配置
Settings.llm = OpenAI(
model="gpt-4o-mini", # 2026年性价比最高的模型
api_base="https://api.openai.com/v1", # 如果你使用公司内网或中转,请修改 base_url
temperature=0.1
)
# 向量模型配置
Settings.embed_model = OpenAIEmbedding(
model="text-embedding-3-small",
api_base="https://api.openai.com/v1"
)
安装llama-index
shell
pip install llama-index
python
from llama_index.core.node_parser import MarkdownNodeParser, SentenceSplitter
# 1. 定义解析逻辑:先按 Markdown 结构分,再按字数强制兜底
# 这样即便某个章节有 100 页,也会被切成多个 1024 tokens 的小块
base_splitter = SentenceSplitter(chunk_size=1024, chunk_overlap=100)
parser = MarkdownNodeParser()
# 2. 处理文档
print("开始智能切分文档...")
# 注意:MarkdownNodeParser 在 LlamaIndex 新版中会递归处理长文本
nodes = parser.get_nodes_from_documents(documents)
# 容错处理(保险起见):如果还有超长的,强制再切一次
final_nodes = []
for node in nodes:
if len(node.get_content()) > 6000: # 预警线设定在 6000 字符
final_nodes.extend(base_splitter.get_nodes_from_documents([node]))
else:
final_nodes.append(node)
安装向量检索Rerank
shell
pip install llama-index-postprocessor-sbert-rerank
- 索引构建:将文本转换为向量(此处会调用 OpenAI Embedding)
python
from llama_index.core import VectorStoreIndex, StorageContext
print("正在构建向量索引...")
index = VectorStoreIndex(final_nodes)
# (可选) 持久化保存索引到本地,防止下次运行重复扣费
index.storage_context.persist(persist_dir="./storage")
# (可选) 持久化保存索引到PostgreSQL, pyvector,以便于后续方便获取,减少重复扣费
# pip install llama-index-vector-stores-postgres
- 检索增强:引入本地 Sentence-Transformers 重排
python
from llama_index.postprocessor.sbert_rerank import SentenceTransformerRerank
# 这一步不需要访问 OpenAI 接口,完全在本地 CPU/GPU 运行
# 解决了"向量检索不准"的问题,特别适合论文和合同
rerank_postprocessor = SentenceTransformerRerank(
model="BAAI/bge-reranker-base", # 第一次运行会自动下载
top_n=3 # 最终喂给大模型的最精准片段数量
)
5.查询和生成
python
# 构建查询引擎
query_engine = index.as_query_engine(
similarity_top_k=10, # 初始找 10 个候选
node_postprocessors=[rerank_postprocessor]
)
question = "Is this program limited to EU students?"
print(f"正在提问: {question}")
response = query_engine.query(question)
print(response)
输出
text
The program is not limited to EU students; it is open to researchers of any nationality. However, there are specific eligibility criteria regarding residency and the location of the beneficiary and associated partners that must be met.
III GraphRAG
看下篇博客
VI Agentic RAG
看下篇博客