メモリの概要
メモリは、エージェントが利用可能なコンテキストを管理する方法であり、すべてのチャットメッセージをコンテキストウィンドウに凝縮したものです。
コンテキストウィンドウ
コンテキストウィンドウは、任意の時点で言語モデルに見える総情報です。
Mastraでは、コンテキストは3つの部分に分かれています:システム指示とユーザーに関する情報(working memory)、最近のメッセージ(メッセージ履歴)、そしてユーザーのクエリに関連する古いメッセージ(semantic recall)です。
Working memoryは異なるスコープで持続できます - 会話スレッドごと(デフォルト)または同じユーザーのすべてのスレッド間(リソーススコープ)で、会話間でコンテキストを記憶する永続的なユーザープロファイルを可能にします。
さらに、コンテキストが長すぎる場合にコンテキストをトリミングしたり情報を削除したりするためのmemory processorsを提供しています。
クイックスタート
メモリの動作を最も早く確認する方法は、組み込みの開発プレイグラウンドを使用することです。
まだ作成していない場合は、メインのGetting Startedガイドに従って新しいMastraプロジェクトを作成してください。
1. メモリパッケージをインストールします:
npm install @mastra/memory@latest
2. エージェントを作成し、Memory
インスタンスをアタッチします:
import { Agent } from "@mastra/core/agent";
import { Memory } from "@mastra/memory";
import { openai } from "@ai-sdk/openai";
import { LibSQLStore } from "@mastra/libsql";
// Initialize memory with LibSQLStore for persistence
const memory = new Memory({
storage: new LibSQLStore({
url: "file:../mastra.db", // Or your database URL
}),
});
export const myMemoryAgent = new Agent({
name: "MemoryAgent",
instructions: "...",
model: openai("gpt-4o"),
memory,
});
3. 開発サーバーを起動します:
npm run dev
4. プレイグラウンド(http://localhost:4111)を開き、`MemoryAgent`を選択します:
いくつかのメッセージを送信し、ターン間で情報を記憶していることを確認してください:
➡️ You: My favorite color is blue.
⬅️ Agent: Got it! I'll remember that your favorite color is blue.
➡️ You: What is my favorite color?
⬅️ Agent: Your favorite color is blue.
Memory Threads
Mastraはメモリをスレッドに整理します。これは特定の会話履歴を識別するレコードで、2つの識別子を使用します:
threadId
: 特定の会話ID(例:support_123
)。resourceId
: 各スレッドを所有するユーザーまたはエンティティID(例:user_123
、org_456
)。
resourceId
はリソーススコープ作業メモリにおいて特に重要で、同じユーザーのすべての会話スレッド間でメモリを永続化することができます。
const response = await myMemoryAgent.stream("Hello, my name is Alice.", {
resourceId: "user_alice",
threadId: "conversation_123",
});
重要: これらのIDがないと、メモリが適切に設定されていてもエージェントはメモリを使用しません。プレイグラウンドではこれを自動的に処理しますが、アプリケーションでメモリを使用する際は自分でIDを追加する必要があります。
スレッドタイトル生成
Mastraは、ユーザーの最初のメッセージに基づいて会話スレッドの意味のあるタイトルを自動生成できます。これにより、アプリケーションUIで会話を整理し、識別するのに役立ちます。
const memory = new Memory({
options: {
threads: {
generateTitle: true, // 自動タイトル生成を有効にする
},
},
});
デフォルトでは、タイトル生成はエージェントと同じモデルを使用します。コスト最適化のために、タイトル生成専用により安価なモデルを指定できます:
const memory = new Memory({
options: {
threads: {
generateTitle: {
model: openai("gpt-4.1-nano"), // タイトル用により安価なモデルを使用
},
},
},
});
タイトル生成はエージェントが応答した後に非同期で実行されるため、応答時間に影響しません。詳細と例については、完全な設定リファレンスを参照してください。
会話履歴
デフォルトでは、Memory
インスタンスは現在のMemoryスレッドから最新の10件のメッセージを各新規リクエストに含めます。これにより、エージェントに即時の会話コンテキストが提供されます。
const memory = new Memory({
options: {
lastMessages: 10,
},
});
重要: 各エージェント呼び出しでは、最新のユーザーメッセージのみを送信してください。Mastraは必要な履歴の取得と挿入を処理します。履歴全体を自分で送信すると重複が発生します。useChat
フロントエンドフックを使用する場合の処理方法については、AI SDK Memoryの例を参照してください。
ストレージ設定
会話履歴はメッセージを保存するためにストレージアダプターに依存しています。 デフォルトでは、メインのMastraインスタンス に提供されたものと同じストレージを使用します。
Memory
インスタンスもMastra
オブジェクトもストレージプロバイダーを指定していない場合、Mastraはアプリケーションの再起動やデプロイメント間でメモリデータを永続化しません。ローカルテスト以外のデプロイメントでは、Mastra
またはnew Memory()
内で直接独自のストレージ設定を提供する必要があります。
Mastra
インスタンスにstorage
が指定されている場合、エージェントに接続されているすべてのMemory
で自動的に使用されます。その場合、エージェントごとのオーバーライドが必要でない限り、new Memory()
にstorage
を渡す必要はありません。
import { Memory } from "@mastra/memory";
import { Agent } from "@mastra/core/agent";
import { LibSQLStore } from "@mastra/libsql";
const agent = new Agent({
memory: new Memory({
storage: new LibSQLStore({
url: "file:./local.db",
}),
}),
});
ストレージコードの例:
次のステップ
コアコンセプトを理解したところで、セマンティック検索に進んで、MastraエージェントにRAGメモリを追加する方法を学びましょう。