watsonx AssistantからWatson Discoveryに取り込まれたデータを検索して、watsonx.aiの生成AIで回答を作成する手順です。
2024年2月末にIBMからGranite日本語版のLLMが提供されたので、ここではGranite日本語版の利用手順を確認しました。
watsonx Assistantのスターターキットでは、カスタム拡張機能を使用して外部 REST API にアクセスするために必要なテンプレートを提供しています。
ここではDiscoveryとwatsonx.aiのAPIを呼び出して、Assistantから生成AIを利用する手順を確認します。
Assistantの作成
最初に新しい空のアシスタントを作成します。
新しい Watson Assistantを使用する必要があります。
Assistant name: ここでは「watsonxx」としています。
Assistant language: スターターキットを利用するため、言語はEnglishを指定します。
Discoveryカスタム拡張
Watson Assistant のカスタム拡張機能を使用して Watson Discovery で情報検索をした内容を利用します。
Discoveryの情報を取得
Assistantのカスタム拡張でDiscoveryを利用する際にはDiscovery側の「API鍵」「URL」「Project ID」が必要です。
API鍵とURLはDiscoveryのリソース情報に表示される資格情報からコピーします。
Project IDはDiscoveryで検索対象のデータを取り込んであるプロジェクトを開き、Integrate and deploy の API Information の Project ID をコピーしておきます。
Discoveryのカスタム拡張機能を作成
watson-discovery-query-openapi.jsonファイルを以下からダウンロードします
https://github.com/watson-developer-cloud/assistant-toolkit/blob/master/integrations/extensions/starter-kits/watson-discovery/watson-discovery-query-openapi.json
東京リージョンを選択できるように、watson-discovery-query-openapi.json の servers に以下の行を箇所を追加して保存します。
"servers": [
+ {
+ "url": "https://jp-tok.ml.cloud.ibm.com",
+ "description": "watsonx.ai Tokyo"
+ },
{
"url": "https://us-south.ml.cloud.ibm.com",
"description": "watsonx.ai v1-beta"
}
],
モデルパラメーターのデコード(greedyかsampling)を選択できるようにする場合は以下も追加します
"parameters": {
"type": "object",
"properties": {
+ "decoding_method": {
+ "type": "string",
+ "description": "greedy か Sample を指定します",
+ "example": "sample"
+ },
Watson Assistant のメニューから「Integration」を選択
Extensionsにある「Build custom extension」をクリック
- Assistant のメニューから[Integration]を選択
- Extensionsにある [Build custom extension] をクリック
- [Next]をクリック
- Extension name (例:Discovery) を入力して[Next]をクリック
- Import OpenAPIで、先ほど編集して保存した "watson-discovery-query-openapi.json" を指定して[Next]をクリック
- [Finish] をクリック
Discoveryカスタム拡張機能の追加
Watson Assistant のメニューから「Integration」を選択
Extensionsの前ページで作成したカタログ(Discovery)の[Add]をクリック
- 作成したカタログDiscoveryの[Add]をクリック
- [Next]をクリック
- Extension name (例:Discovery) を入力して[Next]をクリック
- Discoveryの情報を入力
Authentication type: Basic auth
Username: apikey
Password: [DiscoveryのAPI鍵]
discovery_url: [DiscoveryのURL]から"http://"を除いた値 - [Next] をクリック
- [Finish] をクリック
- [Close] をクリック
watsonx.aiカスタム拡張:
Watson Assistant のカスタム拡張機能を使用して watsonx の生成AIを利用できるようにします。
IBM Cloudの情報を取得
Assistantのカスタム拡張でwatsonx.aiを利用する際には、IBM Cloudの「APIキー」と、watsonx.aiの「プロジェクトID」が必要になります。
API鍵はこちらの記事「IBM Cloud APIKEYの作成(取得)方法」を参考に取得します。
プロジェクトIDはwatsonx.aiの画面からコピーをしておきます。
watsonxのカスタム拡張機能を作成
watsonx-openapi.jsonファイルを以下からダウンロードします
https://github.com/watson-developer-cloud/assistant-toolkit/blob/master/integrations/extensions/starter-kits/language-model-watsonx/watsonx-openapi.json
Watson Assistant のメニューから「Integration」を選択
Extensionsにある「Build custom extension」をクリック
- Assistant のメニューから[Integration]を選択
- Extensionsにある [Build custom extension] をクリック
- [Next]をクリック
- Extension name (例:watsonx) を入力して[Next]をクリック
- Import OpenAPIで、"watsonx-openapi.json" を指定して[Next]をクリック
- [Finish] をクリック
watsonカスタム拡張機能の追加
Watson Assistant のメニューから「Integration」を選択
Extensionsのカタログに追加されたwatsonxにある[Add]をクリック
- 作成したwatsonxの[Add]をクリック
- [Next]をクリック
- watsonx.aiの情報を入力
Authentication type: Oauth 2.0
Grant type: Custom apikey
apikey: [取得済みのIBM Cloud API鍵]
Client authentication: Send as Body
Header prefix: Bearer
Servers: https://jp-tok.ml.cloud.ibm.com(東京リージョン) - [Next] をクリック
- [Finish] をクリック
- [Close] をクリック
Assistant アクションの作成
discovery-watsonx-actions.jsonファイルを以下からダウンロードします
https://github.com/watson-developer-cloud/assistant-toolkit/blob/master/integrations/extensions/starter-kits/language-model-conversational-search/discovery-watsonx-actions.json
Watson Assistant のメニューから「Actions」を選択
[Global settings](右上の歯車マーク)をクリック
- Assistantの[Actions]をクリック
- [Global settings]をクリックして一番右の[Upload/Download]を選択
- Upload で、"discovery-watsonx-actions.json" を指定して[Upload]をクリック
- [Upload and replace] をクリック
*登録済みのアクションは置き換えられて使えなくなります - [Close] をクリック
3つのアクションが作成されます
「Invoke watsonx generation API」がエラーになっている場合
-
Assistantの[Actions]をクリック
-
“Created by you”にある [Invoke watsonx generation API] をクリック
-
Step 1 の “And then” にある “Edit extension” をクリック
-
[Apply] をクリック
エラー表示がなくなっていることを確認します
Assistant 変数の指定
Watson Assistant のメニューから[Variables] - [Created by you] を選択
変数の初期値を設定します
必須:
discovery_project_id: [DiscoveryのプロジェクトID]
watsonx_project_id: [watsonx.aiのプロジェクトID]
model_id: 使用する言語モデル
使用する言語モデルは、日本語が扱える以下のモデルの中から指定します
ibm/granite-8b-japanese
elyza/elyza-japanese-llama-2-7b-instruct
meta-llama/llama-2-70b-chat
meta-llama/llama-2-13b-chat
その他必要に応じて変更します
model_parameters_max_new_tokens: 最大トークン数
model_parameters_min_new_tokens: 最小トークン数
model_parameters_repetition_penalty: 反復ペナルティ
model_parameters_stop_sequences: シーケンスの停止
デコード方式(greedyかsampling)を追加
Watson Assistant のメニューから[Variables] - [Created by you] を選択
-
[New variable +]をクリック
-
以下の情報を入力
Name: decoding_method
Type: Any
Initial value: greedy
*ここでは”greedy”としていますが、Samplingを利用する場合は”sample”と入力します -
[Save] をクリックして保存
Assistant で動作確認
Discoveryには生成AIに関連する「IBMソリューションブログ」を取り込み、
Assistantで作成したチャットから、生成AIに関する質問をしてみます。
日本語も扱える llama-2-70b-chat を使用すると日本語の質問に対しても期待する結果が得られます。
[参考]Assistantからwatsonx.aiに渡される情報
上記の例で Assistant から watsonx.ai に渡されたプロンプトは下記の通りです。
参考とする例はタイトルと文書を日本語で与えて、指示(命令ステートメント)は英語で行なっています。
watsonx.ai からAssistant に返された結果は下記の通りです。
例として与えられた文書と指示に対して、生成された文書が返ってきてます。
【Tips】IBMの言語モデル(Granite日本語版)を利用する際のプロンプト変更
watsonx.aiへのプロンプトは、Generate Answer(アクション)の model_input で指示を与えています。Graniteモデルを使用する場合、モデルに適してプロンプトに変更する必要があります。
Step5で model_input の指示を右の例のように変更します。
Granite用プロンプトとして model_input を下記の内容に変更します。プロンプトは目的に合わせて修正します。
("### System:
あなたは誠実で優秀なAIアシスタントです。ユーザーの指示に可能な限り正確に従ってください。
### User:
以下の文書を読んでQuestionに回答してください。与えられた文書では回答できない場合は「回答がない」と述べてください。
").concat(
${passages}
).concat("\n\n<Question>").concat(
${query_text}
).concat("</Qustion>\n\n### Assistant:")
【Tips】応答結果に元文書のリンクを表示する
*Discoveryのコレクション作成時にファイルをアップロードしている場合はこの方法を使えません。WebやICOSなどのデータをクロールした場合に利用できる方法です
[Actions] - [Variables - Created by you] の [New variable +] から "links" を追加します
Name: links
Type: Free text
[Actions] - [All items - Created by you] の [Generate answer] を選択
Step 1 で links を初期化します
Step 2 で links にDiscoveryの検索結果からurlをセットします
__${search_results}.get(0).metadata.source.url + "\n"__
Step 3と4 で links にDiscoveryの検索結果からurlを追加でセットします
Step 3:
${links}. concat(${search_results}.get(1).metadata.source.url) + "\n"
Step 4:
${links}. concat(${search_results}.get(2).metadata.source.url)
${model_response} <hr>参考文書${links}
【Tips】 Discovery検索結果のパラメータ変更
Discoveryから取得する検索結果は、Search(アクション)内のステップ3で条件を変更できます。
・count= 3(初期値は3件の検索結果を取得、別の値に変更できます)
・passages.characters= 250(パッセージとして取得する長さを変更できます)
・passages.fields= ["text"](パッセージを抽出するフィールドで、別のフィールドに変更可能)
最後に
社内文書など独自のデータを対象にして生成系AIを利用する方法として、検索拡張生成(RAG)が注目されています。今回は情報抽出にWatson Discoveryを利用することで、独自データから回答作成をするチャットボットをノーコードで作成できることが確認できました。Actionを日本語化したりプロンプトを修正することでさらに使い勝手の良いチャットになることが期待できます。
参考情報
Language Model Conversational Search starter kit(Watson Assistant Toolkit)
https://github.com/watson-developer-cloud/assistant-toolkit/tree/master/integrations/extensions/starter-kits/language-model-conversational-search#language-model-conversational-search-starter-kit