Pythonからwatsonx.aiのサービスを使ってみる

# はじめに
watsonx.aiの生成AIのサービスをPythonスクリプト(Jupyter Notebook)から実行する一連の流れを試してみます。具体的にはプロンプトにより指示を与えて、それに対する回答の文書を生成させるということをやりたいです。
ここでは環境構築からサンプルを動かせるところまでをやってみます。

※2024年6月時点の情報です

# 環境イメージ

今回使用する環境の全体像は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/8ff3e9ae-89b2-25a6-ace2-b013118a1823.png)

IBM Cloud上でwatsonx.aiを称するためのサービスを立ち上げます。今回はIBM Cloudのアカウントがあれば無償で利用できる範囲で試してみます。

PC側はWindows11のVS Codeから使用することを想定してPythonおよびJupyter関連のExtensionを追加します。
また、GitHubで提供されているサンプルのPythonスクリプトを実行する想定ですが、WindowsおよびVS CodeでGitについてのセットアップは済みの想定とします。

今回の操作をやってみる際に以下の記事を参考にさせていただいております。

Qiita記事: 
[0からのIBM watsonx.aiのはじめかた](https://qiita.com/ironikot/items/a1ff1423c5c2e7c44876)
[VSCodeでJupyter Notebookを使ってみた【ゼロからPython勉強してみる】](https://qiita.com/starfieldKt/items/ed7dee5142d9d5c177fd)

IBM Cloud Documentation:
[Watson Studio](https://jp-tok.dataplatform.cloud.ibm.com/docs/content/svc-welcome/wsl.html?context=wx&audience=wdp)
[Watson Machine Learning](https://jp-tok.dataplatform.cloud.ibm.com/docs/content/svc-welcome/wml.html?context=wx&audience=wdp)
[生成 AI ソリューションの開発 - 生成 AI ソリューションのコーディング](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-code.html?audience=wdp&context=wx)
[IBM Cloud API Docs - watsonx.ai](https://cloud.ibm.com/apidocs/watsonx-ai)

# IBM Cloud側構成

## watsonx.aiの構成

### Watson Studioサービスのインスタンス作成
watsonx.ai関連の各種ツールを提供してくれるWatson Studioというサービスがあります。まずはこのWatson Studioというサービスのインスタンスを作成します。

IBM Cloudの管理コンソールから検索窓で「Watson Studio」を入力し、Watson Studioサービスを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/e8031f61-d474-53ba-baff-c7efe568f227.png)

作成したいIBMアカウントの元で、ロケーション、プラン(今回は無料のライトプラン)を選択し、作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ef1fc583-cc42-5ac7-b148-1cd190bf5a43.png)

Watson Studioサービスのインスタンスが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/4ab4ef56-7838-04a3-abc2-3bcf2361185e.png)

### watsonxの起動
「Launch in」の横のプルダウンメニューからIBM watsonxを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/1f9fa78d-bf6a-5646-8246-1e7076752de0.png)

ようこそ画面が表示されるので、利用規約同意にチェックし「x」ボタン or ツアー実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/460bf2fd-d8a3-b0de-2cc8-307a8f9f7a86.png)

### プロジェクト作成
watsonxのトップ画面の下の方の「プロジェクト」の横の「+」アイコンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/befb5d6c-376e-509f-a0c6-83b40cbf01c6.png)

適当な名前を指定して作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/aefa020a-d183-8557-6bfd-9c78cc35fe86.png)

プロジェクトが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/edc9241a-5820-2858-537c-f00f26746339.png)

### プロジェクトIDの確認
プロジェクトの画面で「管理」タブからプロジェクトIDを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/67d8314c-c080-648b-6606-ba4c950f8b95.png)

<font color="red">※この情報はPythonからのアクセス時に使用します</font>

### Machine Learningサービスの作成および関連付け
プロンプトLabなどを使用する場合、Machine Learningのサービスを別途作成して関連付けをしておく必要があります。

プロジェクトの画面の「管理」タブから「サービスおよび統合」を選択し、「サービスの関連付け」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/d89e4652-54d1-f415-91b2-a59680cbc866.png)

新規サービスをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/6a4bab6f-6b95-b8ab-0680-ba0de5f3ba4f.png)

Watson Machine Learningを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b50de2c4-9e16-f9cb-a560-e2b3b53f0a17.png)

無料のライトプランを選択して作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/e3abd6a3-1654-783b-98c3-09d5902b17aa.png)

今作成したMachine Learningのインスタンスを選択して「アソシエイト」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/31401dc0-6d5c-4a27-4386-0d43590753fa.png)

### Prompt Labを試してみる
watsonxのトップ画面から、開く場所: 「test01」(上で作成したプロジェクト名)になっていることを確認し「Prompt Labを開く」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f8f59f33-922e-5afa-9c4a-f51b084532bd.png)

Prompt Labが開くので、サンプルの1つを選択してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/649a4cf2-c517-c947-ef89-4eca7fbd3a43.png)

結果が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2ac1c14a-e5c5-5de6-2bff-63e6a7abec81.png)

英語なので日本語で回答するよう指示してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/602c7d35-23e2-cf9a-ce56-b38dc4e5c7aa.png)

先ほどの結果が日本語訳されて出力されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c028aefa-965d-8997-b633-7f149006fc48.png)

チャット形式で生成AIの機能が使えることが確認できました。

## API Keyの作成

IBM Cloudの管理コンソールにて、当該IBM Cloudアカウントを選択して、管理 - アクセス(IAM)を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9c80d8f6-bd2d-8a1b-8e11-2242037c67ae.png)

APIキーの画面から作成をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ce04012f-0b55-98cc-ccc6-086afb39bc2b.png)

適当に名前を付けて作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/3b39b670-e634-421c-20a6-5979925c94db.png)

APIキーが生成されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/4ce83ff3-91a2-5782-c5d4-04ca5f7ee7d9.png)
※ここで生成されるキーはこのタイミングでしか確認できませんので、コピーして安全な場所に管理しておく必要があります。

<font color="red">※この情報はPythonからのアクセス時に使用します</font>

## エンドポイントURL確認

Watsonx Studioサービスのインスタンスを作成したロケーションを確認します。(今回の場合は「東京」)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ee11a349-68fe-5a68-cc6a-fcf6fba32a98.png)

以下のサイトにて、ロケーションに応じたエンドポイントのURLを確認します。
[Endpoint URLs](https://cloud.ibm.com/apidocs/watsonx-ai#endpoint-url)
東京の場合`https://jp-tok.ml.cloud.ibm.com`となります。

<font color="red">※この情報はPythonからのアクセス時に使用します</font>

# PC側構成

Windows11上にPython, Jupyter Notebook関連のセットアップを行います。VS Code, Gitについては設定済みの想定です。

## Pythonのインストール
以下のサイトからインストーラーをダウンロードします。
https://www.python.org/downloads/windows/

今回は3.10.xのうち2024年6月時点で最新の3.10.11をインストールすることにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b1ba574c-a90c-a529-fb84-9a7e6c8687bc.png)

ダウンロードしたexeを実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/e80e5ee0-1ca1-8a42-e033-1562f6fbcd55.png)

前に入れたやつがあったのでUpgrade
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9217de96-32f2-df29-8859-1a6bfb7ebe15.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/99923fd3-be3f-93a6-0907-20cfa115cceb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c2526f2b-2928-54f2-b1a0-b47d5ea5858c.png)

確認

```
c:\>python --version
Python 3.10.11

c:\>pip --version
pip 23.0.1 from C:\Python310\lib\site-packages\pip (python 3.10)
```

一応PATHも確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/256d2358-1069-0eb3-637d-8bfdc725e614.png)

## VS Code Extensionのインストール

マーケットプレースからPythonおよびJupyterのExtensionをインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/43ae05ca-dd89-e283-f652-6d83fe81663b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/d75ca8fb-ce61-0d8c-7960-5b56fbe0854a.png)

## Python仮想環境のセットアップ
Pythonでは実行環境を仮想化する仕組みが提供されていますのでこれを利用します。



VS Codeでターミナルを開き、適当なディレクトリを作成して、カラのpythonスクリプトファイル「blank.py」を作成しておきます。そのディレクトリで「python -m venv test01」を実行します。(test01という仮想環境を作成します)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/fe79e3ec-2f16-5da4-6aa4-139d2fbe7c68.png)

>新しい環境が作成されました。これをワークスペースフォルダに選択しますか？

というポップアップが出ますがここでは無視します。

Ctrl+Shit+Pでコマンドパレットを開き、「Python: インタープリターを選択」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/bf44e429-8edf-dbf4-85e7-a32000aa100f.png)

先ほど作成した仮想環境(test01)を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ecaa1673-1c53-cc46-6cb9-52f195db2081.png)

これで新しいターミナルを開くと、指定した仮想環境がActivateされた形で起動するはずなのだが、デフォルトで開くPower Shellだと恐らくポリシーに引っかかってActivateされてないっぽい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/bf1827a5-7c7a-7f59-c4c2-389a8b25ad4b.png)
多分この辺が関係ありそう: [Windows10のVSCodeでvenvを利用するときの注意点](https://qiita.com/Avocado/items/3e71870815d6c54c1eea)

通常のコマンドプロンプトを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/28289d84-0b79-e214-a82c-1a3570c5235c.png)

プロンプトの先頭に`(test01)`という仮想環境がActivateされていることを示す表記があるのを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ec417f0b-f65b-9476-850e-a5194c0dfc41.png)

# サンプル実行

## サンプル・リポジトリのクローン
GitHubにwatson関連のサンプル・スクリプトが含まれたリポジトリが公開されています。
[GitHub -  IBM/watson-machine-learning-samples](https://github.com/IBM/watson-machine-learning-samples/tree/master)
こちらをローカルにクローンして利用します。

VS CodeのコマンドパレットからGitクローンを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c8f647b6-a9c2-829e-d5e7-3d44f4904c78.png)

クローンしたいリポジトリのURLを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9c3ad9ed-9ecc-4c86-782e-4376d1201df3.png)

適当なフォルダを指定してクローンします。

以下のポップアップが出るのでワークスペースに追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ce1f6de6-7ed9-53ae-524a-cfb3adbfc3a4.png)

VS Codeのワークスペースに追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/fc45a888-0f12-4172-fdfd-1e704d97a9d3.png)

## サンプルのJupyter Notebookを実行してみる

以下に提供されるサンプルを動かしてみます。
[cloud/notebooks/python_sdk/deployments/foundation_models/Use watsonx, and Meta `llama-3-70b-instruct` to answer question about an article.ipynb](https://github.com/IBM/watson-machine-learning-samples/blob/master/cloud/notebooks/python_sdk/deployments/foundation_models/Use%20watsonx%2C%20and%20Meta%20%60llama-3-70b-instruct%60%20to%20answer%20question%20about%20an%20article.ipynb)

上のNotebookをVS Codeで開いて、指示通り実行していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/187a95a0-1a98-bda4-5902-48c4614d99fa.png)

Notebookを開いたあとに、右上に`test01(Python 3.10.11)`と表示されていることを確認してください。これは、このNotebookが先に作成した仮想環境「test01」に紐づいていることを示しています(このNotebook上のコードを実行する際に、この仮想環境で実行されることになる)。意図しない環境に紐づいている場合は、ここの表示をクリックすると、仮想環境が選択できるようになるはずなので使用したい仮想環境を選択してください。

※ある環境では、仮想環境に切り替えようとしたときにipykernelがインストールできないというようなエラーで切り替えに失敗したことがありました。コマンドプロンプトを開いて仮想環境をActivateし、そこで `pip install ipykernel`を手動で実行した後切り替えを行うとうまくいきました。

### Install dependencies

コードブロックの左側の三角アイコンをクリックしてコードを実行していきます。
まずは必要なモジュールのインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/4c5d57c5-6918-2a78-f67e-3e28d2d85b34.png)

※ここでトラップが2つありますのでご注意を！
(1) 先頭に「!」マークがついた命令は、OSコマンドを発行することを意味しています。Windows環境でこれを実行すると文字化けが生じてしまいます。VS CodeのJupyterで使われるOSコマンド実行環境の文字コードは恐らくShiftJISベースになっていて、Notebook自体はUTF-8で解釈しようとしているために文字化けが生じるものと推察されます。
参考: [VsCode_Jupyterの文字化けの対策（chcp）](https://qiita.com/dmkd3006/items/2b9143a76a266bebd2c9)
上の記事に従って、まず`!chcp 65001`を実行してOSコマンド実行シェルの文字コードをUTF-8に変更してから実行すると文字化けは解消されました。Notebookを改修するのはイケてないのでどこか設定で文字コードを指定できないか探したのですが見つからず...

(2) `pip install`コマンドの結果をパイプでつないで`tail`コマンドに渡していますが、Windowsでは標準でtailコマンドは提供されていないようです。このサンプルはMacやLinuxを前提に作成されているものと思われます。私の環境では[MinGW](https://sourceforge.net/projects/mingw/)というツールをセットアップしているので使えましたが、そういうものが無い環境だとtailコマンド使えないので、パイプ以降は削除して実行する必要があります。
※MinGW入れておくとtailとかgrepとかUnixコマンドをWindows上で使えるので非常に便利です。おすすめです。


### Defining the WML credentials

URL部分は、今回東京リージョンのサービスを使用するので、上で確認した東京リージョン用のエンドポイントURL(`https://jp-tok.ml.cloud.ibm.com`)に置き換えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/d23cc948-e837-f883-12bf-dff40b9141e5.png)

実行するとAPI Keyの入力が促されるので、先に作成したAPI Keyを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9fbfe269-861c-6768-856d-e0ac8d5e3df0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/7e89ce58-2c0e-f78e-ae31-1fb5d11aa615.png)

### Defining the project id

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/3695367c-7869-1a77-f154-6617420ec87d.png)

実行するとProject IDの入力が促されるので、先に作成したプロジェクトのProject IDを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c1bae166-34f0-9171-e828-ef338bfd865c.png)


### Specify Foundation Model

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b7d4762b-a86f-dac5-2a76-1402c9b27ee4.png)

### Defining the model parameters

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/1bf82be3-9c16-6ac5-26ec-b4dc832d7715.png)

### Initialize the model

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/a32d9af4-1518-d780-f943-54d45949dfe0.png)

### Model's detail

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/fb763a9e-81ed-13ec-3407-df4ebe7ef54b.png)

### Define Instruction and question

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/21eea33e-1f27-0baf-8e42-539ffdde5411.png)

ここでは、サンプルとしてあるArticleの文章を示し、それに対する質問と答えのサンプルをInstructionとして与えています。
その後、求めるquestionを指定しています。

### Answer the question using Meta `llama-3-70b-instruct` model.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b260a20f-8642-9593-d5eb-229764784a8b.png)

以下のquestionに対して、

>question = "Question: Why should you use mulch when growing tomatoes?"

以下のanswerが返されました

>Answer: To prevent soil-borne disease from splashing up onto the fruit when you water.

## サンプルをカスタマイズして実行

上のサンプルは英語の記事を与えてその内容についての質問をし、回答を生成させるサンプルでした。これを日本語に置き換えて実施してみます。

### Instructionに日本語を指定

元々のサンプルの英文をGoogle翻訳で日本語に翻訳した文章に置き換えてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2ffad0cc-63f3-ab52-a419-43404b2f6e2c.png)

Instruction:

```
記事の情報のみを使用して、次の質問に回答してください。記事に適切な回答がない場合は、「わかりません」と答えてください。

Article: 
###
トマトは、野菜畑で最も人気のある植物の 1 つです。
成功のヒント: 
病気や害虫に強い品種を選択すれば、トマトの栽培は非常に簡単です。
挑戦したい経験豊富な園芸家にとって、栽培できる伝統品種や特別な品種は無数にあります。
トマトの植物にはさまざまなサイズがあります。
12 インチ未満の非常に小さな品種があり、バルコニーやパティオの鉢や吊り下げバスケットでよく育ちます。
高さと幅が数フィートの茂みに成長し、より大きな容器で育てられる品種もあります。
プランターや花壇で幅と高さが数フィートの巨大な茂みに成長する品種もあります。
さらに、6 フィート以上の長いつる植物として成長し、トレリスをよじ登る品種もあります。
トマトの植物は、直射日光が当たる場所で最もよく育ちます。
トマトには、たっぷりと頻繁に水をやる必要があります。
マルチを使用すると、水をやったときに土壌伝染病が果実に飛び散るのを防ぐことができます。
吸芽を刈り込み、先端を摘み取るだけでも、植物は果実を生産するために全力を注ぐようになります。
###

Question: トマトの栽培は簡単ですか?
Answer: はい、病気や害虫に強い品種を選べば簡単です。

Question: トマトにはどんな品種がありますか?
Answer: 伝統品種や特産品種は無数にあります。
```

question:

```
Question: トマトを栽培するときにマルチを使用する必要があるのはなぜですか?
```

### 結果確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2d116c87-38bc-19a1-162e-621be71a06c3.png)

Answer:

```
Answer: 土壌伝染病が果実に飛び散るのを防ぐためです。
```

日本語の指示に対してもきちんと回答が得られました。

# おわりに
VS Code, Python, Jupyter Notebook を使用し、watsonx.aiの生成AIのサービスを利用する一連の流れを確認できました。
あとはこれをベースに色々と応用をしていけると思います。