Stockage vectoriel PG
La classe PgVector permet d'effectuer des recherches vectorielles dans PostgreSQL à l'aide de l'extension pgvector. Elle offre des fonctionnalités fiables de recherche par similarité vectorielle au sein de votre base de données PostgreSQL existante.
Options du constructeurLien direct vers Options du constructeur
connectionString?:
host?:
port?:
database?:
user?:
password?:
ssl?:
schemaName?:
max?:
idleTimeoutMillis?:
pgPoolOptions?:
disableInit?:
createIndex sont ignorées. Cette option est utile pour les pipelines CI/CD où le schéma et les index sont gérés séparément et où le rôle de base de données utilisé à l’exécution ne dispose pas des privilèges DDL. Elle peut également être activée avec la variable d’environnement MASTRA_DISABLE_STORAGE_INIT.Exemples de constructeurLien direct vers Exemples de constructeur
Chaîne de connexionLien direct vers Chaîne de connexion
import { PgVector } from '@mastra/pg'
const vectorStore = new PgVector({
id: 'pg-vector',
connectionString: 'postgresql://user:password@localhost:5432/mydb',
})
Configuration de l’hôte, du port et de la base de donnéesLien direct vers Configuration de l’hôte, du port et de la base de données
const vectorStore = new PgVector({
id: 'pg-vector',
host: 'localhost',
port: 5432,
database: 'mydb',
user: 'postgres',
password: 'password',
})
Configuration avancéeLien direct vers Configuration avancée
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,
},
})
MéthodesLien direct vers Méthodes
createIndex()Lien direct vers createindex
indexName:
dimension:
metric?:
indexConfig?:
buildIndex?:
metadataIndexes?:
IndexConfigLien direct vers indexconfig
type:
flat:
ivfflat:
hnsw:
ivf?:
lists?:
hnsw?:
m?:
efConstruction?:
Besoins en mémoireLien direct vers Besoins en mémoire
Les index HNSW nécessitent une quantité importante de mémoire partagée lors de leur construction. Pour 100 000 vecteurs :
- Petites dimensions (64d) : ~60 Mo avec les paramètres par défaut
- Dimensions moyennes (256d) : ~180 Mo avec les paramètres par défaut
- Grandes dimensions (384d+) : ~250 Mo ou plus avec les paramètres par défaut
Des valeurs plus élevées de M ou de efConstruction augmentent considérablement les besoins en mémoire. Ajustez les limites de mémoire partagée de votre système si nécessaire.
upsert()Lien direct vers upsert
indexName:
vectors:
metadata?:
ids?:
query()Lien direct vers query
indexName:
queryVector:
topK?:
filter?:
includeVector?:
minScore?:
options?:
ef?:
probes?:
listIndexes()Lien direct vers listindexes
Renvoie un tableau contenant les noms des index sous forme de chaînes de caractères.
describeIndex()Lien direct vers describeindex
indexName:
Renvoie :
interface PGIndexStats {
dimension: number
count: number
metric: 'cosine' | 'euclidean' | 'dotproduct'
type: 'flat' | 'hnsw' | 'ivfflat'
config: {
m?: number
efConstruction?: number
lists?: number
probes?: number
}
}
deleteIndex()Lien direct vers deleteindex
indexName:
updateVector()Lien direct vers updatevector
Met à jour un seul vecteur par ID ou par filtre de métadonnées. Vous devez fournir soit id, soit filter, mais pas les deux.
indexName:
id?:
filter?:
update:
Met à jour un vecteur existant par ID ou par filtre. L’objet de mise à jour doit contenir au moins le vecteur ou les métadonnées.
// 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()Lien direct vers deletevector
indexName:
id:
Supprime de l’index indiqué un seul vecteur identifié par son ID.
await pgVector.deleteVector({ indexName: 'my_vectors', id: 'vector123' })
deleteVectors()Lien direct vers deletevectors
Supprime plusieurs vecteurs par ID ou par filtre de métadonnées. Vous devez fournir soit ids, soit filter, mais pas les deux.
indexName:
ids?:
filter?:
disconnect()Lien direct vers disconnect
Ferme le pool de connexions à la base de données. Cette méthode doit être appelée lorsque vous avez fini d’utiliser le stockage.
buildIndex()Lien direct vers buildindex
indexName:
metric?:
indexConfig:
Construit ou reconstruit un index avec la métrique et la configuration indiquées. Tout index existant est supprimé avant la création du nouvel index.
// 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',
})
Types de réponseLien direct vers Types de réponse
Les résultats de la requête sont renvoyés au format suivant :
interface QueryResult {
id: string
score: number
metadata: Record<string, any>
vector?: number[] // Only included if includeVector is true
}
Gestion des erreursLien direct vers Gestion des erreurs
Le stockage lève des erreurs typées qui peuvent être interceptées :
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
}
}
Guide de configuration des indexLien direct vers Guide de configuration des index
Optimisation des performancesLien direct vers Optimisation des performances
Réglage d’IVFFlatLien direct vers Réglage d’IVFFlat
- Paramètre lists : définissez-le sur
sqrt(n) * 2, où n est le nombre de vecteurs - Plus de listes = meilleure précision, mais construction plus lente
- Moins de listes = construction plus rapide, mais précision potentiellement moindre
Réglage de HNSWLien direct vers Réglage de HNSW
- Paramètre m :
- 8-16 : précision moyenne, faible consommation de mémoire
- 16-32 : précision élevée, consommation de mémoire moyenne
- 32-64 : précision très élevée, forte consommation de mémoire
- efConstruction:
- 32-64 : construction rapide, bonne qualité
- 64-128 : construction plus lente, meilleure qualité
- 128-256 : construction la plus lente, qualité optimale
Comportement lors de la recréation d’un indexLien direct vers Comportement lors de la recréation d’un index
Le système détecte automatiquement les changements de configuration et ne reconstruit les index que lorsque cela est nécessaire :
- Configuration identique : l’index est conservé (aucune recréation)
- Configuration modifiée : l’index est supprimé puis reconstruit
- Cela évite les problèmes de performances dus à des recréations d’index inutiles
Bonnes pratiquesLien direct vers Bonnes pratiques
- Évaluez régulièrement la configuration de vos index pour garantir des performances optimales.
- Ajustez des paramètres tels que
listsetmen fonction de la taille du jeu de données et des exigences des requêtes. - Surveillez les performances des index avec
describeIndex()pour suivre leur utilisation - Reconstruisez régulièrement les index afin de préserver leur efficacité, en particulier après des modifications importantes des données
Accès direct au poolLien direct vers Accès direct au pool
La classe PgVector expose son pool de connexions PostgreSQL sous-jacent sous la forme d’un champ public :
pgVector.pool // instance of pg.Pool
Cela permet des usages avancés, tels que l’exécution directe de requêtes SQL, la gestion des transactions ou la surveillance de l’état du pool. Lorsque vous utilisez directement le pool :
- Il vous incombe de libérer les clients (
client.release()) après utilisation. - Le pool reste accessible après l’appel à
disconnect(), mais les nouvelles requêtes échoueront. - L’accès direct contourne toute logique de validation ou de transaction fournie par les méthodes de PgVector.
Cette conception prend en charge des cas d’usage avancés, mais impose à l’utilisateur une gestion rigoureuse des ressources.
Exemple d’utilisationLien direct vers Exemple d’utilisation
Embeddings locaux avec fastembedLien direct vers Embeddings locaux avec fastembed
Les embeddings sont des vecteurs numériques utilisés par la fonctionnalité semanticRecall de la mémoire pour retrouver les messages associés en fonction de leur sens (et non de mots-clés). Cette configuration utilise @mastra/fastembed pour générer des embeddings vectoriels.
Pour commencer, installez 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
Ajoutez ce qui suit à votre 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,
},
},
}),
})