見出し画像

トカマクラブで学ぶGeminiAPIのEmbeddingに関する解説記事

概要

本記事では、Gemini APIを活用したドキュメント検索の手法を紹介します。ここではPythonクライアントライブラリを使用し、検索文字列とドキュメントの内容を比較できる埋め込みを作成するプロセスを学びます。特に、東方M1グランプリのトカマクラブに関連する質問に対して、埋め込みを用いた文書検索の実例を見ていきます。


こちらの記事もおすすめ


前提条件

このチュートリアルはGoogle Colabで実行可能ですが、自分の開発環境で行う場合はPython 3.9とJupyterのインストールが必要です。

セットアップ

まず、Gemini API Pythonライブラリをダウンロードしインストールします。


!pip install -U -q google.generativeai

必要なライブラリをインポートし、APIキーの取得と設定を行います。


import textwrap
import numpy as np
import pandas as pd

import google.generativeai as genai
import google.ai.generativelanguage as glm

from google.colab import userdata
from IPython.display import Markdown

API_KEY = userdata.get('GEMINI_API_KEY')
genai.configure(api_key=API_KEY)

埋め込み生成

Gemini APIを使用してテキストの埋め込みを生成する方法を説明します。新しいエンベッディングモデル `embedding-001` には、タスクタイプパラメータとオプションのタイトルが追加されました。


title = "開発者向け次世代AIとGoogle Workspace"
sample_text = "タイトル 開発者向け次世代AIとGoogle Workspace..."

model = 'models/embedding-001'
embedding = genai.embed_content(model=model, content=sample_text, task_type="retrieval_document", title=title)

print(embedding)

埋め込みデータベースの構築

埋め込みデータベースを構築するために、複数のサンプルテキストを示し、それぞれの埋め込みデータを作成します。データフレーム形式で整理し、可視化を容易にします。

DOCUMENT5にトカマクラブの情報を記載しておきます。


DOCUMENT1 = "クライメートコントロールシステムの操作 Googlecarには、車内の温度や風量を調節できるクライメートコントロールシステムが装備されています。空調システムを操作するには、センターコンソールにあるボタンとノブを使用します。温度 温度ノブは車内の温度を調節します。ノブを時計回りに回すと温度が上がり、反時計回りに回すと温度が下がります。風量: エアフローノブは車内の風量を調節します。ノブを時計回りに回すと風量が増加し、反時計回りに回すと風量が減少します。ファン回転数:ファン回転数ノブはファンの回転数を調節します。ノブを時計回りに回すとファンスピードが上がり、反時計回りに回すとファンスピードが下がります。モード: モードボタンで希望のモードを選択できます。選択可能なモードは以下の通りです: オート:快適な温度と風量を自動的に調節します。クール 涼しい風を車内に送り込みます。Heat(暖房):車内に暖かい空気を送風します。デフロスト フロントガラスに温風を吹き付け、霜を取ります。"
DOCUMENT2 = "Googlecarには、ナビゲーション、エンターテインメント、クライメートコントロールなど、さまざまな機能にアクセスできる大型タッチスクリーンディスプレイが装備されています。タッチスクリーンディスプレイを使用するには、目的のアイコンをタッチするだけです。 例えば、\"Navigation \"アイコンをタッチすると目的地までの道順が表示され、\"Music \"アイコンをタッチするとお気に入りの曲を再生することができます。"
DOCUMENT3 = "シフトチェンジ Googlecarにはオートマチックトランスミッションが搭載されています。ギアをシフトするには、シフトレバーを希望の位置に動かします。 パーク 駐車時に使用します。車輪はロックされ、車は動きません。リバース: バックするときに使います。ニュートラル: 信号待ちや渋滞で停車しているときに使用します。ギアは入っておらず、アクセルを踏まない限り車は動きません。ドライブ: 前進するときに使用します。Low(ロー):このポジションは、雪道など滑りやすい状況で運転するときに使用します。"

DOCUMENT4 = """
火焔猫燐は、東方Projectの人気キャラクターの一人で、彼女は多くのゲームやメディアで見られます。彼女の魅力と特徴を掘り下げてみましょう。
### 概要

火焔猫燐は、妖怪の種族「火車」に属しています。彼女は『東方地霊殿』の4-6面の中ボスおよび5面のボスとして登場し、その後も多くの作品に出演しています。彼女は「地獄の輪禍」「死体ツアーコンダクター」「背信棄義の死猫」「究極探偵の助手猫」といった二つ名で知られ、その能力は「死体を持ち去る」ことに特化しています。彼女は人間に対して友好的で、主な活動場所は旧地獄です。
### キャラクター性

火焔猫燐は、一人称を「あたい」とし、自分の本名の長さを嫌って「お燐」と呼ばせています。彼女は霊や死体と会話する能力を持ち、灼熱地獄跡で怨霊の管理や死体運びを任されています。彼女の趣味は死体集めで、手に入れた死体は自前の猫車に積んで持ち去ります。しかし、生きている人間や妖怪に殺された死体には興味がありません。

"""

DOCUMENT5 = """
トカマ・クラブは「東方M-1ぐらんぷり」における漫才コンビで、第4回大会と第6回大会に出場した経験があります。このコンビはユニークで、彼らの漫才はファンから高い評価を受けています。以下に、トカマ・クラブの特徴と活動の概要を紹介します。
### 概要

トカマ・クラブは、第4回大会で突然結成されたコンビです。このコンビは、より強いツッコミを得るために、火焔猫燐が加わり、お空の暴走に対応しています。しかし、火焔猫燐は主役でないことを利用して、ゲンコツをかますようになりました。お空は、さとりの考えを気にする一方で、気に入らないと「手を出す」こともあります。

"""

DOCUMENT6 = """
霊烏路空(おくう)は、東方Projectのキャラクターで、多くの作品に登場しています。彼女の独特な背景、能力、そして性格について詳しく見ていきましょう。
### 概要

霊烏路空は、妖怪の種族「地獄鴉」と「八咫烏」との融合体で、『東方地霊殿』の6面ボスとして登場しました。彼女の能力は核融合を操ることで、旧地獄の灼熱地獄跡で活動しています。彼女の危険度や人間友好度は不明ですが、そのパワフルな能力は作中で示されています。


texts = [DOCUMENT1, DOCUMENT2, DOCUMENT3, ...]
df = pd.DataFrame(texts)
df.columns = ['Text']
df['Embeddings'] = df['Text'].apply(embed_fn)
df

Q&Aによる文書検索

埋め込みが生成されたので、Q&Aシステムを作成し、質問の埋め込みを生成して、データフレーム内の埋め込みと比較します。

query = "トカマ・クラブとは?"
model = 'models/embedding-001'

request = genai.embed_content(model=model, content=query, task_type="retrieval_query")

passage = find_best_passage(query, df)
passage
\nトカマ・クラブは「東方M-1ぐらんぷり」における漫才コンビで、第4回大会と第6回大会に出場した経験があります。このコンビはユニークで、彼らの漫才はファンから高い評価を受けています。以下に、トカマ・クラブの特徴と活動の概要を紹介します。\n### 概要\n\nトカマ・クラブは、第4回大会で突然結成されたコンビです。このコンビは、より強いツッコミを得るために、火焔猫燐が加わり、お空の暴走に対応しています。しかし、火焔猫燐は主役でないことを利用して、ゲンコツをかますようになりました。お空は、さとりの考えを気にする一方で、気に入らないと「手を出す」こともあります。\n\n

質疑応答アプリケーション

Geminiコンテンツ生成モデルを使用して、Q&Aシステムを構築します。

prompt = make_prompt(query, passage)
model = genai.GenerativeModel('gemini-pro')
answer = model.generate_content(prompt)

Markdown(answer.text)
トカマ・クラブは、「東方M-1ぐらんぷり」という大会に出場した、お空と火焔猫燐による漫才コンビで、第4回大会と第6回大会に出場しました。

埋め込みしてない場合


response = model.generate_content("東方M1グランプリのトカマ・クラブについて教えて")
to_markdown(response.text)
# 東方M1グランプリのトカマ・クラブというユニットは存在しません。

ノートブック


参考記事


この記事が気に入ったらサポートをしてみませんか?