문자열 데이터를 사용하여 유사도 검색 애플리케이션을 강화하는 방법
표지
Milvus 2.1에는 Milvus 작업을 훨씬 더 쉽게 만들어주는 몇 가지 중요한 업데이트가 포함되어 있습니다. 그 중 하나가 바로 문자열 데이터 유형 지원입니다. 현재 Milvus는 문자열, 벡터, 부울, 정수, 부동 소수점 숫자 등의 데이터 유형을 지원합니다.
이 문서에서는 문자열 데이터 유형 지원에 대해 소개합니다. 이를 통해 무엇을 할 수 있는지, 어떻게 사용하는지 읽어보고 배워보세요.
이동하기:
문자열 데이터 유형 지원은 사용자들이 가장 기대했던 기능 중 하나였습니다. Milvus 벡터 데이터베이스로 애플리케이션을 구축하는 과정을 간소화하고 유사도 검색 및 벡터 쿼리 속도를 가속화하여 작업 중인 애플리케이션의 효율성을 크게 높이고 유지 관리 비용을 절감할 수 있습니다.
특히 Milvus 2.1은 다양한 길이의 문자 문자열을 저장하는 VARCHAR 데이터 유형을 지원합니다. VARCHAR 데이터 유형을 지원하면 다음과 같이 할 수 있습니다:
- 외부 관계형 데이터베이스의 도움 없이 문자열 데이터를 직접 관리할 수 있습니다.
밀버스에 데이터를 삽입할 때 문자열을 다른 데이터 유형으로 변환하는 단계를 생략할 수 있습니다. 온라인 서점을 위한 도서 검색 시스템을 개발 중이라고 가정해 보겠습니다. 도서 데이터 세트를 생성하고 있으며 이름으로 책을 식별하려고 합니다. Milvus가 문자열 데이터 유형을 지원하지 않는 이전 버전에서는 MIilvus에 데이터를 삽입하기 전에 먼저 MySQL과 같은 관계형 데이터베이스를 사용하여 문자열(책 이름)을 책 ID로 변환해야 할 수 있습니다. 지금은 문자열 데이터 유형이 지원되므로 문자열 필드를 생성하고 ID 번호 대신 책 이름을 직접 입력하면 됩니다.
이러한 편의성은 검색 및 쿼리 프로세스에도 적용됩니다. 헬로 밀버스라는 책을 가장 좋아하는 고객이 있다고 가정해 봅시다. 시스템에서 비슷한 책을 검색하여 고객에게 추천하고 싶다고 가정해 보겠습니다. 이전 버전의 Milvus에서는 시스템에서 도서 ID만 반환하므로 관계형 데이터베이스에서 해당 도서 정보를 확인하기 위해 추가 단계를 수행해야 합니다. 하지만 Milvus 2.1에서는 책 이름이 포함된 문자열 필드를 이미 생성했기 때문에 책 이름을 직접 가져올 수 있습니다.
한마디로 문자열 데이터 유형을 지원하므로 문자열 데이터를 관리하기 위해 다른 도구를 사용할 필요가 없어 개발 프로세스가 크게 간소화됩니다.
다른 스칼라 데이터 유형과 마찬가지로, VARCHAR는 부울 표현식을 통해 하이브리드 검색 및 벡터 쿼리에서 속성 필터링에 사용할 수 있습니다. 특히 Milvus 2.1에서는 접두사 매칭을 수행할 수 있는 like
연산자가 추가되었습니다. 또한 ==
연산자를 사용하여 정확한 매칭을 수행할 수도 있습니다.
또한, 하이브리드 검색 및 쿼리를 가속화하기 위해 MARISA-trie 기반 역 인덱스가 지원됩니다. 계속해서 문자열 데이터로 속성 필터링을 수행하기 위해 알아야 할 모든 문자열 표현식을 읽어보고 알아보세요.
이제 문자열 데이터 유형이 매우 유용하다는 것을 알았지만, 자체 애플리케이션을 구축할 때 정확히 언제 이 데이터 유형을 사용해야 할까요? 다음에서는 문자열 데이터가 포함될 수 있는 시나리오의 몇 가지 코드 예시를 통해 Milvus 2.1에서 VARCHAR 데이터를 관리하는 방법을 더 잘 이해할 수 있습니다.
컬렉션 만들기
이전 예제를 따라해 보겠습니다. 여전히 도서 추천 시스템에서 작업 중이며 book_name
이라는 기본 키 필드를 사용하여 문자열 데이터를 삽입할 도서 컬렉션을 만들고자 합니다. 이 경우 아래 예시와 같이 필드 스키마를 설정할 때 데이터 유형을 DataType.VARCHAR
으로 설정할 수 있습니다.
VARCHAR 필드를 만들 때는 1에서 65,535 사이의 값을 사용할 수 있는 max_length
매개변수를 통해 최대 문자 길이를 지정해야 합니다. 이 예에서는 최대 길이를 200으로 설정했습니다.
from pymilvus import CollectionSchema, FieldSchema, DataType
book_id = FieldSchema(
name="book_id",
dtype=DataType.INT64,
)
book_name = FieldSchema(
name="book_name",
dtype=DataType.VARCHAR,
max_length=200,
is_primary=True,
)
word_count = FieldSchema(
name="word_count",
dtype=DataType.INT64,
)
book_intro = FieldSchema(
name="book_intro",
dtype=DataType.FLOAT_VECTOR,
dim=2
)
schema = CollectionSchema(
fields=[book_id, word_count, book_intro],
description="Test book search"
)
collection_name = "book"
데이터 삽입
이제 컬렉션이 생성되었으므로 컬렉션에 데이터를 삽입할 수 있습니다. 다음 예제에서는 무작위로 생성된 문자열 데이터 2,000행이 삽입됩니다.
import random
data = [
[i for i in range(2000)],
["book_" + str(i) for i in range(2000)],
[i for i in range(10000, 12000)],
[[random.random() for _ in range(2)] for _ in range(2000)],
]
데이터 삭제
book_0
및 book_1
이라는 이름의 책 두 권을 스토어에서 더 이상 사용할 수 없으므로 데이터베이스에서 관련 정보를 삭제하려고 한다고 가정해 보겠습니다. 이 경우 아래 예시와 같이 in
표현식을 사용하여 삭제할 엔티티를 필터링할 수 있습니다.
Milvus는 기본 키가 명확하게 지정된 엔티티만 삭제할 수 있으므로 다음 코드를 실행하기 전에 book_name
필드를 기본 키 필드로 설정했는지 확인하세요.
expr = "book_name in [\"book_0\", \"book_1\"]"
from pymilvus import Collection
collection = Collection("book")
collection.delete(expr)
색인 구축
Milvus 2.1은 문자열 필드의 필터링 속도를 크게 높여주는 스칼라 인덱스 구축을 지원합니다. 벡터 인덱스 구축과 달리, 스칼라 인덱스 구축 전에 매개변수를 준비할 필요가 없습니다. Milvus는 일시적으로 사전 트리(MARISA-trie) 인덱스만 지원하므로, VARCHAR 타입 필드의 인덱스 유형은 기본적으로 MARISA-trie입니다.
인덱스 생성 시 인덱스 이름을 지정할 수 있습니다. 지정하지 않으면 index_name
의 기본값은 "_default_idx_"
입니다. 아래 예제에서는 scalar_index
로 인덱스 이름을 지정했습니다.
from pymilvus import Collection
collection = Collection("book")
collection.create_index(
field_name="book_name",
index_name="scalar_index",
)
하이브리드 검색
부울 표현식을 지정하면 벡터 유사도 검색 중에 문자열 필드를 필터링할 수 있습니다.
예를 들어 헬로 밀버스와 가장 유사한 소개를 가진 책을 검색하되 이름이 'book_2'로 시작하는 책만 가져오려면 아래 예와 같이 like
연산자를 사용하여 접두사 일치를 수행하여 대상 책을 가져올 수 있습니다.
search_param = {
"data": [[0.1, 0.2]],
"anns_field": "book_intro",
"param": {"metric_type": "L2", "params": {"nprobe": 10}},
"limit": 2,
"expr": "book_name like \"Hello%\"",
}
res = collection.search(**search_param)
문자열 표현식
새로 추가된 연산자 like
외에도 이전 버전의 Milvus에서 이미 지원되던 다른 연산자도 문자열 필드 필터링에 사용할 수 있습니다. 다음은 일반적으로 사용되는 문자열 표현식의 몇 가지 예입니다. A
는 VARCHAR 유형의 필드를 나타냅니다. 아래의 모든 문자열 표현식은 AND, OR, NOT과 같은 논리 연산자를 사용하여 논리적으로 결합할 수 있다는 점을 기억하세요.
집합 연산
in
및 not in
을 사용하여 A in ["str1", "str2"]
과 같은 집합 연산을 구현할 수 있습니다.
두 문자열 필드 비교
관계형 연산자를 사용하여 두 문자열 필드의 값을 비교할 수 있습니다. 이러한 관계형 연산자에는 ==
, !=
, >
, >=
, <
, <=
등이 있습니다. 자세한 내용은 관계형 연산자를 참조하세요.
문자열 필드는 다른 데이터 유형의 필드가 아닌 다른 문자열 필드와만 비교할 수 있습니다. 예를 들어 VARCHAR 타입의 필드는 부울 타입의 필드나 정수 타입의 필드와 비교할 수 없습니다.
상수 값과 필드 비교
==
또는 !=
을 사용하여 필드 값이 상수 값과 같은지 확인할 수 있습니다.
단일 범위로 필드 필터링
>
, >=
, <
, <=
을 사용하여 A > "str1"
과 같이 단일 범위의 문자열 필드를 필터링할 수 있습니다.
접두사 일치
앞서 언급했듯이 Milvus 2.1에서는 A like "prefix%"
과 같은 접두사 일치를 위해 like
연산자를 추가했습니다.
다음 업데이트
Milvus 2.1의 공식 출시와 함께 새로운 기능을 소개하는 블로그 시리즈를 준비했습니다. 이 블로그 시리즈에서 자세히 읽어보세요:
Like the article? Spread the word