ベクターデータベースへの埋め込みの保存
埋め込みを生成した後は、ベクトル類似検索をサポートするデータベースに保存する必要があります。Mastra は、複数のベクターデータベースにまたがって埋め込みの保存と検索を行える統一的なインターフェースを提供します。
対応データベース
MongoDB
import { MongoDBVector } from '@mastra/mongodb'
const store = new MongoDBVector({
uri: process.env.MONGODB_URI,
dbName: process.env.MONGODB_DATABASE
})
await store.createIndex({
indexName: "myCollection",
dimension: 1536,
});
await store.upsert({
indexName: "myCollection",
vectors: embeddings,
metadata: chunks.map(chunk => ({ text: chunk.text })),
});
MongoDB Atlas Vector Search を使う
セットアップ手順やベストプラクティスの詳細は、MongoDB Atlas Vector Search の公式ドキュメント をご覧ください。
ベクターストレージの使用
初期化が完了すると、すべてのベクターストアは、インデックス作成、埋め込みのアップサート、クエリの実行に同じインターフェースを共有します。
インデックスの作成
埋め込みを保存する前に、使用する埋め込みモデルに適した次元数でインデックスを作成する必要があります:
// 次元数 1536 のインデックスを作成(text-embedding-3-small 用)
await store.createIndex({
indexName: "myCollection",
dimension: 1536,
});次元数は、選択した埋め込みモデルの出力次元と一致している必要があります。一般的な次元数は次のとおりです:
- OpenAI text-embedding-3-small: 1536 次元(またはカスタム。例: 256)
- Cohere embed-multilingual-v3: 1024 次元
- Google
text-embedding-004: 768 次元(またはカスタム)
重要: インデックスの次元数は作成後に変更できません。別のモデルを使用する場合は、インデックスを削除し、新しい次元数で再作成してください。
データベースの命名規則
各ベクターデータベースは、互換性の確保と競合の防止のため、インデックスやコレクションに特定の命名規則を設けています。
MongoDB
コレクション(インデックス)名は次の要件を満たす必要があります:
- 文字またはアンダースコアで始まること
- 最大120バイトであること
- 文字、数字、アンダースコア、またはドットのみを含むこと
$またはヌル文字を含まないこと- 例:
my_collection.123は有効 - 例:
my-indexは無効(ハイフンを含むため) - 例:
My$Collectionは無効($を含むため)
埋め込みのアップサート
インデックスを作成したら、基本的なメタデータと一緒に埋め込みを保存できます:
// 対応するメタデータとともに埋め込みを保存する
await store.upsert({
indexName: "myCollection", // index name
vectors: embeddings, // array of embedding vectors
metadata: chunks.map((chunk) => ({
text: chunk.text, // The original text content
id: chunk.id, // Optional unique identifier
})),
});アップサート操作では次のことを行います:
- 埋め込みベクトルの配列と対応するメタデータを受け取る
- 同じIDの既存ベクトルを更新する
- 存在しない場合は新しいベクトルを作成する
- 大規模データセットに対して自動的にバッチ処理する
さまざまなベクトルストアでの埋め込みのアップサートの完全な例については、Upsert Embeddings ガイドを参照してください。
メタデータの追加
ベクターストアは、フィルタリングや整理のためにリッチなメタデータ(任意の JSON シリアライズ可能なフィールド)をサポートします。メタデータは固定スキーマなしで保存されるため、予期しないクエリ結果を避けるにはフィールド名を一貫させてください。
重要: メタデータはベクターストレージにとって不可欠です。これがないと、元のテキストを返したり結果をフィルタリングしたりする手段のない数値埋め込みしか残りません。少なくともソーステキストはメタデータとして必ず保存してください。
// より良い整理とフィルタリングのために、リッチなメタデータとともに埋め込みを保存する
await store.upsert({
indexName: "myCollection",
vectors: embeddings,
metadata: chunks.map((chunk) => ({
// 基本的な内容
text: chunk.text,
id: chunk.id,
// ドキュメントの整理
source: chunk.source,
category: chunk.category,
// 時系列メタデータ
createdAt: new Date().toISOString(),
version: "1.0",
// カスタムフィールド
language: chunk.language,
author: chunk.author,
confidenceScore: chunk.score,
})),
});メタデータに関する主なポイント:
- フィールド名は厳密に統一すること — ‘category’ と ‘Category’ の不一致はクエリに影響します
- フィルタやソートに使う予定のあるフィールドのみ含めること — 余分なフィールドはオーバーヘッドになります
- コンテンツの鮮度を追跡できるようにタイムスタンプ(例: ‘createdAt’、‘lastUpdated’)を追加すること
ベストプラクティス
- 一括挿入の前にインデックスを作成する
- 大量挿入にはバッチ処理を使用する(
upsertメソッドは自動でバッチ化されます) - クエリに使用するメタデータのみを保存する
- 埋め込みの次元数をモデルに合わせる(例:
text-embedding-3-smallは 1536)