引言
在处理长文本文件(如PDF)时,文本长度经常会超出语言模型的上下文窗口。这篇文章将介绍如何使用分块处理和检索增强生成(RAG)方法来有效地提取文本中的关键信息。
主要内容
分块处理法
分块处理法是将文档分成合适大小的片段,并从每个片段中提取内容。此方法简单直接,但需注意分块策略以确保信息完整性和准确性。
检索增强生成(RAG)
RAG方法则通过对文档进行索引,仅从看似“相关”的子集片段中提取内容。此方法的挑战在于确定相关性,但可以通过实验找到适合的设置。
代码示例
以下代码示例演示如何实现分块提取和RAG方法:
import re
import requests
from typing import List
from langchain_community.document_loaders import BSHTMLLoader
from langchain_text_splitters import TokenTextSplitter
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_core.prompts import ChatPromptTemplate
from langchain_google_vertexai import ChatVertexAI
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
# 下载并加载文档
response = requests.get("https://en.wikipedia.org/wiki/Car")
with open("car.html", "w", encoding="utf-8") as f:
f.write(response.text)
loader = BSHTMLLoader("car.html")
document = loader.load()[0]
document.page_content = re.sub("\n\n+", "\n", document.page_content)
# 定义提取信息的模式
class KeyDevelopment(BaseModel):
year: int = Field(..., description="Development year.")
description: str = Field(..., description="Event description.")
evidence: str = Field(..., description="Source text.")
class ExtractionData(BaseModel):
key_developments: List[KeyDevelopment]
prompt = ChatPromptTemplate.from_messages([
("system", "Extract key developments."),
("human", "{text}"),
])
llm = ChatVertexAI(model="gemini-1.5-flash")
extractor = prompt | llm.with_structured_output(schema=ExtractionData)
# 分块处理
text_splitter = TokenTextSplitter(chunk_size=2000, chunk_overlap=20)
texts = text_splitter.split_text(document.page_content)
# 提取数据
extractions = extractor.batch([{"text": text} for text in texts[:3]], {"max_concurrency": 5})
# 合并结果
key_developments = []
for extraction in extractions:
key_developments.extend(extraction.key_developments)
# RAG 方法
vectorstore = FAISS.from_texts(texts, embedding=OpenAIEmbeddings())
retriever = vectorstore.as_retriever(search_kwargs={"k": 1})
rag_extractor = {
"text": retriever | (lambda docs: docs[0].page_content)
} | extractor
results = rag_extractor.invoke("Key developments associated with cars")
常见问题和解决方案
- 信息碎片化:信息可能分布在多个片段中,需优化分块策略。
- 重复信息:重叠大的分块可能导致信息重复,需准备去重。
- 虚假数据:LLMs可能生成虚假信息,需谨慎验证。
总结和进一步学习资源
分块处理和RAG是处理长文本时的两种有效策略。通过实验可以找到适合特定应用场景的方法。以下资源可供进一步学习:
参考资料
- LangChain 官方文档
- OpenAI API 使用指南
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---