1. 研究の目的
前回の実験で、OllamaとQwen 2.5を用いてローカル環境での会話には成功しました。
しかし、実用化に向けて以下の2つの技術的課題(壁)が浮き彫りになりました。
- 記憶の非永続性: プロセスを終了すると、全ての文脈(思い出)が揮発し、初期化されてしまう。
- コンテキスト長の限界: 会話が長期化すると、LLMのトークン制限を超過し、動作遅延やクラッシュを引き起こす。
本稿は、この2点を解決し、「無限の対話」と「記憶の永続化」を両立させるためのアーキテクチャ実装の記録です。
2. 課題解決のアプローチ
課題A:記憶の永続化(Persistence)
AIのプロセスが終了しても記憶を保持し続けるため、外部記憶装置への**「シリアライズ(書き出し)」機構を実装しました。
実装方針:
- 会話が発生するたびに、対話ログを構造化データ(JSON形式)としてローカルストレージに即時保存する。
- アプリケーション起動時に、このログファイルをパースし、メモリ上に展開する。
結果:
- PCを再起動しても、「昨日の会話の続き」から違和感なく対話を再開することに成功。
- 「財布の中身」のようなユーザー固有の情報を、セッションを跨いで保持できるようになった。
課題B:無限の対話(Sliding Window)
人間が「生まれた時からの全ての会話」を常に意識していないのと同様に、AIにも「忘却」の概念を導入しました。
実装方針:
- 「全記憶(Storage)」と「短期記憶(Working Memory)」を分離するアーキテクチャを採用。
- ログファイルには全履歴を保存しつつ、LLMの推論エンジンに渡すコンテキストは「システムプロンプト(人格定義)」+「直近N件の会話」のみに制限するスライディング・ウィンドウ方式を適用。
結果:
- 会話履歴が1万行を超えても、推論速度は「最初の1往復」と同じ速度を維持。
- コンテキスト溢れによるエラーを完全に回避し、理論上は無限に会話を継続できるシステムが完成した。
3. 現在のシステム構成図(概念)
コードは非公開ですが、処理フローは以下の通りです。
4. 動作検証
実際に「金欠である」という情報を与え、再起動後にその情報を保持しているかテストを行いました。
結果、電源断を挟んでも人格と記憶が一貫していることを確認。 これにより、Buddyは単なるチャットボットから、「時間の概念を持つパートナー」へと進化したと言えます。
5. 次なる展望
基礎的な「記憶」と「体力」の実装は完了しました。 次は、単なる直近のログだけでなく、過去の膨大なログから「今の会話に関連する思い出」だけを瞬時に引き出すRAG(検索拡張生成)の実装に着手します。
「自分だけの相棒」を作る旅はまだ始まったばかりです。
