Há casos de uso que são melhor atendidos por vários tipos de acesso a dados, incluindo SQL, pesquisa vetorial, consultas geoespaciais e acesso de valor-chave. Uma abordagem é combinar/encadear vários sistemas de dados para cada método de acesso. No entanto, a abordagem Couchbase torna possível combinar esses diferentes tipos de consultas para resolver problemas do mundo real.
Este artigo aborda aspectos do aplicativo de demonstração "O que é essa coisa?". "What is This Thing?" (também conhecido como "WITT"). Para mais contexto e histórico, confira:
Esta postagem do blog faz parte do C# Advent de 2024. No entanto, você não precisa entender C# para ler este post: os conceitos são aplicáveis a qualquer um dos muitos SDKs disponíveis para o Couchbase.
Pesquisa de vetores: o básico
A busca por vetores é útil para aplicativos que precisam encontrar itens semelhantes. Por exemplo, embeddings criados por modelos de IA podem ser indexados e pesquisados. Cada item no WITT é modelado assim:
1 2 3 4 5 6 7 8 |
{ "name" (nome): "Estrias Reticuladas", "desc": "Ranhuras especializadas usadas em maquinário avançado para alinhamento preciso.", "price" (preço): 19.99, "imagem": "data:image/png;base64,...", "classificação": 5, "imageVector": [ -4.5390625, 0.32543945, ... ] } |
Observação: A imagem do item é armazenada como uma string codificada em base64. Em um projeto de produção, eu recomendaria usar armazenamento de arquivo, S3, etc., em vez de armazená-lo no banco de dados.
imageVector é recuperado carregando a imagem em um modelo de imagem de IA, como o Visão computacional do Azure.
Observação: um dos recursos dos Serviços de IA da Capella recém-anunciados é a hospedagem de modelos, o que reduzirá a latência dessa etapa e também aumentará a privacidade e a flexibilidade, além de potencialmente reduzir custos.
Incorporação de imagens e pesquisa de vizinho mais próximo
Com um índice de pesquisa vetorial no campo imageVector, o Couchbase pode executar pesquisas de vizinho mais próximo. Nesse caso, essa pesquisa encontraria itens que são visualmente semelhantes (de acordo com o modelo de IA). Então, se um usuário tem uma imagem e quer encontrar um item no Couchbase que seja mais semelhante a essa imagem, um índice de pesquisa vetorial pode fazer isso:
Aqui está o código no WITT que, para uma determinada imagem, solicita uma incorporação de vetor do Azure Computer Vision:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
// Camada gratuita: 20 chamadas por minuto, 5 mil chamadas por mês // Camada padrão: 10 chamadas por segundo, a partir de $1,00 USD/1000 chamadas (estimativa) público assíncrono Tarefa<flutuante[]> GetImageEmbedding(string base64Image) { var ponto final = _settings.Valor.Ponto final; var subscriptionKey = _settings.Valor.SubscriptionKey; usando (Cliente Http cliente = novo Cliente Http()) { // Definir a chave de assinatura e o ponto de extremidade cliente.DefaultRequestHeaders.Adicionar("Ocp-Apim-Subscription-Key", subscriptionKey); // URL do ponto de extremidade string url = $"{endpoint}/retrieval:vectorizeImage?overload=stream&api-version=2023-04-01-preview"; byte[] imageBytes = Base64PngToByteArray(base64Image); usando (ByteArrayContent conteúdo = novo ByteArrayContent(imageBytes)) { conteúdo.Cabeçalhos.ContentType = novo MediaTypeHeaderValue("application/octet-stream"); HttpResponseMessage resposta = aguardar cliente.PostAsync(url, conteúdo); string jsonResponse = aguardar resposta.Conteúdo.ReadAsStringAsync(); se (resposta.IsSuccessStatusCode) { // Analisar a resposta JSON para extrair os embeddings do vetor JObjeto json = JObjeto.Analisar(jsonResponse); JToken vetorEmbeddings = json["vetor"]; retorno vetorEmbeddings.ToObject<flutuante[]>(); } lançar novo Exceção("Não foi possível recuperar a incorporação de vetores para a imagem."); } } } |
Provavelmente há estruturas que podem lidar com essa chamada também, mas para essa demonstração simples, que requer apenas uma única chamada REST, achei isso suficiente. Se você quiser usar algo diferente do Azure com essa demonstração, precisa implementar IEmbeddingService.
Consultas multiuso com SQL++
Muitos bancos de dados com pesquisa vetorial podem executar uma operação muito semelhante. O que o Couchbase permite que você faça é executar vários tipos de operações de dados com uma única plataforma, um único conjunto de dados. Por exemplo, dada uma localização geoespacial (que pode ser recuperada por meio de um navegador da Web), você pode não apenas consultar para encontrar um item semelhante por imagem, mas também combinar isso com uma pesquisa geoespacial, tudo por meio de uma única consulta SQL++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
COM Lojas mais próximas AS ( /* CTE para obter as lojas mais próximas com base na localização do usuário */ SELECIONAR x.nome, META(x).id AS id DE o que é isso.Padrão.Lojas x ONDE PESQUISA(x, { "campos": ["*"], "query" (consulta) : { "localização" : { "lat" : 39.8787, "longo" : -83.0805 }, "distância" : "15mi", "campo" : "geo" } . . . }) LIMITE 3 ) /* SELECIONAR itens com estoque próximo */ SELECIONAR todos os itens.nome, todos os itens.`desc`, todos os itens.imagem, todos os itens.preço, todos os itens.classificação, SEARCH_SCORE(todos os itens) AS pontuação, /* subconsulta para obter estoque de locais próximos */ (SELECIONAR . . . ) AS estoque DE o que é isso.Padrão.Itens AS todos os itens /* pesquisa vetorial usando incorporação de imagem */ ONDE PESQUISA(todos os itens, { "campos": ["*"], "query" (consulta): { "match_none": {} }, "knn": [ { "k": 4, "campo": "imageVector", "vetor": [ -0.9135742,1.1552734, ... ] } ] } ) ORDEM BY pontuação DESC |
Nota: esta consulta foi editada para fins de brevidade. Confira DataLayer.cs para uma visão mais completa das consultas.
O resultado desta consulta é uma "correspondência mais provável" para uma determinada imagem. Por exemplo, aqui está o resultado principal ao carregar uma imagem de uma caneta:
A qualidade das correspondências dependerá de:
-
- A qualidade do modelo de AI
- A qualidade/quantidade das imagens para um determinado item
Em meus testes limitados, descobri que o modelo Azure Computer Vision é muito bom para combinar imagens relevantes.
O resultado também conterá lojas próximas, onde o item está disponível para compra.
Além da Pesquisa Vetorial e Geoespacial
Esta consulta mostrou a capacidade do Couchbase de combinar pesquisa vetorial e pesquisa geoespacial em uma única operação. Ela também continha um CTE, JOINs e uma subconsulta.
Em uma única consulta, você também pode executar:
-
- Pesquisa de texto completoincluindo pontuação, facetas, reforço, etc.
- Séries temporais operações
- Funções definidas pelo usuário (UDFs) para adicionar código personalizado (JavaScript ou SQL)
- Recursos completos de SQL: funções de janela, CTEs, JOINs, agregação e muito mais
- Leia dados analíticos em tempo real via write-back
- Consultar dados que são sincronizados automaticamente de dispositivos móveis/de ponta
- Automático armazenamento em cache (incorporado)
Alguns bancos de dados podem ser capazes de executar apenas um subconjunto dessas operações e exigir que você trate outras ferramentas quando precisar de funcionalidade adicional. Isso aumenta seus custos, latência e complexidade. Com o Couchbase, você pode manter seu aplicativo mais simples, rápido e barato.
Destaques técnicos
O aplicativo de demonstração do WITT mencionado foi desenvolvido com:
-
- Front-end da interface do usuário React
- Back-end do ASP.NET Core
- Visão computacional do Azure
- SDK do Couchbase .NET
Você também pode conferir O que é isso? como uma demonstração pública. (Lembre-se de que tudo é construído com hospedagem de nível gratuito (Azure e Nível gratuito Capella) e que ainda está sendo desenvolvido ativamente. Se você notar alguma lentidão ou tempo de inatividade, pode ser por causa de muito tráfego, desculpe!)