Gere embeddings de documentos em uma tabela vetorial com AI Inference
Transforme os documentos de um bucket em trechos com vetores de um modelo de embedding do AI Inference, armazenados em uma tabela vetorial do SQL Database.
Você transforma um documento armazenado no Object Storage em trechos, gera o embedding de cada trecho com um modelo do AI Inference e armazena os trechos e os seus vetores em uma tabela do SQL Database, a partir de uma function e da API da Azion. Para consultar a tabela por significado depois que ela guardar vetores, consulte Vector search.
Uma etapa de recuperação encontra trechos comparando vetores, então cada trecho precisa de um, produzido pelo mesmo modelo e na mesma largura do vetor de cada pergunta posterior. A function lê um documento por requisição, gera os embeddings de todos os trechos dele em uma chamada ao modelo e os grava em uma chamada à API da Azion.
- Uma requisição indica a key de objeto de um documento, e a function lê esse documento do bucket.
- A function divide o texto em trechos.
- Uma chamada ao modelo de embedding retorna um vetor para cada trecho.
- A function monta um
DELETEpara as linhas anteriores do documento e umINSERTpor trecho e os envia ao endpoint de consulta da API da Azion. - As linhas chegam à tabela vetorial, e o índice vetorial passa a cobri-las.
Pré-requisitos
- SQL Database habilitado na sua conta. O produto está em Preview e não vem habilitado por padrão, então solicite acesso pelo Technical Support.
- Um banco de dados, o seu identificador e um personal token, armazenados como as variáveis de ambiente
SQL_DATABASE_IDeSQL_TOKEN, como descreve Grave linhas no SQL Database a partir de uma function. Uma function só grava em um banco de dados pela API da Azion, porque a conexão dela é somente leitura. - Um bucket que guarda os documentos como arquivos de texto UTF-8 ou Markdown. Para criar um e enviar os arquivos, consulte Primeiros passos com Object Storage.
- A Azion CLI instalada e autorizada e um projeto de function ao qual adicionar o código. Para criar um e fazer o deploy, consulte Faça o deploy de uma function com a Azion CLI.
Os exemplos leem o bucket my-bucket, geram embeddings com Qwen/Qwen3-Embedding-4B em 1.024 dimensões, gravam em uma tabela chamada passages e respondem em www.example.com. Substitua esses valores, <database-id>, <personal-token> e <object-key> pelos seus.
Crie a tabela vetorial
A coluna vetorial declara a largura dos vetores que guarda, e a requisição de embedding pede a mesma largura. Qwen/Qwen3-Embedding-4B retorna uma de cinco larguras, 256, 512, 1024, 2048 ou 4096, pelo campo dimensions, então uma coluna F32_BLOB(1024) corresponde a uma requisição de 1024. Um índice vetorial precisa de uma tabela com ROWID ou com uma chave primária de coluna única, e o segundo argumento dele define a métrica de distância.
Para criar a tabela e o seu índice, envie as duas instruções ao endpoint de consulta:
A API responde 200 com "state": "executed" e uma entrada por instrução. Uma instrução que falha ainda responde 200, com error no lugar de results na sua entrada, então leia as duas entradas:
O banco de dados guarda uma tabela passages vazia e o índice passages_idx. O índice adiciona uma tabela sombra, passages_idx_shadow, que uma listagem de tabelas mostra ao lado de passages.
Gere os embeddings de um documento na tabela
A function lê o documento com a classe Storage do módulo azion:storage, que recebe o nome do bucket e nenhum token. Ela envia todos os trechos em um único array input, e o modelo responde com uma entrada por item em data, em que data[].index é a posição do trecho e data[].embedding é o seu vetor. Cada vetor entra na sua instrução como texto dentro de vector('[...]').
A rota grava no banco de dados, então ela recusa uma requisição que não traz um segredo. Para armazenar esse segredo com a Azion CLI:
O comando imprime o UUID da variável que criou:
Para gerar os embeddings de um documento por requisição, use este código como entrypoint da function:
O código aplica quatro decisões:
- Um documento por requisição. Uma leitura, uma chamada ao modelo e uma escrita limitam o trabalho de cada invocação. Uma function pode usar 2 segundos de tempo de CPU e 50 chamadas
fetch()de saída por invocação. - No máximo 99 trechos por documento. O
DELETEe 99 instruçõesINSERTsomam 100 instruções, e uma chamada com 100 instruções dá certo. Um documento mais longo responde413, então divida-o em dois arquivos. - A largura é uma única constante.
DIMENSIONSdefine a requisição e precisa ser igual à larguraF32_BLOBda coluna. Uma pergunta só é comparável a um trecho quando o mesmo modelo produziu os dois vetores na mesma largura. - Uma key ausente responde
404.getlançaStorageError: Object not foundpara uma key que não guarda nenhum objeto, eBucket not foundpara um bucket que a conta não tem.
Com azion dev, Azion.AI é undefined e azion:storage lê o disco local, então faça o deploy da function, como mostra Faça o deploy de uma function com a Azion CLI, e teste-a lá. Depois envie um documento:
A function responde com a key e o número de trechos que armazenou, como {"key":"<object-key>","passages":3}. Uma requisição sem o header Authorization responde 401. A tabela guarda uma linha por trecho do documento, cada uma com o seu vetor.
Confirme que os trechos trazem vetores
Para contar as linhas do documento que guardam um vetor, envie um SELECT ao endpoint de consulta:
A única entrada em data traz results, cuja única linha guarda o número que a function retornou:
Cada trecho do documento traz um vetor, e vector_top_k em passages_idx pode retorná-lo. Um vetor de consulta também precisa vir de Qwen/Qwen3-Embedding-4B em 1.024 dimensões.