1 经常使用 LlamaIndex 和 UnstructuredIO 检索数据
在数据检索畛域,LlamaIndex 以其弱小的工具和技术,为用户带来了全新的检索体验。这个框架的亮点在于索引系统的灵敏性,用户可以依据文档的详细内容,量身定制索引战略,以顺应不同的文档结构。每种索引都设计得不落窠臼,能够精准婚配各种文档结构,确保消息检索的准确性和高效性。
关于蕴含少量表格的 PDF 文件,倡导经常使用 LlamaIndex 介绍的 RecursiveRetriever。这种递归检索技术的精髓在于,它不只深化开掘与消息间接相关的节点,还会追溯这些节点与其它检索器或查问引擎之间的关联,进而口头相应的检索操作。
例如,某个节点精炼地总结了某个结构化表格的主要消息,并链接到该表格的 SQL 或 Pandas 查问引擎。那么在检索到这个节点之后,咱们就能够应用这些底层的查问工具深化开掘,从而失掉更详尽的数据。这种深化的检索方法,大大增强了咱们从复杂数据集中提取有价值消息的才干。
为了有效实施这一战略,分步骤启动:
首先,将 PDF 文件转换成 HTML 格局,这一步曾经成功。
接着,应用 UnstructuredIO 读取转换后的 HTML 文件。
关于 UnstructuredIO 从 HTML 中识别出的每个元素,无论是文本还是表格,都将其存储到 LlamaIndex 的节点中。
这样一来,就构建了一个蕴含文本和表格的节点列表。
(可选步骤)可以专门挑选出蕴含表格的节点,并将这些表格发送到言语模型(LLM)以生成摘要。
而后,借助 LlamaIndex,LLM 代理将递归地检索与疑问相关的消息。
最后,将这些检索到的数据发送回 LLM,以生成最终的照应。
只管这个环节听起来颇为复杂,但得益于 LlamaIndex 提供的封装良好的函数,咱们口头这些步骤愈加容易些。
1.1 读取和处置数据
from llama_index.readers.file.flat_reader import FlatReaderfrom llama_index.node_parser import UnstructuredElementNodeParserimport osimport picklefrom pathlib import Pathos.environ["OPENAI_API_KEY"] = "<your openai api key>"# 读取数据reader = FlatReader()data = reader.load_data(Path('./The_Worlds_Billionaires.html'))# 初始化 NodeParsernode_parser = UnstructuredElementNodeParser()# 假设稍后想重用它if not os.path.exists("qr_2023_nodes.pkl"):raw_nodes = node_parser.get_nodes_from_documents(data)pickle.dump(raw_nodes, open("the_world_billionaires_raw_nodes.pkl", "wb"))# 基础节点和节点映射base_nodes, node_mappings = node_parser.get_base_nodes_and_mappings(raw_nodes)
1.2 构建索引
from llama_index.retrievers import RecursiveRetrieverfrom llama_index.query_engine import RetrieverQueryEnginefrom llama_index import VectorStoreIndexvector_index = VectorStoreIndex(base_nodes_qr_2023)vector_retriever = vector_index.as_retriever(similarity_top_k=3)vector_query_engine = vector_index.as_query_engine(similarity_top_k=3)recursive_retriever = RecursiveRetriever("vector",retriever_dict={"vector": vector_retriever},node_dict=node_mappings_qr_2023,)query_engine = RetrieverQueryEngine.from_args(recursive_retriever)query_engine.query("Who is the richest billionaire in 2020?")
1.3 其余类型的查问索引
前面的例子曾经展现了 UnstructuredElementNodeParser 如何无缝集成到 LlamaIndex + UnstructuredIO 的数据处置流程中,表现了其在优化数据处置效率和方便性方面的弱小才干。它驳回了一种简化的方法论,让原本复杂的数据提取上班变得愈加易于把握。
鉴于 LlamaIndex 提供了多种索引类型和检索技术,探求不同的选项以找到最适宜你特定场景的处置打算是十分有价值的。无妨尝试包括智能兼并检索器、结果重排序以及混合搜查在内的多种战略。
每种战略都有其独到之处,而最终的成果也会随着数据的复杂性而有所不同。经过实践测试和评价,你可以优化检索流程,确保驳回最适宜的方法从数据集中提取主要消息。
2 如何从 PDF/HTML 中提取表格
这局部内容提供了一个可选的性能,它经过较低级别的 API 允许从 PDF 或 HTML 中提取表格,这或者对特定需求十分有用。只管前面提到的方法在大少数状况下曾经足够有效,但假设须要更精细的控制,比如间接操作底层数据,那么或者须要在数据处置流程中参与额外的步骤,例如应用言语模型(LLM)来生成数据摘要。这一环节值得你进一步探求。
2.1 从 PDF 中提取表格
成功从 PDF 中提取表格的义务,可以依赖多种光学字符识别(OCR)技术和库,同时也可以思考经常使用云服务,但这触及较高的老本。UnstructuredIO 提供了一特性能弱小的
partition_pdf
方法,它经过多个参数让你能够灵敏地在处置速度和识别准确性之间做出掂量,并且可以指定特定的深度学习模型来优化表格的提取成果。
from unstructured.partition.pdf import partition_pdffrom unstructured.staging.base import elements_to_jsonimport jsonfile_path = 'The_Worlds_Billionaires.pdf'raw_pdf_elements = partition_pdf(filename=file_path,extract_images_in_pdf=False,infer_table_structure=True,chunking_strategy='by_title',max_characters=0,new_after_n_chars=3800,combine_text_under_n_chars=2000,strategy = "hi_res")# 将结果存储在 json 中elements_to_json(raw_pdf_elements, filename=f"./The_Worlds_Billionaires_Converted.json")no_tables = 0def process_json_file(input_filename):# 读取 JSON 文件with open(f'./{input_filename}.json', 'r') as file:data = json.load(file)# 遍历 JSON 数据并提取所需的表格元素extracted_elements = []for entry in>
该方法能够读取 PDF 文件,并提取出其中的元素,如文本和表格。表格元素会以 JSON 格局保留为“text_as_html”。你可以逐个读取和处置 JSON 文件中的每个元素,并将处置后的数据存储为 TXT 文件,以便后续的 RAG 读取。
须要留意的是,间接解析 PDF 的性能或者不尽善尽美。目前,UnstructuredIO 提供了多种模型,例如 YOLOx,来协助将 PDF 转换为可操作的元素。但是,这些深度神经网络模型在低性能计算机上表现不佳,倡导在装备高性能 GPU 的机器上运转。惟一须要关注的疑问是,当同时处置千份文档时,系统的性能表现如何。
3 总结
开源名目和云服务提供商在应答 PDF 处置复杂性方面展现了行业的协同致力。
在这个始终变动的环境中,没有一种通用的方法能够有效治理复杂的 PDF 文件。阅历标明,联合经常使用 LlamaIndex、UnstructuredIO 以及 PDF 到 HTML 的转换,是一种方便而高效的处置打算,能够发生优秀的结果。
此外,提高 RAG 准确性的主要战略之一是灵敏地联合不同的索引和检索器。这种多元化的方法意识到没有一套固定的索引规定实用于一切状况,强调须要依据每种文档的详细特性和处置细节来定制战略。经过接受这种灵敏性,并经常使用量身定制的索引和检索器组合,你可以构建一个更准确、更复杂的检索系统,以应答数据的复杂性。
本文转载自,作者: