# 处理长文本提取的终极指南:克服语言模型上下文窗口限制
在处理诸如PDF等文件时,你常常会遇到超过语言模型上下文窗口长度的文本。为了能够有效处理这些长文本,我们可以使用几种不同的策略:
1. **更换LLM**:选择支持更大上下文窗口的不同语言模型。
2. **暴力分块**:将文档拆分成小块,然后从每个块中提取内容。
3. **RAG(Retrieval-Augmented Generation)**:将文档分块、为这些块建立索引,并仅从看起来“相关”的部分提取内容。
这些策略各有其优缺点,选择哪种策略取决于你所设计的应用程序!本文将重点介绍如何实现第二和第三种策略。
## 设置
首先,我们需要一些示例数据!我们将从维基百科上下载一篇关于汽车的文章,并将其加载为LangChain文档。
```python
import re
import requests
from langchain_community.document_loaders import BSHTMLLoader
# 下载内容
response = requests.get("https://en.wikipedia.org/wiki/Car")
# 写入文件
with open("car.html", "w", encoding="utf-8") as f:
f.write(response.text)
# 使用HTML解析器加载
loader = BSHTMLLoader("car.html")
document = loader.load()[0]
# 清理文本,替换连续的换行符
document.page_content = re.sub("\n\n+", "\n", document.page_content)
print(len(document.page_content))
定义提取信息的结构
接下来,我们将使用Pydantic来定义我们希望提取的信息结构。在这个例子中,我们将提取"关键发展"的列表,包括年份和描述。
from typing import List
from langchain_core.pydantic_v1 import BaseModel, Field
class KeyDevelopment(BaseModel):
"""关于汽车历史发展的信息。"""
year: int = Field(..</