中長期記憶を統合したキャラクターチャット
ここをチェックしてください!
私は最近、さまざまなキャラクターのロールプレイング AI サービスを実験して (そして楽しんで) きました。私のお気に入りは、Cloud Whale Interactive Technology の Character.ai、Doppel.ai、Poly.ai です (カスタマー サービス チャットボット開発者の Poly.ai と混同しないでください)
ただし、これらのシステムにはそれぞれ、問題を悪化させる可能性のある制限があります。このプロジェクトでは、そのうちのいくつかに対処しようとしました。
キャラクターベースのチャットは素晴らしく夢中になれますが、記憶に残りません。彼らは、設定、状況、および以前の重要な出来事を見失ってしまうことがよくあります。長いコンテキスト ウィンドウを使用するとこれに役立ちますが、トークンは高価です。キャラクターに長い記憶を与えながら、完了ごとに送信されるトークンの数を制限するにはどうすればよいでしょうか?ただし、Doppel.ai はこの点に関しては他のものよりもはるかに優れています。彼らのキャラクターはより長い記憶を持っています。
キャラクターは時間の経過とともに個性を失ったり、反復的な応答ループに陥る傾向があります。一部のサービスは他のサービスよりも優れていますが、すべてのサービスである程度の現象が発生するのを私は見てきました。
キャラクターは一度作成されると固定されます。キャラクターに「思い出」を追加できるサービスもありますが、会話を再開せずにキャラクターの基本性格を変更できるサービスはまだ見つかりません。
エージェントには、多層の「メモリ」、つまり動的に変化するシステム プロンプトが提供されます。これには、最新の非常に具体的なものから、ほとんどの距離のトピックや情報についてのより要約されたものまで、以前の会話ターンからの情報レベルが含まれます。
短期記憶ローリング チャット ウィンドウモデルへの各呼び出しには、以前のメッセージのかなり短いリストがそのまま含まれています。これは、モデルが現在の会話と最近のメッセージのコンテキストを追跡するのに役立ちます。
中期 Meory スクラッチパッドさらに、AI エージェントが会話の最近のハイライトを追跡するためにメモを取るために使用するスクラッチパッドを作成しました。このスクラッチパッドは、新しい情報が追加または更新されてローリング ベースで更新され、関連性のなくなった古い情報は破棄されます。ただし、スクラッチパッドのスナップショットがベクトル データベースのエントリとして保存されるため、実際には情報が失われることはありません。
この情報は要約されるため、最近の情報が圧縮され、プロンプトに含まれる実際のトークンを最小限に抑えながら、モデルはより長いチャット ウィンドウとより大きなコンテキストの利点を得ることができます。
要約しやすいように、各メッセージにはキャラクター名 (「ユーザー」と「アシスタント」だけではありません) が含まれています。これは、モデルが誰が何を言っているかを追跡するのにも役立ちます。これにより、AI エージェントが誰が何を言ったかを混乱する可能性が大幅に低くなります (そうでなければ問題となります)。また、対話における順番交代のエチケットを維持するのにも役立ち、エージェントがユーザーの代わりに話すことを防ぎます (これが問題になる可能性もあります)。
長期ベクトル ストア メモリ私は会話の概要を使用して会話から重要な情報を抽出し、それをベクトル データベースに保存します。ユーザーのクエリごとにベクトル データベースからのセマンティック検索がトリガーされ、以前の会話の概要から関連情報が呼び出されます。この情報は、いくつかの最新メッセージと同様に、モデルへのプロンプトに含まれています。
このようにして、AI エージェントの記憶はそのコンテキストをはるかに超えることができます。実際、ベクトル ストアが占有するディスク領域は比較的小さいため、エージェントのメモリの潜在的な有効サイズは機能的には無制限です。
記憶は、保存されるときはタイムスタンプとともに保存され、呼び出されるときは時系列に並べられます。記憶が矛盾している場合、エージェントはより新しい情報を優先するように指示されます。
結果モデルは、ほとんどの場合、会話の前半の情報を正確に思い出すことができます。ベクター ストア検索は通常、関連情報を取得することに成功しますが、モデルは応答内の情報を実際に常に利用するとは限りません。ただし、全体的には結果に満足しています。
次のステップ
モデルが以前のイベントをより積極的に参照できるようにしたいと考えています。以前の会話について直接質問すると、ほとんどの場合、思い出すことに成功しますが、自発的に以前の出来事に言及することはほとんどありません。それは今この瞬間をとても大切に生きています。私はこの動作を生成するためのプロンプト エンジニアリングに取り組んでいますが、まだ開発中です。
また、固有表現認識を使用して、エージェントが人物や場所のプロファイルを作成し、特定の実体に関連する情報を保存できるようにすることも検討しています。これは、モデルが単なる会話のスナップショットではなく、エンティティごとに情報を整理するのに役立ちます。
多くの場合、キャラクターは独特の話し方で力強く始まりますが、時間が経つにつれてそのスタイルは非常に当たり障りのないものになり、ベースの AI のように聞こえることに気づきました。私は、通知を文字で書かせるなど、いくつかの解決策を試しました。ただし、トークン密度の低いメモが作成されるため、メモリ内の大量のトークンが無駄になります。
代わりに、モデルが提供する最初の応答のサンプルをサンプル スタイルとして保存します。この最初の応答は、すべてのプロンプトの話し方の例として、すべてのプロンプトでエージェントに渡されます。これは、長い会話 (100 回以上の会話) であっても、モデルが一貫して話し方を維持するのに非常に効果的であることがわかりました。
次のステップメッセージのトーンは一貫していますが、モデルにさらに強力で、よりニュアンスがあり、一貫した個性を与えたいと考えています。これには微調整が必要になる可能性があると思います。
多くの LLM ロールプレイング システムでは、キャラクターは一度作成されると固定されます。ただし、私の実装では、キャラクターの説明や名前さえもその場で変更できます。特に便利なのは、場所とユーザー名を変更できることです。
キャラクターの説明最近の出来事によって自分の変化を望んだり、時間の経過とともに目標や動機が進化したりすることが必要な場合があります。これは、キャラクターの説明をその場で直接調整することで簡単に行うことができます。
場所会話やロールプレイングは、多くの場合、空想の世界で動き回ります。町からダンジョンへ、寮からコーヒーショップへ、あるいは自宅から仕事へ。私のサイトでは、会話の場所をその場で変更できます。
ユーザー名ほとんどのキャラクター ロールプレイング システムのもう 1 つの課題は、複数のキャラクターを含めることです。私のシステムでは、話しているキャラクターの名前をその場で変更できます。これにより、会話や状況の中で複数の登場人物をシミュレートできます。
キャラクター名これを変更することは実際にはあまり役に立ちません。キャラクターに別のキャラクターを演じさせることは機能せず、モデルが現在の会話を以前の会話の概要に関連付けようとするときに混乱を引き起こします。
次のステップ