このチュートリアルでは、IBMのDoclingとオープンソースのIBM Graniteビジョン、テキストベースの埋め込み、生成AIモデルを使用してRAGシステムを作成します。これらのモデルは、オープンソースのフレームワークを介して利用できます。このチュートリアルでは、 Replicate を使ってIBMのGraniteビジョンおよび生成AIモデルに接続し、HuggingFaceを使って埋め込みモデルに接続します。
検索拡張生成(RAG)は、大規模言語モデル(LLM)で使用される手法で、LLMが学習したデータの外部にある情報の知識ベースとモデルを接続し、ファイン・チューニングを行う必要がありません。従来のRAGは、テキストの要約やチャットボットなどのテキスト・ベースのユースケースに限定されています。
マルチモーダルRAGは、マルチモーダルLLM(MLLM)を使用して、RAGで使用される外部知識ベースの一部として含まれる複数の種類のデータからの情報を処理できます。マルチモーダル・データには、テキスト、画像、音声、動画、その他の形式が含まれます。一般的なマルチモーダルLLMには、Google社のGemini、Meta社のLlama 3.2、OpenAI社のGPT-4やGPT-4oなどがあります。
このレシピでは、さまざまなモダリティーを処理できるIBM Graniteモデルを使用します。PDF内の非構造化データからリアルタイムでユーザーのクエリーに応答するAIシステムを作成します。
Graniteチュートリアルへようこそ。このチュートリアルでは、高度なツールの力を活用してAI搭載のマルチモーダルRAGパイプラインを構築する方法について説明します。このチュートリアルでは、次のプロセスについて説明します。
チュートリアルでは、3つの最先端テクノロジーを使用しています。
このチュートリアルを完了すると、以下を達成できます。
このチュートリアルは、文書管理および高度な自然言語処理(NLP)技術に関する知識を深めたいAI開発者、研究者、愛好家向けに設計されています。このチュートリアルは、IBM Graniteコミュニティーの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 log レベルを設定します。
注: このセルの実行は省略しても問題ありません。
テキスト埋め込みベクトルの生成に使用する埋め込みモデルを指定します。ここではGranite Embeddingsモデルの一つを使用します
別の埋め込みモデルを使用するには、このコード・セルをこの埋め込みモデルレ・シピのものに置き換えてください。
イメージの理解に使用するMLLMを指定します。ここではGraniteのビジョンモデルを使用します。
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ドキュメントのリストは、テキスト・チャンクから作成されます。
次に、文書内のテーブルを処理します。テーブル・データをマークダウン形式に変換して、言語モデルに渡します。LangChainドキュメントのリストは、テーブルのマークダウン・レンダリングから作成されます。
最後に、文書内の画像を処理します。ここでは、ビジョン言語モデルを使用して、画像の内容を理解します。この例では、画像内のテキスト情報に注目します。さまざまなプロンプトを試して、成果がどのように改善するかを確認することをお勧めします。
注:画像の数とビジョン言語モデルを実行するサービスによっては、画像の処理に非常に長い時間がかかる場合があります。
その後、入力したドキュメントから作成されたLangChainドキュメントを表示できます。
埋め込みモデルを使用して、テキスト・チャンクからドキュメントと生成された画像キャプションをベクトル・データベースにロードします。このベクトル・データベースを作成すると、ドキュメント全体で意味的な類似性検索を簡単に実行できます。
注:ベクトル・データベースの入力には、埋め込みモデルとサービスによっては時間がかかる場合があります。
埋め込みベクトルの保存と取得に使用するデータベースを指定します。
ベクトル・データベース以外のベクトル・データベースに接続するには、このコード・セルをこのベクトル・ストアのレシピのものに置き換えてください。
テキスト、テーブル、画像の説明用のすべての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専門知識とソリューション製品群を使用すれば、ビジネスにAIを活用できます。
AIの導入で重要なワークフローと業務を再構築し、エクスペリエンス、リアルタイムの意思決定とビジネス価値を最大化します。