LangChain 提供了开箱即用的 RAG 实现,一个最简示例:
1from langchain.chat_models import ChatOpenAI
2from langchain.schema.runnable import RunnablePassthrough
3
4llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
5
6# 构建 RAG chain
7rag_chain = (
8 {"context": retriever, "question": RunnablePassthrough()}
9 | rag_prompt
10 | llm
11)
12
13# 推理
14rag_chain.invoke("What is Task Decomposition?")1from langchain import LLMChain
2from langchain.prompts import PromptTemplate
3from langchain.memory import ConversationBufferMemory
4from langchain.chains import ConversationalRetrievalChain
5
6# 内存保存对话历史
7memory = ConversationBufferMemory(
8 memory_key="chat_history",
9 return_messages=True
10)
11
12# 构建 conversational RAG chain
13qa = ConversationalRetrievalChain.from_llm(
14 llm=llm,
15 retriever=retriever,
16 memory=memory
17)
18
19# 多轮对话调用
20result = qa({"question": "藜怎么防治虫害?"})
21print(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 格式,然后作为上下文送入大模型,大模型能够理解表格内容并回答相关问题。
版面分析识别出文档的结构元素(标题、段落、表格、图片)后,文本分块需要利用这些结构信息:
多轮文档对话需要处理对话历史,核心问题是:如何基于历史对话理解当前问题,并正确检索。
工作流程:
1# 问题生成链:基于历史压缩问题
2question_generator = LLMChain(llm=llm, prompt=question_prompt)
3
4# 回答生成链:基于检索文档回答问题
5combine_docs_chain = StuffDocumentsChain(
6 llm_chain=answer_llm_chain,
7 document_variable_name="context"
8)
9
10# ConversationalRetrievalChain 整合
11qa = ConversationalRetrievalChain(
12 combine_docs_chain=combine_docs_chain,
13 question_generator=question_generator,
14 retriever=retriever,
15 return_source_documents=True,
16 return_generated_question=True,
17)数据准备:
分块策略:
Embedding 模型:
检索优化:
Prompt 工程:
评估:
回答要点:
回答要点:
回答要点:
回答要点: