はじめに
「プロンプトエンジニアっぽいことがしてみたい!」という好奇心から、まずは 長和技研さんのLLM記事 を参考に Azure OpenAI を使おうとしました。
ところが…
-
Azure OpenAI Studioにアクセスできない - 代わりに「AI Foundry」という謎サービスに案内された
- なんとかキーとエンドポイントは取得できたけど、モデルの選択画面で「クオータが足りません」と言われて撃沈
ということで、今回はおとなしく Google の Gemini API を使って遊んでみることにしました。
やりたいこと
日本の政治家とポケモンの名前をベクトル化して、似たような名前を可視化する!
環境と準備
- 実行環境:Google Colab
APIキーの取得とColabへの登録
Colab の左側メニュー「鍵マーク」から「シークレット」を登録しておきます。
from google.colab import userdata
api_key = userdata.get('GOOGLE_API_KEY')
Gemini API クライアントの準備
from google import genai
client = genai.Client(api_key=api_key)
エンベディング関数の定義
本来はt-sneやPCAなどの次元削減を行うべきだが、まだそこまで学習が追いついてないので今回は2次元で出力しています。
def name2vec(name: str):
result = client.models.embed_content(
model="gemini-embedding-001",
contents=name,
config=types.EmbedContentConfig(output_dimensionality=2) # 本来は100〜768次元が多いけど、可視化のため2次元に
)
[embedding_obj] = result.embeddings
return embedding_obj.values
名前データの準備
ChatGPT にお願いして、日本の政治家とポケモンの名前をそれぞれ100個ずつリスト化してもらいました。
japanese_politicians = [...] # 政治家名のリスト
pokemon_names = [...] # ポケモン名のリスト
ベクトル化処理
私は内包表記で書いてないんですけど、GPTに記事書くの手伝ってもらったらかっこよく内包表記してくれましたね。
japanese_politician_vecs = [
{"name": name, "vec": name2vec(name)}
for name in japanese_politicians
]
pokemon_name_vecs = [
{"name": name, "vec": name2vec(name)}
for name in pokemon_names
]
可視化(Plotly)
import plotly.graph_objects as go
fig = go.Figure()
# 政治家プロット
fig.add_trace(go.Scatter(
x=[p['vec'][0] for p in japanese_politician_vecs],
y=[p['vec'][1] for p in japanese_politician_vecs],
mode='markers+text',
name='政治家',
text=[p['name'] for p in japanese_politician_vecs],
textposition='top center',
marker=dict(color='blue', size=10, symbol='circle')
))
# ポケモンプロット
fig.add_trace(go.Scatter(
x=[p['vec'][0] for p in pokemon_name_vecs],
y=[p['vec'][1] for p in pokemon_name_vecs],
mode='markers+text',
name='ポケモン',
text=[p['name'] for p in pokemon_name_vecs],
textposition='bottom center',
marker=dict(color='red', size=10, symbol='diamond')
))
fig.update_layout(
title='政治家とポケモンのベクトル散布図',
xaxis_title='X軸',
yaxis_title='Y軸',
legend_title='カテゴリ',
)
fig.show()
結果と感想
以下が実際に得られたベクトル散布図です(青が政治家、赤がポケモン)
もしくは インタラクティブ版(HTML) はこちらから確認できます👇
👉 ベクトル散布図をHTMLで見る
- 意外と似たような場所にマッピングされる名前もあって面白い
- 試しに 石破茂さん と 安倍晋三さん を見てみたけど、近くにあるポケモンと特に似ているとは思えなかった
- もしかすると、次元を上げて(例:128次元とか)エンベディングすれば、より意味的な類似が出てくるのかもしれない
まとめ
- Azure 使えなかったけど、Gemini API で名前のベクトル化を試せて楽しかった
- 可視化して遊ぶだけでも、けっこうプロンプトエンジニアっぽい気分になれる
- 次は次元数を上げてクラスタリングとかもやってみたい!
おまけ:今後の野望
- 多次元からの次元削減
- 名前以外(職業や属性)との関連付け
- LLM に「この2人は似てますか?」と聞いて答えとの一致率を計測
