PG ベクターストア
PgVector クラスは、PostgreSQL で pgvector 拡張を導入したベクトル検索を提供します。 既存の PostgreSQL データベース内で信頼性の高いベクトル類似検索を利用できます。
コンストラクターオプションコンストラクターオプションへの直接リンク
connectionString?:
host?:
port?:
database?:
user?:
password?:
ssl?:
schemaName?:
max?:
idleTimeoutMillis?:
pgPoolOptions?:
disableInit?:
createIndex 内での自動 DDL(スキーマ、拡張、テーブル、インデックスの作成)を省略します。スキーマとインデックスを別に管理し、ランタイムのデータベースロールに DDL 権限がない CI/CD パイプラインで役立ちます。環境変数 MASTRA_DISABLE_STORAGE_INIT でも有効にできます。コンストラクターの例コンストラクターの例への直接リンク
接続文字列接続文字列への直接リンク
import { PgVector } from '@mastra/pg'
const vectorStore = new PgVector({
id: 'pg-vector',
connectionString: 'postgresql://user:password@localhost:5432/mydb',
})
ホスト、ポート、データベースの設定ホスト、ポート、データベースの設定への直接リンク
const vectorStore = new PgVector({
id: 'pg-vector',
host: 'localhost',
port: 5432,
database: 'mydb',
user: 'postgres',
password: 'password',
})
高度な設定高度な設定への直接リンク
const vectorStore = new PgVector({
id: 'pg-vector',
connectionString: 'postgresql://user:password@localhost:5432/mydb',
schemaName: 'custom_schema',
max: 30,
idleTimeoutMillis: 60000,
pgPoolOptions: {
connectionTimeoutMillis: 5000,
allowExitOnIdle: true,
},
})
メソッドメソッドへの直接リンク
createIndex()createindexへの直接リンク
indexName:
dimension:
metric?:
indexConfig?:
buildIndex?:
metadataIndexes?:
IndexConfigindexconfigへの直接リンク
type:
flat:
ivfflat:
hnsw:
ivf?:
lists?:
hnsw?:
m?:
efConstruction?:
メモリ要件メモリ要件への直接リンク
HNSW インデックスの構築には大量の共有メモリが必要です。ベクトルが 10 万件の場合:
- 小さい次元(64d): デフォルト設定で ~60MB
- 中程度の次元(256d): デフォルト設定で ~180MB
- 大きい次元(384d 以上): デフォルト設定で ~250MB 以上
M または efConstruction の値を大きくすると、メモリ要件が大幅に増加します。必要に応じてシステムの共有メモリ上限を調整してください。
upsert()upsertへの直接リンク
indexName:
vectors:
metadata?:
ids?:
query()queryへの直接リンク
indexName:
queryVector:
topK?:
filter?:
includeVector?:
minScore?:
options?:
ef?:
probes?:
listIndexes()listindexesへの直接リンク
インデックス名を文字列の配列として返します。
describeIndex()describeindexへの直接リンク
indexName:
戻り値:
interface PGIndexStats {
dimension: number
count: number
metric: 'cosine' | 'euclidean' | 'dotproduct'
type: 'flat' | 'hnsw' | 'ivfflat'
config: {
m?: number
efConstruction?: number
lists?: number
probes?: number
}
}
deleteIndex()deleteindexへの直接リンク
indexName:
updateVector()updatevectorへの直接リンク
ID またはメタデータフィルターで単一のベクトルを更新します。id と filter のどちらか一方だけを指定する必要があります。
indexName:
id?:
filter?:
update:
ID またはフィルターで既存のベクトルを更新します。update オブジェクトには vector または metadata の少なくとも一方を指定する必要があります。
// Update by ID
await pgVector.updateVector({
indexName: 'my_vectors',
id: 'vector123',
update: {
vector: [0.1, 0.2, 0.3],
metadata: { label: 'updated' },
},
})
// Update by filter
await pgVector.updateVector({
indexName: 'my_vectors',
filter: { category: 'product' },
update: {
metadata: { status: 'reviewed' },
},
})
deleteVector()deletevectorへの直接リンク
indexName:
id:
指定したインデックスから ID で単一のベクトルを削除します。
await pgVector.deleteVector({ indexName: 'my_vectors', id: 'vector123' })
deleteVectors()deletevectorsへの直接リンク
ID またはメタデータフィルターで複数のベクトルを削除します。ids と filter のどちらか一方だけを指定する必要があります。
indexName:
ids?:
filter?:
disconnect()disconnectへの直接リンク
データベース接続プールを閉じます。ストアの使用を終えたら呼び出してください。
buildIndex()buildindexへの直接リンク
indexName:
metric?:
indexConfig:
指定したメトリクスと設定でインデックスを構築または再構築します。新しいインデックスを作成する前に、既存のインデックスを削除します。
// Define HNSW index
await pgVector.buildIndex('my_vectors', 'cosine', {
type: 'hnsw',
hnsw: {
m: 8,
efConstruction: 32,
},
})
// Define IVF index
await pgVector.buildIndex('my_vectors', 'cosine', {
type: 'ivfflat',
ivf: {
lists: 100,
},
})
// Define flat index
await pgVector.buildIndex('my_vectors', 'cosine', {
type: 'flat',
})
レスポンス型レスポンス型への直接リンク
クエリ結果は次の形式で返されます。
interface QueryResult {
id: string
score: number
metadata: Record<string, any>
vector?: number[] // Only included if includeVector is true
}
エラー処理エラー処理への直接リンク
ストアはキャッチ可能な型付きエラーをスローします。
try {
await store.query({
indexName: 'index_name',
queryVector: queryVector,
})
} catch (error) {
if (error instanceof VectorStoreError) {
console.log(error.code) // 'connection_failed' | 'invalid_dimension' | etc
console.log(error.details) // Additional error context
}
}
インデックス設定ガイドインデックス設定ガイドへの直接リンク
パフォーマンスの最適化パフォーマンスの最適化への直接リンク
IVFFlat の調整IVFFlat の調整への直接リンク
- lists パラメーター: n をベクトル数として
sqrt(n) * 2に設定します - リストが多いほど精度は上がりますが、構築時間は長くなります
- リストが少ないほど構築は速くなりますが、精度が下がる可能性があります
HNSW の調整HNSW の調整への直接リンク
- m パラメーター:
- 8〜16: 中程度の精度、少ないメモリ
- 16〜32: 高精度、中程度のメモリ
- 32〜64: 非常に高い精度、多くのメモリ
- efConstruction:
- 32〜64: 高速な構築、良好な品質
- 64〜128: 低速な構築、より良い品質
- 128〜256: 最も低速な構築、最高の品質
インデックスの再作成動作インデックスの再作成動作への直接リンク
システムは設定変更を自動検出し、必要な場合にのみインデックスを再構築します。
- 同じ設定: インデックスを保持します(再作成なし)
- 設定変更あり: インデックスを削除して再構築します
- これにより、不要なインデックス再作成によるパフォーマンス上の問題を防ぎます
ベストプラクティスベストプラクティスへの直接リンク
- 最適なパフォーマンスを確保するため、インデックス設定を定期的に評価します。
- データセットのサイズとクエリ要件に基づいて、
listsやmなどのパラメーターを調整します。 describeIndex()で使用状況を追跡し、インデックスのパフォーマンスを監視します- 特にデータが大幅に変更された後は、効率を維持するため定期的にインデックスを再構築します
プールへの直接アクセスプールへの直接アクセスへの直接リンク
PgVector クラスは、基盤となる PostgreSQL 接続プールをパブリックフィールドとして公開します。
pgVector.pool // instance of pg.Pool
これにより、SQL クエリの直接実行、トランザクション管理、プール状態の監視など、高度な使い方が可能になります。プールへ直接アクセスする場合:
- 使用後のクライアント解放(
client.release())は利用者の責任です。 disconnect()を呼び出した後もプールへアクセスできますが、新しいクエリは失敗します。- 直接アクセスすると、PgVector メソッドが提供する検証やトランザクションロジックを迂回します。
この設計は高度なユースケースに対応しますが、利用者による慎重なリソース管理が必要です。
使用例使用例への直接リンク
fastembed を使用したローカル埋め込みfastembed を使用したローカル埋め込みへの直接リンク
埋め込みは、Memory の semanticRecall がキーワードではなく意味に基づいて関連メッセージを取得するために使用する数値ベクトルです。この設定では @mastra/fastembed でベクトル埋め込みを生成します。
まず fastembed をインストールします。
- npm
- pnpm
- Yarn
- Bun
npm install @mastra/fastembed@latest
pnpm add @mastra/fastembed@latest
yarn add @mastra/fastembed@latest
bun add @mastra/fastembed@latest
Agent に次の内容を追加します。
import { Memory } from '@mastra/memory'
import { Agent } from '@mastra/core/agent'
import { PostgresStore, PgVector } from '@mastra/pg'
import { fastembed } from '@mastra/fastembed'
export const pgAgent = new Agent({
id: 'pg-agent',
name: 'PG Agent',
instructions:
'You are an AI agent with the ability to automatically recall memories from previous interactions.',
model: 'openai/gpt-5.6-sol',
memory: new Memory({
storage: new PostgresStore({
id: 'pg-agent-storage',
connectionString: process.env.DATABASE_URL!,
}),
vector: new PgVector({
id: 'pg-agent-vector',
connectionString: process.env.DATABASE_URL!,
}),
embedder: fastembed,
options: {
lastMessages: 10,
semanticRecall: {
topK: 3,
messageRange: 2,
},
},
}),
})