本文将深入探讨两种创新的多模态文档检索方法 ——ColPali 和 ColFlor。它们在多模态 RAG 技术领域表现卓越,正重塑着文档处理的格局。我们不仅会剖析其系统结构、性能优势,还将通过实际案例展示它们在处理文档时的出色表现 |文末点击阅读原文查看网页版|
更多专栏文章点击查看:
LLM 架构专栏
大模型架构专栏文章阅读指南
Agent系列
强化学习系列
欢迎加入大模型交流群:加群链接 https://docs.qq.com/doc/DS3VGS0NFVHNRR0Ru#
公众号【柏企阅文】
知乎【柏企】
个人网站:https://www.chenbaiqi.com
在当今数据驱动的商业环境中,存在着一个矛盾现象:企业一方面要应对信息过载的问题,另一方面又试图从海量信息中提取有意义的见解以推动行动,这构成了双重挑战。存储在技术报告、产品文档、合同和演示文稿幻灯片中的大量商业知识,都以非结构化格式存在,传统的数据分析系统难以对其进行解读。包含文本、图表、图形和图像的文档蕴含着有关业务流程和决策系统的重要商业情报,但这些情报大多未被充分利用。
想要利用机构知识的企业,在从多种格式的文档中自动提取有价值的见解时,面临着一个长期存在的障碍。光学字符识别(OCR)传统上是一种可靠的文本提取方法,它运用计算机视觉技术将字符从背景中区分出来,重新组合成单词和句子。OCR在处理基于文本的文档时表现出色,但在处理图表、图形和信息图时却无能为力,而这些对于传达复杂概念至关重要。
一些先进的OCR解决方案试图通过章节分块和布局分析来保留文档结构,但当视觉数据对理解内容至关重要时,这些方法就会失效。这种局限性在建筑、工程和科学研究等领域尤为严重,因为视觉描述往往能传达书面文本无法表达的重要信息。正如Adejumo等人(2024年)的研究所表明的,传统的基于规则的系统和基本的机器学习算法无法准确解读医学文档中文本与图像之间的复杂关系。
多模态检索系统是一项创新技术,能够同时处理和理解文本与视觉数据。这些先进系统不仅仅是被动地接受视觉元素,而是通过将图像与其文本环境相结合(反之亦然)来进行主动解读。其成果具有革命性,因为多模态方法在处理文本较多的文档时,性能达到或超过了传统OCR,在处理视觉复杂的文档时更是取得了优异的效果。
检索增强生成(RAG)应用展示了这些多模态系统的全部能力。这些系统生成先进的嵌入向量,将文本和视觉数据封装起来,使其能够将非结构化文档存储到向量数据库中,并保留其语义属性。在接收到用户查询后,系统会定位并提供最相关的数据,这些数据可能包括文本元素、视觉元素或两者皆有,然后将其提供给大语言模型或视觉语言模型(LLMs或VLMs)。结果如何呢?生成的回复不再是泛泛的答案,而是基于全面的数据分析,提供高度具体和准确的信息。
能够访问非结构化数据资产标志着企业数据使用方式的重大变革。多模态RAG系统通过防止有价值的见解被锁定在难以访问的文档格式中,实现了机构知识的共享,有助于做出更好的决策,并为创新和提高效率创造了机会。
接下来的部分将探讨两种创新的多模态文档检索方法——ColPali和ColFlor,它们正在改变这个快速发展领域的能力。我们的分析将涵盖这两个系统的结构和性能基准,同时评估企业如何最大化其文档库的价值。寻求实施解决方案的数据科学家和希望了解这些技术战略影响的商业领袖,通过这次探索,将对智能文档处理的未来获得有价值的见解。
ColPali:通过以视觉为先的文档检索重新构想多模态RAG
Faysse等人(2025年)提出的ColPali框架为多模态检索增强生成(RAG)建立了一种变革性的方法。ColPali摒弃了以文本提取为中心的标准流程,采用以视觉为先的方法,简化并改进了文档检索操作。这一创新解决了文档处理中一个长期存在的挑战,即处理包含多种信息模式的复杂现实世界文档,同时保留其上下文含义。
ColPali以PaliGemma-3B为基础模型,并对其进行扩展,创建类似ColBERT的多向量表示,这种表示适用于文本和视觉数据。该模型通过有效利用在多模态微调过程中形成的文本和图像令牌嵌入之间的固有对齐,展现出卓越性能。ColPali从文档的视觉表示开始处理文档,无需RAG系统通常需要的传统预处理步骤。
传统的文档RAG流程需要几个复杂的步骤,包括PDF解析、通过OCR进行文本提取、文档布局检测、文本分块和视觉元素标注。这个处理流程在每个阶段都存在失败和信息丢失的可能性。ColPali通过将完整的页面转换为编码视觉形式,避免了这些问题,这种形式保留了空间关系和视觉上下文,而标准的纯文本表示通常无法做到这一点。
该系统架构采用先进的后期交互方法来执行查询匹配。ColPali在共享嵌入空间中为提交的查询和索引文档生成多向量表示。它使用可微的后期交互算子计算相似度,而较简单的双编码器模型为文档生成单个密集向量表示。该算子通过确定查询向量和文档嵌入向量之间最高的点积之和,来找到文档中最匹配的部分,而不要求完全匹配。
ColPali实施了一种技术设计,将SigLIP补丁嵌入转换为与Gemma-2B指定的文本嵌入空间对齐。语言模型生成的每个输出令牌嵌入(由文本或图像令牌生成)都通过一个投影层进行映射,将其转换到一个128维的低维向量空间。这种统一的表示方式使模型能够高效地处理文档中视觉和文本部分的上下文细节。
ColPali的性能优势非常显著。基准评估表明,与来自非结构化和标注方法的强大基线以及每个测试的文本 - 图像嵌入模型相比,它都取得了卓越的性能。在处理像信息图问答(InfographicVQA)、Arxiv问答和表格问答(TabFQuAD)等视觉复杂的任务时,ColPali相对于传统RAG系统的优势凸显出来,因为传统RAG系统在处理混合格式文档时存在困难。
ColFlor:用于视觉文档检索的轻量级ColPali替代方案
ColFlor模型是高效多模态检索领域的一项显著改进,与更大的ColPali架构相比,它提供了一种更高效的选择。这个无需OCR的视觉文档检索模型使用1.74亿个参数,比ColPali小17倍,但在计算需求低得多的情况下仍取得了令人瞩目的性能。ColFlor基于Florence-2架构构建,巧妙地利用其DaViT视觉编码器和基于BART的文本编码器,同时舍弃了文本自回归解码器,从而大大提高了处理速度:图像编码过程比ColPali快5.25倍,查询编码速度快9.8倍。
该模型通过两个不同的阶段进行操作。在索引阶段,DaViT视觉编码器处理分辨率为768×768的文档图像(大于ColPali的448×448分辨率),以提取视觉特征,并将其转换为嵌入向量。嵌入向量通过基于BART的文本编码器,创建上下文表示,然后将其压缩为128维向量以节省存储空间。在查询阶段,文本编码器处理用户查询,生成查询嵌入,通过MaxSim操作将其与存储的文档嵌入进行评估,实现高效且具有上下文感知的匹配。
尽管ColFlor的规模较小,但在处理富含文本的英文文档时,它与ColPali保持着相当的性能水平,在NDCG@5指标上仅下降了1.8%。在图形评估中,ColFlor的表现优于其更大的模型ColPali,表明它具有更出色的视觉推理能力。然而,当处理非英文文档时,ColFlor遇到了重大挑战,与ColPali相比,它在处理法语文档时表现较差。ColFlor生成的上下文嵌入数量较少(每页587个向量),而ColPali为1024个,这减少了存储需求和检索时间。
实际应用:围绕文档构建多模态RAG系统
我们将通过研究ColPali和ColFlor在产品手册中的应用,展示它们在实际应用中的工作方式。该手册包含技术规格、图表、表格和应用示例,这在建筑和建筑文档中很常见。
设置索引流程
实施过程从索引开始,通过使用ColPali和ColFlor编码器架构,将多页的Xilonor CLT手册转换为向量表示。我们对两个模型应用相同的高级步骤。
在预处理阶段,我们的第一步是将每个PDF页面转换为高分辨率图像。为了满足ColPali的输入规格,我们将图像调整为448×448像素,但对于ColFlor,我们使用其支持的更高分辨率768×768。这种差异立即凸显了ColFlor的一个优势:它能够从文档页面中保留更详细的视觉信息。每个模型接收页面图像,并通过其特定的视觉编码器进行处理。PaliGemma-3B骨干网络使ColPali能够处理图像,而ColFlor使用其DaViT视觉编码器实现更高效的图像处理。编码过程生成丰富的、具有上下文的嵌入向量,捕获每个页面的文本和视觉信息。
为了提高存储效率,两个模型都将其嵌入向量投影为更紧凑的表示:ColPali处理的每个文档页面会生成1024个向量,而ColFlor生成587个向量,这使得ColFlor更高效。系统将这些嵌入向量保存到Qdrant向量数据库中,并进行优化索引,以实现有效的检索。
实际检索过程
一旦我们的CLT手册被正确索引,我们就可以研究每个系统如何响应不同复杂程度的用户查询。我们将研究三个不同的问题,这些问题展示了建筑专业人员可能提出的不同复杂程度的问题。
- “CLT面板的最大尺寸是多少?”
- “CLT和混凝土在生产过程中的能源消耗方面如何比较?”
- “根据第15页的标准服务等级图表,在湿度较高的室内空间应使用哪种CLT服务等级?”
两个系统在处理每个查询时都使用相同的检索顺序:
查询文本编码:查询文本通过文本编码,并使用模型的文本编码器转换到向量空间。
async def get_embedding(self, query_text: str): with torch.no_grad(): batch_query = self.colpali_processor( text=[query_text], images=[Image.new("RGB", (448, 448), (255, 255, 255))], return_tensors="pt", truncation=True ).to(self.colpali_model.device) query_embedding = self.colpali_model(**batch_query) return query_embedding[0].cpu().float().numpy().tolist()
搜索匹配嵌入向量:搜索文档嵌入向量,找到相似度得分最高的匹配嵌入向量。
async def search(self, query_text: str, collection_name: str, top_k: int = 5): embedding = await self.get_embedding(query_text) query_hash = self._hash_embedding(embedding) cache_key = f"{collection_name}:{query_hash}" results = self.cache.get(cache_key) if results is None: results = self.client.query_points( collection_name=collection_name, query=embedding, limit=top_k, timeout=120 ) self.cache[cache_key] = results return results
获取相关文档页面:获取最相关的文档页面,在本场景中检索限制为5。
def retrieve_top_document( query: str, document_embeddings: List[torch.Tensor], document_images: List[Image.Image] ) -> Tuple[str, Image.Image]: query_embeddings = [] placeholder_image = Image.new("RGB", (448, 448), (255, 255, 255)) with torch.no_grad(): query_batch = process_queries(paligemma_processor, [query], placeholder_image) query_batch = {key: value.to(device) for key, value in query_batch.items()} query_embeddings_tensor = retrieval_model(**query_batch) query_embeddings = list(torch.unbind(query_embeddings_tensor.to("cpu"))) evaluator = CustomEvaluator(is_multi_vector=True) similarity_scores = evaluator.evaluate(query_embeddings, document_embeddings) best_index = int(similarity_scores.argmax(axis=1).item()) return document_images[best_index], best_index
- 转换文档页面格式:将检索到的文档页面转换回图像格式。
生成回复:GPT-4o(或任何其他有能力的VLM)在接收到原始查询文本和检索到的文档图像后生成回复。
content = [ {"type": "text", "text": f"Query: {query_text}\n\nRelevant pages from reference regulatory documents:"} ] content.extend([ {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{img['image']}"}} for img in retrieved_images[:5] ]) response = await openai_client.chat.completions.create( model="gpt-4o", messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": content} ], max_tokens=4096, timeout=20 )
示例输出
表1展示了ColPali和ColFlor RAG系统对三个提示问题的示例回复。
问题 | ColPali回复 | ColFlor回复 |
---|---|---|
“CLT面板的最大尺寸是多少?” | 具体回复内容1 | 具体回复内容2 |
“CLT和混凝土在生产过程中的能源消耗方面如何比较?” | 具体回复内容3 | 具体回复内容4 |
“根据第15页的标准服务等级图表,在湿度较高的室内空间应使用哪种CLT服务等级?” | 具体回复内容5 | 具体回复内容6 |
性能比较
对比测试显示两个系统之间存在显著的性能差异:
查询处理时间
- ColFlor在查询处理过程中的延迟几乎降低了20倍,每个查询只需3.54秒,而ColPali每个查询需要69.41秒。
- 在批量处理多个查询时,ColFlor保持了其卓越的性能,在压力条件下性能仅略有下降。
检索准确率
- ColPali在检索关于面板尺寸和能源消耗的精确数值答案时表现出色,始终能够准确找到文档参考。
- 在与标准服务等级图表相关的分类分配查询中,两个模型都正确识别了服务等级,并且都将第15页作为最相关的页面检索出来。
端到端响应质量
- 两个系统在检索到正确的页面后,都能让GPT-4o生成详细而精确的答案。
- ColPali通过其全面的检索方法,为复杂查询提供了更完整的答案。
- ColFlor缩短的检索时间提供了更具响应性的用户体验,这对于交互式应用程序至关重要。
实际应用表明,ColPali和ColFlor都是有效的多模态RAG系统解决方案,理想的选择取决于你对速度、准确性和资源效率的需求。作为一个基线比较,包含图表和表格中重要视觉信息的建筑和建筑文档领域,像ColPali和ColFlor这样的多模态系统比基于文本的标准方法表现更好。
成本与准确性:文档检索的实际部署考虑因素
ColFlor为在生产环境中工作的数据科学家和机器学习工程师带来了显著的实际好处。ColFlor较少的参数导致推理成本降低和响应时间加快,这对于计算资源有限或对延迟要求较低的应用程序非常有利。其高效的架构使该模型可以部署在处理能力有限的硬件上。虽然ColPali需要配备大量内存的GPU机器,但ColFlor即使在仅使用CPU的情况下也能表现得相当不错。
ColPali仍然是多语言应用程序和必须不惜一切代价追求最高准确性的场景的最佳选择,但ColFlor在大多数实际文档检索任务中提供了卓越的性能效率。其精心设计的模型架构在保持足够性能水平的同时降低了资源需求,这使得多模态检索在更广泛的应用中成为可能。
ColPali提供了卓越的功能,但与像ColFlor这样的轻量级解决方案相比,它需要更多的计算能力。使用PaliGemma的30亿个参数,与纯文本方法相比,会导致推理过程更加耗费资源。当在建筑文档搜索、施工文档分析或法规合规决策支持等领域,从复杂的多模态文档中进行精确检索至关重要时,这种系统增加的计算成本就是合理的。
参考文献
P., Adejumo, P., Thangaraj, S., Shankar, L., Dhingra, A., Aminorroaya & R. Khera (2024). Retrieval-augmented generation for extracting CHA₂DS₂-VASc risk factors from unstructured clinical notes in patients with atrial fibrillation. https://doi.org/10.1101/2024.09.19.24313992
M., Faysse, H., Sibille, T., Wu, B., Omrani, G., Viaud, C., Hudelot & P. Colombo (2025). ColPali: Efficient document retrieval with vision language models. Proceedings of the 13th International Conference on Learning Representations (ICLR) 2025, Singapore.
A., Masry & E. Hoque (2024). ColFlor: Towards BERT-Size Vision-Language Document Retrieval Models. The 38th Annual Conference on Neural Information Processing Systems (NeurIPS) 2024 Workshop MusIML Submission25, Vancouver, Canada.
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。