IBM watsonx.ai を試してみた ( コピペ OK ) 💙

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/f2f7a36d-efd6-cd63-103d-6085e4431df2.png)

[『IBM watsonx.ai がやってきた 💙』](https://qiita.com/yanagih/items/60d3263518da7acc126e)の続きの記事です。

# 使用するモデルについて
現時点(2023/7/8)で使用できるファウンデーション・モデルは、この 5 つです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/d0ba742f-2fba-098e-c6be-1b6312846ce5.png)

今回は、オリジナル mpt-7b-instruct モデルを IBM が再トレーニングしたバージョンである **mpt-7b-instruct2** を使用してみます。

https://huggingface.co/ibm/mpt-7b-instruct2

Model Cardからの抜粋
~~~md:MPT-7B-Instruct2
MPT-7B-Instruct2 is a retrained version of the orignal MPT-7B-Instruct model available 
under the Apache 2.0 License.

MPT-7B-Instruct is a short-form instruction following decoder-only model.

See model cards for MPT-7B and MPT-7B-Instruct for more information.
~~~


# 4 つのタスクを試してみた :bangbang:
IBMによって再トレーニングされた **mpt-7b-instruct2** を Prompt Lab にて試してみました。
正式な日本サポートは明言されていませんが、私が試した範囲では、割と日本語も使えそうな印象です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/c2c35754-08e6-b2ab-46d3-5b7cc7eb53f2.png)


:::note warn
日本語サポートを保証するものではありません
:::

## 1. 翻訳

定番の翻訳をやってみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/9a3dc8cb-cc4e-beab-166f-5b3526303641.png)
~~~md:Instruction
日本語に翻訳してください
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/54d6613f-4ad5-a8aa-521e-5765e96a646c.png)


~~~md:Examples
(Output: → 翻訳)
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/bc4fa556-3188-0211-ccf5-7e127f61cda8.png)

~~~md:Test your prompt (Input:)
About Watson Discovery
IBM Watson® Discovery is an intelligent document processing engine that helps you to gain insights from complex business documents.

Use Discovery to visually train AI for deep understanding of your content, including tables and images, to help you find business value that is hidden in your enterprise data. Use natural language or structured queries to find relevant answers, surface insights, and build AI-enhanced business processes anywhere.

Start by connecting your data to Discovery. Next, teach Discovery to understand the language and concepts that are unique to your business and industry. Enrich your data with award-winning Watson Natural Language Processing (NLP) technologies so you can identify key information and patterns. 
~~~
生成をクリック！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/f469f340-4af9-690d-2831-a1357d102e12.png)
結果はこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/407e2e74-d58f-a390-972f-9a461010e056.png)
翻訳する文章が割と長めなので、翻訳結果が途中で切れてしまわないように、Max tokensを500に変更しました。(~~以降、Max tokensは500を使用しています~~)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/ec1f0363-9cd7-6574-3b7b-3412ead5f70c.png)


~~~md:Generate 結果
Watson Discovery は、ビジネスドキュメントに関する深い意識を得るための intelligent document processing engine です。

Discovery を使用すると、ビジネスの言語と業界固有の概念を理解するためにビジネスドキュメントを視覚的にトレーニングすることができます。 このようにすることで、ビジネスの重要な情報を隠していた企業データについて見つけることができます。 構造化のクエリや自然言語のクエリを使用して、重要な情報を見つけ、検出することができます。 そして、ビジネスプロセスを構築する場所に、Discovery を使用して AI を強化することができます。

Discovery を使用する前に、データを Discovery に接続し、Discovery がビジネスの言語と業界固有の概念を理解するためにトレーニングする必要があります。 そして、Watson Natural Language Processing (NLP) 技術を使用してデータを豊富に補完することができます。
~~~

一部微妙な箇所もありますが、なかなか、いい感じで翻訳してくれています。

:::note info
Examplesにおいて 『 Output: 』 を**翻訳**に変更したら、日本語に翻訳されるようになった。
:::

:::note warn
**『Max tokens』** について
出力が暴走した場合を想定し、Max tokens はあまり大きくしない方が**トークン消費の観点**で賢明だと思われる。逆に短かった場合は再度やり直しが必要になり、**無駄にトークンを消費**してしまう。「適切な Max tokens を指定する」は課題の1つになりそうだ。対応策として、「自分が求める出力をイメージし、入力と出力の合計をある程度上回る大きさを指定する」が考えられるが、これもまた難しい。。。
:::

## 2. 固有表現抽出

『固有表現抽出』という言葉を初めて聞いた方のために、Wikipediaへのリンクを含めておきます。

https://ja.wikipedia.org/wiki/%E5%9B%BA%E6%9C%89%E8%A1%A8%E7%8F%BE%E6%8A%BD%E5%87%BA

『文中から固有表現 (Named Entity) を抽出し、それを固有名詞（人名、組織名、地名など）や日付、時間表現、数量、金額、パーセンテージなどのあらかじめ定義された固有表現分類へと分類する。』とあります。

**固有表現**を特定し、さらにその**固有表現の分類**も一緒に抽出する手法です。

ビジネス領域で AI 技術を活用する際の有効なユースケースとして**要約**がありますが、要約によって本来必要な情報が省かれてしまう可能性があります。
ケース・バイ・ケースではありますが、顧客対応履歴の場合、**固有表現抽出**を使用することで、重要な表現を的確に抽出し、簡潔に整理(構造化)することが可能です。
また、その構造化データをデータベースに蓄積することで、様々な後続処理へ連携することが容易になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/2c19a639-13ab-cd48-3168-5ad1e7a541db.png)
~~~md:Instruction
活動報告から固有表現を抽出してください。
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/011ad754-36e5-149d-5a76-d726cb63e1c2.png)

~~~md:Examples (Input:)
柳は12:00に西山さんから13:30にマルゲリータピザを配達する注文を電話でもらった。
~~~
~~~md:Examples (Output:)
担当者: 柳
お客様: 西山
種別: 注文
手段: 電話
対象: マルゲリータピザ
受付: 12:00
配達時刻: 13:30

以上
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/f7c861b0-44df-af01-1900-8cb4fc3f282a.png)
~~~md:Test your prompt
柳が小山さんからピザのキャンセルを13:00にアプリで受け付けた。
~~~
~~~md:Generate 結果
担当者: 柳
お客様: 小山
種別: キャンセル
手段: アプリ
対象: ピザ
受付: 13:00
~~~
いい感じに固有表現を抽出することができました。
このような大量のデータをデータベースに蓄積しておくことで、統計的な分析にも活用できそうです。

:::note info
Examplesにおいて Output:の最終行に **『以上』**　を追加することで、ゴミ(Input文自体)が出力されなくなりました。これって、もしかして発見しちゃった:interrobang:笑
:::
## 3. プログラムコード説明

プログラム初心者にとって、プログラムを読むことは割と大変な作業です。
また、プログラム・メンテナンス時において、他人が書いたコードを読み解くのは、なれたプログラマーであっても負荷のかかる作業です。
このような作業負荷を軽減するために、『AI にプログラムコードを自然な文章で説明させる』ことが利用できそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/cbaad1df-46c6-2540-e297-3b82a00880dc.png)

~~~md:Instruction
関数を日本語で説明してください。
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/b5ffe66e-a956-f25e-c109-1e5e5ad86328.png)

~~~md:Examples
Input: → プログラム
Output: → プログラムの説明
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/2f8dfc48-483c-7ebf-cd71-fa3962577f09.png)

~~~md:Test your prompt
#python コード
def gcd(x, y):
    while y != 0:
        (x, y) = (y, x % y)
    return x
~~~
~~~md:Generate 結果
この関数は、引数のxとyの最大公約数を返します。
~~~

難解なプログラム笑は、これで解決。

## 4. プログラムコード生成

プログラムコードを読み解くこともさることながら、やりたい処理をプログラミングする事もなかなか負荷の高い作業です。
この作業を、自然文を使ってプログラミングコードを生成することができればプログラミングの作業効率が随分と高まるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/5a858ab8-9f43-acff-6edc-dd3d11b9be16.png)
~~~md:Test your prompt
引数で与えられた数までに存在する素数を生成するPython関数を作成してください。

Python:
~~~
~~~md:Generate 結果
def generate_primes(n):
    """
    Generate the first n primes.
    """
    primes = []
    for i in range(2, n + 1):
        if i == 2:
            continue
        for j in range(2, i):
            if i % j == 0:
                break
        else:
            primes.append(i)
    return primes
~~~
プログラムが苦手な方もこれで安心:interrobang:

実際にこのコードを使って、100以下に存在する素数を探してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/57e23cbd-acc6-4960-cd96-b05a085c63ef.png)

おおお！ 100以下の素数をあっという間に探してくれました！ (が)

:::note warn
プロンプトの工夫で解決できる余地があると思いますが、素数である『2』を出力しません。
(理由は生成されたプログラムを見るとわかります)
無料枠を使い切ってしまったため、ここで断念。
:::

今回は、Pythonコードを出力させました。一からプログラムを書くことを思えば十分役に立ちますし、Java, JavaScript, C言語等、自分の慣れた言語以外のコードでプログラミングしなければいけないシーンで活用すれば、もっと大きな効果が期待できます。

## 無料枠を使い切る
色々と試しているうちに、**無料枠**を使い切ってしまいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/7f18579b-7437-df3b-4249-551dbd04484f.png)

:::note info
**Lite プランで使用できる token 数について**
[Watson Machine Learning Lite プランの説明ページ](https://cloud.ibm.com/catalog/services/watson-machine-learning)を見ると、月当たり、**25,000 token** とあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/eec9eee6-64cf-5303-d65a-1f85723a4f73.png)
:::

# いかがでしたでしょうか

モデルの能力を引き出すプロンプト(Instruction/Examples)の改良の余地は、残されていると思いますが、なかなか面白い結果が得られたと思います。
多くの方々の**最初の一歩**になることを願っております。

### Enjoy your watsonx.ai life !

# 参考

https://qiita.com/yanagih/items/60d3263518da7acc126e