はじめに
ついにIBMでも生成AIが出てきて、EnterpriseのためのAIはどこまで使えるようになるのか楽しみですね。
さて、その使い勝手を検証してもらうためには、様々な人たちに使ってもらう必要があると思いますし、誰かがアプリケーションに組み込んでみて初めて真価を発揮するでしょう。
早速使ってみたいけど、SDKは2023/8/1時点でPythonのみ提供されているみたい。Node.jsを普段使う身としては、せめて curl
で呼び出せる必要が、、、
なので、こちらの記事ではwatsonxのAPIをcurlで呼び出せるようになるまでの細かい手順を紹介します。
※IBM Cloudアカウントがあることが前提になっています
IBM watsonxへまずアクセスしてみよう
https://dataplatform.cloud.ibm.com/login?context=wx&save_region=true
こちらにアクセスします。
実行環境は以下から選択できますが、今回はダラスに作成します。
- ダラス(us-south)
- ロンドン(eu-gb)
- フランクフルト(eu-de)
- 東京(jp-tok)
IBMidはすでにあるIBM Cloudアカウントの情報を入力してください。
注意
実行環境選択したロケーションにLiteプランのWatson Studio/Watson Machine Learningが作成されます。
すでにLiteプランの両サービスがある場合は、そのサービスと同じロケーションを選択するか、既存のLiteプランのサービスを削除してから実施する必要があります。
認証ページが表示されるので、IBM Cloudアカウントと同じ情報を入力ください。
連絡先と利用ポリシーを確認されるので、必要な情報を入力します。
無事にポータルが表示されました
試しに生成AIに質問を投げてみたいので、 ファウンデーション・モデルを試し、プロンプトを作成する
を選びます。
なお、自動的に xxのサンドボックス
という名前でProjectが作成されました。
Projectはwatsonxを動かす上での一定のワークスペースとなります。
利用ポリシーを確認されるので、すべての項目にチェックを入れます。
私は特にツアーは必要ないですが、ツアーを見たい方はツアーを開始を選択してください。
とりあえず、初期表示された状態で、画面末尾のプロンプトのテスト、の項目に「日本の首都は?」と入れて、画面右下の「生成」のボタンを押します。
無事に「東京」という回答が得られました。他の都道府県が応答されたらどうしようかと思いました。
画面末尾に以下のような記載があります。
停止理由: シーケンス・トークンの終わりが検出されました
トークン: 17 入力 + 5 生成済み = 22 / 2048
4 秒
今回の生成AIの利用で、入力に17、出力に5、合計22のトークンを消費しています。
この利用したトークンは重要で、Liteプランで利用する場合、月に25,000トークンまでしか利用できません。
注意
watsonxで生成AIを利用する場合、裏でWatson Machine Learningのサービスを利用しています。
月に25,000トークンまで利用可能な記載はWatson Machine Learningのサービスのプランに記載されています。
curlで実行するために
実は、先ほどの画面の右側に「コードの表示」というボタンがあります。
開いてみるとここにcurlのコマンドが。これで実行できるのでは?と誰もが思うはずです。
問題は、Bearer認証で記載されている YOUR_ACCESS_TOKEN
は、どこにあるのか?という問題。
xxのサンドボックスというProjectを選択し、「管理」から「アクセス制御」を選択すると「アクセストークン」のタブが見えます。
試しにアクセストークンを作成してみましょう。
無事にトークンが作成できました。
これでやっと curl
で先ほどの内容を再現できるでしょうか?
エラーだってよ
つまり、先ほど作成したアクセストークンは、生成AIを利用するためのものではない、ということです。
では、どうやってアクセストークンを作成すれば良いのか?
ヒントは、curlのリクエスト先のURLを見てください
これ、Watson Machine Learningのエンドポイントですね。つまり、Watson Machine Learningのアクセストークンを発行できる必要があります。
Service IDを作成する
IBM Cloudのポータル上部のメニューにある「管理」から「アクセス(IAM)」を選択してください。
左側のメニューから「サービスID」を選択します。
すでにいくつかサービスを利用していた場合自動生成された情報もあると思いますが、今回は新規に作成してみましょう。
最低サービスIDの名称を入れて作成を選択します。
サービスIDが作成できました。
この状態では、何の権限も持たないので、Watson Machine Learningの権限を割り当てます。
ポリシーの作成で、まず、サービスに「Watson Machine Learning」を選択します。
リソースでは、すべてのリソースを選択しても動作するのですが、今回はwatsonx用に作成されたWatson Machine Learningのインスタンスのみ権限がある状態にします。
とりあえず管理者相当の権限を設定して、末尾の追加を選択します。
画面右側にアクセス・サマリーが表示されるので、割り当てを選択して、サービスIDに権限を割り当てます。
これでサービスIDに権限が付与されました。
このサービスIDに紐づくAPIキーを作成するので、画面上のAPIキーのタブを選択して、作成します。
最低名前を入力して作成を選択します。
APIキーが作成されるので、どこかに控えておきましょう。
表示されたAPIキーはポップアップをCloseする、もしくは表示から300秒経過すると二度と表示されなくなります。
作成したAPIキーは記録するようにしてください。
APIキーからアクセストークンを取得する
こちらの記事にも記載ありますが、下記のようなcurlコマンドで取得可能です
curl -X POST "https://iam.cloud.ibm.com/identity/token" \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'Accept: application/json' \
-d 'grant_type=urn:ibm:params:oauth:grant-type:apikey' \
-d 'apikey=さきほど取得したAPIキー'
応答として下記の内容が得られます。
{
"access_token": "eyJraWQiOiIyMDIzMDcx(~中略~)ayftdlDpiFQ5tKQ",
"refresh_token": "not_supported",
"token_type": "Bearer",
"expires_in": 3600,
"expiration": 1690900173,
"scope": "ibm openid"
}
こちらで生成されたアクセストークンは1時間(3600秒)で失効します。有効期限が切れた場合は、改めてアクセストークンの生成が必要です
curlでwatsonxのAPIを呼び出してみる
先ほど取得したアクセストークンを利用して、改めて先ほど認証でエラーになったcurlコマンドを実行してみましょう
エラーだってよ(再掲)
とはいえ、ここまでくるとあと少しです。
メッセージの中に下記のような内容が記載あります。
Failed to find the iam-ServiceId-xxxxxx member in project_id xxxxxx
これは、watsonxのProjectにそのService IDが参加していません(見つかりません)というエラーなので、ProjectにService IDを含めるようにしましょう。
watsonx のプロジェクトにService IDを含める
watsonxの画面からProjectを選択、管理のタブを選び、左側のメニューからアクセス制御を指定。
先ほどはアクセストークンを見ましたが、今回は、画面右側のコラボレーターの追加からサービスIDの追加を選択します。
先ほど作成したService IDを検索してチェックボックスにマークをして、忘れがちですがロールを指定して画面右下から追加を行います
これで無事にService IDがprojectに追加されました
これで先ほどエラーになったcurlコマンドを実行すると、無事にwatsonxの生成AIから応答が返るようになります。
さいごに
いかがでしたでしょうか?
watsonxにアクセストークン生成って書いてるのだから、そのアクセストークンでcurlコマンドが動いてほしいですが、ちょっと工夫が必要ですね。
Node.jsのSDKが2023/8/1時点で無いようなので、Node.jsで書いているアプリでwatsonxと連携する場合、アクセストークンの生成処理を自前で書かなければならない部分がありますが、これでやっと自分で作成しているアプリとwatsonxを自力で繋げることが出来そうです。
この内容で少しでも多くの人がwatsonxを触ってみるにあたって、壁に当たることなく利用できることを願います。
2023/8/3 追記
Node.jsからwatsonxを利用する記事を投稿しました
watsonxのAPIをNode.jsから呼び出してみる