Project Icon

llmsherpa

PDF智能解析与大语言模型应用框架

LLM Sherpa是一个开源项目,提供LayoutPDFReader工具用于智能解析PDF文档结构,包括章节、段落和表格。该工具支持精确分块并保留上下文信息,适用于向量搜索和生成式AI应用。项目提供API接口,便于集成到各类大语言模型应用中,如问答系统和文本摘要。LLM Sherpa简化了PDF处理流程,为开发者提供了高效的大语言模型应用开发框架。

LLM Sherpa

LLM Sherpa提供战略性API,以加速大型语言模型(LLM)的应用场景。

最新动态

[!重要] llmsherpa后端服务现已完全开源,采用Apache 2.0许可证。详见https://github.com/nlmatics/nlm-ingestor

  • 现在您可以使用Docker镜像运行自己的服务器!
  • 支持不同的文件格式:DOCX、PPTX、HTML、TXT、XML
  • 内置OCR支持
  • 块现在有坐标 - 使用块(如章节)的bbox属性
  • 新的缩进解析器,更好地将文档中的所有标题对齐到相应的级别
  • 免费服务器和付费服务器未更新最新代码,建议用户按照nlm-ingestor中的说明启动自己的服务器

LayoutPDFReader

大多数PDF转文本解析器不提供布局信息。通常,甚至句子也被任意的回车换行符分割,使得很难找到段落边界。这在为LLM应用(如检索增强生成(RAG))索引/向量化PDF时,对分块和添加长期上下文信息(如章节标题)到段落中造成了各种挑战。

LayoutPDFReader通过解析PDF并提供层次化布局信息来解决这个问题,包括:

  1. 章节和子章节及其级别。
  2. 段落 - 组合行。
  3. 章节和段落之间的链接。
  4. 表格及其所在的章节。
  5. 列表和嵌套列表。
  6. 连接跨页内容。
  7. 移除重复的页眉和页脚。
  8. 水印移除。

使用LayoutPDFReader,开发人员可以找到最佳的文本块进行向量化,并为LLM的有限上下文窗口大小提供解决方案。

您可以直接在Google Colab这里试验该库

这里有一篇文章解释了问题和我们的方法。

这里有一篇LlamaIndex的博客解释了智能分块的需求。

API参考https://llmsherpa.readthedocs.io/

如何与Google Gemini Pro一起使用 如何与Cohere Embed3一起使用

重要提示

  • LayoutPDFReader已在各种PDF上进行了测试。尽管如此,正确解析每一个PDF仍然具有挑战性。
  • 目前不支持OCR。仅支持带有文本层的PDF。

[!注意] LLMSherpa使用免费开放的API服务器。该服务器除了在解析期间临时存储外,不会存储您的PDF。此服务器将很快停用。 使用https://github.com/nlmatics/nlm-ingestor中的说明自行托管您的私有服务器

[!重要] Microsoft Azure Marketplace上的私有版本 将很快停用。请使用https://github.com/nlmatics/nlm-ingestor中的说明迁移到您的自托管实例。

安装

pip install llmsherpa

读取PDF文件

使用LayoutPDFReader的第一步是提供URL或文件路径,然后获取文档对象。

from llmsherpa.readers import LayoutPDFReader

llmsherpa_api_url = "https://readers.llmsherpa.com/api/document/developer/parseDocument?renderFormat=all"
pdf_url = "https://arxiv.org/pdf/1910.13461.pdf" # 也允许使用文件路径,例如 /home/downloads/xyz.pdf
pdf_reader = LayoutPDFReader(llmsherpa_api_url)
doc = pdf_reader.read_pdf(pdf_url)

安装LlamaIndex

在以下示例中,为简单起见,我们将使用LlamaIndex。如果您还没有安装,请安装该库。

pip install llama-index

设置OpenAI

import openai
openai.api_key = #<插入API密钥>

使用智能分块进行向量搜索和检索增强生成

LayoutPDFReader通过保持文档结构相关的文本在一起进行智能分块:

  • 所有列表项目都在一起,包括列表前的段落。
  • 表格中的项目一起分块
  • 包含来自章节标题和嵌套章节标题的上下文信息

以下代码使用LayoutPDFReader文档块创建LlamaIndex查询引擎

from llama_index.core import Document
from llama_index.core import VectorStoreIndex

index = VectorStoreIndex([])
for chunk in doc.chunks():
    index.insert(Document(text=chunk.to_context_text(), extra_info={}))
query_engine = index.as_query_engine()

让我们运行一个查询:

response = query_engine.query("列出所有使用bart的任务")
print(response)

我们得到以下响应:

BART在文本生成、理解任务、抽象对话、问答和摘要任务方面表现良好。

让我们尝试另一个需要从表格中获取答案的查询:

response = query_engine.query("bart在squad上的性能得分是多少")
print(response)

我们得到以下响应:

BART在SQuAD上的性能得分为EM 88.8和F1 94.6。

使用提示总结章节

LayoutPDFReader提供了强大的方法来从大型文档中选择章节和子章节,并使用LLM从章节中提取洞见。

以下代码查找文档中的Fine-tuning章节:

from IPython.core.display import display, HTML
selected_section = None
# 通过标题在文档中查找章节
for section in doc.sections():
    if section.title == '3 Fine-tuning BART':
        selected_section = section
        break
# 使用include_children=True和recurse=True来完全展开章节。
# include_children只返回一个子级别的子项,而recurse会遍历所有后代
HTML(section.to_html(include_children=True, recurse=True))

运行上述代码会产生以下HTML输出:

3 Fine-tuning BART

BART产生的表示可以在下游应用中以几种方式使用。

3.1 序列分类任务

对于序列分类任务,相同的输入被送入编码器和解码器,最后一个解码器标记的最终隐藏状态被送入新的多类线性分类器。\n这种方法与BERT中的CLS标记相关;但是我们在末尾添加额外的标记,以便该标记在解码器中的表示可以关注来自完整输入的解码器状态(图3a)。

3.2 标记分类任务

对于标记分类任务,如SQuAD的答案端点分类,我们将完整文档送入编码器和解码器,并使用解码器的顶层隐藏状态作为每个词的表示。\n这个表示用于分类标记。

3.3 序列生成任务

由于BART有一个自回归解码器,它可以直接微调用于序列生成任务,如抽象问答和摘要。\n在这两个任务中,信息从输入中复制但被操纵,这与去噪预训练目标密切相关。\n在这里,编码器输入是输入序列,解码器自回归地生成输出。

3.4 机器翻译

我们还探索了使用BART来改进翻译成英语的机器翻译解码器。\n先前的工作Edunov等人。\n(2019)已经表明,通过结合预训练编码器可以改进模型,但在解码器中使用预训练语言模型的收益有限。\n我们展示了可以通过添加一组从双语文本学习的新编码器参数,将整个BART模型(包括编码器和解码器)用作机器翻译的单一预训练解码器(见图3b)。

更确切地说,我们用一个新的随机初始化的编码器替换了BART的编码器嵌入层。\n模型进行端到端训练,这训练新编码器将外语词映射到BART可以去噪为英语的输入。\n新编码器可以使用与原始BART模型不同的词汇表。

我们分两步训练源编码器,在两种情况下都从BART模型的输出反向传播交叉熵损失。\n在第一步中,我们冻结大部分BART参数,只更新随机初始化的源编码器、BART位置嵌入和BART编码器第一层的自注意力输入投影矩阵。\n在第二步中,我们训练所有模型参数几个迭代。

现在,让我们使用提示创建这段文本的自定义摘要:

from llama_index.llms import OpenAI
context = selected_section.to_html(include_children=True, recurse=True)
question = "列出所讨论的所有任务,并对每个任务进行一行描述"
resp = OpenAI().complete(f"阅读这段文本并回答问题:{question}:\n{context}")
print(resp.text)

上述代码产生以下输出:

文本中讨论的任务:

1. 序列分类任务:相同的输入被送入编码器和解码器,最后一个解码器标记的最终隐藏状态用于多类线性分类。
2. 标记分类任务:完整文档被送入编码器和解码器,解码器的顶层隐藏状态用作每个词的表示进行标记分类。
3. 序列生成任务:BART可以微调用于抽象问答和摘要等任务,其中编码器输入是输入序列,解码器自回归地生成输出。
4. 机器翻译:BART可以用于改进机器翻译解码器,通过结合预训练编码器并将整个BART模型用作单一预训练解码器。新编码器参数从双语文本中学习。

使用提示分析表格

使用LayoutPDFReader,您可以遍历文档中的所有表格,并利用LLM的能力分析表格。 让我们看看这个文档中的第6个表格。如果您使用的是笔记本,可以按以下方式显示表格:

from IPython.core.display import display, HTML
HTML(doc.tables()[5].to_html())

输出的表格结构如下:

SQuAD 1.1 EM/F1SQuAD 2.0 EM/F1MNLI m/mmSST AccQQP AccQNLI AccSTS-B AccRTE AccMRPC AccCoLA Mcc
BERT84.1/90.979.0/81.886.6/-93.291.392.390.070.488.060.6
UniLM-/-80.5/83.487.0/85.994.5-92.7-70.9-61.1
XLNet89.0/94.586.1/88.889.8/-95.691.893.991.883.889.263.6
RoBERTa88.9/94.686.5/89.490.2/90.296.492.294.792.486.690.968.0
BART88.8/94.686.1/89.289.9/90.196.692.594.991.287.090.462.8

现在让我们提出一个问题来分析这个表格:

from llama_index.llms import OpenAI
context = doc.tables()[5].to_html()
resp = OpenAI().complete(f"阅读这个表格并回答问题:哪个模型在squad 2.0上表现最好:\n{context}")
print(resp.text)

上述问题将得到以下输出:

在SQuAD 2.0上表现最好的模型是RoBERTa,其EM/F1得分为86.5/89.4。

就是这样!LayoutPDFReader还支持带有嵌套标题和标题行的表格。

这里是一个带有嵌套标题的例子:

from IPython.core.display import display, HTML
HTML(doc.tables()[6].to_html())
CNN/DailyMailXSum-
R1R2RLR1R2RL
---------------------
Lead-340.4217.6236.6716.301.6011.95
PTGEN (See et al., 2017)36.4415.6633.4229.709.2123.24
PTGEN+COV (See et al., 2017)39.5317.2836.3828.108.0221.72
UniLM43.3320.2140.51---
BERTSUMABS (Liu & Lapata, 2019)41.7219.3938.7638.7616.3331.15
BERTSUMEXTABS (Liu & Lapata, 2019)42.1319.6039.1838.8116.5031.27
BART44.1621.2840.9045.1422.2737.25

现在让我们提出一个有趣的问题:

from llama_index.llms import OpenAI
context = doc.tables()[6].to_html()
question = "告诉我bart在不同数据集上的R1表现"
resp = OpenAI().complete(f"阅读这个表格并回答问题:{question}:\n{context}")
print(resp.text)

我们得到了以下回答:

BART在不同数据集上的R1表现:

- 对于CNN/DailyMail数据集,BART的R1得分是44.16。
- 对于XSum数据集,BART的R1得分是45.14。

获取原始JSON

要获取llmsherpa服务返回的完整json并进行不同的处理,只需获取json属性

doc.json
项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号