O que e Busca Semantica?
Busca semantica vai alem de palavras-chave: encontra documentos por significado, nao por correspondencia exata. Um usuario que busca "como aprender programacao" encontra artigos sobre "introducao ao desenvolvimento de software" mesmo sem as palavras exatas.
A base tecnica sao embeddings — vetores numericos que representam o significado de um texto no espaco multidimensional.
Schema: Adicionando Embeddings ao Article
DEFINE TABLE article SCHEMAFULL;
DEFINE FIELD slug ON article TYPE string;
DEFINE FIELD title ON article TYPE object;
DEFINE FIELD content ON article TYPE object;
DEFINE FIELD content_embedding ON article TYPE option<array<float>>
COMMENT "Vetor 1536-dim gerado a partir do content.pt";
-- Indice HNSW para similaridade de cosseno
DEFINE INDEX idx_content_embedding ON article
FIELDS content_embedding
HNSW DIMENSION 1536
DIST COSINE
EFC 150 M 16;Gerando Embeddings com Cloudflare AI
export async function generateEmbedding(
text: string,
ai: Ai
): Promise<number[]> {
const result = await ai.run("@cf/baai/bge-base-en-v1.5", {
text: [text.slice(0, 512)],
})
return result.data[0]
}
export async function updateArticleEmbedding(
db: Surreal,
ai: Ai,
slug: string,
contentPt: string
) {
const embedding = await generateEmbedding(contentPt, ai)
await db.query(
"UPDATE article SET content_embedding = $emb WHERE slug = $slug",
{ emb: embedding, slug }
)
}@cf/baai/bge-base-en-v1.5 esta no plano free do Cloudflare AI. Para melhor precisao em portugues, use multilingual-e5-large (pago) ou a API da OpenAI com o modelo text-embedding-3-small.Query de Artigos Relacionados por Similaridade
export async function listRelatedArticles(
query: QueryFn,
currentSlug: string,
embedding: number[],
limit = 3
): Promise<ArticleSummary[]> {
const [rows] = await query<[ArticleSummary[]]>(
`SELECT
slug,
title.pt AS title,
excerpt.pt AS excerpt,
category,
tags,
cover,
author.name AS author_name,
vector::similarity::cosine(content_embedding, $embedding) AS score
FROM article
WHERE content_embedding != NONE
AND slug != $currentSlug
AND status = "published"
ORDER BY score DESC
LIMIT $limit`,
{ embedding, currentSlug, limit }
)
return rows ?? []
}Fluxo Completo de Publicacao
O fluxo ao publicar um artigo com embeddings:
- Gestor aprova artigo (status: published)
- Evento SurrealDB dispara webhook no Workers
- Worker chama Cloudflare AI para gerar embedding
- Embedding salvo no campo
content_embedding - Pagina /blog/:slug exibe artigos relacionados semanticamente
REBUILD INDEX idx_content_embedding ON article para reotimizar a estrutura HNSW. Para novos artigos, o indice e atualizado automaticamente.Prompt para Gerar Metadados com IA
Analise o artigo abaixo e gere os metadados otimizados para SEO e busca semantica.
Retorne APENAS um JSON valido (sem markdown, sem explicacao):
Artigo: CONTEUDO_DO_ARTIGO
Conclusao
SurrealDB com HNSW transforma seu banco em motor de busca semantica sem servicos externos. Embeddings via Cloudflare AI ficam dentro da mesma infraestrutura, com custo zero no plano free. O resultado sao recomendacoes de conteudo verdadeiramente relevantes para cada leitor.
Escrito por
Autor
Autor(a) do Portal Marina Bernardi.
Continue lendo