LoginSignup
7
3

DALL·E 2023-11-02 11.34.40 - Digital illustration of a home office with a contemporary design, featuring two 16_9 monitors on a desk. The left monitor shows a development environm.png

はじめに

みなさん、watsonx Assistant を使ってますか!
なんといっても、No Code でチャットボットをサクッと作って、自社のホームページに簡単に設置できるのは魅力的ですね。

この watsonx Assistant は、「業務アプリケーションに組み込んで業務効率を上げたい」、「モバイル・アプリケーションに組み込んでユーザー体験を向上させたい」、というご要望にも答えられるように、watsonx Assistant の機能にアクセスできる REST API を公開しています。とはいえ API なのでプログラミングが必要になります。

ただし、ここで引いてはいけません笑

この記事では、昨今話題の生成AIを活用してプログラミングを行いますので、実際のプログラミングの量はグッと減り、まさに、 Low Code です。

プログラム作成の方針

プログラム全体の見通しを良くし、将来のプログラム変更にも容易に対応できるように、FastAPI を使おうと思います。(ここが 『カッコよく』 の所以です)

ところで、みなさん、FastAPI って聞いたことありますか?

アプリケーション・プログラムから直接 watsonx Assistant API を呼び出すことはもちろん可能ですが、

:cloud_rain: アプリケーション・プログラムの中に認証用のコードを埋め込むため、セキュリティ的に問題がある
:cloud_lightning: 別のチャットボットエンジンの API に変更したい場合、アプリケーション・プログラムの修正が必要になり、アプリケーション・プログラム自体の汎用性が失われる

等、の問題があります。

もっと根深い問題については、こちらのWikipediaの記事を参照ください。

このような問題の解決策として、WSGI(Web Server Gateway Interface) という考え方があり、その実装の一例が FastAPI です。

ということで、今回は、アプリケーション・プログラムをサーバー・プログラムとクライアント・プログラムに分離して実装していきます。

前置きはこれぐらいにして、早速いってみましょう:bangbang:

本当に3分でできるのか:question:

3分で終わらせるためには、これからご紹介する 3 つの前提条件をクリアする必要がありますので、その点についてご説明します。

条件1: watsonx Assistant環境をお持ちで、Actionsで対話フローの作成が終わっていること

この条件をクリアするための情報は、こちらのQiita記事で扱っています。まだ、watsonx Assistant 環境をお持ちでない方は参考にしてみて下さい。

こんな対話フローを作成しておきます。
シンプルながらも、現在時刻を表示してくれます。

image.png

条件2: Python と VS Code の実行環境が導入済みであること

この記事は、MacOS にて確認した内容ではありますが、Windows 環境であっても Python が導入済みであれば再現可能です。

この条件をクリアするための情報は、こちらの Qiita 記事が参考になると思います。
(先人の知恵をお借りします)

Windows をお使いの方

MacOS をお使いの方

条件3: GitHub Copilot が VS Code から使えるように設定する

この条件をクリアするための情報は、こちらのQiita記事で扱っていますので、まだ、環境をお持ちでない方は参考にしてみて下さい。

コードを生成する AIとして、今回の記事では GitHub Copilot を使用します。

レッツ・プログラミング:bangbang: :writing_hand:

3 つのステップでプログラミングをしていきます。

  1. サーバー・プログラムの作成と実行
  2. テスト・プログラムの作成と実行
  3. クライアント・プログラムの作成と実行

です。

:one: サーバー・プログラムの作成と実行

サーバー・プログラムの作成

サーバー・プログラムとして、watsonx Assistant に接続するための Gateway Interface を作成します。つまりは、watsonx Assistant API にアクセスするための仕掛けで、先にご紹介した WSGI の実装です。

これによって、アプリケーション・ロジックを埋め込むクライアント・プログラム側に認証用のコードを埋め込む必要がなくなります。

なんか難しそうに感じるかもしれませんが、そこはご安心を。

まずは VS Code を開き、app.py という名前のファイルを作成してください。
そして、GitHub Copilot チャットをクリックします。

image.png

チャット・ウィンドウが表示されますので、

fastapiを使って、watson assistantへのgatewayサーバーを作成して下さい

と入力してサーバー・プログラムを生成します。こんな感じです。

image.png

エンターキーを押すと。。。。
一気に大量のコードが生成されました。
image.png

ざっと眺める限り、watsonx Assistant の部分は問題がなさそうです。
FastAPI の部分は自分でコードを書いたことがないので自信がありませんが、なんとなく OK っぽい。

右上にある「カーソルに挿入」アイコンをクリックすると、生成されたコードが、エディター領域にコピーされます。
こんな感じです。
image.png

あとは、自分の環境に合わせて、この部分を修正します。
image.png

assistant_id について

各 Assistants の EnvironemtsタブSettings をクリックします。
image.png

API details タブの Environment ID が assistant_id です。
image.png

urlapi_key について

watsonx Assistant の管理タブから値をコピーしてください。
image.png

サーバー・プログラムの実行

出来上がった app.py を実行します。
実行方法も一緒に GitHub Copilot が教えてくれています。

image.png

この指示に従って、サーバー・プログラムである app.py を実行してみます。

$ pip install fastapi uvicorn ibm-watson
$ uvicorn app:app --reload

エラーが発生することもなく、一発で実行できました。
成功すると、このような表示になります。
image.png

FastAPI を使うプログラムを起動する方法の詳細については、こちらを参照してください。

:two: テスト・プログラムの生成と実行

テスト・プログラムの生成

サーバー・プログラムが正常に動作するかどうか、テストしてみます。
GitHub Copilot の出力を見ると、テストする方法が記載されています。
image.png

ただ、ここは、テストプログラムも生成して欲しいところです。
早速お願いしてみましょう。

以下のようなJSON形式のデータを含むPOSTリクエストをcurl形式で教えて下さい 
{ "text": "こんにちは" }

と入力します。こんな感じです。
image.png
速攻で、cURLコマンドが出力されました。
image.png

テスト・プログラムの実行

実行してみます。

cURL
curl -X POST "http://localhost:8000/message" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"text\":\"こんにちは\"}" | jq .

エラーが発生することもなく、一発で実行できました。

image.png

現在時刻も取得できています。

:three: クライアント・プログラムの生成と実行

クライアント・プログラムの生成

テストが成功したので、クライアント・プログラムを生成します。

クライアント側のpythonコードを作成して下さい

と入力します。こんな感じです。
image.png

速攻で、クライアント・プログラムが出力されました。
image.png

クライアント・プログラムの実行

実行に必要なモジュールをインストールします。

pip
$ pip install requests

実行してみます。

python
python client.py

エラーが発生することもなく、一発で実行できました。
image.png

現在時刻も取得できています。

結果(まとめ)

DALL·E 2023-11-03 12.00.04 - Digital illustration of an AI chatbot represented as a holographic interface in a cozy home office environment. The hologram is a friendly, gender-neu.png

簡単なプログラムとはいえ、GitHub Copilot を使うことで、自分でコードを 1 行たりとも書かずに、一発で、サーバー・プログラムとクライアント・プログラムを生成することができました。
Low Code どころか、No Code でした :smiley:
さらに、No Error です:bangbang:

始める前は、watsonx Assistant の API コール部分は、requests を使った実装になるのかなと想像していたのですが、それはいい意味で裏切られ、Python SDKを使ったシンプルなPythonコードが生成されました。
GitHub Copilot は IBM Watson のPython SDK も学習しているのですね。ある意味感動しました:grin:

終わりに

最後まで読んでくれた皆さんと感動を共有するために、生成されたコードを載せておきます。
時間がある方は試してみてください。

3分で終わるはずです。。。:sweat_smile:

サーバー・プログラム

app.py
from fastapi import FastAPI
from pydantic import BaseModel
from ibm_watson import AssistantV2
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator

# Watson Assistantの設定
assistant_id = 'YOUR_ASSISTANT_ID'
api_key = 'YOUR_API_KEY'
url = 'YOUR_URL'

# FastAPIのインスタンスを作成
app = FastAPI()

# リクエストボディのモデルを定義
class Item(BaseModel):
    text: str

# Watson Assistantへの接続を作成
authenticator = IAMAuthenticator(api_key)
assistant = AssistantV2(
    version='2020-04-01',
    authenticator=authenticator
)
assistant.set_service_url(url)

# /messageエンドポイントを作成
@app.post("/message")
async def send_message(item: Item):
    response = assistant.message_stateless(
        assistant_id=assistant_id,
        input={
            'message_type': 'text',
            'text': item.text
        }
    ).get_result()

    return response

テスト用 cURL コマンド

curl
curl -X POST "http://localhost:8000/message" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"text\":\"こんにちは\"}"

クライアント・プログラム

client.py
import requests

url = "http://localhost:8000/message"
data = {
    "text": "こんにちは"
}

response = requests.post(url, json=data)

print(response.json())

参考

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3