watsonx.aiで使用できるサンプルがリソース・ハブで多数提供されています。この記事では、すぐに手軽にRAGをお試しできるサンプルノートブック「Use watsonx, Chroma, and LangChain to answer questions (RAG)」を実行した記録をご紹介します。ノートブックに含まれている説明に少し補足を加え、変更した方がよい点についても触れてみたいと思います。
注)当記事の画面イメージは2026年1月時点のものであり、今後変更される場合があります。
サンプルノートブックの使い方
-
リソース・ハブのサンプルの画面に移ります。サンプルの中から「Use watsonx, Chroma, and LangChain to answer questions (RAG)」を見つけてクリックします。

-
デフォルトではランタイム「Runtime 25.1 on Python 3.12 XS」が選ばれていますが、このノートブックがPython 3.11を前提としているため、「Runtime 24.1 on Python 3.11 XS」を選択し「作成」をクリックします。

* Runtime 24.1はDeprecationとなりました。Runtime 25.1で実行する場合はこちらもご参照ください。
ノートブックの実行
プロジェクトに追加されたノートブック「Use watsonx Granite Model Series, Chroma, and LangChain to answer questions (RAG)」を実行します。以下、ノートブックの内容に補足(太字部分)を加えたものです。
免責事項
- watsonxの文脈で利用可能なプロジェクトとスペースのみを使用してください。
ノートの内容
このノートブックには、watsonx.ai における検索拡張生成のサポートを示すための手順とコードが含まれています。データ検索、ナレッジベースの構築・クエリ、モデルテストのためのコマンドを導入します。
Pythonにある程度慣れていると役立ちます。このノートブックはPython 3.11を使用しています。
検索拡張生成について
検索拡張生成(RAG)は、事実を想起する情報を必要とする多くのユースケースを解放できる多用途パターンであり、例えば自然言語でのナレッジベースクエリなどを解き放ちます。
最も単純な形では、RAGは3つのステップを必要とします。
- ナレッジベースのパッセージ(文章)をインデックスする (一度)
- ナレッジベースから関連するパッセージ(文章)を取得する (すべてのユーザークエリに対して)
- 検索した文章をLLMに入力することで応答を生成する (すべてのユーザークエリに対して)
内容
このノートには以下の部分が含まれています。
- 環境セットアップ
- ドキュメントデータのロード
- ナレッジベースの構築
- watsonxの基盤モデル
- 質問に対する検索拡張応答の生成
- まとめと次のステップ
環境セットアップ
このノートブックのサンプルコードを使用する前に、以下のセットアップ作業を行う必要があります。
- watsonx.ai ランタイムサービスインスタンスの作成(無料プランが提供されています。インスタンス作成方法の情報はこちらでご覧いただけます)。
依存関係のインストールとインポート
注)ibm-watsonx-ai ドキュメントはこちらにあります。
%pip install -U wget | tail -n 1
%pip install -U langchain-community "langchain<1.0" "ibm_watsonx_ai>=1.1.22" "langchain_ibm<1.0" "langchain_chroma<1.0" | tail -n 1
import getpass
import os
watsonx API connection
このセルは、基盤モデル推論のためにwatsonx APIを使用するために必要な認証情報を定義しています。
このセルを実行すると、APIキーの入力を求められます。IBM CloudのユーザーAPIキーを提供しEnterを押します。詳細はドキュメントをご覧ください。
注)us-south以外のリージョンをお使いの場合はurlを置き換える必要があります。
from ibm_watsonx_ai import Credentials
credentials = Credentials(
url="https://us-south.ml.cloud.ibm.com",
api_key=getpass.getpass("Please enter your watsonx.ai api key (hit enter): "),
)
project id の定義
API を呼び出すには、呼び出しのコンテキストとなるプロジェクトID が必要です。この ID は、このノートブックが実行されているプロジェクトから取得します。取得できない場合は、入力を求められますのでプロジェクト ID を入力してください。
ヒント: project_id は次のように確認できます。watsonx.ai のプロンプトラボを開きます。UI の最上部に Projects / <プロジェクト名> / があります。<プロジェクト名> リンクをクリックします。次に、プロジェクトの管理タブ ([プロジェクト] -> [管理] -> [一般] -> [詳細]) から project_id を取得します。
try:
project_id = os.environ["PROJECT_ID"]
except KeyError:
project_id = input("Please enter your project_id (hit enter): ")
認証の詳細を含む APIClient のインスタンスを作成します。
from ibm_watsonx_ai import APIClient
api_client = APIClient(credentials=credentials, project_id=project_id)
ドキュメントデータのロード
一般教書演説のファイルをダウンロードします。
import wget
filename = "state_of_the_union.txt"
url = "https://raw.github.com/IBM/watsonx-ai-samples/master/cloud/data/foundation_models/state_of_the_union.txt"
if not os.path.isfile(filename):
wget.download(url, out=filename)
ナレッジベースの構築
RAGで最も一般的なアプローチは、ナレッジベースの密ベクトル表現を作成し、特定のユーザークエリとの意味的類似性を計算することです。
この基本的な例では、一般教書演説の内容(ファイル名)を取得し、それをチャンクに分割し、オープンソースのエンベディングモデルでエンベッドし、Chroma に読み込み、その後クエリします。
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain_chroma import Chroma
loader = TextLoader(filename)
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
データセットは、すでに Chroma で取り込むことができる自己完結型のパッセージに分割されました。
エンベディング関数を作成する
chromadbで使うカスタムエンベディング関数を入力できることに注意してください。Chroma dbの性能は、使用されるエンベディングモデルによって異なる場合があります。以下の例では、watsonx.ai Embeddingサービスを使います。利用可能なエンベディングモデルを get_embedding_model_specs で確認できます。
注)ノートブック内の説明では上のように書いてありますが、実際には get_embedding_model_specs ではなく、より新しいアプローチである下のコードになっています。参考:Foundation model functions moved under APIClient
api_client.foundation_models.EmbeddingModels.show()
2026年1月現在、サンプルで使用されている"ibm/slate-30m-english-rtrvr"は存在しないため、代わりに上のセルの実行により表示されたモデルのいずれかをmodel_idに設定します。
次は、model_id="ibm/slate-30m-english-rtrvr-v2" を使用する例です。
from langchain_ibm import WatsonxEmbeddings
embeddings = WatsonxEmbeddings(
model_id="ibm/slate-30m-english-rtrvr-v2",
url=credentials.url,
apikey=credentials.api_key,
project_id=project_id,
)
docsearch = Chroma.from_documents(texts, embeddings)
LangChain と watsonx.ai Embeddingsの互換性
LangChain Retrievalでは、内部で embed_documents と embed_query を使用して、アップロードされたドキュメントとユーザークエリのエンベディングベクトルをそれぞれ生成します。
help(WatsonxEmbeddings)
watsonx.ai の基盤モデル
IBM watsonx基盤モデルは、LangchainがサポートするLLMモデルのリストに含まれています。この例は Langchain を使って Granite Model Series と通信する方法を示しています。
モデルの定義
推論に使用する model_id を指定する必要があります。
model_id = api_client.foundation_models.TextModels.GRANITE_3_3_8B_INSTRUCT
注)2026年1月現在、ibm/granite-3-3-8b-instruct はdeprecated状態であるため、次のコードを実行して、利用可能な別のモデルに変更することをお勧めします。
api_client.foundation_models.TextModels.show()
モデル・パラメーターの定義
結果に影響を与えるモデル・パラメータのセットを提供する必要があります:
from ibm_watsonx_ai.foundation_models.utils.enums import DecodingMethods
from ibm_watsonx_ai.metanames import GenTextParamsMetaNames as GenParams
parameters = {
GenParams.DECODING_METHOD: DecodingMethods.GREEDY,
GenParams.MIN_NEW_TOKENS: 1,
GenParams.MAX_NEW_TOKENS: 100,
GenParams.STOP_SEQUENCES: ["<|endoftext|>"],
}
watsonxモデル用のLangChain CustomLLMラッパー
定義したパラメータと model_id で指定したモデルを使って Langchain の WatsonxLLM クラスを初期化します。
from langchain_ibm import WatsonxLLM
watsonx_granite = WatsonxLLM(
model_id=model_id.value,
url=credentials.url,
apikey=credentials.api_key,
project_id=project_id,
params=parameters,
)
質問に対する検索拡張応答の生成
RetrievalQA(質問応答チェーン)を構築してRAGタスクを自動化します。
from langchain.chains import RetrievalQA
qa = RetrievalQA.from_chain_type(
llm=watsonx_granite, chain_type="stuff", retriever=docsearch.as_retriever()
)
質問の選定
前にロードしたテストデータセットから質問を取得します。
query = "What did the president say about Ketanji Brown Jackson"
qa.invoke(query)
まとめと次のステップ
このノートブックは無事に完了しました!
watsonxとLangChainを用いてRAGで質問に回答する方法を学びました。
その他のサンプル、チュートリアル、ドキュメント、ハウツー、ブログ記事については、オンライン・ドキュメントをご覧ください。




