見出し画像

Gemini×VOICEPEAKに「会話履歴」と「会話圧縮」機能を追加してみた

こんにちは、あいさきです。

前回の記事では、AIアシスタントに「資料読み込み(RAG)」機能を追加した話を書きました。

今回もまたその続編です。
「会話履歴」機能 と、それに伴う 「会話圧縮」機能を実装しました。

何を作ったか

今回追加したのは、大きく分けて3つです。

1. 会話がずっと残る「セッション管理」

これまでは、ブラウザをリロードしたり新しく開き直すと、Geminiは前に何を話したか全て忘れてしまう状態でした。「さっきの話の続きなんだけど」が通じない。これはけっこうつらいし、めんどい。

今回のアップデートで、会話の記録がデータベースに保存されるようになり、いつでも過去の会話に戻れるようになりました。

また、これにより、会話履歴も引き継ぎ、これまでの会話の内容を把握し、Geminiが回答できるようになりました。

これまでの会話の内容を把握し回答する様子

2. 話題ごとに会話を分けられる「マルチセッション」

ChatGPTやGeminiのように、複数の会話を並列で持てるようにしました。

  • 「雑談の部屋」「勉強の部屋」みたいに目的別の使い分けが可能

  • セッション一覧がサイドバーに表示され、クリックひとつで切り替えられる

  • 最初のメッセージが自動的にセッションのタイトルになる

3. 会話を要約して圧縮する「Compact」機能

長く会話を続けていると、AIに送る文脈(コンテキスト)がどんどん膨れ上がります。

この「Compact」とは、長くなった会話ログをAIに要約させて、履歴を要約1件にギュッと圧縮する機能です。Claudeの開発者向けツール「Claude Code」にある /compact コマンドを参考にしました。

  • ヘッダーの「Compact」ボタンを押すと手動で実行できる

  • 30ターンを超えると自動的にCompactが発動する安全装置も搭載

  • 要約後も会話の文脈は維持されるので、スムーズに続きの会話が可能

UIもアップデート

会話履歴機能に合わせて、UIにもいくつか変更を加えました。

1. サイドバー(セッション一覧)

画面左側に、ChatGPTのような 「セッション一覧」のサイドバー を追加しました。

  • ハンバーガーメニュー(≡ボタン)で開閉

  • 過去のセッションがタイトル付きで一覧表示

  • クリックするだけで過去の会話に瞬時に切り替え

  • 各セッションの「×」ボタンで不要な会話を削除


2. 「新しいチャット」ボタン

サイドバーの一番上に 「+ 新しいチャット」ボタン を設置。 ワンクリックで新しい会話セッションを開始できます。

3. 「Compact」ボタン

ヘッダーのツールバーに 「Compact」ボタン を追加。 会話が長くなってきたら、ワンクリックで会話を要約・短縮できます。確認ダイアログが出るので、間違えて押しても安心です。

ダイアログ画面

どうやって作ったか

図にまとめるとこんな感じ

ポイントは、SQLite(データベース)が会話の「記憶装置」として中心にいるということです。メッセージを送るたびに保存され、セッションを切り替えれば過去の記憶が呼び戻されます。

SQLiteで会話をまるごと保存

会話の保存先にはSQLiteを採用しました。軽量なファイルベースのデータベースで、サーバーを別途建てる必要がありません。

テーブルは大きく2つ:

  • sessions テーブル:会話の「部屋」を管理。タイトル・作成日時・更新日時を持つ

  • messages テーブル:各セッションに紐づくメッセージ。誰が言ったか(user / model)・内容・要約フラグを持つ

会話の「引き継ぎ」のしくみ

セッションを切り替えると、SQLiteからそのセッションのメッセージを全件取得し、Gemini APIに渡す会話履歴リストを丸ごと差し替えます。

これにより、Geminiは「今までの文脈」を正しく理解した上で返答してくれます。

会話圧縮の仕組み

会話圧縮処理の流れはこうです:

  1. 現在の会話ログを全文テキストに整形する

  2. Geminiに 「この会話を要約してください」 と依頼する

  3. 返ってきた要約で、会話履歴を1件に置き換え

  4. データベースも同様に更新

要約のプロンプトでは「重要な情報、ユーザーの関心事、決定事項、話題の流れを漏らさないように」と指示しているので、圧縮しても大事なことはちゃんと残ります。(おそらく)

なぜこの機能を作ったのか

会話履歴

前回のRAG機能で「実用的なツール」にはなったものの、毎回まっさらな状態からの「初対面の会話」になるのが気になっていた

「あの件どうなった?」「前聞いたあれと比べてこれって何?」が通じないのは、ちょっと使い心地が悪いところがある

会話を記録として残すことで、会話の文脈を読み取って、質問に声えてくれるようになって使い心地が少し良くなります。

会話圧縮

会話履歴を作成したことにより、コンテキスト管理が必要になったので作成しましたが、LLM(大規模言語モデル)には、文章が大きくなればなるほど性能が低下するという結果があります。

つまり、会話が長くなるほど、AIの回答の質が落ちてしまう可能性があります

加えて、送信するトークン数が増えればAPI呼び出しのコストにも影響します。

Claude Code の /compact コマンドはこの問題への対策として存在していて、「必要な文脈だけを残して、それ以外は要約で圧縮する」というアプローチを取っています。
それを参考にして、この AIアシスタントにも同じ考え方を取り入れました。

「文脈を保ちつつ、無駄を削ぐ」。シンプルですが、長く使い続けるシステムには欠かせない仕組みだと思ってます。

おわりに

てなわけで、今回は「会話履歴」と「会話圧縮」を作ってみました。自分で作ってみると、後ろ側のLLMの構造もわかるようになってきて勉強になる今日この頃です

次も何かアップデートありましたら、続編書きます

ではまた

いいなと思ったら応援しよう!