で、結局キャラクターBOTを作るには? ~LlamaIndexを断念~ #001
前回、これからやることの概要をお話しましたが
今回から実際に作業に移りたいと思います。
ざっとやりたいことはこれです。
AI大谷翔平BOTを作る
・問い合わせと回答はLINEにより行う
・「野球を始めたきっかけ」など基本的な情報や学生時代のエピソードなどを大谷選手として回答ができる
・あまりお金はかけない
※あくまでサンプルで、ほんとに大谷選手を使ったサービスを作ると怒られると思います。
目的ベースとして、作る過程での検討・採択を通してLLM周辺の理解の助けになれば…と思います
ただ私はAIの専門家ではなく、もちろん選択は完璧ではないので意見などあればお願いします。
では最初にLLMの選定から。
LLMモデルの選定
LLMを利用するための選択肢は3つ挙げたいと思います。
OpenAIのAPIによるGPTの利用
オープンソース(商用利用可能)モデルの利用
その他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に大谷選手の情報を回答してもらう方法を考えます。
システムプロンプトによる指示
ファインチューニングによる学習
LlamaIndexの利用
最近OpenAIが任意のデータを学習させることができる、ファインチューニング機能をリリースしたので、すぐに飛びつきたくなりますが、OpenAIが言うことには
なんでもかんでもファインチューニングすんな!
…とのことらしく
実際OpenAIのファインチューニングに関するドキュメント
※ありがたいことにnpakaさんが要約してくれています
にはファインチューニング使わなくても、プロンプトの設定でも十分に対応できるようなことが書いてあります。
特にChatGPTでいうところのカスタムインストラクション
※APIではシステムプロンプト(role:system)としての指示
から簡単にキャラクターなどオリジナルの設定の指示ができます。
ただ身長・体重など細かい情報への回答の正確さや、回答の安定度合いを見ると、プロンプトだけでは対応には限界があるようですし、読み込ませるプロンプトが毎回多いというのは、費用面などなんとなくネックな気がします。
ということで、今回はファインチューニングを活用します。
使った方が面白そう!というのが正直な理由でもあります…
(もちろん同時にシステムプロンプトも設定します)
LlamaIndex
で、忘れてましたがLlamaIndexに触れようと思います
機能の説明が難しい(よくわかってない)ので、見ていただければと思います。
次が書かれたテキストファイルを
”/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を利用
・ファインチューニングによりキャラクター付け
で、行うことを決めました。
次回こそファインチューニングに手を付けたいと思います…
この記事が気に入ったらサポートをしてみませんか?