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并提供层次化布局信息来解决这个问题,包括:
- 章节和子章节及其级别。
- 段落 - 组合行。
- 章节和段落之间的链接。
- 表格及其所在的章节。
- 列表和嵌套列表。
- 连接跨页内容。
- 移除重复的页眉和页脚。
- 水印移除。
使用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/F1 | SQuAD 2.0 EM/F1 | MNLI m/mm | SST Acc | QQP Acc | QNLI Acc | STS-B Acc | RTE Acc | MRPC Acc | CoLA Mcc | |
---|---|---|---|---|---|---|---|---|---|---|
BERT | 84.1/90.9 | 79.0/81.8 | 86.6/- | 93.2 | 91.3 | 92.3 | 90.0 | 70.4 | 88.0 | 60.6 |
UniLM | -/- | 80.5/83.4 | 87.0/85.9 | 94.5 | - | 92.7 | - | 70.9 | - | 61.1 |
XLNet | 89.0/94.5 | 86.1/88.8 | 89.8/- | 95.6 | 91.8 | 93.9 | 91.8 | 83.8 | 89.2 | 63.6 |
RoBERTa | 88.9/94.6 | 86.5/89.4 | 90.2/90.2 | 96.4 | 92.2 | 94.7 | 92.4 | 86.6 | 90.9 | 68.0 |
BART | 88.8/94.6 | 86.1/89.2 | 89.9/90.1 | 96.6 | 92.5 | 94.9 | 91.2 | 87.0 | 90.4 | 62.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/DailyMail | XSum | - | ||||
---|---|---|---|---|---|---|
R1 | R2 | RL | R1 | R2 | RL | |
--- | --- | --- | --- | --- | --- | --- |
Lead-3 | 40.42 | 17.62 | 36.67 | 16.30 | 1.60 | 11.95 |
PTGEN (See et al., 2017) | 36.44 | 15.66 | 33.42 | 29.70 | 9.21 | 23.24 |
PTGEN+COV (See et al., 2017) | 39.53 | 17.28 | 36.38 | 28.10 | 8.02 | 21.72 |
UniLM | 43.33 | 20.21 | 40.51 | - | - | - |
BERTSUMABS (Liu & Lapata, 2019) | 41.72 | 19.39 | 38.76 | 38.76 | 16.33 | 31.15 |
BERTSUMEXTABS (Liu & Lapata, 2019) | 42.13 | 19.60 | 39.18 | 38.81 | 16.50 | 31.27 |
BART | 44.16 | 21.28 | 40.90 | 45.14 | 22.27 | 37.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