llmsherpa

llmsherpa

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

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

LLM SherpaLayoutPDFReaderPDF解析向量搜索文档结构分析Github开源项目

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输出:

<h3>3 Fine-tuning BART</h3><p>BART产生的表示可以在下游应用中以几种方式使用。</p><h4>3.1 序列分类任务</h4><p>对于序列分类任务,相同的输入被送入编码器和解码器,最后一个解码器标记的最终隐藏状态被送入新的多类线性分类器。\n这种方法与BERT中的CLS标记相关;但是我们在末尾添加额外的标记,以便该标记在解码器中的表示可以关注来自完整输入的解码器状态(图3a)。</p><h4>3.2 标记分类任务</h4><p>对于标记分类任务,如SQuAD的答案端点分类,我们将完整文档送入编码器和解码器,并使用解码器的顶层隐藏状态作为每个词的表示。\n这个表示用于分类标记。</p><h4>3.3 序列生成任务</h4><p>由于BART有一个自回归解码器,它可以直接微调用于序列生成任务,如抽象问答和摘要。\n在这两个任务中,信息从输入中复制但被操纵,这与去噪预训练目标密切相关。\n在这里,编码器输入是输入序列,解码器自回归地生成输出。</p><h4>3.4 机器翻译</h4><p>我们还探索了使用BART来改进翻译成英语的机器翻译解码器。\n先前的工作Edunov等人。\n(2019)已经表明,通过结合预训练编码器可以改进模型,但在解码器中使用预训练语言模型的收益有限。\n我们展示了可以通过添加一组从双语文本学习的新编码器参数,将整个BART模型(包括编码器和解码器)用作机器翻译的单一预训练解码器(见图3b)。</p><p>更确切地说,我们用一个新的随机初始化的编码器替换了BART的编码器嵌入层。\n模型进行端到端训练,这训练新编码器将外语词映射到BART可以去噪为英语的输入。\n新编码器可以使用与原始BART模型不同的词汇表。</p><p>我们分两步训练源编码器,在两种情况下都从BART模型的输出反向传播交叉熵损失。\n在第一步中,我们冻结大部分BART参数,只更新随机初始化的源编码器、BART位置嵌入和BART编码器第一层的自注意力输入投影矩阵。\n在第二步中,我们训练所有模型参数几个迭代。</p>

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

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

编辑推荐精选

Keevx

Keevx

AI数字人视频创作平台

Keevx 一款开箱即用的AI数字人视频创作平台,广泛适用于电商广告、企业培训与社媒宣传,让全球企业与个人创作者无需拍摄剪辑,就能快速生成多语言、高质量的专业视频。

即梦AI

即梦AI

一站式AI创作平台

提供 AI 驱动的图片、视频生成及数字人等功能,助力创意创作

扣子-AI办公

扣子-AI办公

AI办公助手,复杂任务高效处理

AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!

TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
蛙蛙写作

蛙蛙写作

AI小说写作助手,一站式润色、改写、扩写

蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。

AI辅助写作AI工具蛙蛙写作AI写作工具学术助手办公助手营销助手AI助手
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

下拉加载更多