在本教程中,您将使用 IBM 的 Docling 和开源 IBM Granite Vision、基于文本的嵌入和生成式 AI 模型,创建一个 RAG 系统。这些模型可通过各种开源框架获得。在本教程中,我们将使用 Replicate 连接 IBM Granite Vision 和生成式 AI 模型,并使用 HuggingFace 连接嵌入模型。
检索增强生成 (RAG) 是一种用于将与大型语言模型 (LLM) 与模型训练数据之外的信息知识库相连接的技术,无需进行微调。传统的 RAG 仅限于基于文本的用例,例如文本摘要和聊天机器人。
多模态 RAG 可以使用多模态 LLM (MLLM) 处理来自多种类型数据的信息,将其作为 RAG 使用的外部知识库的一部分。多模态数据可以包括文本、图片、音频、视频或其他形式。常用的多模态 LLM 包括 Google 的 Gemini、Meta 的 Llama 3.2 和 OpenAI 的 GPT-4 和 GPT-4o。
在本方案中,您将使用能够处理不同模态的 IBM Granite 模型。您将创建一个 AI 系统,用于根据 PDF 中的非结构化数据回答用户的实时查询。
欢迎进入学习本 Granite 教程。在本教程中,您将了解如何利用高级工具的强大功能来构建人工智能驱动的多模式 RAG 管道。本教程将指导您完成以下步骤:
本教程使用三种尖端科技:
完成本教程后,您将实现以下目标:
本教程专为希望增强文档管理和高级自然语言处理 (NLP) 技术知识的 AI 开发人员、研究人员和爱好者而设计。该教程还可以在 IBM Granite Community 的 Granite Snack Cookbook GitHub 中以 Jupyter Notebook 的形式找到。
! echo "::group::Install Dependencies"
%pip install uv
! uv pip install git+https://github.com/ibm-granite-community/utils.git \
transformers \
pillow \
langchain_classic \
langchain_core \
langchain_huggingface sentence_transformers \
langchain_milvus 'pymilvus[milvus_lite]' \
docling \
'langchain_replicate @ git+https://github.com/ibm-granite-community/langchain-replicate.git'
! echo "::endgroup::"
为了查看一些日志信息,我们可以将日志级别配置为 INFO。
注意:可以跳过运行此单元。
指定用于生成文本嵌入矢量的嵌入模型。这里我们将使用 Granite 嵌入模型中的一个
要使用不同的嵌入模型,请将此代码单元替换为此嵌入模型方案中的一个。
指定用于图像理解的 MLLM。我们将使用 Granite Vision 模型。
指定用于 RAG 生成操作的语言模型。在这里,我们使用 Replicate LangChain 客户端连接 Replicate 上 ibm-granite org 的 Granite 模型。
要使用 Replicate 进行设置,请参阅 Replicate 入门指南。要连接到除 Replicate 之外的提供商上的模型,请将些代码单元替换为 LLM 组件方案中的一个。
要连接到 Replicate 之外的提供商上的模型,请将此代码单元替换为 LLM 组件方案中的一个。
from langchain_replicate import ChatReplicate
model_path = "ibm-granite/granite-4.0-h-small"
model = ChatReplicate(
model=model_path,
replicate_api_token=get_env_var("REPLICATE_API_TOKEN"),
model_kwargs={
"max_tokens": 1000, # Set the maximum number of tokens to generate as output.
"min_tokens": 100, # Set the minimum number of tokens to generate as output.
},
)
在本示例中,我们使用 Docling 将一组源文档转换为文本和图片。然后将文本分割成若干区块。MLLM 处理这些图片以生成图片摘要。
Docling 将下载 PDF 文档并进行处理,以便获取文件中包含的文本和图片。PDF 中有各种数据类型,包括文本、表格、图形和图像。
文档处理后,我们会进一步处理文档中的文本元素。我们将其区块成适合我们使用的嵌入模型的大小。由文本区块创建 LangChain 文档列表。
接下来,我们将处理文档中的所有表格。我们将表格数据转换为 markdown 格式,以便传递给语言模型。从表格的 markdown 渲染创建 LangChain 文档列表。
最后,我们处理文档中的所有图片。在这里,我们使用视觉语言模型来理解图片的内容。在此示例中,我们对图片中的所有文本信息感兴趣。您可能需要尝试使用不同的提示文本,看看它如何改善结果。
注意:处理图片中有需要很长时间,具体取决于图片数量和运行视觉语言模型的服务。
接着,我们可以显示从输入文档生成的 LangChain 文档。
使用嵌入模型,我们将文本区块并将生成的图片说明加载到矢量数据库中。通过创建这个矢量数据库,我们可以轻松地在文档中进行语义相似性搜索。
注意:矢量数据库填充可能需要一些时间,具体取决于您的嵌入模型和服务。
指定用于存储和检索嵌入矢量的数据库。
要连接到 Milvus 以外的矢量数据库,请将此代码单元替换为此矢量存储方案中的一个。
现在,我们将所有用于文本、表格和图片描述的所有 LangChain 文档添加到矢量数据库中。
现在,我们已成功转换文档并将其矢量化,接下来可以设置 RAG 管道。
这里,我们通过在矢量空间中搜索与查询相关的区块来测试矢量数据库。我们显示与检索到的图片描述相关的文档。
欢迎尝试不同的查询方式。
返回的文档应该对查询做出响应。让我们继续构建我们的 RAG 管道。
首先,我们为 Granite 执行 RAG 查询创建提示。我们使用 Granite 聊天模板,并提供 LangChain RAG 管道将替换的占位符值。
接下来,我们利用之前创建的 Granite 提示模板构建 RAG 管道。
from ibm_granite_community.langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_classic.chains.retrieval import create_retrieval_chain
from langchain_core.prompts import ChatPromptTemplate
# Create a Granite prompt for question-answering with the retrieved context
prompt_template = ChatPromptTemplate.from_template("{input}")
# Assemble the retrieval-augmented generation chain
combine_docs_chain = create_stuff_documents_chain(
llm=model,
prompt=prompt_template,
)
rag_chain = create_retrieval_chain(
retriever=vector_db.as_retriever(),
combine_docs_chain=combine_docs_chain,
)
管道使用查询从矢量数据库中查找文档,并将其用作查询的上下文。
from ibm_granite_community.notebook_utils import wrap_text
output = rag_chain.invoke({"input": query})
print(wrap_text(output['answer']))
太棒了!我们已经创建了一个 AI 应用程序,它能够利用源文档的文本和图片知识。
使用面向 AI 构建器的新一代企业级开发平台 IBM watsonx.ai,可以训练、验证、调整和部署生成式 AI、基础模型和机器学习功能。使用一小部分数据,即可在很短的时间内构建 AI 应用程序。
借助 IBM 业界领先的人工智能专业知识和解决方案组合,让人工智能在您的业务中发挥作用。
通过增加 AI 重塑关键工作流程和运营,最大限度提升体验、实时决策和商业价值。