watsonx Code Assistantがやってきた！(コピペで体感)

![DALL·E 2024-11-26 14.31.54 - A dynamic 16-year-old boy coding intensely on a laptop in a modern workspace, focusing on programming. The scene is vibrant and futuristic, with holog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/a9ee8e82-d75d-1689-4b60-f98240266c24.png)

# はじめに
みなさん、プログラミングしてますか！
生成AIの活用は自然言語の生成に関するものが多いですが、**GitHub Copilot**や**Cursor**の登場で、コード生成AIも盛り上がっていますね。

そんな中、IBMは汎用コード生成モデルである**IBM Granite Code**を組み込んだ**watsonx Code Assistant**を発表しています。

# watsonx Code Assistantって何？

watsonx Code Assistantは、IBMが提供せるコード生成AIを活用したソリューションです。
これまでにも、
* [watsonx Code Assistant for Z](https://www.ibm.com/jp-ja/products/watsonx-code-assistant-z)
* [watsonx Code Assistant for Red Hat Ansible Lightspeed](https://www.ibm.com/jp-ja/products/watsonx-code-assistant-ansible-lightspeed)

という２つのソリューションを発表していましたので、今回の発表は3つ目となります。

:::note info
今回発表のソリューションは、特定の製品や言語に限定されないため、『for xxx』が外れています。
:::

主な特徴としてはこちらの3つです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/c5a7f577-d6ab-cb65-1e3a-d1d26829d9f1.png)

また、[『2024/11/15 リリース IBMの最新のコードアシスタントを試してみよう』](https://qiita.com/r-nakayamasan/items/c35b62e1096c1dcd7b15)という記事にて、**watsonx Code Assistant**に関する詳しい解説が述べられています。トライアル・プランを使って30日間無料で試す手順も紹介されていますので、ぜひ、ご参照ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/8391e112-a5db-6bd9-9683-d32e5f714e2f.png)

:::note warn
トライアル・プランは、『30日間』もしくは『15万トークンの消費』のどちらか早い方に達した時点で終了です。
:::

# ずーっと無料で使いたい:bangbang:というあなたへ:bangbang:

30日間やトークン制限を受けずに、「ずーっと無料で使用したい」というあなたへ！
朗報です:blue_heart:

一手間必要ですが可能です。そして、そんなに面倒でもありません。

## ずーっと無料で使用する方法

「IBMの製品が、ずーっと無料で使えるはずがない！」そう思ったあなた、「裏技か？」と勘ぐったあなた、違います。
オンライン・マニュアルに記載されている**正式な手順**を踏むことで、watsonx Code Assistantをずーっと無料で使用することが可能です:relaxed:
詳細については、[『watsonx Code Assistantをローカルな'IBM'Graniteモデルで使用する』](https://cloud.ibm.com/docs/watsonx-code-assistant?topic=watsonx-code-assistant-cloud-setup-wca-individual)を参照ください。

ざっくり言うと、IBM Cloudで提供されるサービスは使用せず、IBM Granite Codeモデルを自分のPCにダウンロードして使用する方法です。

セットアップ手順はそれほど難しくありませんので、ご安心を:baby:

:::note info
watsonx Code Assistantのトライアル・プランも、IBM Cloudアカウントも不要です。
:::

但し、オンラインマニュアルには[こんな記載](https://cloud.ibm.com/docs/watsonx-code-assistant?topic=watsonx-code-assistant-cloud-setup-wca-individual&locale=en)があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/978fc385-2dcd-3db4-8b2a-c2e24de15f18.png)
『Note: For increased performance and a full set of features for your organization, provision a trial of watsonx Code Assistant on IBM Cloud. For more information, see Setting up your watsonx Code Assistant service in IBM Cloud.』

確認できておりませんが、**機能が限定的**なのかもしれません。

## 事前準備1: Ollamaのインストール
IBM Granite Codeモデルを自分のPCで実行するために、Ollamaを使用します。

1.[Ollamaのインストーラー](https://ollama.com/download)をダウンロード
私は、homebrewを使って導入しました
```shells
brew install ollama
```
2.Ollamaの起動
ターミナルやコマンドプロンプトから
```shells
ollama serve
```
3.IBM Granite Codeモデルのダウンロード
別ターミナルやコマンドプロンプトから
```shells
ollama run granite-code:8b
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/95c886ac-f8e7-0c19-3f22-639431b2e368.png)

以上

## 事前準備2: 拡張機能のインストール
Visual Studio Codeにwatsonx Code Assistantの拡張機能をインストールします。

まずはこちらをクリック

https://marketplace.visualstudio.com/items?itemName=IBM.wca-core

watsonx Code Assistantの拡張機能が表示されますので、[Install]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/b013636e-a5b8-3351-3a64-0116eeae7986.png)

Visual Studio Codeが起動し、拡張機能のインストール画面が表示されますので、[Install]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/f6c99a1a-ebad-b4a6-e426-9461172fa11b.png)

このような表示に変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/fa637920-2928-24c9-146a-a555efd16069.png)

事前準備は以上です。

## いざ、実行！

それではいよいよwatsonx Code Assistantを使ってみます。

下図のように、Visual Code Studioの左側のアイコンをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/35c83eb1-8054-24f3-a24b-47e52e0ad574.png)

『Welcome, let's get started!』が開きますので、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/8f161da5-0ade-608a-7845-d4475af0ef5f.png)


[Run with Ollama Service]をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/b9f4d697-f8af-680b-bc02-b89126939ac9.png)

[Reload]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/8a127f5e-57f7-ec6d-1eca-71b682f72fff.png)

**「Hi, how can I help you today?」** と表示されたら**成功**です:sunny:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/5510754d-46b9-dfd6-c11d-55e8cdf70087.png)


# 1st Question
「あなたは誰ですか？」と入れてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/d3827620-c105-122c-75c1-0cbfeb003915.png)
日本語が通じたようですが、出力は日本語と英語が混ざっています。

:::note warn
実際にコードを生成するときは、**英語**を使ってください。**日本語では意図したコードが生成されません**でした。
:::

# コード生成のお題
それでは、実際にwatsonx Code Assistantを使って、コード生成を試してみます。

何をお題とするか迷いましたが、**ソースコードのリファクタリング**にチャレンジしたいと思います。
リファクタリング元のコードに、watsonx Assistantのリファレンス・マニュアルに記載されているサンプル・コードを使ってみます。

watsonx AssistantのAPIリファレンス・マニュアル

https://cloud.ibm.com/apidocs/assistant-v2?code=python#messagestateless

watsonx Assistantとは、IBMが提供するチャットボットのエンジです。
サンプル・コードとして、ユーザーからのメッセージをwatsonx Assistantに送信し、その返信を受け取るコードを使用します。
リファレンス・マニュアルに記載のPythonのサンプル・コードはこちらです。

```python:メッセージ送信用のサンプル・コード
import json
from ibm_watson import AssistantV2
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator

authenticator = IAMAuthenticator('{apikey}')
assistant = AssistantV2(
    version='2021-06-14',
    authenticator = authenticator
)

assistant.set_service_url('{url}')

response = assistant.message_stateless(
    assistant_id='{environment_id}',
    input={
        'message_type': 'text',
        'text': 'Hello'
    }
).get_result()

print(json.dumps(response, indent=2))
```
メッセージを送信し、その戻り値を受け取って、ターミナル上に表示する、と言うシンプルな内容です。

## クラス化のためのプロンプト
非常に短いコードですが、クラス化によりどう書き変わるのか、ちょっと楽しみです。
『Rewrite the program below using the class.』と指示し、その後にPythonコードを続けます。

```python:プロンプト
Rewrite the program below using the class. 

# python program
import json
from ibm_watson import AssistantV2
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator

authenticator = IAMAuthenticator('{apikey}')
assistant = AssistantV2(
    version='2021-06-14',
    authenticator = authenticator
)

assistant.set_service_url('{url}')

response = assistant.message_stateless(
    assistant_id='{environment_id}',
    input={
        'message_type': 'text',
        'text': 'Hello'
    }
).get_result()

print(json.dumps(response, indent=2))
```

## クラス化の実行結果
このようなコードが生成されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/6a2f5fa5-45a4-cc7e-5dc4-cc042b63774b.png)

コンストラクタ部では、パラメータを使ってプロパティが初期化されています。
メソッド部では、メッセージの送信とその結果の受け取りが定義されています。
とても小さなコードですが、無事、クラス化され、可読性/再利用性が向上したと思います。

クラス化されたコードを実行するコードとその説明も一緒に生成されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/fc5a5667-b594-e3b8-4b0b-a659d353664c.png)

ぱっと見、問題なさそうです。

# 早速、動かしてみましょう
それでは、早速実行してみます。

watsonx Code Assistantが生成してくれた**クラス化されたコード**と**それを実行するコード**をマージして、実行してみます。
マージしたコードは、send_message.pyという名前で保存します。

```python:マージしたコード
import json
from ibm_watson import AssistantV2
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator

class WatsonAssistant:
    def __init__(self, apikey, url, environment_id):
        self.apikey = apikey
        self.url = url
        self.environment_id = environment_id

    def get_response(self, message):
        authenticator = IAMAuthenticator(self.apikey)
        assistant = AssistantV2(
            version='2021-06-14',
            authenticator=authenticator
        )

        assistant.set_service_url(self.url)

        response = assistant.message_stateless(
            assistant_id=self.environment_id,
            input={'message_type': 'text', 'text': message}
        ).get_result()

        return json.dumps(response, indent=2)

if __name__ == "__main__":
    assistant = WatsonAssistant('{apikey}', '{url}', '{environment_id}')
    response = assistant.get_response('Hello')
    print(response)
```

:::note
{apikey}、{url}、{environment_id}はwatsonx Assistant環境に合わせて値をセットしてください。送信するメッセージ(この例ではHello)も適宜変更してください。
:::
:::note
watsonx Assistantが初めてという方には、[初めての『IBM Watson Assistant』〜これから触ってみる方への体験ガイド〜](https://qiita.com/yanagih/items/27dc6e0561340168724f)が参考になると思います。
:::

## 前提モジュールのインストール

```shells
pip install --upgrade "ibm-watson>=8.1.0"
```

:::note
実行に必要なモジュールは、APIリファレンスの[Introduction](https://cloud.ibm.com/apidocs/assistant-v2?code=python#introduction)に記載されています。
:::

## 実行
```shells
python send_message.py
```

エラーが出ることもなく、一発で実行が成功しました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/db222cad-8921-1275-810f-e2b8569345e6.png)


# おわりに

これで、ネットのない無人島でも安心:interrobang:

# 参考情報

https://www.ibm.com/jp-ja/products/watsonx-code-assistant

https://www.ibm.com/jp-ja/products/watsonx-code-assistant-z

https://www.ibm.com/jp-ja/products/watsonx-code-assistant-ansible-lightspeed

https://qiita.com/r-nakayamasan/items/c35b62e1096c1dcd7b15

https://qiita.com/r-nakayamasan/items/8dfc005b29060f6d5151

https://qiita.com/c_u/items/e49966f476ef6486f4e2

https://qiita.com/yanagih/items/27dc6e0561340168724f