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:
Este post 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": "Reticulated Splines", "desc": "Specialized grooves used in advanced machinery for precise alignment.", "price": 19.99, "image": "data:image/png;base64,...", "rating": 5, "imageVector": [ -4.5390625, 0.32543945, ... ] } |
Nota: 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 Azure Computer Vision.
Observação: um dos recursos dos Capella AI services 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, requests a vector embedding 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 |
// Free tier: 20 Calls per minute, 5K Calls per month // Standard tier: 10 Calls per second, starting $1.00 USD/1000 calls (Estimated) public async Task<float[]> GetImageEmbedding(string base64Image) { var endpoint = _settings.Value.Endpoint; var subscriptionKey = _settings.Value.SubscriptionKey; using (HttpClient client = new HttpClient()) { // Set the subscription key and endpoint client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subscriptionKey); // Endpoint URL string url = $"{endpoint}/retrieval:vectorizeImage?overload=stream&api-version=2023-04-01-preview"; byte[] imageBytes = Base64PngToByteArray(base64Image); using (ByteArrayContent content = new ByteArrayContent(imageBytes)) { content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); HttpResponseMessage response = await client.PostAsync(url, content); string jsonResponse = await response.Content.ReadAsStringAsync(); if (response.IsSuccessStatusCode) { // Parse the JSON response to extract the vector embeddings JObject json = JObject.Parse(jsonResponse); JToken vectorEmbeddings = json["vector"]; return vectorEmbeddings.ToObject<float[]>(); } throw new Exception("Unable to retrieve vector embeddings for image."); } } } |
Provavelmente há frameworks 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 |
WITH closestStores AS ( /* CTE to get closest stores based on user's location */ SELECT x.name, META(x).id AS id FROM whatisthis._default.Stores x WHERE SEARCH(x, { "fields": ["*"], "query" : { "location" : { "lat" : 39.8787, "lon" : -83.0805 }, "distance" : "15mi", "field" : "geo" } . . . }) LIMIT 3 ) /* SELECT items with nearby stock */ SELECT allItems.name, allItems.`desc`, allItems.image, allItems.price, allItems.rating, SEARCH_SCORE(allItems) AS score, /* subquery to get stock from nearby locations */ (SELECT . . . ) AS stock FROM whatisthis._default.Items AS allItems /* vector search using image embedding */ WHERE SEARCH(allItems, { "fields": ["*"], "query": { "match_none": {} }, "knn": [ { "k": 4, "field": "imageVector", "vector": [ -0.9135742,1.1552734, ... ] } ] } ) ORDER BY score 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 IA
- 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:
-
- Full Text Search, incluindo scoring, facets, boosting, etc.
- Time series operações
- User-defined functions (UDFs) para adicionar código personalizado (JavaScript or SQL)
- Full SQL capabilities: 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 mobile/edge devices
- Automatic caching (built-in)
Alguns bancos de dados podem ser capazes de executar apenas um subconjunto dessas operações e exigir que você traga 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
The WITT demo application referenced is built with:
-
- React UI frontend
- ASP.NET Core backend
- Azure Computer Vision
- Couchbase .NET SDK
Você também pode conferir What is This Thing? como uma demonstração pública. (Lembre-se de que tudo é construído com hospedagem de nível gratuito (Azure e Capella Free Tier) 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!)