SQL, 벡터 검색, 위치 기반 정보 쿼리, 키-값 액세스 등 여러 유형의 데이터 액세스가 가장 적합한 사용 사례가 있습니다. 한 가지 접근 방식은 각 액세스 방법에 대해 여러 데이터 시스템을 결합/연결하는 것입니다. 하지만 카우치베이스 접근 방식 를 사용하면 이러한 다양한 유형의 쿼리를 결합하여 실제 문제를 해결할 수 있습니다.
이 문서에서는 데모 애플리케이션인 "이게 뭐예요?"(일명 "WITT")의 여러 측면을 살펴봅니다. 자세한 맥락과 배경은 여기에서 확인하세요:
이 블로그 게시물은 2024 C# 도래. 그러나 이 게시물을 읽기 위해 C#를 이해할 필요는 없습니다. 이 개념은 다음 중 하나에 적용할 수 있습니다. 카우치베이스에 사용할 수 있는 많은 SDK.
벡터 검색: 기본 사항
벡터 검색은 유사한 항목을 찾아야 하는 애플리케이션에 유용합니다. 예를 들어, AI 모델에 의해 생성된 임베딩을 색인화하여 검색할 수 있습니다. WITT의 각 항목은 다음과 같이 모델링됩니다:
|
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, ... ] } |
참고 이미지 항목은 base64로 인코딩된 문자열로 저장됩니다. 프로덕션 프로젝트에서는 데이터베이스에 저장하는 것보다 파일 스토리지, S3 등을 사용하는 것이 좋습니다.
이미지 벡터 은 다음과 같이 이미지를 AI 이미지 모델에 업로드하여 검색됩니다. Azure 컴퓨터 비전.
참고: 방금 발표한 새로운 기능 중 하나인 카펠라 AI 서비스 는 모델 호스팅으로, 이 단계의 지연 시간을 줄이고 개인 정보 보호와 유연성을 높이며 잠재적으로 비용을 절감할 수 있습니다.
이미지 임베딩 및 가장 가까운 이웃 검색
벡터 검색 인덱스의 이미지 벡터 필드에 입력하면 카우치베이스는 가장 가까운 이웃 검색을 수행할 수 있습니다. 이 경우, 이 검색은 (AI 모델에 따라) 시각적으로 유사한 항목을 찾습니다. 따라서 사용자가 이미지를 가지고 있고 그 이미지와 가장 유사한 항목을 Couchbase에서 찾고자 하는 경우 벡터 검색 인덱스가 이를 수행할 수 있습니다:
다음은 주어진 이미지에 대한 WITT의 코드입니다, 벡터 임베딩을 요청합니다. 의 Azure 컴퓨터 비전에서
|
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."); } } } |
이 호출도 처리할 수 있는 프레임워크가 있을 수 있지만, 이 간단한 데모에서는 단 한 번의 REST 호출만 필요하므로 이것으로 충분하다는 것을 알았습니다. 이 데모에서 Azure 이외의 다른 것을 사용하려면 다음을 구현해야 합니다. IEmbeddingService.
SQL++를 사용한 다목적 쿼리
벡터 검색을 사용하는 많은 데이터베이스는 매우 유사한 작업을 수행할 수 있습니다. Couchbase를 사용하면 단일 플랫폼, 단일 데이터 풀로 여러 유형의 데이터 작업을 수행할 수 있습니다. 예를 들어, 웹 브라우저를 통해 검색할 수 있는 지리공간 위치가 주어진다면, 단일 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 |
참고: 이 쿼리는 간결성을 위해 편집되었습니다. 확인 DataLayer.cs 를 클릭하면 쿼리를 더 자세히 볼 수 있습니다.
이 쿼리의 결과는 주어진 이미지에 대해 '가장 일치할 가능성이 높은' 결과입니다. 예를 들어 펜 사진을 업로드할 때 가장 높은 결과는 다음과 같습니다:
경기의 품질은 다음과 같이 달라집니다:
-
- AI 모델의 품질
- 특정 항목에 대한 이미지의 품질/수량
제한된 테스트에서 Azure 컴퓨터 비전 모델이 관련 이미지를 일치시키는 데 매우 우수하다는 것을 알았습니다.
결과에는 해당 품목을 구매할 수 있는 인근 상점도 포함됩니다.
벡터 검색 및 지리공간을 넘어서
이 쿼리는 벡터 검색과 지리공간 검색을 단일 작업으로 결합하는 Couchbase의 기능을 보여주었습니다. 이 쿼리에는 CTE, JOIN 및 하위 쿼리도 포함되어 있습니다.
단일 쿼리 내에서 수행할 수도 있습니다:
-
- 전체 텍스트 검색득점, 패싯, 부스팅 등을 포함합니다.
- 시계열 작업
- 사용자 정의 함수(UDF) 사용자 지정 코드(JavaScript 또는 SQL) 추가용
- 전체 SQL 기능창 함수, CTE, JOIN, 집계 등
- 다음을 통해 실시간 분석 데이터에서 읽기 쓰기
- 다음에서 자동으로 동기화되는 쿼리 데이터 모바일/엣지 디바이스
- 자동 캐싱 (기본 제공)
마케팅 섹션은 다음과 같습니다.: 일부 데이터베이스는 이러한 작업의 일부만 수행할 수 있으며, 추가 기능이 필요한 경우 다른 도구를 가져와야 할 수 있습니다. 이로 인해 비용, 지연 시간, 복잡성이 증가합니다. Couchbase를 사용하면 애플리케이션을 더 간단하고, 더 빠르고, 더 저렴하게 유지할 수 있습니다. 마케팅 섹션이 끝났습니다.
기술 하이라이트
참조된 WITT 데모 애플리케이션은 다음과 같이 구축되었습니다:
-
- React UI 프론트엔드
- ASP.NET Core 백엔드
- Azure 컴퓨터 비전
- 카우치베이스 .NET SDK
다음을 확인할 수도 있습니다. 이게 뭐죠? 를 공개 데모로 사용할 수 있습니다. (모두 무료 티어 호스팅(Azure 및 카펠라 무료 티어), 그리고 여전히 활발히 개발 중이라는 점을 알려드립니다. 속도가 느려지거나 다운타임이 발생한다면 트래픽이 너무 많아서일 수 있으니 죄송합니다!)