はじめに
Qiitaの「Jevで遊ぼう!」キャンペーンをきっかけに、TypeSafe AIの判断特化モデルJevを触っています。Pythonで試したあと、Elixirからも呼び出してみました。
題材は、私が以前から唱えている「AI = Antonio Inoki」説。世間ではArtificial Intelligenceの略とされていますが、Jevはどう判断するのでしょう。
Elixirから聞いてみる
Elixirのコミュニティ製ライブラリjevexを使いました。 @kentaro さんが作成されました。mix.exsの依存関係は{:jevex, "~> 0.1.0"}です。
同じChoice質問に対して、Stateだけを変えます。質問は「この文章の書き手は、ここでの『AI』をどちらの意味で使っていますか?」です。
questions = %{
"ai_identity" =>
Jevex.Question.choice!(
"この文章の書き手は、ここでの「AI」をどちらの意味で使っていますか?",
%{
"artificial_intelligence" => "人工知能(Artificial Intelligence)",
"antonio_inoki" => "アントニオ猪木(Antonio Inoki)。1943年2月20日、鶴見に生まれし一人の漢姓名猪木寛至、闘魂の火種。"
}
)
}
state = "日本プロレス時代、AIはジャイアント馬場と組んでBI砲と呼ばれ、インターナショナル・タッグ王座を獲得した。"
client = Jevex.Client.new!(backend: :typesafe, api_key: {:system, "TYPESAFE_API_KEY"})
{:ok, response} = Jevex.evaluate(client, state, questions)
answer = response.answers["ai_identity"]
使用するAPIキーは環境変数TYPESAFE_API_KEYに設定しました。実際のスクリプトでは4つのStateを順に評価し、choice、両候補のprobabilities、confidenceを表示しています。
mix run scripts/ai_identity.exs
結果
| State | choice |
P(Artificial Intelligence) |
P(Antonio Inoki) |
confidence |
|---|---|---|---|---|
| AIモデルに文章を入力し、分類結果をJSONで受け取って、アプリケーションの処理を分岐する。 | artificial_intelligence |
1.00 | 0.00 | 1.00 |
| AIは私とリングに上がる世界最強のタッグパートナー。ストロングスタイルで闘魂を注入する。 | artificial_intelligence |
0.89 | 0.11 | 0.78 |
| 日本プロレス時代、AIはジャイアント馬場と組んでBI砲と呼ばれ、インターナショナル・タッグ王座を獲得した。 | antonio_inoki |
0.08 | 0.92 | 0.84 |
| AIが必要だ。 | artificial_intelligence |
1.00 | 0.00 | 1.00 |
闘魂を注入しただけでは、猪木は勝てませんでした。 「AIをタッグパートナーにする」は、人工知能をプロレスにたとえた文章としても読めます。そこでジャイアント馬場と組んだBI砲を出したところ、ようやくantonio_inokiが92%になりました。
confidenceは選ばれた候補だけの確率ではなく、Choiceの確率分布を1つの値にまとめたものです。どちらの候補に何%を割り振ったかは、両方のprobabilitiesを見るとわかります。公式のConfidenceの説明
表は今回の実行結果です。同じ入力でも、実行ごとに確率が少し変わることがありました。
公式Python SDKでも聞いてみる
Elixir版と同じ質問・選択肢・4つのStateを、今度はTypeSafe AI公式のPython SDKで評価しました。APIキーは同じTYPESAFE_API_KEYを使います。Pythonのプロジェクトではuv add typesafe-sdkで依存関係を追加しました。
from typesafe_sdk import Choice, TypeSafeClient
questions = {
"ai_identity": Choice(
instructions="この文章の書き手は、ここでの「AI」をどちらの意味で使っていますか?",
criteria={
"artificial_intelligence": "人工知能(Artificial Intelligence)",
"antonio_inoki": "アントニオ猪木(Antonio Inoki)。1943年2月20日、鶴見に生まれし一人の漢姓名猪木寛至、闘魂の火種。",
},
)
}
examples = [
("技術の文脈", "AIモデルに文章を入力し、分類結果をJSONで受け取って、アプリケーションの処理を分岐する。"),
("闘魂の文脈", "AIは私とリングに上がる世界最強のタッグパートナー。ストロングスタイルで闘魂を注入する。"),
("プロレス史の文脈", "日本プロレス時代、AIはジャイアント馬場と組んでBI砲と呼ばれ、インターナショナル・タッグ王座を獲得した。"),
("文脈なし", "AIが必要だ。"),
]
with TypeSafeClient(model="jev-latest") as client:
for label, state in examples:
answer = client.system_one(state=state, questions=questions).answers["ai_identity"]
print(label)
print("choice:", answer.choice)
print("probabilities:", answer.probabilities)
print("confidence:", answer.confidence)
ai_identity.pyとして保存し、uv run ai_identity.pyで実行しました。
| State | choice |
P(Artificial Intelligence) |
P(Antonio Inoki) |
confidence |
|---|---|---|---|---|
| 技術の文脈 | artificial_intelligence |
1.00 | 0.00 | 1.00 |
| 闘魂の文脈 | artificial_intelligence |
0.89 | 0.11 | 0.78 |
| プロレス史の文脈 | antonio_inoki |
0.06 | 0.94 | 0.89 |
| 文脈なし | artificial_intelligence |
1.00 | 0.00 | 0.99 |
4件ともElixir版と同じ候補が選ばれました。数値もだいたい同じです。完全には一致しませんが、おそらく実行のたびに多少揺れるのでしょう。少なくともこの実験では、BI砲を出すとPythonから聞いても「AI = Antonio Inoki」になりました。
おわりに
Jevにとって「闘魂」は比喩にもなります。しかし「BI砲」はプロレス史の文脈でした。AIをアントニオ猪木にするには、気合いだけでなく、判断材料をリングに上げる必要があるようです。
編集後記
Jevの名前の由来もおもしろい。TypeSafe AIの説明によると、「System One」はダニエル・カーネマンの『ファスト&スロー』に着想を得ています。人間の素早く直感的な「システム1」と、時間をかけて熟考する「システム2」の対比です。Jevは、その「速い判断」をソフトウェアの中で使えるようにするモデル、というわけです。
一方、「Jev」は経済学者ウィリアム・スタンレー・ジェヴォンズから。石炭を使う技術の効率が上がっても、用途が広がれば石炭の消費はかえって増えうる、というジェヴォンズのパラドックスで知られます。TypeSafe AIは、AIによる判断も安く効率的になれば、使い道が広がると考えて、この名前を付けたそうです。
石炭と聞くと、旧産炭地の飯塚を思い出します。以前、飯塚市ブロックチェーン推進宣言の話題につなげて「飯塚は石炭が掘れたのだから、ビットコインも掘れます!」と言ったことがありました。石炭からブロックチェーン、今度はJevへ。まだ鉱脈が続いている気がします。掘りすぎなのかもしれません。
