微信扫码
与创始人交个朋友
我要投稿
今天是2024年4月11日,北京,天气晴,我们继续来看看一些有趣的话题。
先来看看昨日大模型进展早报,来看看昨天发生的一些事儿。
然后再来看看关于RAG策略进展。《HiQA: A Hierarchical Contextual Augmentation RAG for Massive Documents QA》(https://arxiv.org/pdf/2402.01767.pdf)这一工作,主要思想是借助版式分析得到文本层级结构,提升检索效果,属于知识库构建的范畴,其具体实现代码也已经放出,思路还不错,也很有趣,可以看看。
供大家一起参考并思考。
我们先来看看大模型进展早报,昨天又是开源爆炸的一天。
我们可以重点关注以下几个点:
1、老刘参加K+Talk分享:《RAG的窘境与长文本之争》,与几位老师谈了谈当前RAG的选型、RAG落地中存在的问题,以及长文本带来的一些影响,感兴趣的可以去看看,结论就是:么必要争,并且要抬头看。
2、关于微调阶段一些数据选择和配比影响的参考,可以查看《A Survey on Data Selection for LLM Instruction Tuning》:https://arxiv.org/abs/2402.05123,《Instruction Tuning for Large Language Models: A Survey》:https://arxiv.org/pdf/2308.10792,《When Scaling Meets LLM Finetuning: The Effect of Data, Model and Finetuning Method»: https://arxiv.org/pdf/2402.17193,这三个工作。
3、关于大模型RAG评估的进展。Rageval:评估检索增强生成(RAG)工具,包括六个子任务:查询重写、文档排名、信息压缩、证据验证、答案生成和结果验证,地址可查看: https://github.com/gomate-community/rageval
《HiQA: A Hierarchical Contextual Augmentation RAG for Massive Documents QA》(https://arxiv.org/pdf/2402.01767.pdf)这一工作,主要思想是借助版式分析得到文本层级结构,提升检索效果。
该工作主要关注图像和表格,以提高这些上下文的质量,其思路如下所示:
首先,每个文档都会经过MarkdownFormatter的处理,根据其固有的章节结构将其转换为[章节元数据:章节内容]对(称为段),然后以Markdown格式存储。
随后,提取片段的层次结构,并将元数据关联到到每个章节中,以构建数据库。
最后,应用多路由检索方法来增强RAG。
1、系统架构设计
HiQA系统由三个组件组成:Markdown Formatter(MF)、Hierarchical Contextual Augmentor(HCA)和Multi-Route Retriever(MRR)。
其中:
MF模块处理源文档,将其转换为一个由段序列组成的Markdown文件。每个片段都对应于文档中的一个自然章节,包括章节元数据和内容,而不是将文档划分为固定大小的块【这是很自然的方案】;
HCA模块从markdown中提取分层元数据并将其组合,形成级联元数据,从而增强每个片段的信息;
MRR模块采用多路由检索方法来查找最合适的片段,然后将其作为上下文输入提供给语言模型。
2、Markdown Formatter(MF)
因为需要获取层次结构信息,源文档必须进行结构解析。该工作引入了MarkdownFormatter将源文档转换为富含结构元数据的Markdown文档。
在具体实现上,LLMMc以PDF文档DI作为输入并输出markdown格式的文档DM。但由于大模型通常受到上下文限制,或者在进入长上下文时存在精度损失、遗忘、指令弱化、幻觉等问题,因此,为了确保输出内容的结构连贯、准确且与原始文档一致,该工作采用滑动窗口技术,窗口大小为W,步长为W,附加填充为K,因此,长度为N的文档需要T=⌈N/W⌉时间步进行处理,具体的伪代码如下图所示:
当然,prompt工程也十分必要,例如,在具体实现上,该工作将文档中的每一章(无论其级别如何)视为带有数字标识符的Markdown中的一级标题,并将每一章视为一个知识片段,而不是一个固定大小的块;设置正确的章节编号,后跟章节标题;通过Markdown语法生成表格并记录表格标题。
因此,生成的文档DM包含一系列段,描述为序列DM={D(1),D(2),...,D(S)},其中:S表示分段的数量,而T取决于处理窗口的尺寸和文档的长度,确定分段文本块的数量。
有趣的是,对于图像,该工作开发了一个名为PDF Image Searcher的开源工具,用于从文档中提取位图和SVG矢量图像,以及用于检索图像的API,接着,其利用图像周围的文本、图像标题和可选的视觉语言模型来为每个图像生成描述性文件,每个文档DM将具有图像集合DG={I1(File1,Desc1),I2(File2,Desc2),...},这个已经有跨模态RAG那味儿了。
3、Hierarchical Contextual Augmentor(HCA)
分层上下文增强器(HCA)模块从Markdown文件中提取结构元数据,其根据片段类型(即文本、表格或图像)对结构元数据和上下文信息进行不同的处理,形成增强片段相应的级联元数据,然后使用嵌入模型将增强的片段转换为嵌入向量并存储在向量数据库中,其执行流程如图3所示:
具体伪代码如下:
1)文本增强
将输入文档DI处理为一系列章节DP和|DP|=S,每一章都包含丰富的元数据,包括标题和编号。
为了解决扩展、多个或类似文档的知识回忆不准确的问题,其利用文档的层次结构,类似于以文档标题为根、以章节为节点的树,在级联元数据增强算法上,采用深度优先搜索来遍历本章树,连接并传递元数据。
2)表格增强
传统的基于块的RAG方法并不专门针对表,而且准确回忆表格信息十分困难,很大程度上是因为表格中的数值在语义编码中通常表现为噪声。
因此,该工作假设表的语义值源自其定义,包括总体描述、标题和行/列标签等信息,如图4所示。
因此,在进行表格向量化表示时,该工作只关注这些语义元素,将表视为类似于文本知识。
3)图像增强
在图象方面,该工作利用图像的上下文,并利用视觉模型来创建描述性标题,然后对这些标题进行向量化表示,图像增强如图5所示。
此外,在向量化过程当中,段落向量化通常需要较短的输入长度,因此,对于超过此限制的章节,该工作将它们分成更小的片段,同时保留其相关的元数据。
我们可以看到的是,这些向量化策略有助于将不同的文档元素(文本、表格和图像)转换为统一的编码空间,从而增强模型有效处理和回忆复杂文档结构和内容的能力。
4、Multi-Route Retriever(MRR)
该模块集成了各种技术来提高从大量文档语料库中检索知识的精度。
具体来说,该工作通过以下三种方法实现了检索:向量相似度匹配、弹性搜索、关键字匹配,其中:
该工作采用关键命名实体检测(CNED)方法,利用预先训练的命名实体检测模型从文档和查询中提取关键字。
Elasticsearch弥补了基于向量的匹配在字级精度方面的局限性。
相比之下,关键字匹配利用文档语料库中固有的关键术语(例如产品模型)来解决Elasticsearch主要依靠统计方法来控制词权重的局限性。
这三种方法在检索语义级信息方面逐渐减弱,在检索字符级信息方面逐渐增强。
由于其检索特点是互补的,因此可以组合在一起使用。获得三组排名后,该工作根据公式进行重新排名:
其中α和β分别是平衡向量相似度和信息检索分数的贡献的超参数,|C|表示匹配的关键词的数量。
这种动态可配置参数的方案,允许根据查询和文档集的特定要求进行调整,然后将由最终分数确定的前k个知识片段提供给LLM模型,以生成连贯且与上下文相关的答案。
关于论文的配套代码实现,我们可以查看:https://github.com/TebooNok/HiQA我们可以在其开开源地址:https://github.com/TebooNok/HiQA中找到其实现代码,步骤如下:
第1步:利用gpt-4-turbo-preview(0125)模型,使用pdf2md将PDF转换为格式良好的文件,这块重心放在prompt的设计上,参见:https://github.com/TebooNok/HiQA/blob/main/build_tool/pdf2md.py
第2步:使用md2csv将标记符文件转换为CSV文件,用分层元数据将内容组织成章节,并标注表格(https://github.com/TebooNok/HiQA/blob/main/build_tool/md2csv.py)
def md2sections(file_name: str):
name = os.path.splitext(file_name)[0]
directory = os.path.join('sections')
file_path = os.path.join('mds', file_name)
with open(file_path, 'r', encoding='utf-8') as f:
file_content = f.read()
title, sections = parse_markdown(file_content)
df = pd.DataFrame(sections, columns=['section'])
df.to_csv(directory + "/" + name + '.csv', index=False, encoding='utf-8')
直接使用pandas进行转换。
第3步:使用section2embedding将嵌入向量添加到章节中(https://github.com/TebooNok/HiQA/blob/main/build_tool/section2embedding.py)
from openai.embeddings_utils import get_embedding
embedding_model = "text-embedding-ada-002"
embedding_encoding = "cl100k_base" # this the encoding for text-embedding-ada-002
# set openai
os.environ["OPENAI_API_KEY"] = "yPKz6gw9KNVZd6oBFQ2AoZvosF3TvX6C3XJbADgahZYj3wZNHNuhRMoDG9pzpN98"
os.environ["OPENAI_API_BASE"] = "https://ai.api.moblin.net/api/openai/v1"
openai.api_key = os.environ.get('OPENAI_API_KEY')
openai.api_base = os.environ.get('OPENAI_API_BASE')
def split_and_embed(section, encoding,max_tokens=8000):
# Get the title from the first line
lines = section.split("\n")
title = lines[0]
content = "\n".join(lines[1:])
half_length = len(content) // 2
section_1 = title + "\n" + content[:half_length]
section_2 = title + "\n" + content[half_length:]
sections = [section_1, section_2]
new_sections = []
for sec in sections:
if len(encoding.encode(sec)) > max_tokens:
new_sections.extend(split_and_embed(sec, encoding))
else:
new_sections.append(sec)
return new_sections
第4步:将所有处理过的CSV文件放入数据集目录,其中,文件名和标题通过命名实体检测模型进行处理,以生成关键关键词,这些关键词存储在utils.filter.critic_keywords中。
本文主要回顾了下昨日大模型进展早报以及介绍了HiQA层级性上下文增强策略的工作,后者其实也是重点在做文档解析的思想,这样可以提升召回的准确性,并且有跨模态的影子。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-03-30
2024-04-26
2024-05-10
2024-04-12
2024-05-28
2024-04-25
2024-05-14
2024-07-18
2024-08-13
2024-04-26