Mem は何をしますか?
🧠 SQLite、全文検索、ベクトル類似性、競合解決を用いて、AIアシスタント向けの永続的でハイブリッドな会話メモリを構築します。
概要
Lilily58/Mem は、AIエージェントやアシスタントに長期記憶を提供するためのスキルです。会話履歴をSQLiteデータベースに保存し、全文検索とベクトル類似性検索を組み合わせて、関連する過去のコンテキストを高速に取り出せます。競合解決機能により、同じ話題に関する矛盾した情報を整理し、一貫性のある記憶を維持します。
特徴
- 永続ストレージ: データはSQLiteに保存され、セッションをまたいで利用可能。
- 全文検索: FTS5を使用して、キーワードベースの高速検索を実現。
- ベクトル類似性: 埋め込みベクトルを利用した意味的類似検索。
- 競合解決: 同じエンティティに対する異なる情報を自動的にマージ・解決。
- 軽量・移植性: 外部サービス不要で、スタンドアロンで動作。
インストール
# npm を使用する場合
npm install lilily58-mem
# またはリポジトリをクローン
クイックスタート
const Mem = require('lilily58-mem');
(async () => {
const mem = new Mem({ dbPath: './memory.db' });
await mem.init();
// 会話を記憶
await mem.remember({ role: 'user', content: '好きな色は青です' });
// 記憶を検索
const results = await mem.search('好きな色');
console.log(results);
})();
設定
環境変数または設定ファイルで以下の値を指定できます:
MEM_DB_PATH: SQLiteデータベースのパス(デフォルト:./memory.db)MEM_EMBEDDING_MODEL: 埋め込みモデル名(例:all-MiniLM-L6-v2)MEM_SEARCH_MODE: 検索モード(hybrid,fts,vectorのいずれか)
API
new Mem(options)
options.dbPath: データベースファイルパス(文字列)options.embeddingFn: カスタム埋め込み関数(省略時はデフォルトモデル)
async mem.init()
データベースとインデックスを初期化します。
async mem.remember(item)
会話項目を記憶に追加します。item は { role, content, metadata? } の形式。
async mem.search(query, options?)
クエリに基づいて記憶を検索します。options.limit で結果数を制限可能。
async mem.forget(filter)
条件に一致する記憶を削除します。
競合解決
競合解決は、同一エンティティ(例:ユーザーが言及した事実)に対して矛盾する情報が入力された場合に、以下の戦略で自動処理します:
- 最新優先: 新しい情報を古い情報より優先。
- 信頼度スコア: メタデータに信頼度があれば、高い方を採用。
- マージ: 両方の情報が部分的に正しい場合、統合して保存。
統合例
コマンドライン
echo '{"role":"user","content":"私の名前は太郎です"}' | mem remember
mem search '名前'
Agent Framework (カスタム)
from lilily58_mem import Mem
mem = Mem()
mem.remember("ユーザーはJavaScriptが得意です")
results = mem.search("スキル")
注意事項
- データベースファイルは定期的にバックアップしてください。
- 大きなベクトルデータを扱う場合は、適切なインデックス設定が必要です。
- プライバシーに配慮し、機密情報は暗号化を検討してください。
ライセンス
MIT
詳細は GitHub リポジトリ を参照してください。