Pular para o conteúdo principal

AI PostgreVectorStore

Armazenamento vetorial baseado em PostgreSQL com a extensão pgvector.

Permite guardar, pesquisar e gerir documentos com os seus embeddings vetoriais em coleções isoladas por fornecedor. Suporta pesquisa por similaridade coseno, filtragem por metadados e inserção em lote com transação atómica.

A extensão pgvector é verificada e instalada automaticamente se não estiver presente. As tabelas de suporte são criadas automaticamente na primeira inicialização.

const vector = _ai.vector('default')
const client = _ai.client()
const chunker = _ai.contextRetrievalChunker()

// Criar a coleção se ainda não existir
if (!vector.collectionExists('netuno')) {
vector.createCollection('netuno', 768)
}

// Recolher todos os ficheiros Markdown recursivamente
const files = collectFiles(_app.folder(_app.pathStorage() + '/netuno_docs'))

for (const path of files) {
const file = _app.file(path)
if (file.exists()) {
const content = file.input().readAllAndClose()
const chunks = chunker.markdown(content, 1500 * 3, 400)
for (const chunk of chunks) {
const options = _val.init()
.set('encoding_format', 'float')
.set('dimensions', 768)
const embeddingResponse = client.embeddings(
'embeddinggemma:latest',
chunk.get('text'),
options
)
const embedding = embeddingResponse.get('data').get(0).get('embedding')
vector.add('netuno', embedding, chunk.get('text'), null)
}
}
}

function collectFiles(folder) {
const list = _val.list()
folder.list().forEach(item => {
if (item.isDirectory()) {
collectFiles(item).forEach(f => list.add(f))
} else {
const path = item.fullPath()
if (path.endsWith('.md') || path.endsWith('.mdx')) {
list.add(path)
}
}
})
return list
}

add


add(colecao: string, id: string, embedding: Values, texto: string, metadados: Values) : void

Descrição

Insere ou atualiza um documento numa coleção com um ID explícito. Se a coleção ainda não existir, é criada automaticamente com as dimensões do embedding fornecido. Se já existir um documento com o mesmo ID, o conteúdo, embedding e metadados são atualizados.

Como Usar
const options = _val.init()
.set('encoding_format', 'float')
.set('dimensions', 768)

const embeddingResponse = client.embeddings('embeddinggemma:latest', 'Texto do documento.', options)
const embedding = embeddingResponse.get('data').get(0).get('embedding')

vector.add('netuno', 'doc-001', embedding, 'Texto do documento.', _val.map().set('fonte', 'web'))
Atributos
NOMETIPODESCRIÇÃO
colecaostringNome da coleção onde o documento será inserido.
idstringIdentificador único do documento. Se nulo ou vazio, é gerado automaticamente um UUID.
embeddingValuesLista de valores numéricos que representam o vetor do documento.
textostringConteúdo textual do documento a guardar.
metadadosValuesObjeto com metadados arbitrários associados ao documento, utilizável para filtragem em pesquisas. Pode ser nulo.
Retorno

( void )


add(colecao: string, embedding: Values, texto: string, metadados: Values) : void

Descrição

Insere ou atualiza um documento numa coleção com um ID gerado automaticamente. Se a coleção ainda não existir, é criada automaticamente com as dimensões do embedding fornecido. Se já existir um documento com o mesmo ID, o conteúdo, embedding e metadados são atualizados.

Como Usar
const options = _val.init()
.set('encoding_format', 'float')
.set('dimensions', 768)

const embeddingResponse = client.embeddings('embeddinggemma:latest', 'Texto do documento.', options)
const embedding = embeddingResponse.get('data').get(0).get('embedding')

vector.add('netuno', embedding, 'Texto do documento.', _val.map().set('fonte', 'web'))
Atributos
NOMETIPODESCRIÇÃO
colecaostringNome da coleção onde o documento será inserido.
embeddingValuesLista de valores numéricos que representam o vetor do documento.
textostringConteúdo textual do documento a guardar.
metadadosValuesObjeto com metadados arbitrários associados ao documento, utilizável para filtragem em pesquisas. Pode ser nulo.
Retorno

( void )


addBatch


addBatch(colecao: string, documentos: Values) : void

Descrição

Insere ou atualiza múltiplos documentos numa coleção numa única transação atómica. Se algum documento falhar, toda a operação é revertida. Cada item da lista deve ser um objeto com os campos text (obrigatório), embedding (obrigatório), id (opcional, gerado automaticamente se ausente) e metadata (opcional).

Como Usar
const options = _val.init().set('encoding_format', 'float').set('dimensions', 768)

const documentos = _val.list()

const textos = _val.list().add('Primeiro documento.').add('Segundo documento.')
const embeddingResponse = client.embeddings('embeddinggemma:latest', textos, options)

const data = embeddingResponse.get('data')
for (let i = 0; i < data.size(); i++) {
const item = data.get(i)
documentos.add(
_val.map()
.set('text', textos.get(i))
.set('embedding', item.get('embedding'))
.set('metadata', _val.map().set('index', i))
)
}

vector.addBatch('netuno', documentos)
Atributos
NOMETIPODESCRIÇÃO
colecaostringNome da coleção onde os documentos serão inseridos.
documentosValuesLista de documentos. Cada item deve conter: text (texto do documento), embedding (vetor numérico), id (opcional) e metadata (opcional).
Retorno

( void )


collectionExists


collectionExists(colecao: string) : boolean

Descrição

Verifica se uma coleção existe para o fornecedor configurado.

Como Usar
if (!store.collectionExists('artigos')) {
store.createCollection('artigos', 1536)
}
Atributos
NOMETIPODESCRIÇÃO
colecaostringNome da coleção a verificar.
Retorno

( boolean )

Verdadeiro se a coleção existe, falso caso contrário.


count


count(colecao: string) : int

Descrição

Retorna o número total de documentos numa coleção para o fornecedor configurado.

Como Usar
const total = store.count('artigos')
_log.info('Total de documentos: ' + total)
Atributos
NOMETIPODESCRIÇÃO
colecaostringNome da coleção a contar.
Retorno

( int )

Número total de documentos na coleção. Retorna 0 se a coleção não existir ou estiver vazia.


createCollection


createCollection(colecao: string, dimensoes: int) : boolean

Descrição

Cria explicitamente uma coleção com um número fixo de dimensões. Se a coleção já existir, a operação é ignorada silenciosamente e retorna false. Normalmente não é necessário chamar este método diretamente, pois a coleção é criada automaticamente na primeira chamada a add ou addBatch.

Como Usar
const criada = store.createCollection('artigos', 1536)
if (criada) {
_log.info('Coleção criada com sucesso.')
}
Atributos
NOMETIPODESCRIÇÃO
colecaostringNome da coleção a criar.
dimensoesintNúmero de dimensões dos vetores desta coleção. Deve ser maior que zero e consistente com o modelo de embeddings utilizado.
Retorno

( boolean )

Verdadeiro se a coleção foi criada, falso se já existia.


delete


delete(colecao: string, id: string) : void

Descrição

Remove um documento específico de uma coleção pelo seu ID. Se o ID não existir, a operação é ignorada silenciosamente.

Como Usar
store.delete('artigos', 'doc-001')
Atributos
NOMETIPODESCRIÇÃO
colecaostringNome da coleção que contém o documento.
idstringIdentificador único do documento a remover.
Retorno

( void )


deleteCollection


deleteCollection(colecao: string) : void

Descrição

Remove uma coleção inteira e todos os seus documentos. A operação é em cascata: apagar a coleção apaga automaticamente todos os documentos associados.

Como Usar
store.deleteCollection('artigos')
Atributos
NOMETIPODESCRIÇÃO
colecaostringNome da coleção a remover.
Retorno

( void )


getProvider


getProvider() : string

Retorno

( string )


init


init() : void

Retorno

( void )


isInitialized


isInitialized() : boolean

Retorno

( boolean )


listCollections


listCollections() : Values

Descrição

Lista todas as coleções existentes para o fornecedor configurado, incluindo o número de dimensões e o total de documentos em cada uma.

Como Usar
const colecoes = store.listCollections()

for (const c of colecoes) {
_log.info(c.get('name') + ' | dims: ' + c.get('dimensions') + ' | docs: ' + c.get('count'))
}
Retorno

( Values )

Lista de coleções, cada uma com os campos: name (nome da coleção), dimensions (número de dimensões) e count (total de documentos).


provider


provider(provider: string) : org.netuno.tritao.ai.vector.VectorStore

Atributos
NOMETIPODESCRIÇÃO
providerstring
Retorno

( org.netuno.tritao.ai.vector.VectorStore )



search(colecao: string, embedding: Values, topK: int) : Values

Descrição

Pesquisa os documentos mais similares ao embedding fornecido numa coleção, utilizando distância coseno. Retorna os topK documentos mais próximos, ordenados por pontuação de similaridade decrescente.

Como Usar
const resultados = store.search('artigos', embedding, 5)

for (const r of resultados) {
_log.info('Score: ' + r.get('score') + ' | ' + r.get('text'))
}
Atributos
NOMETIPODESCRIÇÃO
colecaostringNome da coleção onde a pesquisa será realizada.
embeddingValuesVetor de consulta para comparação com os documentos armazenados.
topKintNúmero máximo de resultados a retornar.
Retorno

( Values )

Lista de documentos correspondentes, cada um com os campos: id, text, embedding, metadata, score (0.0–1.0) e timestamp.


search(colecao: string, embedding: Values, topK: int, filtro: Values) : Values

Descrição

Pesquisa os documentos mais similares ao embedding fornecido numa coleção, com filtragem adicional por metadados. O filtro é aplicado como correspondência exata por subconjunto JSON (operador @> do PostgreSQL). Retorna os topK documentos mais próximos que satisfaçam o filtro, ordenados por pontuação de similaridade decrescente.

Como Usar
const filtro = _val.map().set('fonte', 'pdf')

const resultados = store.search('artigos', embedding, 5, filtro)

for (const r of resultados) {
_log.info('Score: ' + r.get('score') + ' | ' + r.get('text'))
}
Atributos
NOMETIPODESCRIÇÃO
colecaostringNome da coleção onde a pesquisa será realizada.
embeddingValuesVetor de consulta para comparação com os documentos armazenados.
topKintNúmero máximo de resultados a retornar.
filtroValuesObjeto de metadados para filtrar os resultados. Apenas documentos cujos metadados contenham todos os pares chave-valor do filtro são retornados.
Retorno

( Values )

Lista de documentos correspondentes, cada um com os campos: id, text, embedding, metadata, score (0.0–1.0) e timestamp.