LangChain 提供了开箱即用的 RAG 实现,一个最简示例:
from langchain.chat_models import ChatOpenAI
from langchain.schema.runnable import RunnablePassthrough
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
# 构建 RAG chain
rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| rag_prompt
| llm
)
# 推理
rag_chain.invoke("What is Task Decomposition?")from langchain import LLMChain
from langchain.prompts import PromptTemplate
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain
# 内存保存对话历史
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
# 构建 conversational RAG chain
qa = ConversationalRetrievalChain.from_llm(
llm=llm,
retriever=retriever,
memory=memory
)
# 多轮对话调用
result = qa({"question": "藜怎么防治虫害?"})
print(result["answer"])特点:ConversationalRetrievalQA 会基于聊天历史压缩问题,然后再检索,支持多轮对话中的上下文理解。
TextLoader / PyPDFLoader 等加载不同格式文档;RecursiveCharacterTextSplitter 分割文档;PDF 是 RAG 应用中最常见的文档格式,但也是最复杂的:
PDF 不是为内容结构化设计的,它主要描述怎么在页面上渲染,不保存语义结构信息:
| 方法 | 思路 | 优缺点 |
|---|---|---|
| 基于规则 | 根据坐标、字体等规则提取内容 | 简单快,但不通用,复杂排版效果差 |
| 基于 AI | 目标检测 + OCR 识别各个元素 | 准确率高,通用性强,但速度较慢 |
表格识别包含两个子任务:表格检测(找到表格在哪里)和表格结构识别(找到单元格和行列关系)。
利用图像处理和规则:
pdfplumber 是 Python 中最常用的 PDF 表格抽取工具:
两种抽取模式:
lattice 模式(线框表格):
stream 模式(无线/少线表格):
| 方法 | 特点 |
|---|---|
| TableNet | 基于 VGG 编码器,两个分支分别检测表格区域和列区域,端到端,F1 ~0.96 |
| CascadeTabNet | 级联掩码 R-CNN + HRNet,端到端检测表格和结构,支持少量标注数据迁移 |
| SPLERGE | 先自上而下分割行列,再自下而上合并单元格,两阶段处理 |
| DeepDeSRT | 检测+结构识别,基于 Faster R-CNN 框架 |
表格识别出来后,一般转换为 CSV/Markdown 格式,然后作为上下文送入大模型,大模型能够理解表格内容并回答相关问题。
版面分析识别出文档的结构元素(标题、段落、表格、图片)后,文本分块需要利用这些结构信息:
多轮文档对话需要处理对话历史,核心问题是:如何基于历史对话理解当前问题,并正确检索。
工作流程:
# 问题生成链:基于历史压缩问题
question_generator = LLMChain(llm=llm, prompt=question_prompt)
# 回答生成链:基于检索文档回答问题
combine_docs_chain = StuffDocumentsChain(
llm_chain=answer_llm_chain,
document_variable_name="context"
)
# ConversationalRetrievalChain 整合
qa = ConversationalRetrievalChain(
combine_docs_chain=combine_docs_chain,
question_generator=question_generator,
retriever=retriever,
return_source_documents=True,
return_generated_question=True,
)数据准备:
分块策略:
Embedding 模型:
检索优化:
Prompt 工程:
评估:
回答要点:
回答要点:
回答要点:
回答要点: