見出し画像

GPT Index でのTensorflowHubの埋め込みモデルの利用

「GPT Index」でのTensorflowHubの埋め込みモデルの利用方法をまとめました。

前回

1. universal-sentence-encoder-multilingual

universal-sentence-encoder-multilingual」は16言語で、同じ意味の言葉が同じベクトルになるように学習した埋め込みモデルです。TensorflowHubで提供されています。

Arabic, Chinese, Chinese (Taiwan), English, French, German, Italian, Japanese, Korean, Dutch, Polish, Portuguese, Spanish, Thai, Turkish, Russian

2. ドキュメントの準備

はじめに、チャットボットに教える専門知識を記述したドキュメントを用意します。

今回は、 マンガペディアの「ぼっち・ざ・ろっく!」と、英語版Wikipediaの「SEGA」のドキュメントを用意しました。

・bocchi.txt

・sega.txt

【注意】過去記事では、デフォルトセパレータのスペースを手作業で入れましたが、今回はPromptHelperでセパレータを「\n」にしています。

3. Colabでの実行

Google Colabでの実行手順は、次のとおりです。

(1) パッケージのインストール。
現在、「tensorflow-text」に「2.8.*」がないとエラーになりました。

# パッケージのインストール
!pip install gpt-index
!pip install "tensorflow-text==2.8.*"

(2) 環境変数の準備。
以下のコードの <OpenAI_APIのトークン> にはOpenAI APIのトークンを指定します。(有料)

import os
os.environ["OPENAI_API_KEY"] = "<OpenAI_APIのトークン>"

(3) Colabにdataフォルダを作成してドキュメントを配置。
左端のフォルダアイコンでファイル一覧を表示し、右クリック「新しいフォルダ」でフォルダを作成し、ドキュメントをドラッグ&ドロップします。

(4) 埋め込みモデルの準備。
TensorflowHubEmbeddingsを使います。デフォルトが「universal-sentence-encoder-multilingual」になってます。

from langchain.embeddings import TensorflowHubEmbeddings
from gpt_index import LangchainEmbedding

# 埋め込みモデルの準備
embed_model = LangchainEmbedding(TensorflowHubEmbeddings())

(5) インデックスの生成。
セパレータは多言語対応のため「\n」にしています。

from gpt_index import GPTSimpleVectorIndex, SimpleDirectoryReader
from gpt_index.indices.prompt_helper import PromptHelper

# ドキュメントの読み込み
documents = SimpleDirectoryReader('data').load_data()

# インデックスの生成
index = GPTSimpleVectorIndex(
    documents=documents,
    prompt_helper=PromptHelper(
        max_input_size=4000,  # LLM入力の最大トークン数
        num_output=256,  # LLM出力のトークン数
        chunk_size_limit=2000,  # チャンクのトークン数
        max_chunk_overlap=0,  # チャンクオーバーラップの最大トークン数
        separator="\n"  # セパレータ
    ),
    embed_model=embed_model,  # 埋め込みモデル
    verbose=True
)
Token indices sequence length is longer than the specified maximum sequence length for this model (1237 > 1024). Running this sequence through the model will result in indexing errors
> Adding chunk: 結束バンド
後藤ひとりは友達を作れない陰キャでいつも一人で過ごしていたが、中学時代にテレビのイ...
> Adding chunk: 未確認ライオットに参加するためには、デモ審査、ウェブ投票、ライブ審査を通過して、最終審査に合格...
> Adding chunk: 秀華高校に通う女子。桃色の髪を無造作に伸ばし、いつもジャージを身につけている。自他共に認める引...
> Adding chunk: 下北沢高校に通う女子。後藤ひとりより1学年上。ライトイエロー色の髪をサイドテールにセットし、派...
> Adding chunk: 秀華高校に通う女子。後藤ひとりとは同学年。ウェーブの入った赤い髪をセミロングに伸ばした美少女で...
> Adding chunk: 後藤ひとりの妹。年齢は5歳。姉とは正反対の天真爛漫(らんまん)で無邪気な性格をしている。愛犬の...
> Adding chunk: 秀華高校に通う3年生の女子。進級した後藤ひとりとクラスメートとなる。愛称は「さっつー」。喜多郁...
> Adding chunk: 後藤ひとりの父親。本名は不明で、素顔もなぜか毎回明かされていないために不明。若い頃、ギターを弾...
> Adding chunk: 下北沢のライブハウス「STARRY(スターリー)」の店長を務める女性。誕生日を迎えて30歳にな...
> Adding chunk: Sega

Sega Corporation[a] is a Japanese multina...
> Adding chunk: Following a downturn in the arcade business sta...
> Adding chunk: Nakayama hired Tom Kalinske as CEO of Sega of A...
> Adding chunk: The Saturn's release in Europe also came before...
> Adding chunk: Despite a 75 percent drop in half-year profits ...
> Adding chunk: Okawa, who had loaned Sega $500 million in 1999...
> Adding chunk: To streamline operations, Sega established oper...
> Adding chunk: After the formation of Sega Group in 2015 and t...
> Adding chunk: In Eurogamer, Damien McFerran wrote that Sega's...
> [build_index_from_documents] Total LLM token usage: 0 tokens
> [build_index_from_documents] Total embedding token usage: 28388 tokens

(6) ぼっち・ざ・ろっくの質問
正解。

print(index.query(
    "ぼっち・ざ・ろっくの作中で、文化祭で何が起きた?", 
    verbose=True
))
> Top 1 nodes:
> [Node e2052097-829d-4153-a6c3-ec4581cd344f] [Similarity score:                     0.279737] 結束バンド
後藤ひとりは友達を作れない陰キャでいつも一人で過ごしていたが、中学時代にテレビのインタビューを見て、陰キャでもバンドを組んでいれば人気者になれると聞き、ギターの練習を始める。ひとりは...
> Searching in chunk: 結束バンド
後藤ひとりは友達を作れない陰キャでいつも一人で過ごしていたが、中学時代にテレビのイ...
> Initial response: 
後藤ひとりは文化祭で結束バンドのライブを行い、観客を魅了しました。そのライブ中に機材トラブルが発生し、ひとりはとっさにボトルネック奏法のアドリブを行い、仲間たちはそのフォローに回りました。その演奏をみんなから拍手喝采されるひとりだったが、コミュ症のひとりはその晴れ舞台に混乱し、観客席にダイブするという暴挙に出てしまいました。その結果、結束バンドの名はフリーライターの佐藤
> [query] Total LLM token usage: 2097 tokens
> [query] Total embedding token usage: 37 tokens

後藤ひとりは文化祭で結束バンドのライブを行い、観客を魅了しました。そのライブ中に機材トラブルが発生し、ひとりはとっさにボトルネック奏法のアドリブを行い、仲間たちはそのフォローに回りました。その演奏をみんなから拍手喝采されるひとりだったが、コミュ症のひとりはその晴れ舞台に混乱し、観客席にダイブするという暴挙に出てしまいました。その結果、結束バンドの名はフリーライターの佐藤

(7) SEGAの質問
正解。しかし、参照先が英語だと回答も英語になりがちです。

print(index.query(
    "メガドライブの発売日は?", 
    verbose=True
))
> Top 1 nodes:
> [Node 2bdf54b6-4a2a-4221-b524-eb9831b07d93] [Similarity score:                     0.244163] Despite a 75 percent drop in half-year profits just before the Japanese launch of the Dreamcast, ...
> Searching in chunk: Despite a 75 percent drop in half-year profits ...
> Initial response: 
The release date of the Sega Mega Drive is October 29, 1988.
> [query] Total LLM token usage: 1675 tokens
> [query] Total embedding token usage: 16 tokens

The release date of the Sega Mega Drive is October 29, 1988.

(8) 日本語での回答を促してSEGAの質問
正解。そして日本語回答。

print(index.query(
    "メガドライブの発売日は?日本語で答えて", 
    verbose=True
))
> Top 1 nodes:
> [Node 2bdf54b6-4a2a-4221-b524-eb9831b07d93] [Similarity score:                     0.250733] Despite a 75 percent drop in half-year profits just before the Japanese launch of the Dreamcast, ...
> Searching in chunk: Despite a 75 percent drop in half-year profits ...
> Initial response: 
メガドライブは、19881029日に日本で発売されました。
> [query] Total LLM token usage: 1706 tokens
> [query] Total embedding token usage: 28 tokens

メガドライブは、19881029日に日本で発売されました。



いいなと思ったら応援しよう!