RAG(Retrieval-Augmented Generation)基建之PDF解析的“魔法”与“陷阱”

news2025/3/24 20:05:19

嘿,亲爱的算法工程师们!今天咱们聊一聊PDF解析的那些事儿,简直就像是在玩一场“信息捉迷藏”游戏!PDF文档就像是个调皮的小精灵,表面上看起来规规矩矩,但当你想要从它那里提取信息时,它就开始跟你玩捉迷藏了。
在RAG(Retrieval-Augmented Generation)中,从文档中提取信息是一个不可避免的场景。确保从源内容中有效提取信息对于提高最终输出的质量至关重要。

不要低估这个过程。在实现RAG时,解析过程中信息提取不当会导致对PDF文件中包含信息的理解和利用受限。

下图显示了PDF解析过程(红框)在RAG中的位置。:在这里插入图片描述
在实际工作中,非结构化数据比结构化数据丰富得多。如果这些海量数据无法解析,它们的巨大价值将无法实现。

在非结构化数据中,PDF文档占据了大多数。 有效处理PDF文档也可以极大地帮助管理其他类型的非结构化文档。

预防针

1. PDF解析的“魔法”

  • 规则派:用规则去解析PDF,就像是用一把钥匙去开锁,虽然简单直接,但遇到复杂的PDF布局时,这把钥匙可能就“卡壳”了。
  • 深度学习派:深度学习模型就像是“魔法师”,能准确识别文档的布局,甚至能理解表格里的复杂结构。不过,这“魔法”需要强大的GPU加持,不然可能会慢得像蜗牛爬。
  • 多模态大模型派:这是最新的“黑科技”,结合了图像识别和文本处理,能像“超级侦探”一样从PDF中提取出最复杂的信息。

2. PDF解析的“陷阱”

  • 双栏PDF的“迷宫”:双栏PDF就像是个迷宫,解析时一不小心就会把左右栏的内容搞混。不过,咱们可以通过“中心线”算法来破解这个迷宫,确保信息按正确的顺序排列。
  • 多级标题的“捉迷藏”:PDF里的多级标题就像是在玩捉迷藏,你得通过布局块的高度差来找到它们。找到这些标题后,LLM的回答就会更加准确,就像给AI装上了“导航仪”。

3. 未来的“魔法棒”

  • 多模态模型:未来的PDF解析可能会越来越依赖多模态模型,尤其是结合了图像识别和文本处理的模型。它们不仅能解析表格,还能从图像中提取关键信息,简直是“全能选手”。

提前的忠告

PDF解析就像是一场“信息大冒险”,没有一种方法是万能的。你得根据具体的PDF类型和项目需求,选择合适的“魔法工具”。不过,如果你有条件,深度学习或多模态模型绝对是你的“最佳拍档”。

好了,下面我们进行详细的剖析

解析PDF文件的方法

解析PDF的难点

PDF文档是非结构化文档的代表,然而,从PDF文档中提取信息是一个具有挑战性的过程。

与其说PDF是一种数据格式,不如说它是一组打印指令。 PDF文件由一系列指令组成,这些指令告诉PDF阅读器或打印机在屏幕或纸张上显示符号的位置和方式。这与HTML和docx等文件格式形成对比,后者使用诸如<p><w:p><table><w:tbl>等标签来组织不同的逻辑结构,如图2所示:图2:HTML vs PDF。

解析PDF文档的挑战在于准确提取整个页面的布局,并将内容(包括表格、标题、段落和图像)转换为文档的文本表示。 这个过程涉及处理文本提取的不准确性、图像识别以及表格中行列关系的混淆。

解析PDF文档的“魔法”

一般来说,解析PDF有三种方法:

  • 基于规则的方法:根据文档的组织特征确定每个部分的样式和内容。然而,这种方法并不具有很好的通用性,因为PDF的类型和布局多种多样,无法用预定义的规则覆盖所有情况。
  • 基于深度学习模型的方法:例如结合目标检测和OCR模型的流行解决方案。
  • 基于多模态大模型的复杂结构解析或关键信息提取

基于规则的方法

最具代表性的工具之一是pypdf,它是一个广泛使用的基于规则的解析器。它是LangChain和LlamaIndex中解析PDF文件的标准方法。

以下是使用pypdf解析"Attention Is All You Need"论文第6页的尝试。原始页面如图3所示。

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Farxiv.org%2Fpdf%2F1706.03762.pdf&pos_id=img-ErnKMfZS-1742654400641

代码如下:

import PyPDF2
filename = "/Users/Florian/Downloads/1706.03762.pdf"
pdf_file = open(filename, 'rb')

reader = PyPDF2.PdfReader(pdf_file)

page_num = 5
page = reader.pages[page_num]
text = page.extract_text()

print('--------------------------------------------------')
print(text)

pdf_file.close()

执行结果如下(省略部分内容):

pip list | grep pypdf
pypdf                    3.17.4
pypdfium2                4.26.0

python /Users/Florian/Downloads/pypdf_test.py
--------------------------------------------------
Table 1: Maximum path lengths, per-layer complexity and minimum number of sequential operations
for different layer types. nis the sequence length, dis the representation dimension, kis the kernel
size of convolutions and rthe size of the neighborhood in restricted self-attention.
Layer Type Complexity per Layer Sequential Maximum Path Length
Operations
Self-Attention O(n2·d) O(1) O(1)
Recurrent O(n·d2) O(n) O(n)
Convolutional O(k·n·d2) O(1) O(logk(n))
Self-Attention (restricted) O(r·n·d) O(1) O(n/r)
3.5 Positional Encoding
Since our model contains no recurrence and no convolution, in order for the model to make use of the
order of the sequence, we must inject some information about the relative or absolute position of the
tokens in the sequence. To this end, we add "positional encodings" to the input embeddings at the
bottoms of the encoder and decoder stacks. The positional encodings have the same dimension dmodel
as the embeddings, so that the two can be summed. There are many choices of positional encodings,
learned and fixed [9].
In this work, we use sine and cosine functions of different frequencies:
PE(pos,2i)=sin(pos/100002i/d model)
PE(pos,2i+1)=cos(pos/100002i/d model)
where posis the position and iis the dimension. That is, each dimension of the positional encoding
corresponds to a sinusoid. The wavelengths form a geometric progression from 2πto10000 ·2π. We
chose this function because we hypothesized it would allow the model to easily learn to attend by
relative positions, since for any fixed offset k,PEpos+kcan be represented as a linear function of
PEpos.
...
...
...

根据PyPDF的检测结果,观察到它将PDF中的字符序列序列化为一个长序列,而没有保留结构信息。换句话说,它将文档的每一行视为由换行符“\n”分隔的序列,这阻碍了准确识别段落或表格。

这种限制是基于规则方法的固有特性。

基于深度学习模型的方法

这种方法的优点是能够准确识别整个文档的布局,包括表格和段落。它甚至可以理解表格内部的结构。这意味着它可以将文档划分为定义明确、完整的信息单元,同时保留预期的含义和结构。

然而,这种方法也有一些局限性。目标检测和OCR阶段可能耗时较长。因此,建议使用GPU或其他加速设备,并采用多进程和多线程进行处理。

这种方法涉及目标检测和OCR模型,我测试了几个具有代表性的开源框架:

  • Unstructured:它已经集成到langchain中。使用hi_res策略和infer_table_structure=True的表格识别效果很好。然而,fast策略表现不佳,因为它没有使用目标检测模型,错误地识别了许多图像和表格。
  • Layout-parser:如果需要识别复杂的结构化PDF,建议使用最大的模型以获得更高的准确性,尽管速度可能稍慢。此外,Layout-parser的模型在过去两年似乎没有更新。
  • PP-StructureV2:使用各种模型组合进行文档分析,性能高于平均水平。架构如下图所示:
    在这里插入图片描述

除了开源工具外,还有像ChatDOC这样的付费工具,它们利用基于布局的识别+OCR方法来解析PDF文档。

接下来,我们将解释如何使用开源的unstructured框架解析PDF,解决三个关键挑战。

挑战1:如何从表格和图像中提取数据

这里,我们将使用unstructured框架作为示例。检测到的表格数据可以直接导出为HTML。代码如下:

from unstructured.partition.pdf import partition_pdf

filename = "/Users/Florian/Downloads/Attention_Is_All_You_Need.pdf"

# infer_table_structure=True 自动选择 hi_res 策略
elements = partition_pdf(filename=filename, infer_table_structure=True)
tables = [el for el in elements if el.category == "Table"]

print(tables[0].text)
print('--------------------------------------------------')
print(tables[0].metadata.text_as_html)

**partition_pdf**函数的内部过程:下图是一个基本的流程图。

在这里插入图片描述

图5:**partition_pdf**函数的内部流程。作者提供的图片。

代码的运行结果如下:

Layer Type Self-Attention Recurrent Convolutional Self-Attention (restricted) Complexity per Layer O(n2 · d) O(n · d2) O(k · n · d2) O(r · n · d) Sequential Maximum Path Length Operations O(1) O(n) O(1) O(1) O(1) O(n) O(logk(n)) O(n/r)
--------------------------------------------------
<table><thead><th>Layer Type</th><th>Complexity per Layer</th><th>Sequential Operations</th><th>Maximum Path Length</th></thead><tr><td>Self-Attention</td><td>O(n? - d)</td><td>O(1)</td><td>O(1)</td></tr><tr><td>Recurrent</td><td>O(n- d?)</td><td>O(n)</td><td>O(n)</td></tr><tr><td>Convolutional</td><td>O(k-n-d?)</td><td>O(1)</td><td>O(logy(n))</td></tr><tr><td>Self-Attention (restricted)</td><td>O(r-n-d)</td><td>ol)</td><td>O(n/r)</td></tr></table>

将HTML标签复制并保存为HTML文件。然后,使用Chrome打开,如下所示:

None

可以观察到,unstructured的算法在很大程度上还原了整个表格。

挑战2:如何重新排列检测到的块?特别是对于双栏PDF。

在处理双栏PDF时,我们以论文"BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding"为例。阅读顺序如下图中的红色箭头所示:在这里插入图片描述
图7:双栏页面。

在识别布局后,unstructured框架将把每一页划分为几个矩形块,如下图所示:双栏。
在这里插入图片描述

每个矩形块的详细信息可以以以下格式获取:

[

LayoutElement(bbox=Rectangle(x1=851.1539916992188, y1=181.15073777777613, x2=1467.844970703125, y2=587.8204599999975), text='These approaches have been generalized to coarser granularities, such as sentence embed- dings (Kiros et al., 2015; Logeswaran and Lee, 2018) or paragraph embeddings (Le and Mikolov, 2014). To train sentence representations, prior work has used objectives to rank candidate next sentences (Jernite et al., 2017; Logeswaran and Lee, 2018), left-to-right generation of next sen- tence words given a representation of the previous sentence (Kiros et al., 2015), or denoising auto- encoder derived objectives (Hill et al., 2016). ', source=<Source.YOLOX: 'yolox'>, type='Text', prob=0.9519357085227966, image_path=None, parent=None), 

LayoutElement(bbox=Rectangle(x1=196.5296173095703, y1=181.1507377777777, x2=815.468994140625, y2=512.548237777777), text='word based only on its context. Unlike left-to- right language model pre-training, the MLM ob- jective enables the representation to fuse the left and the right context, which allows us to pre- In addi- train a deep bidirectional Transformer. tion to the masked language model, we also use a "next sentence prediction" task that jointly pre- trains text-pair representations. The contributions of our paper are as follows: ', source=<Source.YOLOX: 'yolox'>, type='Text', prob=0.9517233967781067, image_path=None, parent=None), 

LayoutElement(bbox=Rectangle(x1=200.22352600097656, y1=539.1451822222216, x2=825.0242919921875, y2=870.542682222221), text='• We demonstrate the importance of bidirectional pre-training for language representations. Un- like Radford et al. (2018), which uses unidirec- tional language models for pre-training, BERT uses masked language models to enable pre- trained deep bidirectional representations. This is also in contrast to Peters et al. (2018a), which uses a shallow concatenation of independently trained left-to-right and right-to-left LMs. ', source=<Source.YOLOX: 'yolox'>, type='List-item', prob=0.9414362907409668, image_path=None, parent=None), 

LayoutElement(bbox=Rectangle(x1=851.8727416992188, y1=599.8257377777753, x2=1468.0499267578125, y2=1420.4982377777742), text='ELMo and its predecessor (Peters et al., 2017, 2018a) generalize traditional word embedding re- search along a different dimension. They extract context-sensitive features from a left-to-right and a right-to-left language model. The contextual rep- resentation of each token is the concatenation of the left-to-right and right-to-left representations. When integrating contextual word embeddings with existing task-specific architectures, ELMo advances the state of the art for several major NLP benchmarks (Peters et al., 2018a) including ques- tion answering (Rajpurkar et al., 2016), sentiment analysis (Socher et al., 2013), and named entity recognition (Tjong Kim Sang and De Meulder, 2003). Melamud et al. (2016) proposed learning contextual representations through a task to pre- dict a single word from both left and right context using LSTMs. Similar to ELMo, their model is feature-based and not deeply bidirectional. Fedus et al. (2018) shows that the cloze task can be used to improve the robustness of text generation mod- els. ', source=<Source.YOLOX: 'yolox'>, type='Text', prob=0.938507616519928, image_path=None, parent=None), 


LayoutElement(bbox=Rectangle(x1=199.3734130859375, y1=900.5257377777765, x2=824.69873046875, y2=1156.648237777776), text='• We show that pre-trained representations reduce the need for many heavily-engineered task- specific architectures. BERT is the first fine- tuning based representation model that achieves state-of-the-art performance on a large suite of sentence-level and token-level tasks, outper- forming many task-specific architectures. ', source=<Source.YOLOX: 'yolox'>, type='List-item', prob=0.9461237788200378, image_path=None, parent=None), 

LayoutElement(bbox=Rectangle(x1=195.5695343017578, y1=1185.526123046875, x2=815.9393920898438, y2=1330.3272705078125), text='• BERT advances the state of the art for eleven NLP tasks. The code and pre-trained mod- els are available at https://github.com/ google-research/bert. ', source=<Source.YOLOX: 'yolox'>, type='List-item', prob=0.9213815927505493, image_path=None, parent=None), 

LayoutElement(bbox=Rectangle(x1=195.33956909179688, y1=1360.7886962890625, x2=447.47264000000007, y2=1397.038330078125), text='2 Related Work ', source=<Source.YOLOX: 'yolox'>, type='Section-header', prob=0.8663332462310791, image_path=None, parent=None), 

LayoutElement(bbox=Rectangle(x1=197.7477264404297, y1=1419.3353271484375, x2=817.3308715820312, y2=1527.54443359375), text='There is a long history of pre-training general lan- guage representations, and we briefly review the most widely-used approaches in this section. ', source=<Source.YOLOX: 'yolox'>, type='Text', prob=0.928022563457489, image_path=None, parent=None), 

LayoutElement(bbox=Rectangle(x1=851.0028686523438, y1=1468.341394166663, x2=1420.4693603515625, y2=1498.6444497222187), text='2.2 Unsupervised Fine-tuning Approaches ', source=<Source.YOLOX: 'yolox'>, type='Section-header', prob=0.8346447348594666, image_path=None, parent=None), 

LayoutElement(bbox=Rectangle(x1=853.5444444444446, y1=1526.3701822222185, x2=1470.989990234375, y2=1669.5843488888852), text='As with the feature-based approaches, the first works in this direction only pre-trained word em- (Col- bedding parameters from unlabeled text lobert and Weston, 2008). ', source=<Source.YOLOX: 'yolox'>, type='Text', prob=0.9344717860221863, image_path=None, parent=None), 

LayoutElement(bbox=Rectangle(x1=200.00000000000009, y1=1556.2037353515625, x2=799.1743774414062, y2=1588.031982421875), text='2.1 Unsupervised Feature-based Approaches ', source=<Source.YOLOX: 'yolox'>, type='Section-header', prob=0.8317819237709045, image_path=None, parent=None), 

LayoutElement(bbox=Rectangle(x1=198.64227294921875, y1=1606.3146266666645, x2=815.2886352539062, y2=2125.895459999998), text='Learning widely applicable representations of words has been an active area of research for decades, including non-neural (Brown et al., 1992; Ando and Zhang, 2005; Blitzer et al., 2006) and neural (Mikolov et al., 2013; Pennington et al., 2014) methods. Pre-trained word embeddings are an integral part of modern NLP systems, of- fering significant improvements over embeddings learned from scratch (Turian et al., 2010). To pre- train word embedding vectors, left-to-right lan- guage modeling objectives have been used (Mnih and Hinton, 2009), as well as objectives to dis- criminate correct from incorrect words in left and right context (Mikolov et al., 2013). ', source=<Source.YOLOX: 'yolox'>, type='Text', prob=0.9450697302818298, image_path=None, parent=None), 

LayoutElement(bbox=Rectangle(x1=853.4905395507812, y1=1681.5868488888855, x2=1467.8729248046875, y2=2125.8954599999965), text='More recently, sentence or document encoders which produce contextual token representations have been pre-trained from unlabeled text and fine-tuned for a supervised downstream task (Dai and Le, 2015; Howard and Ruder, 2018; Radford et al., 2018). The advantage of these approaches is that few parameters need to be learned from scratch. At least partly due to this advantage, OpenAI GPT (Radford et al., 2018) achieved pre- viously state-of-the-art results on many sentence- level tasks from the GLUE benchmark (Wang language model- Left-to-right et al., 2018a). ', source=<Source.YOLOX: 'yolox'>, type='Text', prob=0.9476840496063232, image_path=None, parent=None)

]

其中(x1, y1)是左上顶点的坐标,(x2, y2)是右下顶点的坐标:

        (x_1, y_1) --------
            |             |
            |             |
            |             |
            ---------- (x_2, y_2)

此时,您可以选择重新排列页面的阅读顺序。Unstructured自带一个排序算法,但我发现它在处理双栏情况时排序结果并不理想。

因此,有必要设计一个算法。最简单的方法是首先按左上顶点的水平坐标排序,如果水平坐标相同,则按垂直坐标排序。伪代码如下:

layout.sort(key=lambda z: (z.bbox.x1, z.bbox.y1, z.bbox.x2, z.bbox.y2))

然而,我们发现即使在同一列中的块,其水平坐标也可能有变化。如图9所示,紫色线块的水平坐标bbox.x1实际上更靠左。排序时,它将位于绿色线块之前,这显然违反了阅读顺序(同一列中的块可能具有不同的水平坐标)
在这里插入图片描述

在这种情况下,可以使用以下算法:

  • 首先,对所有左上顶点的x坐标**x1进行排序,得到x1_min**
  • 然后,对所有右下顶点的x坐标**x2进行排序,得到x2_max**
  • 接下来,确定页面中心线的x坐标为:
x1_min = min([el.bbox.x1 for el in layout])
x2_max = max([el.bbox.x2 for el in layout])
mid_line_x_coordinate = (x2_max + x1_min) /  2

接下来,if bbox.x1 < mid_line_x_coordinate,将块分类为左栏。否则,将其视为右栏。

分类完成后,根据每个块的y坐标对每栏中的块进行排序。最后,将右栏连接到左栏的右侧。

left_column = []
right_column = []
for el in layout:
    if el.bbox.x1 < mid_line_x_coordinate:
        left_column.append(el)
    else:
        right_column.append(el)

left_column.sort(key = lambda z: z.bbox.y1)
right_column.sort(key = lambda z: z.bbox.y1)
sorted_layout = left_column + right_column

值得一提的是,这种改进也适用于单栏PDF。

挑战3:如何提取多级标题

提取标题(包括多级标题)的目的是提高LLM回答的准确性。

例如,如果用户想知道图9中2.1节的主要思想,通过准确提取2.1节的标题,并将其与相关内容一起作为上下文发送给LLM,最终答案的准确性将显著提高。

该算法仍然依赖于图9中展示的布局块。我们可以提取**type='Section-header'的块,并计算高度差(bbox.y2 — bbox.y1**)。高度差最大的块对应一级标题,其次是二级标题,然后是三级标题。

基于多模态大模型的PDF复杂结构解析

在多模态模型爆发后,也可以使用多模态模型来解析表格。有几种选择:

  • 检索相关图像(PDF页面)并将其发送给GPT4-V以响应查询。
  • 将每个PDF页面视为图像,让GPT4-V对每个页面进行图像推理。为图像推理构建文本向量存储索引。查询答案时,针对图像推理向量存储进行查询。
  • 使用Table Transformer从检索到的图像中裁剪表格信息,然后将这些裁剪后的图像发送给GPT4-V以响应查询。
  • 对裁剪后的表格图像应用OCR,并将数据发送给GPT4/GPT-3.5以回答查询。

经过测试,确定第三种方法最有效。

此外,我们可以使用多模态模型从图像中提取或总结关键信息(PDF文件可以轻松转换为图像),如下图所示。
在这里插入图片描述

从图像中提取或总结关键信息。来源:GPT-4 with Vision: Complete Guide and
Evaluation。

结论

总的来说,非结构化文档具有高度的灵活性,需要各种解析技术。然而,目前还没有关于使用哪种方法最佳的共识。

在这种情况下,建议选择最适合项目需求的方法。建议根据不同类型的PDF应用特定的处理方法。例如,论文、书籍和财务报表可能根据其特点具有独特的设计。

尽管如此,如果条件允许,仍然建议选择基于深度学习或多模态的方法。这些方法可以有效地将文档划分为定义明确且完整的信息单元,从而最大限度地保留文档的预期含义和结构。

好了,今天的“PDF解析大冒险”就到这里!如果你还有什么问题,欢迎在评论区留言,咱们一起探讨!记住,搞砸了的话,你的工作可能会像气球一样飞走哦!😉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2320261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言【文件操作】详解中(会使用fgetc,fputc,fgets,fputs,fscanf,fprintf,fread,fwrite函数)

引言 介绍和文件操作中文件的顺序读写相关的函数 看这篇博文前&#xff0c;希望您先仔细看一下这篇博文&#xff0c;理解一下文件指针和流的概念&#xff1a;C语言【文件操作】详解上-CSDN博客文章浏览阅读606次&#xff0c;点赞26次&#xff0c;收藏4次。先整体认识一下文件是…

GpuGeek:破解算力难题,赋能AI创新与普及

文章目录 一、引言二、填补算力资源供需缺口&#xff0c;降低使用门槛三、提升算力资源利用率&#xff0c;推动高效协作四、满足多样化需求&#xff0c;支持AI技术落地五、推动算力市场创新&#xff0c;促进生态良性发展六、助力AI人才培养&#xff0c;推动行业长远发展七、结语…

扣子平台知识库不能上传成功

扣子平台知识库不能上传成功 目录 扣子平台知识库不能上传成功查看模板复制头部到自己的excel中json数据转为excel或者csv&#xff08;一定使用excel&#xff0c;csv总是报错&#xff09; 查看模板复制头部到自己的excel中 json数据转为excel或者csv&#xff08;一定使用excel&…

JVM的组成--运行时数据区

JVM的组成 1、类加载器&#xff08;ClassLoader&#xff09; 类加载器负责将字节码文件从文件系统中加载到JVM中&#xff0c;分为&#xff1a;加载、链接&#xff08;验证、准备、解析&#xff09;、和初始化三个阶段 2、运行时数据区 运行时数据区包括&#xff1a;程序计数…

c++进阶之------红黑树

一、概念 红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡二叉查找树&#xff0c;它在计算机科学的许多领域中都有广泛应用&#xff0c;比如Java中的TreeMap和C中的set/map等数据结构的底层实现。红黑树通过在每个节点上增加一个颜色属性&#xff08;红色或黑色&am…

ubuntu22.04安装搜狗输入法保姆教程~

一、添加中文语言支持 1.首先打开设置,找到Language and Region 2.点击Manage Installed Languages 3.点击 Install/Remove Languages... 4.选中Chinese (simplified),点击Apply

《数据库原理》SQLServer期末复习_题型+考点

目录 题型&#xff1a; 一. 概况分析题&#xff08;5小题&#xff0c;每小题2分&#xff0c;共10分&#xff09; 二. 计算题&#xff08;3小题&#xff0c;每小题5分&#xff0c;共15分&#xff09; 三. 数据库设计&#xff08;2小题&#xff0c;每小题10分&#xff0c;共2…

Zstd(Zstandard)压缩算法

要压缩的数据量越小&#xff0c;压缩的难度就越大。这个问题对所有压缩算法都是通用的&#xff0c;原因是压缩算法从过去的数据中学习如何压缩未来的数据。但是&#xff0c;在新数据集开始时&#xff0c;没有“过去”可以构建。 官网 为了解决这种情况&#xff0c;Zstd 提供了一…

本地部署 browser-use

本地部署 browser-use 0. 引言1. 核心功能与优势2. 快速上手3. 部署 Gradio UI4. 更多示例0. 引言 Browser-Use 是一个强大的工具,旨在让 AI Agent 能够控制浏览器,从而实现各种自动化任务。它简化了 AI 与浏览器的交互,让开发者能够轻松构建能够执行网页操作的智能应用。本…

Vite管理的Vue3项目中monaco editer的使用以及组件封装

文章目录 背景环境说明安装流程以及组件封装引入依赖封装组件 外部使用实现效果 v-model实现原理 背景 做oj系统的时候,需要使用代码编辑器,决定使用Monaco Editor&#xff0c;但是因为自身能力问题&#xff0c;读不懂官网文档&#xff0c;最终结合ai和网友的帖子成功引入&…

[笔记] TinyWebServer编译及demo运行过程

文章目录 前言环境搭建ubuntumysql 8.0c/c开启root用户TinyWebServer 搭建及编译过程运行结果常见问题./threadpool/../CGImysql/sql_connection_pool.h:6:10: fatal error: mysql/mysql.h: No such file or directory./server运行后直接退出了 前言 哎 也就帮帮新手看看问题 …

基于springboot的电影院管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 互联网技术的成熟和普及&#xff0c;势必会给人们的生活方式带来不同程度的改变。越来越多的经营模式中都少不了线上运营&#xff0c;互联网正强力推动着社会和经济发展。国人对民族文化的自信和不同文化的包容&#xff0c;再加上电影行业的发展&#xff0c;如此繁荣吸引…

虚拟电商-延迟任务系统的微服务改造(二)注册中心和Feign调用

一、微服务注册中心Consul 编写完延迟任务系统的web层接口&#xff0c;也就是说可以基于http协议来访问延迟系统&#xff0c;接下来要将延迟任务改造成一个服务。首要考虑的问题就是服务的注册与发现&#xff0c;服务的注册与发现都离不开服务的注册中心&#xff0c;本项目选取…

数智读书笔记系列022《算力网络-云网融合2.0时代的网络架构与关键技术》读书笔记

一、书籍核心价值与定位 1.1 书籍概述:中国联通研究院的权威之作 《算力网络 —— 云网融合 2.0 时代的网络架构与关键技术》由中国联通研究院算力网络攻关团队精心撰写,是业界首部系统性探讨云网融合 2.0 与算力网络的专著。在云网融合从 1.0 迈向 2.0 的关键节点,本书的…

第十六届蓝桥杯康复训练--6

题目链接&#xff1a;790. 数的三次方根 - AcWing题库 思路&#xff1a;二分&#xff0c;注意正负号和小数判断退出的方法&#xff08;虽然正负无所谓&#xff09; 代码&#xff1a; #include<bits/stdc.h> using namespace std;#define exs 0.00000018812716007232667…

logisim安装以及可能出现的问题

阅读提示&#xff1a;我这篇文章更偏向于安装出现问题的解决方案 目录 一、安装步骤 二、安装问题 1、出错的问题 2、出错的原因与解决方法 一、安装步骤 1、下载logisim 官方网站&#xff1a;https://sourceforge.net/projects/circuit/ 下载适用于你操作系统的版本&…

Servlet、HttpServletRequest、HttpServletResponse、静态与动态网页、jsp、重定向与转发

DAY15.2 Java核心基础 JavaWeb 要想通过浏览器或者客户端来访问java程序&#xff0c;必须通过Servlet来处理 没有Servlet&#xff0c;java是无法处理web请求的 Web交互&#xff1a; 接收请求HttpServletRequest&#xff1a;可以获取到请求的信息&#xff0c;比如uri&#…

hackmyvm-Icecream

arp-scan -l nmap -sS -v 192.168.222.106 enum4linux 192.168.222.106 445端口 smbmap -H 192.168.222.106 icecream为只读模式 smbclient \\192.168.222.106\icecream 反弹shell(上传put php-reverse-shell.php) 开启监听 nc -lnvp 1234 拿到webshell cat /etc/passwd 9000端…

告别低效人工统计!自动计算计划进度

实时监控任务进度一直是项目管理中的一项巨大挑战。 人工统计方式不仅耗时耗力&#xff0c;而且往往由于信息传递的延迟和人为误差&#xff0c;导致无法实时获得准确的项目进展信息。 这种不准确性可能掩盖潜在的风险点&#xff0c;从而影响项目的整体进度和成果。 Ganttable …

AI比人脑更强,因为被植入思维模型【16】反脆弱

毛选中就有言&#xff0c;不经历困难&#xff0c;我们就不会掌握战胜困难的方法。 这个世界纷繁复杂&#xff0c;不是强者总是运气好&#xff0c;而是他们能够失败后快速复原&#xff0c;不断找到战胜困难的方法。 定义 马斯洛需求层次模型是一种将人类需求从低到高按层次进…