
Jerry Liu • 2024-09-17
LlamaCloud 中的多模态 RAG
我们很高兴宣布在我们的企业级 RAG 平台 LlamaCloud 中推出多模态功能。这项新功能使开发人员能够在几分钟内构建完整的多模态 RAG 管道,适用于各种文档类型——从投资者演示文稿到保险合同再到研究报告。
文档 RAG 的未来是多模态的
许多实际文档不仅包含文本,还包含复杂的视觉元素,如图像、图表和流程图。传统的 RAG 系统往往只关注文本。这导致文档理解能力下降、响应质量降低以及幻觉率增加。
多模态 LLM 和 RAG 系统可以解决这些复杂性——多模态 LLM,如 Pixtral、Sonnet 3.5 和 GPT-4o,在文档理解方面越来越出色。我们的客户一直要求我们为高级知识助手用例提供这些功能,例如生成包含图表和图像的结构化报告。
然而,这些系统的设置和生产化非常复杂。一个理想的多模态管道不仅将图像提取成文本,还存储与文本块一起索引的原始图像块。这使得 LLM 可以在合成阶段将检索到的文本和图像作为输入。要做好这一点,需要在解析、索引和检索方面采用巧妙的算法,并需要基础设施来同时服务文本和图像。我们在核心 LlamaIndex 仓库和 LlamaParse 中都提供了笔记本,以帮助您构建多模态 RAG 设置,但它们包含大量代码,针对少量本地文件进行了优化,并回避了如何将此索引扩展到生产环境的系统级复杂性。
LlamaCloud 新的多模态功能让您可以在几分钟内构建一个完整的多模态 RAG 管道。索引文本和图像块。检索文本和图像,并在响应中提供这些作为来源。
LlamaCloud 多模态功能概述
概括而言,我们的多模态功能让您能够构建一个可以索引和检索文本和图像块的 RAG 管道。您可以通过我们的聊天界面(见下图)轻松验证您的管道,或通过 API 将其插入到您的应用程序中。


主要优势
- 缩短价值实现时间:激活多模态索引就像创建 RAG 索引时点击一个开关一样简单。
- 处理非结构化数据的高性能:在 PDF 和 PowerPoint 等复杂文档的文本和图像中实现卓越的检索质量。
- 全面理解:利用文本和视觉信息,提供更准确、更具上下文感知能力的 AI 响应。
- 简化的数据集成:无需大量预处理,即可轻松将不同数据类型整合到您的 RAG 管道中。
真实世界示例:分析企业演示文稿
为了演示多模态 RAG 的有效性,让我们考虑一个真实世界的示例,使用 ConocoPhillips 投资者演示文稿。让我们一步步来看
1. 创建多模态索引
首先,创建一个新的 LlamaCloud 索引并启用多模态索引选项。此功能会自动生成和存储页面截图以及提取的文本,从而允许进行文本和图像检索。

2. 将索引集成到您的代码中
创建索引后,您可以轻松将其集成到您的 Python 代码中
from llama_index.indices.managed.llama_cloud import LlamaCloudIndex
index = LlamaCloudIndex(
name="<index_name>",
project_name="<project_name>",
organization_id="...",
api_key="llx-..."
)
3. 设置多模态检索
要启用多模态检索,创建一个可以处理文本和图像节点的检索器
retriever = index.as_retriever(retrieve_image_nodes=True)
4. 构建自定义多模态查询引擎
为了充分利用多模态 RAG 的力量,我们建议创建一个自定义查询引擎,该引擎可以充分利用这个多模态检索器。它将检索器中的文本和图像节点分开,并通过我们的多模态 LLM 抽象将它们馈送到多模态模型中
from llama_index.core.query_engine import CustomQueryEngine
from llama_index.multi_modal_llms.openai import OpenAIMultiModal
class MultimodalQueryEngine(CustomQueryEngine):
"""Custom multimodal Query Engine.
Takes in a retriever to retrieve a set of document nodes.
Also takes in a prompt template and multimodal model.
"""
qa_prompt: PromptTemplate
retriever: BaseRetriever
multi_modal_llm: OpenAIMultiModal
def __init__(self, qa_prompt: Optional[PromptTemplate] = None, **kwargs) -> None:
"""Initialize."""
super().__init__(qa_prompt=qa_prompt or QA_PROMPT, **kwargs)
def custom_query(self, query_str: str):
# retrieve text nodes
nodes = self.retriever.retrieve(query_str)
img_nodes = [n for n in nodes if isinstance(n.node, ImageNode)]
text_nodes = [n for n in nodes if isinstance(n.node, TextNode)]
# create context string from text nodes, dump into the prompt
context_str = "\\n\\n".join(
[r.get_content(metadata_mode=MetadataMode.LLM) for r in nodes]
)
fmt_prompt = self.qa_prompt.format(context_str=context_str, query_str=query_str)
# synthesize an answer from formatted text and images
llm_response = self.multi_modal_llm.complete(
prompt=fmt_prompt,
image_documents=[n.node for n in img_nodes],
)
return Response(
response=str(llm_response),
source_nodes=nodes,
metadata={"text_nodes": text_nodes, "image_nodes": img_nodes},
)
return response
query_engine = MultimodalQueryEngine(
retriever=retriever, multi_modal_llm=gpt_4o
)
注意:我们希望让这个体验变得一行代码即可实现——敬请期待!
5. 查询您的多模态索引
现在,您已准备好查询您的多模态索引并接收包含文本和视觉信息的响应
response = query_engine.query("告诉我代表生产基地的多样化地理位置")
print(str(response))
当被问及公司的多样化生产基地时,我们的多模态 RAG 系统提供了全面的响应
"代表 ConocoPhillips 生产基地的多样化地理位置包括
- 美国本土(美国)
- 加拿大
- 阿拉斯加
- EMENA(欧洲、中东和北非)
- 亚太地区
此信息来源于演示文稿中提供的文本和图像,展示了我们的系统如何整合多种数据类型以提供完整的答案。"
立即开始
将 LlamaCloud 指向您存储非结构化文件的存储桶;剩下的交给我们处理,这样您就可以专注于应用程序逻辑。请访问 https://cloud.llamaindex.ai/ 注册 LlamaCloud 账户——我们正在让许多人通过候补名单。
我们在此提供了一个很棒的参考笔记本,帮助您立即开始。
如果您希望在企业环境中采用 LlamaCloud,请联系我们。