Chatbot作り

あらかじめ保存しておいた情報について質問できるChatBotを作ったよ
仕組み調べながらやったから、GPTフルで使っても丸2日かかったよ
はじめてリポジトリ公開にしたから、READMEもちゃんと書いて頑張った!
使用技術
- Pinecone:テキストをベクター化して保存できるDB(いちばん有名みたいだから採用したよ)
- Together AI: 質問に対して回答してくれるAI(OpenAIよりAPIの使い方がわかりやすくて、LLMモデルがいろいろ選べるから採用したよ)
アプリでできること
画面は
- APIキーを設定する画面
- Pinoconeにデータを保存する画面
- Together AIに質問する画面
だけ
さくっとデータを保存したり、質問したりして、
- こんなデータを入れるとこんな質問ができるのか
- こんな質問は答えてもらえないのか
とか、いろいろ実験するときに便利なアプリにしたよ
UIが賑やかすぎる
GPTにおまかせにしたら元気だいばくはつ的なUIになったw
うちのGPTは絵文字大好きだから性格出てる笑
Chatbotの仕組み(Pinecone + Together AI)
- テキストをベクター化してPieneconeに保存するよ
- ユーザーからの質問をPineconeに送って、その質問に似てるテキストを決まった数だけ返してもらうよ
- 「以下のテキストだけを使って、質問に答えてください。[Pineconeから受け取ったテキスト] 質問:[ユーザーが送った質問]」っていう質問をTogether AIに送って、答えを受け取るよ
こんな風にいったん類似テキストを取ってAIに渡す手法はRAG(Retrieval-Argumented Generation)と呼ばれるよ
アプリでは質問を送ると実際にAIに送った質問も表示されるから、面白いかも [Pineconeから受け取ったテキスト]に質問と関係ない文章がたくさん入ってても、AIがガン無視してくれるからすごいなって思ったよ
意外だったこと
AIにDBの鍵をポンと渡したら、勝手にそこから検索してくれるのを想像してたけど...
実際は類似するテキストをこちらで探して、AI様にはいい感じに整形してもらってるだけっていうw
意外と泥臭いよね
ベクター化って何
テキストの特徴を数字で表すことだよ。
たとえば、「フッ…この右手が疼く。封印されし力が解放されようとしているのか…」は「厨二度5」「ポエム度5」「現実度0」「芸術度3」みたいに表すことができるよね。この数字の集まり([5,5,0,3])がベクターだよ。
大量に文章を読み込んで、文章同士を見比べてベクターを生成するのがEmbedding Modelって呼ばれるプログラムで、BERTとかが有名だよ。ベクター化の原理はまだよくわかってないんだけど、基本的にベクター文章に含まれる単語の類似度を見ているから、似てる単語が含まれる文章同士は似てるベクターになるっていう性質があるみたい。だから、「目覚めてしまったか…封印されたはずの“混沌の記憶(カオス・メモリー)”が…」は、さっきの文章と同じく「封印」っていう単語が入ってるから、似てると判断されるはず
(ちなみに、さっきは「厨二度」とか書いたけど、実際は「このテキストを、次元数1000でベクター化して」ってEmbedding Modelに頼んだら、「厨二度」みたいな軸も1000個勝手に生成してくれるから、「○○度」みたいに人間が読んでわかるようなラベルはつかないよ。)
ベクター化がうまくいくと、一個一個の文章の中身を解釈しなくても、数字が近ければ似ている文書っていうことが言えるから、似ている文章を高速で検索することができるよ
PineconeはEmbedding Modelを内蔵してて、Pineconeにテキストを送ると自動的にベクター化してくれるし、そのベクターをもとに類似したドキュメントを引っ張ってくるっていうこともできるよ。
LLMって何
Language Learning Modelで、自然言語を解釈できるAIだよ。Embedding Modelは単純に類似した文章を割り出すっていうことしかできないけど、LLMは文章を解釈して、受け答えすることができるよ。Chat GPTとかが有名だよ。
Together AIだと、Chat GPTは使えないけど、Deep Seekとか、Microsoftのとか、Googleのとか、Metaのとか、いろんなLLMを試せるよ。
アプリではとりあえず「meta-llama/Llama-3.3-70B-Instruct-Turbo」っていうLLMを使ってるけど、LLMも簡単にスイッチングできるようにしたい
厨二っぽいセリフ集
GPTに聞いたら全部名作だったから、消すのもったいないから残しておくよ
- 「フッ…この右手が疼く。封印されし力が解放されようとしているのか…」
- 「我が名は漆黒の堕天使(フォールン・エンジェル)。貴様ごときでは、この世界の真理には辿り着けぬ…!」
- 「この剣はただの剣ではない…魂を喰らい、怨嗟を糧とする闇の刃だ…」
- 「目覚めてしまったか…封印されたはずの“混沌の記憶(カオス・メモリー)”が…」
- 「俺の瞳に映るのは、未来か、それとも滅びか…貴様にその覚悟はあるか?」
- 「くく…この世界のルールは俺には通じないぜ?」
- 「俺の中の闇が囁く…『すべてを破壊しろ』と…だがまだ時ではない…」
- 「見えるか?この紋章が。これは選ばれし者のみが宿す“神威の刻印(ディヴァイン・シンボル)”だ」
- 「お前の技は見切った…否、最初から全て計算の上だったのさ」
- 「この世は仮初の幻想…真実を知る者のみが、世界の裏側に辿り着くことができるのさ」
- 「ハッ…俺に勝とうなんて、一万年早いぜ?」
- 「この黒き炎に触れたが最後…貴様の魂は無限の闇に囚われることになるだろう…」
- 「俺がこの力を解放すれば…世界は変わる。だが、それでいいのか?」
- 「止めておけ。俺に近づくと、運命の歯車が狂い始める…」
- 「俺のこの左腕に宿りしは、運命を捻じ曲げる“時喰らいの蛇(クロノス・ヴァイパー)”」
- 「この世界は、まだ俺を本気にさせてはいないようだな…」
- 「貴様はただのモブにすぎん…運命の舞台に立つ資格はない」
- 「お前の知らぬところで、すでに俺たちは何度も相見えている…それを知らぬのは、お前だけだ」
- 「覚悟しろ…俺の影が触れた瞬間、お前の存在は”無”へと帰す…」
- 「俺の存在を知ったこと、それが貴様の運命の終焉を意味するのだ…」