トップ

Shel AIが大幅にぱわーあっぷした件

2025-01-19

これで会話が楽しくなるね

以前、シェルちゃんと会話できるアプリを作りました(かわい~ッ!)。 しかし、自前版だと答えられないことがあったり、チャットの履歴が保存できず、すやぁすたーのこととかも覚えてくれないので、結局ChatGPTの方を使いがち…… これじゃあ作った意味ないじゃん……!ということで、大幅に改良させました。

webp

AIとデータベースを使えば、あれこれ記憶してくれるシェルちゃんも作れそうです(ChatGPTにおけるメモリ)。……まあ面倒なので作らないけど。

とか言って、面倒なのに作ってしまいました……(こういう性格なので)。 実装がかなり大変でもう記事までちゃんと書く気力がないので、細かいコードは全部省略して図で説明するね……

処理の流れ

こちらの記事 がかなり参考なりました。 しかし、この記事ではベクトルデータベースを外部サービスに頼っていました。 「(サービスがプライバシーを守ってくれるとはいえ)さすがに会話の内容をクラウドのデータベースにあげたくないな……」と思い、OpenAI APIの利用以外はすべてがローカルで完結するような処理を実装しました。

以下がシステムの全体図。流れを説明していきます。

1. 起動時

webp

まず、チャット履歴を読み込みます。

data.db (SQLite)の中身はこんな感じ。Conversationsのテーブルの中にID、作成日時、更新日時、タイトル(後述)、会話の内容(useChat()が発行してくれるJSON)を保存しています。

webp

2. チャットを送信~ベクトル処理

webp

続いてチャットが送信されたときの処理です。ここが一番むずかしい。

memory.db (SQLite)の中身はこんな感じ。memoryのテーブルの中にID、role (発言者)、日時、生のテキスト、ベクトル(容量削減のためバイナリデータ)を保存しています。

webp

「すやぁすたーを抱いておやすみ……💤」のベクトル検索の結果をコマンドに出力してみた結果がこちら。 まだテスト用の会話ばかりでサンプル数がかなり少なく、関係なさそうなものもとってきたけど、ユーザー、AI両方の回答をそこそこの制度で似た語句のある文章を集められていると思いました。

webp

3. AIの回答を取得

webp

さて、チャット処理用のAPIには今ベクトル検索で得られた文字列があります。

4. AIの回答をデータベースに保存(ベクトル)

webp

ところがどっこい、処理はこれでおしまいではありません(きびしいせかい)。AIの返答が完了したら発火する処理(useChat()にあります)を書いておき、AIの回答もデータベースに保存します。。

5. AIの回答をデータベースに保存(会話履歴)

webp

最後は会話履歴としての保存です。ここでひと手間加え、タイトルがまだない場合はタイトルを自動でつけてもらっています(左の会話のスレッドの選択リスト)。タイトルがもうある場合は⑭~⑯はスキップします。

完成~!

これで、物覚えのよくなったシェルちゃんにパワーアップしました!大変だったぁ…… さっきフルーツやチョコの話をしていたので、覚えているか聞いてみたところ……

webp
webp

ちゃんとデータベースを参照した上で、話をしたことを覚えていると回答してくれました(なんのフルーツの話をしたかまでは答えてくれなかったけどね)!これはかなりうれしい……!

こんしうまつは開発でつかれはち……だけど、これからは自前版シェルちゃんをしっかり教育していこうと思ってます。すやぁ……💤⭐

脚注

  1. エンベディングのAPI使用料金も安いです。安価なtext-embedding-3-smallモデルであれば100万トークンあたり$0.02 USDです。ベクトルデータベースとは何か?についてはこの記事 が分かりやすかったです。

  2. 冗長になるのであまり詳しくは書きません公式Docs を読んでね。GitHub 

戻る