見出し画像

で、結局キャラクターBOTを作るには? ~LlamaIndexを断念~ #001

前回、これからやることの概要をお話しましたが
今回から実際に作業に移りたいと思います。


ざっとやりたいことはこれです。

AI大谷翔平BOTを作る

・問い合わせと回答はLINEにより行う
・「野球を始めたきっかけ」など基本的な情報や学生時代のエピソードなどを大谷選手として回答ができる
・あまりお金はかけない

※あくまでサンプルで、ほんとに大谷選手を使ったサービスを作ると怒られると思います。

目的ベースとして、作る過程での検討・採択を通してLLM周辺の理解の助けになれば…と思います
ただ私はAIの専門家ではなく、もちろん選択は完璧ではないので意見などあればお願いします。

では最初にLLMの選定から。

LLMモデルの選定

LLMを利用するための選択肢は3つ挙げたいと思います。

  1. OpenAIのAPIによるGPTの利用

  2. オープンソース(商用利用可能)モデルの利用

  3. その他LLMのAPIの利用

①はAPIによるGPT3.5またはGPT4の利用で、ネットワークさえあればどんな環境でも利用できますし、レスポンスも早いので、LLMの第一検討候補だと思います。利用は有料ですが、1000文字で数円程度なので"大量の文献を読み込ます"とかいうわけではない今回の目的では問題にならないと思います。

②はオープンソースモデルの利用でMetaのLlama2、StabilityAIのStableLM
東大発スタートアップから生まれたELYZAなど様々なモデルが商用利用可能で無料で利用できます。

が、無料というのは”環境”があればの話です。


多くのLLMモデルはGPUを搭載したサーバでの利用が前提となっており
当然そのような環境を用意すればお金はかかります。
Llama.cppなどMacのPCで動く軽量なものもありますが、結局サーバは必要ですし、手間など含めたコストを考えると、今のところ難しいかなと思います。

③は挙げといてあれですが、これといったサービスが思い浮かばないので除外します。(今後こういうサービスは増えるとは思います。)

以上のことから、①のAPIによるGPTの利用をしてBOTの作成を行いたいと思います。日本語での回答の正確さもGPTが安定しているという印象なので、日本ではまだまだGPTが優位…という気がします。

キャラクター付け(カスタマイズ)

次にBOTに大谷選手の情報を回答してもらう方法を考えます。

  1. システムプロンプトによる指示

  2. ファインチューニングによる学習

  3. LlamaIndexの利用

最近OpenAIが任意のデータを学習させることができる、ファインチューニング機能をリリースしたので、すぐに飛びつきたくなりますが、OpenAIが言うことには

なんでもかんでもファインチューニングすんな!


…とのことらしく
実際OpenAIのファインチューニングに関するドキュメント

※ありがたいことにnpakaさんが要約してくれています

にはファインチューニング使わなくても、プロンプトの設定でも十分に対応できるようなことが書いてあります。

特にChatGPTでいうところのカスタムインストラクション

ChatGPTのカスタムインストラクション(marke-mediaさんより)

※APIではシステムプロンプト(role:system)としての指示

から簡単にキャラクターなどオリジナルの設定の指示ができます。

ただ身長・体重など細かい情報への回答の正確さや、回答の安定度合いを見ると、プロンプトだけでは対応には限界があるようですし、読み込ませるプロンプトが毎回多いというのは、費用面などなんとなくネックな気がします。

ということで、今回はファインチューニングを活用します。
使った方が面白そう!というのが正直な理由でもあります…
(もちろん同時にシステムプロンプトも設定します)

LlamaIndex

で、忘れてましたがLlamaIndexに触れようと思います
機能の説明が難しい(よくわかってない)ので、見ていただければと思います。

次が書かれたテキストファイルを

小学校3年時から野球を始め、中学時代には一関リトルシニアに所属し、全国大会に出場する。
菊池雄星に憧れ花巻東高等学校に進学したが、1年夏まで野手として育成される。その後はエースとなり、ストレートの球速は1年次に147km/h、2年次に150km/hと徐々に上がり、3年次の岩手県大会準決勝でアマチュア史上最速の160km/hをマークした。しかし決勝戦で敗れたため、3年夏の甲子園出場は叶わなかった。甲子園大会には2年夏、3年春と2回出場したが、いずれも1回戦で敗れた。2年夏には帝京高校、3年春は大阪桐蔭高校(藤浪晋太郎、森友哉が所属)と強豪校と当たったことも不運であった。
2012年ドラフト会議直前にメジャー挑戦を表明していたにも関わらず、ドラフト会議前日に北海道日本ハムファイターズが1位での指名を表明し、交渉権を獲得。日本ハムが訪れても当初は面会を拒否していた。その後監督の栗山英樹も交え、4度も入団交渉が行われた末に、日本ハム入りを決断した(その際は30ページにも及ぶ資料が使われ、日本ハムの球団公式サイトでも一部公開されている)。背番号はダルビッシュ有がつけていた11。
高校通算56本塁打と長打力もあるため、投手と野手の二刀流で育成されることになり、どこまで通用するかが注目される。
現在の最速は公式記録では164km/h、非公式ではクライマックスシリーズの165km/h。

ニコニコ大百科

”/content/data"フォルダに置いて読み込ませます。
(openaiとllama-indexは要インストール。)

mport openai
from llama_index import GPTVectorStoreIndex, SimpleDirectoryReader

openai.api_key = "sk-******************************************"

documents = SimpleDirectoryReader("/content/data").load_data()
index = GPTVectorStoreIndex.from_documents(documents)

"大谷翔平の最高球速は?"など質問を投げると

query_engine = index.as_query_engine()

question = "大谷翔平の最高球速は?"

response = query_engine.query(question)
print(response)
大谷翔平の最高球速は公式記録では164km/h、非公式ではクライマックスシリーズの165km/hです。

読み込ませたテキストの内容を回答してくれます。

ファインチューニングが出る少し前にこれを知り、ただただ
すげぇ!と思いました。
(だから、みなさん騒いでたんですね…)

ただ、LlamaIndexはドキュメントの内容から情報を答えるのは得意ですが、対話をするには向いていません。回答は基本的に内容+"ですます"のみで、また直前の会話の内容は影響されませんので(データを保持していない)チャットBOTという今回の目的には合っていないようです。

対話を可能にする方法もあるかと思いますが
実装が大変そう
なので、利用は見送ろうとと思います。

ということで長くなってしまいましたが、今回BOTの作成を
・GPTのAPIを利用
・ファインチューニングによりキャラクター付け

で、行うことを決めました。
次回こそファインチューニングに手を付けたいと思います…

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