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
| NOME | TIPO | DESCRIÇÃO |
|---|---|---|
| colecao | string | Nome da coleção onde o documento será inserido. |
| id | string | Identificador único do documento. Se nulo ou vazio, é gerado automaticamente um UUID. |
| embedding | Values | Lista de valores numéricos que representam o vetor do documento. |
| texto | string | Conteúdo textual do documento a guardar. |
| metadados | Values | Objeto 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
| NOME | TIPO | DESCRIÇÃO |
|---|---|---|
| colecao | string | Nome da coleção onde o documento será inserido. |
| embedding | Values | Lista de valores numéricos que representam o vetor do documento. |
| texto | string | Conteúdo textual do documento a guardar. |
| metadados | Values | Objeto 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
| NOME | TIPO | DESCRIÇÃO |
|---|---|---|
| colecao | string | Nome da coleção onde os documentos serão inseridos. |
| documentos | Values | Lista 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
| NOME | TIPO | DESCRIÇÃO |
|---|---|---|
| colecao | string | Nome 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
| NOME | TIPO | DESCRIÇÃO |
|---|---|---|
| colecao | string | Nome 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.