摘要
本文讨论了信息检索与文本生成畛域的最新停顿,特意关注了OpenAI的RAG模型及其在文本内容搜查上的运行。文章详细引见了gpt-4-vision-preview模型,这一模型标记着从结构化搜查向非结构化搜查的严重转变,能够有效处置和解释多模态信息,如图片、表格和文本。经过实践案例剖析,文章展现了如何应用这些技术启动企业文档治理、学术钻研和媒体内容剖析,为读者提供了关于如何运用这些先进技术启动多模态数据处置的深化见地。
开篇
在人工智能的畛域内,信息检索与文本生成不时是两个关键的钻研方向。OpenAI的RAG(Retrieval-Augmented Generation)模型,作为这一畛域的打破性成绩,成功地将神经网络的文本生成才干与大规模数据集的检索性能联合起来。这一翻新不只优化了文本生成模型的准确性和信息丰盛度,而且处置了传统模型在应回答杂查问时的局限性。
RAG模型的干流运行体如今文本内容的搜查上,例如企业常识库的检索。经过文本加载、切割、嵌入、索引等方法树立输入与指标的关系性,最终将搜查结果出现给用户。但是,随着信息类型的多样化,传统的文本搜查曾经不能满足一切的需求。
此时,OpenAI推出了gpt-4-vision-preview模型,这不只是技术上的一大跃进,更标记着从结构化搜查走向非结构化搜查的关键转变。该模型具有处置和解释多模态信息的才干,无论是图片、表格还是文本,都能够被有效地摘要和搜查。这一提高极大地裁减了RAG性能的外延,为多模态数据处置开拓了新的路线。
例如,在企业文档治理方面,gpt-4-vision-preview可以剖析含有图表和文本的PDF格局文档,如合同和报告,提供精准的摘要和关键信息提取。在学术钻研畛域,这一技术能智能整顿和剖析学术论文中的数据和图像,极大优化钻研效率。而在媒体内容剖析上,资讯报道中的图片与文本内容可以被整合剖析,为媒体从业者提供更深化的洞察。
当天我会经过这篇文章,手把手带大家如何成功对一个多模态PDF的剖析和搜查。
场景剖析
那么当天的主角就要退场了,如下图所示,这个PDF文件是一个典型的财经市场剖析报告,蕴含了丰盛的文字、图表和数据。
报告不只蕴含了详细的文本形容,如市场趋向的剖析和预测,还包括了少量的图表和数据,如股票市场的指数、固定收益产品的收益率和关键利率等。这些图表和数据无了解整个市场状况中起着至关关键的作用。
但是,人工处置这类多模态的PDF文件经常是耗时且劳力密集的。剖析师须要细心浏览文本,解读图表和数据,并将这些信息综合起来以构成完整的市场观念。这个环节不只耗时,还容易出错,特意是在处置少量复杂数据时。
传统的RAG模型在处置这类多模态PDF文件时显得力所能及。虽然RAG在处置和生成基于文本的信息方面体现杰出,但它关键针对文字内容启动搜查和生成,关于非文本元素,如图表和数据,其处置才干有限。这就象征着,在经常使用RAG模型启动信息检索时,关于蕴含非文本元素的复杂PDF文件,它或者不可充沛了解和应用文件中的一切信息。
因此,针对这种业务场景就须要经常使用OpenAI推出的多模态的处置方式,应用GPT 模型处置文本、图表和数据,以提供愈加片面和准确的剖析。从而提高剖析效率,还能增加由于人工处置的失误而形成的危险。
技术剖析
在多模态PDF文档处置中,首要应战是识别文档中的非结构化信息,如图片、表格和文字。这里咱们须要经常使用 提供了用于摄取和预处置图像和文本文档的开源组件,如PDF、HTML、Word文档等。它的关键用途是简化和优化大型言语模型(LLMs)的数据处置上班流程。unstructured的模块化性能和衔接器构成了一个简化数据摄取和预处置的分歧系统,使其顺应不同平台,有效地将非结构化数据转换为结构化输入
除此之外,为了更好处置PDF文档,咱们还引入了poppler-utils工具, 它被用来提取图片和文本。特意是其中的pdfimages和pdftotext工具,区分用于从PDF中提取嵌入的图像和所有文本,这关于多模态PDF的剖析至关关键。
备注:Poppler是一个PDF文档渲染库,可以经常使用两种后端启动绘制,区分是Cairo和Splash。这两种后端的个性有所不同,Poppler的性能也或者依赖于它经常使用的后端。此外,还有一个基于Qt4的绘图框架“Arthur”的后端,但这个后端不完整且已中止开发。Poppler为Glib和Qt5提供绑定,这些绑定提供了对Poppler后端的接口,虽然Qt5绑定只允许Splash和Arthur后端。Cairo后端允许矢量图形的抗锯齿和透明对象,但不允许平滑位图图像如扫描文档,并且不依赖于X Window系统,因此Poppler可以在Wayland、Windows或macOS等平台上运转。Splash后端允许位图的增加过滤。Poppler还附带一个文本渲染后端,可经过命令行工具pdftotext调用,用于在命令行中搜查PDF中的字符串,例如经常使用grep工具。
处置了图片、表格和疑问的提取疑问之后,在将图片和表格内容转换为可剖析的文本格局方面,Tesseract-OCR工具施展了关键作用。虽然Tesseract不能间接处置PDF文件,但它可以将转换为.tiff格局的PDF文件中的图像转换为文本。这个环节是处置多模态PDF的关键环节,使得原本以图像或表格方式存在的信息转化为可供进一步剖析的文本方式。
当然除了上方提到的识别和分别PDF元素的技术之外,例如:向量存储、向量索引器等技术也会用到,由于在传统的RAG 中常罕用到,这里就不赘述了。
代码成功
经过场景和技术剖析之后,咱们了解到假设须要对PDF启动多模态的剖析和查问,首先是要对其中的图片、表格、文字启动识别。这里咱们会引入 、Poppler库以及Tesseract-OCR工具。有了这些工具的加持让咱们的编码环节愈加锦上添花。
装置库和工具
!pip install langchain unstructured[all-docs] pydantic lxml openai chromadb tiktoken -q -U!apt-get install poppler-utils tesseract-ocr
上方的库有几个之前没有提到的,这里做一下说明。
提取PDF信息
既然工具都预备好了,接上去就是处置PDF
from typing import Anyfrom pydantic import BaseModelfrom unstructured.partition.pdf import partition_pdf# 设置寄存图像的门路images_path = "./images"# 调用 partition_pdf 函数处置PDF文件,提取其中的元素raw_pdf_elements = partition_pdf(filename="weekly-market-recap.pdf",# 指定要处置的PDF文件名extract_images_in_pdf=True,# 设置为True以从PDF中提取图像infer_table_structure=True,# 设置为True以推断PDF中的表格结构chunking_strategy="by_title",# 设置文档切分战略为按题目切分max_characters=0,# 设置每个块的最大字符数为0new_after_n_chars=3800,# 在到达3800字符后开局新的块combine_text_under_n_chars=2000,# 将少于2000字符的文本组合在一同image_output_dir_path=images_path,# 指定输入图像的目录门路)
这段Python代码经常使用了pydantic和unstructured库来处置PDF文件。上方是代码的逐行解释:
images_path = "./images":设置一个变量images_path,用于寄存从PDF中提取的图像。
接上去调用partition_pdf函数,这个函数用于处置PDF文件并提取其中的元素:
可以经过命令失掉PDF图片的信息,由于经过上方代码将图片保留到images目录上方了,所以经过如下代码展现图片。
from IPython.display import ImageImage('images/figure-1-1.jpg')
为图片信息发生摘要
这段代码定义了一个名为ImageSummarizer的类,用于生成图像内容的摘要信息
# 引入所需的库import base64import os# 从langchain包导入ChatOpenAI类和HumanMessage模块from langchain.chat_models import ChatOpenAIfrom langchain.schema.messages import HumanMessage# 定义图像摘要类class ImageSummarizer:# 初始化函数,设置图像门路def __init__(self, image_path) -> None:self.image_path = image_pathself.prompt = """你的义务是将图像内容生成摘要信息,以便检索。这些摘要将被嵌入并用于检索原始图像。请给出一个繁复的图像摘要,以便于检索优化。"""# 定义函数将图像转换为base64编码def base64_encode_image(self):with open(self.image_path, "rb") as image_file:return base64.b64encode(image_file.read()).decode("utf-8")# 定义摘要函数def summarize(self, prompt = None):# 失掉图像的base64编码数据base64_image_data = self.base64_encode_image()# 创立ChatOpenAI对象,经常使用gpt-4-vision预览模型,最大token数为1000chat = ChatOpenAI(model="gpt-4-vision-preview", max_tokens=1000)# 调用chat对象的invoke方法,发送蕴含文本和图像的信息response = chat.invoke([#人类揭示语的输入HumanMessage(content=[{"type": "text","text": prompt if prompt else self.prompt},{"type": "image_url","image_url": {"url": f"data:image/jpeg;base64,{base64_image_data}"},},])])# 前往base64编码的图像数据和照应内容return base64_image_data, response.content
以下是代码的详细解释:
1.导入库
导入base64和os库,用于图像编码和操作系统关系性能。
从Langchain包中导入ChatOpenAI类和HumanMessage模块,这些用于与OpenAI的聊天模型交互。
2.定义图像摘要类 ImageSummarizer
__init__方法初始化图像门路和摘要生成的揭示语。
base64_encode_image方法将图像文件读取并转换为base64编码,这种编码格局实用于在网络上行输图像,便于图片信息与GPT模型交互。
3. 定义摘要函数 summarize
经常使用base64_encode_image方法失掉图像的base64编码数据。
创立ChatOpenAI对象,指定经常使用gpt-4-vision-preview模型,最大token数设为1000,用于处置图像摘要义务。
经常使用chat.invoke方法,向模型发送蕴含文本揭示和图像数据的信息。文本揭示用于指点模型生成图像的摘要。
创立summarize函数的目的就是为了给图片生成摘要,接上去就是调用该函数。上方 这段代码创立图像数据和图像摘要的列表,并遍历指定门路下的一切文件以生成这些信息。
# 创立图像数据和图像摘要的列表image_data_list = []image_summary_list = []# 遍历指定门路下的一切文件for img_file in sorted(os.listdir(images_path)):# 审核文件裁减名能否为.jpgif img_file.endswith(".jpg"):# 创立ImageSummarizer对象summarizer = ImageSummarizer(os.path.join(images_path, img_file))# 调用summarize方法生成摘要data, summary = summarizer.summarize()# 将base64编码的图像数据增加到列表image_data_list.append(data)# 将图像摘要增加到列表image_summary_list.append(summary)
1. 初始化列表
image_data_list和image_summary_list两个列表被创立用于存储图像的base64编码数据和对应的图像摘要。
2.遍历指定门路下的一切文件
经常使用os.listdir(images_path)列出指定门路(images_path)下的一切文件,并经常使用sorted函数对文件名启动排序。
3. 审核和处置每个文件
经过if img_file.endswith(".jpg")审核文件裁减名能否为.jpg,以确保只处置图像文件。
关于每个.jpg文件,创立ImageSummarizer对象,传入图像的完整门路。
调用summarize方法生成该图像的摘要。
将前往的base64编码图像数据增加到image_data_list列表。
将前往的图像摘要增加到image_summary_list列表。
最终会生成两个列表:一个蕴含了图像文件的base64编码数据,另一个蕴含了相应的图像摘要,这些信息可以用于图像检索或其余处置。
咱们经过如下代码来检查图片的摘要信息
image_summary_list
['这个图像蕴含了三个不同的图表,提供了无关假日开售增长、各行业一周和年迄今(YTD)的体现对比的数据。\n\n第一个图表是一个柱状图,题目为“Holiday sales growth is set to return to its pre-pandemic pace”,展现了2010年至2023年间11月和12月开售同比增长的实践数据和预测数据。蓝色柱子代表实践数据,条纹柱子代表预测数据,蓝色虚线代表2010-2019年平均增长率,绿色虚线代表2020-2022年平均增长率。\n\n第二个图表是一个色块图,分为两局部,展现了“V”, “B”, 和 “G”在不同的尺度(大、中、小)下的1周和年迄今(YTD)的体现。数值在色块内以红色文字显示。\n\n第三个图表是两个并列的柱状图,区分显示了不同行业在1周和年迄今(YTD)的体现。左侧的蓝色柱状图展现了一周的变动,右侧的绿色柱状图展现了年迄今的变动。图表的Y轴代表了百分比变动,X轴列出了不同的行业。\n\n摘要:三个图表显示假日开售增长估量将复原至疫情前水平,不同市场尺度(大、中、小)的1周和年迄今体现,以及不同行业的1周和年迄今体现数据。']
模型对图片是能够识别,并且对一些细节也能够把控。
识别表格和文本信息
图片、表格和文本信息组成了PDF的完整内容, 在识别了图片信息之后,就须要对表格和文本信息下手了。
上方这段代码定义了处置PDF文档元素的环节。
# 定义一个基本模型Element,用于存储文档元素的类型和文本内容class Element(BaseModel):type: strtext: Any# 创立表格元素和文本元素的空列表#表格信息table_elements = []#文本信息text_elements = []# 遍历从PDF中宰割出的一切元素for element in raw_pdf_elements:# 判别元素能否为表格:非结构化-文档-元素-表格if "unstructured.documents.elements.Table" in str(type(element)):# 假设是表格,将其增加到表格元素列表table_elements.append(Element(type="table", text=str(element)))# 判别元素能否为复合元素elif "unstructured.documents.elements.CompositeElement" in str(type(element)):# 假设是复合元素,将其增加到文本元素列表text_elements.append(Element(type="text", text=str(element)))
1.定义Element基本模型
经常使用pydantic的BaseModel定义了一个名为Element的类,用于存储文档元素的类型(如表格或文本)和文本内容。这个类经常使用类型注解str和Any定义了两个属性:type(元素类型)和text(元素内容)。
2. 创立空列表以存储表格和文本元素
table_elements和text_elements区分用于存储表格信息和文本信息。
3. 遍历PDF中的元素
关于从PDF文件中宰割出的每个元素(在raw_pdf_elements中),代码经过判别元素的类型来分类处置:
假设元素是表格(unstructured.documents.elements.Table),则创立Element对象,并将其类型设为"table",文本内容设为元素的字符串示意,而后将此对象增加到table_elements列表。
假设元素是复合元素(unstructured.documents.elements.CompositeElement),则以相似的方式处置,将其类型设为"text",并增加到text_elements列表。
在对PDF文档中的不同元素启动分类和存储,接上去就须要对其启动处置,对这些表格和文字启动总结。代码如下:
# 导入所需模块from langchain.chat_models import ChatOpenAIfrom langchain.prompts import ChatPromptTemplatefrom langchain.schema.output_parser import StrOutputParser# 定义用于生成总结的揭示文本prompt_text = """您担任繁复地总结表格或文本块,中文输入。:{element}"""# 从模板创立揭示prompt = ChatPromptTemplate.from_template(prompt_text)# 创立总结链,联合揭示和GPT-3.5模型summarize_chain = {"element": lambda x: x} | prompt | ChatOpenAI(temperature=0, model="gpt-3.5-turbo") | StrOutputParser()# 从表格元素中提取文本tables = [i.text for i in table_elements]# 经常使用总结链批量处置表格文本,设置最大并发数为5table_summaries = summarize_chain.batch(tables, {"max_concurrency": 5})# 从文本元素中提取文本texts = [i.text for i in text_elements]# 经常使用总结链批量处置文本,设置最大并发数为5text_summaries = summarize_chain.batch(texts, {"max_concurrency": 5})
这段代码用于生成表格和文本块的总结,应用LangChain和GPT-3.5模型:
1.导入模块
2.定义生成总结的揭示文本
定义了一个用于指点模型总结表格或文本块的揭示文本模板。
3.创立揭示和总结链
经常使用ChatPromptTemplate.from_template依据定义的揭示文本创立揭示。
创立一个名为summarize_chain的总结链,该链联合了揭示、GPT-3.5模型(由于生成总结的才干不须要用到GPT
4.处置表格和文本元素
从table_elements中提取表格文本,经常使用summarize_chain.batch方法批量处置这些文本,最大并发数设为5。
从text_elements中提取文本块文本,雷同经常使用summarize_chain.batch批量处置,最大并发数设为5。
咱们将总结的内容打印如下:
创立索引器
好了,目前为止咱们将PDF中的图片、表格和文本信息都逐个抽取进去了 并针对这些信息生成了摘要,其目的是繁难后续搜查,在做好这一系列预备之后就须要布置上索引器了 索引器望文生义就是对被搜查信息增加上
这段代码创立了一个多向量检索器,用于存储和检索文本、表格和图像数据:
import uuid# 导入uuid库,用于生成惟一标识符# 导入所需的langchain模块from langchain.embeddings import OpenAIEmbeddingsfrom langchain.retrievers.multi_vector import MultiVectorRetrieverfrom langchain.schema.document import Documentfrom langchain.storage import InMemoryStorefrom langchain.vectorstores import Chromaid_key = "doc_id"# 设置文档的惟一标识键# 初始化多向量检索器,初始为空,文字,图片,表格retriever = MultiVectorRetriever(vectorstore=Chroma(collection_name="summaries", embedding_function=OpenAIEmbeddings()),# 经常使用OpenAI的嵌入方法docstore=InMemoryStore(),# 经常使用内存存储文档id_key=id_key,# 设置文档的惟一标识键)# 为文本增加惟一标识doc_ids = [str(uuid.uuid4()) for _ in texts]# 为每个文本生成一个惟一的UUID# 创立文本的文档对象并增加到检索器summary_texts = [Document(page_content=s, metadata={id_key: doc_ids[i]})# 将文本封装为文档对象for i, s in enumerate(text_summaries)]retriever.vectorstore.add_documents(summary_texts)# 将文本文档增加到向量存储中retriever.docstore.mset(list(zip(doc_ids, texts)))# 将文本文档的ID和内容存储在内存存储中# 为表格增加惟一标识table_ids = [str(uuid.uuid4()) for _ in tables]# 为每个表格生成一个惟一的UUID# 创立表格的文档对象并增加到检索器summary_tables = [Document(page_content=s, metadata={id_key: table_ids[i]})# 将表格封装为文档对象for i, s in enumerate(table_summaries)]retriever.vectorstore.add_documents(summary_tables)# 将表格文档增加到向量存储中retriever.docstore.mset(list(zip(table_ids, tables)))# 将表格文档的ID和内容存储在内存存储中# 为图像增加惟一标识doc_ids = [str(uuid.uuid4()) for _ in image_data_list]# 为每个图像生成一个惟一的UUID# 创立图像的文档对象并增加到检索器summary_images = [Document(page_content=s, metadata={id_key: doc_ids[i]})# 将图像封装为文档对象for i, s in enumerate(image_summary_list)]retriever.vectorstore.add_documents(summary_images)# 将图像文档增加到向量存储中retriever.docstore.mset(list(zip(doc_ids, image_data_list)))# 将图像文档的ID和内容存储在内存存储中
1. 初始化多向量检索器
经常使用Chroma作为向量存储,它应用OpenAI嵌入方法将文档转换为向量方式。
经常使用InMemoryStore作为文档存储,这是一种将文档存储在内存中的方法。
设置id_key为文档的惟一标识键。
2. 处置文本数据
为每个文本创立惟一标识符(UUID)。
将文本总结封装为Document对象,并增加到向量存储和文档存储中。
3. 处置表格数据
相似地,为每个表格创立UUID。
将表格总结封装为Document对象,并增加到向量存储和文档存储中。
4. 处置图像数据
将图像总结封装为Document对象,并增加到向量存储和文档存储中。
这段代码树立了一个系统,可以存储和检索多种类型的文档数据,包括文本、表格和图像,应用惟一标识符来治理每个文档。这关于处置和组织少量复杂数据十分有用。
生成多模态查问揭示语
上方这段代码蕴含多个函数,用来处置和展现图像与文本数据。
from PIL import Imagefrom IPython.display import HTML, displayimport ioimport re# 显示基于base64编码的图片def plt_img_base64(img_base64):display(HTML(f''))# 审核base64数据能否为图片def is_image_data(b64data):"""经过检查数据扫尾来审核base64数据能否为图片"""image_signatures = {b"\xFF\xD8\xFF": "jpg",b"\x89\x50\x4E\x47\x0D\x0A\x1A\x0A": "png",b"\x47\x49\x46\x38": "gif",b"\x52\x49\x46\x46": "webp",}try:header = base64.b64decode(b64data)[:8]# 解码并失掉前8个字节for sig, format in image_signatures.items():if header.startswith(sig):return Truereturn Falseexcept Exception:return False# 分别base64编码的图片和文本def split_image_text_types(docs):"""分别base64编码的图片和文本"""b64_images = []texts = []for doc in docs:# 审核文档能否为Document类型并提取page_contentif isinstance(doc, Document):doc = doc.page_content#是图片if is_image_data(doc):b64_images.append(doc)else:texts.append(doc)return {"images": b64_images, "texts": texts}# 依据数据生成揭示信息def img_prompt_func(data_dict):messages = []# 假设存在图片,则增加到信息中#图片的信息独自拿进去, 须要和揭示语一同传给大模型的。if>
1. 显示基于base64编码的图片 (plt_img_base64)
这个函数的目的是显示base64编码的图片。
2. 审核base64数据能否为图片 (is_image_data)
经过审核base64编码数据的扫尾能否合乎经常出现图像格局(如JPEG, PNG, GIF, WEBP)的签名来判别数据能否为图片。
3. 分别base64编码的图片和文本 (split_image_text_types)
此函数遍历文档汇合,经常使用is_image_data函数来区分哪些是图像数据,哪些是文本,而后将它们区分存储在两个列表中。
4. 依据数据生成揭示信息 (img_prompt_func)
此函数生成用于向LangChain的大模型传递的信息。关于每个图像,创立蕴含图像URL的信息;关于文本数据,创立蕴含揭示文本和疑问的信息。
定义信息的详细文本内容。
说明了用户角色:"You are financial analyst."(你是一名财务剖析师)。
紧接着说明义务类型和数据格局:"You will be given a mixed of text, tables, and image(s) usually of charts or graphs."(你将会失掉蕴含文本、表格和图像(通常是图表或图形)的混合数据)。
揭示经常使用这些信息回答财务疑问:"Use this information to answer the user question in the finance."(经常使用这些信息来回答财务方面的用户疑问)。
{data_dict['question']}:这里{}内的局部是Python字符串格局化的占位符,用于拔出变量data_dict中的'question'键所对应的值,即用户提出的疑问。
"Text and / or tables:\n":揭示文本,说明接上去的内容是文本和/或表格。
f"{formatted_texts}":再次经常使用字符串格局化将变量formatted_texts(格局化后的文本数据)拔出到信息中。
成功金融剖析查问
万事俱备只欠西风,如今开局应用GPT Preview模型启动推理了, 咱们尝试对索引器提问,看看结果如何。
上方这段代码成功了一个基于RAG(Retrieval Augmented Generation)模型的查问处置管道。
from langchain.schema.runnable import RunnableLambda, RunnablePassthrough# 创立ChatOpenAI模型实例model = ChatOpenAI(temperature=0, model="gpt-4-vision-preview", max_tokens=1024)# 构建RAG(Retrieval Augmented Generation)管道chain = ({"context": retriever | RunnableLambda(split_image_text_types), # 经常使用检索器失掉内容并分别图片和文本"question": RunnablePassthrough(), # 传递疑问}| RunnableLambda(img_prompt_func) # 依据图片和文本生成揭示信息| model # 经常使用ChatOpenAI模型生成回答| StrOutputParser() # 解析模型的字符串输入)# 定义查征询题query = "Which year had the highest holiday sales growth?"# 调用chain的invoke方法口头查问chain.invoke(query)
1.创立ChatOpenAI模型实例
经常使用ChatOpenAI类创立模型实例,性能了温度参数为0、经常使用的模型为gpt-4-vision-preview,最大token数设为1024。
2.构建RAG管道 (chain)
retriever | RunnableLambda(split_image_text_types):首先经常使用retriever检索内容,而后经过RunnableLambda调用split_image_text_types函数分别图片和文本。
RunnablePassthrough():用于间接传递查征询题。
RunnableLambda(img_prompt_func):依据检索到的图片和文本生成揭示信息。
model:经常使用性能好的ChatOpenAI模型依据生成的揭示信息生成回答。
StrOutputParser():解析模型输入的字符串。
3. 定义查征询题 (query)
定义了一个字符串query作为查征询题,例如:“Which year had the highest holiday sales growth?”(哪一年的假日开售增长最高?)。
4. 口头查问 (chain.invoke(query))
调用chain的invoke方法口头查问,依据疑问和检索到的信息生成答案。
总的来说,这个代码片段树立了一个复杂的查问处置流程,联合了内容检索、数据分别、揭示生成和模型回答,用于处置和回答基于文本和图像数据的复杂疑问。
咱们将其翻译成中文如下:
依据提供的图表,2021年的假日开售增长率最高,为12.7%。这一点从“实心”局部的柱状图中最高的柱子可以看出,该柱子代表了11月和12月的年度同比增长率。
PDF中图表局部与大模型回应答比
经过大模型的回应,再对比PDF中形容假日开售增长率的柱状图,可以显著发现2 年的增长率是最高的,为1 ,并且关于柱子“实心”的形容也是正确的。看来OpenAI提供的多模态性能起到了作用。
总结
文章经过剖析和实例演示,明晰地展现了OpenAI的最新技术在多模态数据处置方面的后劲和运行前景。经过对unstructured库、Poppler工具和Tesseract-OCR工具的粗疏引见和代码成功的解读,文章不只为读者提供了通经常识,也指点了如何实践操作和运行这些工具。文章的论断强调了gpt-4-vision-preview模型在提高剖析效率和增加人工失误方面的价值。
作者引见
崔皓,社区编辑,资深架构师,领有18年的软件开发和架构阅历,10年散布式架构阅历。