この記事を読むと嬉しいこと
言語の壁を越えた、グローバルAIを作れます!
= GPTに英語と日本語、中国語、フランス語…の情報をまとめてインプットし、質問に答えさせることが出来ます!
"""「Harry Potter(英語)」と「ぼっち・ざ・ろっく!」の情報をまとめて与えた後で質問をした時の回答"""
# before
index.query("ハリーの学校では、何を教えている?日本語で答えて")
# -> ハリーの学校では、何を教えているかは不明です。
# after
index.query("ハリーの学校では、何を教えている?日本語で答えて")
# -> ハリーの学校では、魔法と魔法使いの学問を教えています。
背景・課題
今大人気のGPTに、外部情報を繋ぐGPT Indexが物凄い勢いで使われています。一方で、この仕組みを無邪気に使おうとすると、OpenAIに課金しまくることになり、お財布が。。
その解決策として、oshizoさん、npakaさんがインデックス作成をローカルで行うことで、課金を抑える方法を公開してくださっています。この方法は非常に有益なのですが、日本語特化モデルのため、言語が異なる場合はインデックスも異なるつくりになってしまいます。例えば、英語文献Indexに対して日本語で質問(あるいはその逆)をしても、適切に答えが返せません。
日本語情報は、インターネット全体の中で3%を切ると言われています。英語に恨みはありませんが、AIに教えを乞うために英語を勉強するというのは、我々の思い描いた未来とは異なります。
やり方
PullRequest通しておいたので、誰でも、すぐに使えます!
import os
os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"
from langchain.embeddings import TensorflowHubEmbeddings
from gpt_index import LangchainEmbedding, GPTSimpleVectorIndex, SimpleDirectoryReader, PromptHelper
# 埋め込みモデルの準備
embed_model = LangchainEmbedding(TensorflowHubEmbeddings())
# インデックスの作成
documents = SimpleDirectoryReader('data').load_data()
index = GPTSimpleVectorIndex(
documents=documents,
prompt_helper=PromptHelper(
max_input_size=4000, # LLM入力の最大トークン数
num_output=256, # LLM出力のトークン数
chunk_size_limit=500, # チャンクのトークン数
max_chunk_overlap=0, # チャンクオーバーラップの最大トークン数
separator="。" # セパレータ
),
embed_model=embed_model # 埋め込みモデル
)
print(index.query("ハリーの学校では、何を教えている?日本語で答えて"))
(興味ある人用)どうやって解決したのか?
GPT Indexから、GoogleがTensorflowHubで公開しているモデル郡を使えるようにしました。その中でデフォルトに設定しているuniversal-sentence-encoder-multilingualモデルは複数の言語(なんと16言語!)において、同じ意味の言葉が同じベクトルになるように訓練されたモデルです。
GPT Indexでは、人間が辞書やグーグル検索でそれっぽい話を探しながら読むのと同じように、
- 文章の塊ごとに意味ベクトルを計算しておき
- 質問から作ったベクトルに一番近いベクトルを探し
- その文章の塊をGPT等に補足情報として与えて質問に答える
ということをしています。そのため、目的に応じたモデルを与えてあげることで検索がしやすくなり、冒頭の結果を出すことができるようになっています。(なので私がやったことは、ただ凄い人の成果と別の凄い人の成果を繋いだだけなのでした。)
最後まで読んでいただき、ありがとうございました!