PG 벡터 스토어
PgVector 클래스는 다음을 사용하여 벡터 검색을 제공합니다.PostgreSQL~와 함께pg벡터확대. 기존 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?:
Memory 요구 사항Memory 요구 사항에 대한 직접 링크
HNSW 인덱스는 생성 중에 상당한 공유 Memory가 필요합니다. 100,000개 벡터의 경우:
- 작은 크기(64d): 기본 설정으로 ~60MB
- 중간 크기(256d): 기본 설정에서 ~180MB
- 큰 크기(384d+): 기본 설정에서 ~250MB+
M 값이나 efConstruction 값이 높을수록 Memory 요구 사항이 크게 늘어납니다. 필요한 경우 시스템의 공유 Memory 제한을 조정하십시오.
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 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
}
}
인덱스 구성 가이드인덱스 구성 가이드에 대한 직접 링크
성능 최적화성능 최적화에 대한 직접 링크
IVFF플랫 튜닝IVFF플랫 튜닝에 대한 직접 링크
- 목록 매개변수: n이 벡터 수일 때
sqrt(n) * 2로 설정합니다. - 목록이 많을수록 정확도는 높아지지만 빌드 시간은 느려집니다.
- 목록이 적을수록 빌드 속도는 빨라지지만 정확도가 낮아질 수 있습니다.
HNSW 튜닝HNSW 튜닝에 대한 직접 링크
- m 매개변수:
- 8-16: 보통 정확도, 낮은 Memory
- 16-32: 높은 정확도, 중간 정도의 Memory
- 32-64: 매우 높은 정확도, 높은 Memory
- ef건설:
- 32-64: 빠른 빌드, 좋은 품질
- 64-128: 느린 빌드, 더 나은 품질
- 128-256: 가장 느린 빌드, 최고의 품질
인덱스 재생성 동작인덱스 재생성 동작에 대한 직접 링크
시스템은 구성 변경 사항을 자동으로 감지하고 필요한 경우에만 인덱스를 다시 작성합니다.
- 동일한 구성: 인덱스가 유지됩니다(재구성 없음).
- 변경된 구성: 인덱스가 삭제되고 다시 작성됩니다.
- 이는 불필요한 인덱스 재생성으로 인한 성능 문제를 방지합니다.
모범 사례모범 사례에 대한 직접 링크
- 최적의 성능을 보장하려면 인덱스 구성을 정기적으로 평가하세요.
- 데이터 세트 크기와 쿼리 요구 사항에 따라
lists와m같은 매개변수를 조정하세요. - 인덱스 성능 모니터링: 사용량을 추적하려면
describeIndex()를 사용하세요. - 특히 데이터가 크게 변경된 후에는 효율성을 유지할 수 있도록 인덱스를 주기적으로 재구축하세요.
수영장 직접 이용 가능수영장 직접 이용 가능에 대한 직접 링크
PgVector 클래스는 기반 PostgreSQL 연결 풀을 public 필드로 노출합니다.
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,
},
},
}),
})