Mem0のHistory storeでSQLite以外のDBを使う方法
TL; DR
- 記事執筆時点の最新であるv1.0.4では、Python版でのHistoy storeはSQLite固定になっている
mem0.memory.storage.SQLiteManagerを参考に、使いたいDBに応じたManagerクラスを自作すればよい
Mem0とは
Mem0は一言で説明すると、LLMにいわゆるメモリー機能を持たせられるもの
その中でHistory storeは、Vector storeと違ってチャット履歴を時系列順に記録しておくもの
Vector storeは「知識」を、History storeは「文脈」を扱う (By Gemini)
このMem0にはOSS版があり、これを使うことでメモリー機能をセルフホスティングできる
DBの選択肢
公式ドキュメントの以下のページに記されている通り、Vector Databaseには多くの選択肢が用意されている
いくつかピックアップすると、
- Qdrant: ローカル環境で済ませたい場合
- pgvector: PostgreSQLをVector Databaseとしても使えるようにする拡張機能。既にPostgreSQLをホスティングしており、そこにMem0用のテーブルを追加するだけで済む構成
- Amazon S3 Vectors: 2025年にリリースされたばかりの、Vector Databaseとして使えるタイプのS3バケット
- Supabase: 最近よく耳にするやつ。内部的にはpgvectorが使われてるっぽい
のようになっている
ただしこれは、あくまでVector store用のDBの話
History storeはデフォルトではローカルでSQLiteを使う形になっているが、これを永続化させたい場合は一気に面倒になってくる
まずNode.js版のMem0であれば、デフォルトのSQLite以外にSupabaseを使うオプション設定が用意されているため、この場合は簡単
(以下のソースコードを参照)
しかしPython版ではどうだろうか
SQLiteManagerしか用意されてない!
しかも、このHistoryManagerを使うMemoryクラス側のコンストラクタで、SQLiteManagerで固定されてしまっている!
class Memory(MemoryBase): def __init__(self, config: MemoryConfig = MemoryConfig()): # 省略 self.vector_store = VectorStoreFactory.create( self.config.vector_store.provider, self.config.vector_store.config ) # 省略 self.db = SQLiteManager(self.config.history_db_path)https://github.com/mem0ai/mem0/blob/main/mem0/memory/main.py
ということがあり、
正直ここはPull Requestを投げてしまいたい気持ちがありましたがそんな余裕がある訳ではないので、ここでは取り急ぎの対策を共有します。
History storeにPostgreSQLを使うようにカスタマイズしてみる
今回はPostgreSQLを使うことにしてみます。
といってもやることは単純で、SQLiteManagerの実装を参考に、自前でPostgresManagerを実装します。
あとはMemoryクラスを継承し、コンストラクタを以下のように上書きします。
class CustomizedMemory(Memory):
def __init__(self, config: MemoryConfig = MemoryConfig()):
super().__init__(config)
self.db = PostgresManager(self.config.history_db_path)余談ですが、SQLiteManagerはSQL文が直で書かれているため、実装ミスによるSQLインジェクションが怖いという場合もあるかもしれません。
pgvectorには、SQLAlchemyなどのORMでもVector形式のテーブルを定義できるようにするためのライブラリが用意されています。
これを利用して、HistoryManagerの各種DB操作部分はORMを利用するような書き方にもできるかと思います。
ご参考までに