Há casos de uso que são mais bem atendidos por vários tipos de acesso a dados, incluindo SQL, pesquisa vetorial, consultas geoespaciais e acesso a valores-chave. Uma abordagem é combinar/encadear vários sistemas de dados para cada método de acesso. No entanto, a Abordagem do Couchbase torna possível combinar esses diferentes tipos de consultas para resolver problemas do mundo real.
Este artigo apresenta aspectos do aplicativo de demonstração "What is This Thing?" (também conhecido como "WITT"). Para obter mais contexto e informações básicas, consulte:
Esta postagem do blog faz parte do 2024 C# Advento. No entanto, você não precisa entender o C# para ler esta postagem: os conceitos são aplicáveis a qualquer um dos muitos SDKs disponíveis para o Couchbase.
Pesquisa vetorial: Noções básicas
A pesquisa vetorial é útil para aplicativos que precisam encontrar itens semelhantes. Por exemplo, os embeddings criados por modelos de IA podem ser indexados e pesquisados. Cada item no WITT é modelado da seguinte forma:
1 2 3 4 5 6 7 8 |
{ "name" (nome): "Reticulated Splines" (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: O imagem do item é armazenado como uma cadeia de caracteres codificada em base64. Em um projeto de produção, eu recomendaria usar o armazenamento de arquivos, S3, etc., em vez de armazená-lo no banco de dados.
imageVector
é recuperado por meio do upload da imagem para um modelo de imagem de IA, como Visão computacional do Azure.
Observação: Um dos recursos do recém-anunciado Serviços de IA da Capella é a hospedagem de modelos, o que reduzirá a latência dessa etapa, além de aumentar a privacidade e a flexibilidade e, possivelmente, reduzir os custos.
Embeddings de imagens e pesquisa do vizinho mais próximo
Com um índice de pesquisa vetorial no imageVector o Couchbase pode realizar pesquisas de vizinhos mais próximos. Nesse caso, essa pesquisa encontraria itens que são visualmente semelhantes (de acordo com o modelo de IA). Portanto, se um usuário tiver uma imagem e quiser encontrar um item no Couchbase que seja mais semelhante a essa imagem, um índice de pesquisa vetorial poderá 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 |
// Nível gratuito: 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<flutuar[]> 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<flutuar[]>(); } lançar novo Exceção("Não foi possível recuperar a incorporação de vetores para a imagem."); } } } |
Provavelmente há estruturas que também podem lidar com essa chamada, mas para esta demonstração simples, que requer apenas uma única chamada REST, achei que isso é suficiente. Se quiser usar algo diferente do Azure com esta demonstração, você precisará 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 fazer é executar vários tipos de operações de dados com uma única plataforma, um único pool 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 |
Observação: esta consulta foi editada para fins de brevidade. Confira DataLayer.cs para obter uma visão mais completa das consultas.
O resultado dessa consulta é uma "correspondência mais provável" para uma determinada imagem. Por exemplo, aqui está o principal resultado ao carregar uma imagem de uma caneta:
A qualidade das partidas dependerá de:
-
- A qualidade do modelo de IA
- A qualidade/quantidade das imagens de um determinado item
Em meus testes limitados, descobri que o modelo de visão computacional do Azure é muito bom para fazer a correspondência de 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
Essa 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, aumento, etc.
- Séries temporais operações
- Funções definidas pelo usuário (UDFs) para adicionar código personalizado (JavaScript ou SQL)
- Recursos completos de SQLFunções de janela, CTEs, JOINs, agregação e muito mais
- Leitura de dados analíticos em tempo real por meio de write-back
- Consultar dados que são automaticamente sincronizados a partir de dispositivos móveis/de ponta
- Automático armazenamento em cache (incorporado)
Aqui está a seção de marketing: Alguns bancos de dados podem ser capazes de realizar apenas um subconjunto dessas operações e exigir que você utilize outras ferramentas quando precisar de funcionalidades adicionais. Isso aumenta seus custos, a latência e a complexidade. Com o Couchbase, você pode manter seu aplicativo mais simples, mais rápido e mais barato. Seção de marketing encerrada.
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 isso foi criado com hospedagem de nível gratuito (Azure e Nível gratuito Capella) e que ele ainda está sendo desenvolvido ativamente. Se você notar alguma lentidão ou tempo de inatividade, isso pode ser devido ao excesso de tráfego, desculpe!)