前回の続きです:

0:準備編
1:Jupyter Notebook 編 (今回はここ)
2:LangChain 編


IBM が提供する LLM である watsonx.ai を使って LangChain やエージェントを実装する手順を紹介しています。前回は環境構築を含めた必要な情報の取得を一通り行いました。今回から Jupyter Notebook を使ってプログラミングを行います。 なお、ここで紹介した内容とその結果は 2024/12/31 時点でのものである点に留意ください。

まず、前回までの内容で取得した以下の情報が全て揃っていることを確認してください。取得方法は全て前回のコンテンツ内に含まれています(赤字は今回のブログで実際に使います):
・watsonx.ai プログラミング時に必要な4つの値
 ・URL
 ・モデル ID
 ・プロジェクト ID
 ・API キー値
・Jupyter Notebook の利用環境
・LangChain プログラミング時に必要な外部キー
 ・Serp API キー


【Jupyter Notebook にアクセス】
自分の PC に Python などを導入して、自分のローカル環境で Python を使って実行する人はその方法でも構いません。が、このブログでは事前にオンラインに用意した Jupyter Notebook ランタイム環境を使ってプログラミングを実施します。

まずは前回作成した Jupyter Notebook 環境にアクセスします。IBM Cloud にログインし、リソース・リスト内「AI/機械学習」カテゴリーから "Watson Machine Learning" インスタンスを選択します:


"Watson Machine Learning" インスタンス画面において、「起動」右側の矢印 - 「IBM Cloud Pak for Data」を選択します:
2024123100


以下のような画面になったら(プロジェクトは前回作成済みなので)「キャンセル」をクリックします(プロジェクトを新規に作成する場合は、前回の内容を参考に「新規プロジェクト」から作成してください):
2024123101


IBM Cloud Pak for Data の起動直後の画面に移動します。ここで画面下部の「プロジェクト」から作成済みのプロジェクトを選択します:
2024123102


選択したプロジェクトの「資産」タブ内に、これも前回作成済みの Jupyter Notebook 資産が存在しています。再度利用したいので、該当する資産の右側のメニューから「編集」を選択します:
2024123103


少し待つとランタイムがロードされて起動し、Jupyter Notebook の編集画面に移ります。これで Jupyter Notebook が利用できるようになりました:
2024123104


【Jupyter Notebook で watsonx.ai の LLM を利用する】
IBM Cloud の Jupyter Notebook は最低限の pip パッケージが導入済みということもあって、すぐに Python コードを書き始めることができます(必要であれば "pip install xxxxx" で追加することももちろん可能です。このシリーズでも最後に使う予定です)。まずは以下の内容を Jupyter Notebook 内に記述(またはコピー&ペースト)してください。内容は前回の手順でそろえた5つの値を全て変数化する、というだけのものです。赤字部分はコメントなので入力時には無視して、自分で実際に取得した値をそのまま文字列として入力するようにしてください。なお最後の SERPAPI_API_KEY は今回使いませんが、定義だけここで済ませておきます:
# 変数の事前定義
MODEL_ID = "ibm/granite-8b-japanese" (LLM 言語モデルのID)
ML_URL = "https://jp-tok.ml.cloud.ibm.com" (watsonx.ai の URL)
API_KEY = "(API キーの値)"
PROJECT_ID = "(プロジェクト IDの値)"
SERPAPI_API_KEY = "(SerpAPI キーの値)"

2024123105



続けて新しいセルを追加します。画面内左上、左から2番目のアイコン("Insert a cell below")をクリックします:
2024123106


新しいセルが下に追加されます:
2024123107


追加されたセル内に以下のコードを入力(またはコピー&ペースト)します:
# watsonx.ai を LangChain から使った問い合わせ
from ibm_watson_machine_learning.foundation_models import Model
from ibm_watson_machine_learning.metanames import GenTextParamsMetaNames as GenParams
from ibm_watson_machine_learning.foundation_models.extensions.langchain import WatsonxLLM

credentials = {
    "url": ML_URL,
    "apikey": API_KEY
}
project_id = PROJECT_ID

# 使用するLLMのパラメータ
generate_params = {
    GenParams.MAX_NEW_TOKENS: 500,
    GenParams.MIN_NEW_TOKENS: 0,
    GenParams.DECODING_METHOD: "greedy",
    GenParams.REPETITION_PENALTY: 1
}

# モデルの初期化
model = Model(
    model_id=MODEL_ID,
    credentials=credentials,
    params=generate_params,
    project_id=project_id
)

# LangChainで使うllm
custom_llm = WatsonxLLM(model=model)

r = custom_llm.invoke( "IBM Db2 on Cloud の特徴は?" )
print( r )

この時点では(実質的には) LangChain を使っているわけではないのですが、LangChain を使う想定で LLM のモデルを初期化し、最後に "IBM Db2 on Cloud の特徴は?" という問い合わせを実行しています。LangChain を使う準備も兼ねた実験的な問い合わせのような内容※だと理解ください。

※もう少し細かな内容まで説明すると、generate_params という変数の中で LLM を利用する上での変数値を調整しています。具体的には最大トークン数 = 500、デコーディング手法はいわゆる「貪欲法(greedy)」と呼ばれるシンプルな計算法、既に生成された単語や文脈が繰り返し使われることを抑制するための Repetition Penalty を有効に設定した上で言語モデルを初期化しています。この辺り、ある程度内容を理解できている場合は調整いただいて構いません。

では入力した内容を Jupyter Notebook 内で実行してみます。Jupyter Notebook を編集状態で開き、最初に変数定義を入力したセルにカーソルを合わせます(選択されているセルの左側に青い帯が表示されます)。そしてアイコンメニューの左から6番目、"Run this cell and advance(Shift + Enter)" をクリックするか、Shift キーを押しながら Enter キーを押してこのセルを実行します:
2024123109


最初のセルは変数の値を代入しているだけなので出力結果は何もありません(実行しても何もなかったかのような結果になります)。ただ選択されているセルが1つ下に移動しているはずです。この状態で(最初のセルの実行結果が有効になった状態で)2番目のセルを同じアイコンまたは Shift + Enter で実行します:
2024123110


すると(2024/12/31 時点では)画面のような警告メッセージも表示されますが、最終的には(プログラム内に書かれていた「IBM Db2 on Cloud の特徴は?」という問い合わせに対する回答が表示されます:
2024123111


Jupyter Notebook を使って watsonx.ai の LLM 言語エンジン(今回の例だと "granite-8b-japanese")に対するシンプルな問い合わせのプログラミングサンプルを入力し、実際に動く様子が確認できました。


【ここまでのまとめ】
今回紹介した内容で、watsonx.ai の LLM モデルを使った Python コーディングのサンプルを実際に動かす、具体的なコーディング内容/方法を紹介しました。

次回は今回紹介した内容を応用して、LangChain やエージェントと呼ばれる LLM アプリケーション開発手法を watsonx.ai の LLM で実現・実装する方法を紹介する予定です。