清水理史の「イニシャルB」

AIが「長期記憶」を手に入れて進化、相手の名前や予定を覚え、文脈を共有して話せる「MemGPT」

MemGPTが記憶したメモリと、それをもとにした会話。会話を重ねるほどユーザーのことを理解できる

 AIがあなたの名前を呼び、先週話した話題の続きを語り、家族について聞いてきたり、今週のスケジュールやTo Doについて教えてくれたりする――そんなAIアプリの登場も目の前だ。

 10月にarxivで公開された「MemGPT:Towards LLMs as Operationg Systems」で、大規模言語モデル(LLM)の長期記憶として階層的なメモリを使う方法が提案され、そのサンプルコードが公開された。人間との雑談から、名前や年齢、スケジュール、To Do、家族構成など、重要と思われる情報をメモリに格納し、会話に役立てることができる。実際の動作を試してみた。

長期記憶のネックとなるトークン制限を回避

 現状、AIとの会話が「面白い」と感じられないのは、文脈を共有していないからだろう。

 会話はいつも「はじめまして」で始まり、回答はいつも一般的なもの。友人や家族と会話をするときのように、相手が誰で、何が好きで、どんな仕事をしていて……、とその背景を理解して会話をすることは難しい。

 もちろん、ChatGPTであれば、「カスタム指示」に自分のプロフィールを入力することで、プロンプトとして自動的に前提情報を与えられるため、ある程度、文脈を意識した会話ができる。

 しかしながら、LLMには入力できるトークン数に限りがある。GPT-3.5-Turboは4K、GPT-4は8Kと少ない。Claudeは100Kと多いが、それでも、会話が増えると文脈として保持できる前提情報は限られてしまう。過去の履歴やプロンプトなどを含めて入力しなければならない場合、情報を詰め込み過ぎると、すぐにAPIの上限を超えてしまうわけだ。

MemGPTの論文に記載されている各LLMのトークン数の上限(MemGPT:Towards LLMs as Operationg Systemsより)

 こうしたトークン数の壁は、ウェブ検索や文書検索などでも課題となっている。RAG(Retrieval Augmentation Generation)で、検索結果をプロンプトに含めて質問への回答分を生成しようとする際に、検索結果や入力文書が大きすぎるとプロンプトからあふれてしまう。

 こうした制限を回避するためのしくみはいくつかあるが、今回登場したMemGPTも、そのひとつだ。

 arXivでは「MemGPT: Towards LLMs as Operating Systems」(OSとしてのLLMに向けて)と紹介されている。このタイトルは少々大げさな気もしなくもないが、発想としてコンピューターのOSにおける仮想メモリを参考にしたしくみとなっており、Core Memory(PCでいうRAM)とArchival Storage(PCでいうSSD/HDD)という階層的な記憶域を自律的に利用できる。

▼arXivでの紹介ページ
MemGPT: Towards LLMs as Operating Systems

 これにより、過去の会話履歴などを全てプロンプトに詰め込む必要はなく、直近の話題はCore Memoryから、過去の話題はArchival Storageからと、情報を適宜検索して必要な情報だけをプロンプトに含めることが可能となっている。

MemGPTのしくみ図(MemGPT:Towards LLMs as Operationg Systemsより)。「Virtual context」の部分がメモリの役割を担っている

会話の例を見てみよう

 このあたりは、実際の動作を見た方がわかりやすい。以下の例は、公開された論文でも提示されている例だ。

 MemGPTの初期設定では、人間のプロフィールとして「Chad」という名前が与えられているが、会話として「僕はチャドじゃないよ。『まさし』だよ」と話しかけると、以下のように「core_memory」に記憶されている「Firstname: Chad」というデータが「First name: Masashi」に書き換えられる。

名前を教えると、それをメモリ上の「First name」の値を書き換える

 このように、MemGPTが、自らの判断で情報を保管してくれるわけだ。

 そして、会話を続けて、メモリがいっぱいになると(例では/memorywarningコマンドで意図的に同じ状況を発生させている)、重要な情報をcore_memoryから「archival_memory」へと情報を移動する。

 つまり、情報を「自動的」かつ「自律的」に保管してくれることになる。

コマンドを発行してcore_memoryからarchival_memoryへと情報を移動
「ARCHIVAL MEMORY」の部分に「Masashi」という名前が保存されている

パーソナルアシスタントやTo Do LLMなんてすぐ実現できそう

 MemGPTは、こうしたしくみに特徴があるが、実際のアプリやサービスとして、すぐに応用できそうな点が面白い。

 たとえば、ざっと考えただけでも、以下のようなアイデアが思い浮かぶ。

  • ユーザーのプロフィールや嗜好を考慮して会話できるチャットキャラクター
  • To Doやスケジュールを記憶して伝えてくれるパーソナルエージェント
  • ユーザーの趣味に合わせて雑談してくれる雑談アプリ
  • 対話しながら毎日の出来事を記録する日記サービス
  • 愚痴をひたすら聞いて同意してくれる自己肯定アプリ

 要するに、ユーザーと会話するだけで、情報を記憶し、その情報をもとに新たな会話をしたり、必要な情報を提供したりすることができるわけだ。

 われわれが昔から夢見てきた人工知能やロボットは、こちらの名前を呼んでくれるし、生活や嗜好を理解して会話してくれる存在だった。「〇〇くん! まったくきみってやつは……」などと、全てを達観して言葉を飲み込むようなAIはまだ遠い存在かもしれないが、そこに少しだけ近づいている感覚はある。

MemGPTを体験してみよう

 このようなMemGPTは、比較的簡単にPCで試すことができる。

 方法は以下のGitHubでも同じことが紹介されているが、Python(とPIP)が動く環境を用意し、リポジトリをクローン後、必要なモジュールを追加。LLMとしてOpen AIのGPT-4を利用するのでAPIキーを環境変数として登録して、「main.py」を実行すればいい。

▼MemGPT(GitHub)
GitHub - cpacker/MemGPT: Teaching LLMs memory management for unbounded context

今回はWindows 11のWSLを利用して検証した。コマンドのみとなるが、いくつかの操作を順番に実行するだけなので簡単

 標準設定は英語となるが、「/MemGPT/memgpt/humans/example」に人間の定義ファイル、「/MemGPT/memgpt/personas/example」にAIの定義ファイルを、どちらも日本語で作成し、起動時にオプションで指定しておけば日本語で会話ができる。

 この2つの定義ファイルによって、人間の情報(名前や趣味)やAIのキャラクターをある程度設定できるので、好みに合わせて設定しておくといいだろう。

human_ja.txtにユーザー情報を日本語で記述
persona_ja.txtにAIのキャラクターを日本語で記述

 以上の準備ができたら、次のコマンドでmain.pyを実行する。

 python3 main.py --human human_ja.txt --persona persona_ja.txt
実行時にファイルを指定することで指定したキャラクターで起動する

 MemGPTにはコマンドが用意されており、「/memory」で会話中に記憶した情報を確認したり、「/save」や「/load」で会話の保存や復元をしたりすることもできる。このため、次回以降は単に「pyhon3 main.py」とキャラクターを指定せずに起動したとしても、「/load」で前回の情報を読み込むことで定義ファイルも自動的に反映される。

 さすがにまだ人間並みという感じはしないが、自分が誰だか認識し、過去の会話を受けて回答するだけでも、未来的なアンドロイド感はグッと増す印象だ。

 このほか、データベースや与えられたドキュメントをもとに会話することなどもできるので、試してみるといいだろう。

「/save」または「/exit」で現状の会話を保存可能。次回、「/load」で最後のセーブファイルを読み込める
清水 理史

製品レビューなど幅広く執筆しているが、実際に大手企業でネットワーク管理者をしていたこともあり、Windowsのネットワーク全般が得意ジャンル。最新刊「できるWindows 11」ほか多数の著書がある。