Zilliz Cloud에서 Milvus 2.6 기능을 탐색하기 위한 개발자 가이드
Milvus는 최첨단 벡터 ANN 검색 기능을 갖춘, 확장성을 위해 구축된 고성능 오픈 소스 벡터 데이터베이스로 시작했습니다. 개발자 커뮤니티가 성장하면서 기능 요청은 전문 검색, 부스팅, 반정형 데이터 유형(JSON, struct 등) 지원까지 확대되었습니다. 이러한 요청은 AI 애플리케이션 개발을 가속화하는 데 도움이 되는 더 고급 기능(유사도 검색 외)에 대한 필요성에 의해 주도되는, 데이터베이스 기능의 융합이라는 더 넓은 흐름을 반영합니다.
이러한 융합은 기능 요청에서만 나타나는 것이 아니라, 이제 데이터베이스 자체에서도 나타납니다. Milvus 2.6에서는 개발자들이 이전에는 데이터베이스 외부에서 조립해야 했던 많은 기능들, 예를 들어 감쇠 기반 랭킹, 필드 수준 부스팅, 정형 및 비정형 데이터 전반의 하이브리드 필터링 등이 이제 일급 프리미티브가 되었습니다.
다시 말해, Milvus 2.6은 "벡터 검색 + 글루 코드"에서 더 고급 검색 엔진으로의 전환을 의미하며, 이제 Zilliz Cloud에서 Generally Available (GA)(관리형 Milvus 서비스)입니다.
이 글에서는 Milvus v2.6의 멋진 기능들 중 일부, 언제 사용해야 하는지, 그리고 어떻게 사용하는지 살펴보겠습니다. 시작해 봅시다!
임베딩 함수(Embedding Function, Data In, Data Out이라고도 함)
데이터베이스가 사용자를 대신해 임베딩 생성을 처리할 수 있을지 궁금했던 적이 있나요? Embedding Functions("Data in, data out"이라고도 함)를 사용하면 Milvus는 OpenAI, VoyageAI, Cohere와 같은 외부 서드파티 임베딩 서비스를 호출하여 원시 텍스트를 벡터로 변환할 수 있습니다.
Embedding Functions는 Milvus v2.6.0에서 처음 출시되었으며, 저는 the kafka-milvus-no-code-pipelines demo에서 이를 선보인 바 있습니다. 이제 Milvus 벡터 데이터베이스의 완전 관리형 서비스인 Zilliz Cloud에서 Embedding Functions를 사용할 수 있습니다.
임베딩 함수는 어떻게 작동하나요?
임베딩 함수가 구성된 Milvus에 "The quick brown fox jumps over the lazy dog"를 삽입한다고 해 보겠습니다. Milvus는 이를 프록시 계층에서 가로채고, 제공자별 임베딩 파이프라인을 통해 라우팅한 다음, 모델이 생성한 벡터를 저장합니다. 검색 중에는 동일한 변환이 역방향으로 일어납니다. 쿼리 텍스트는 인덱스에 도달하기 전에 벡터로 변환됩니다.
이 기능은 임베딩 워크플로 관리를 데이터베이스에 맡기고자 하는 팀에 특히 유용합니다. 데이터베이스가 수집 시점에(서드파티 모델 제공자를 통해) 투명하게 임베딩을 생성하도록 함으로써, Zilliz Cloud는 API 통합, 배칭, 재시도, 속도 제한, 실패 처리를 담당합니다.
Zilliz Cloud에서 Embedding Functions를 시작하려면 다음이 필요합니다:
- 원하는 임베딩 서비스 제공자에 대한 Model Provider Integration 설정
- Embedding Function이 정의된 컬렉션 생성
- 데이터 삽입.
올바르게 설정했다면 컬렉션 스키마 페이지의 Zilliz Cloud 콘솔에서 임베딩 함수를 확인할 수 있을 것입니다.
이제 원시 텍스트만 삽입하면 임베딩이 자동으로 생성되어 지정한 dense vector 필드에 저장됩니다. 임베딩 함수가 정의되어 있으면 검색 쿼리에 대해서도 더 이상 임베딩을 생성할 필요가 없습니다.
마주할 수 있는 가능한 문제는 embedding function을 사용할 때 Milvus가 적용하는 배치 크기 제한일 수 있습니다.
2026-01-21 14:03:12,902 [ERROR][handler]: RPC 오류: [insert_rows], <MilvusException: (code=65535, message=numRows [1000] > function [openai]의 최대 배치 [640])>, <Time:{'RPC start': '2026-01-21 14:03:12.722589', 'RPC error': '2026-01-21 14:03:12.902013'}>
모범 사례 및 팁
- 배치 크기 제한(오류 메시지에 표시됨) 내로 유지하세요. 이는 API 호출당 모델 제공업체의 토큰 제한에 도달하는 것을 방지하기 위한 안전 메커니즘입니다. 예를 들어, OpenAI에는 API 호출당 최대 300,000개 토큰 제한이 있습니다.
- 긴 텍스트나 대규모 문서 사용 사례의 경우, 삽입하기 전에 반드시 청크로 나누어야 합니다. 예를 들어, OpenAI의 모든 임베딩 모델은 입력 텍스트당 8192토큰 제한이 있습니다.
- VoyageAI 및 Cohere와 같은 제공업체는 기본적으로 긴 텍스트를 자동으로 잘라내지만, 이에 의존하면 문서 끝부분의 콘텐츠가 조용히 손실될 수 있습니다.
어휘 하이라이팅
어휘 하이라이팅은 일치가 발생한 정확한 용어나 구문을 시각적으로 표시하여 결과가 쿼리와 일치한 이유를 사용자에게 보여주는 데 유용합니다. 이는 검색 결과의 투명성, 해석 가능성 및 사용자 신뢰를 향상시킵니다.
다음은 몇 가지 주요 시나리오입니다:
UI에서 검색 결과 표시. 검색 인터페이스를 구축할 때 하이라이팅은 사용자가 전체 문서를 열지 않고도 결과의 관련성을 빠르게 이해하도록 도와줍니다. 일치 항목을 명확하게 표시하여 인지 부하를 줄이고 클릭률을 높입니다.
문서 / 콘텐츠 검색. 대용량 문서(예: 지식 베이스, PDF, 정책)에서 어휘 하이라이팅을 사용하면 사용자가 주변 문맥 내에서 일치한 키워드를 즉시 찾을 수 있어 정보 탐색 속도가 빨라집니다.
로그 / 이벤트 분석. 운영 로그나 이벤트 데이터에서 하이라이팅을 사용하면 특히 문제 해결이나 인시던트 대응 중에 밀도 높고 비정형인 텍스트 내에서 일치하는 패턴, 오류 코드 또는 키워드를 더 쉽게 찾아낼 수 있습니다.
RAG(Retrieval-Augmented Generation) 디버깅. RAG 파이프라인에서 어휘 하이라이팅은 실무자가 검색된 청크의 어떤 부분이 원래 쿼리와 일치했는지 검사하는 데 도움이 됩니다. 이는 다음에 유용합니다:
- 검색 정확성 검증
- 오탐 또는 약한 일치 진단
- 특정 컨텍스트가 생성에 선택된 이유 이해
Zilliz Cloud로 서버 측 어휘 하이라이팅을 구현하려면 먼저 LexicalHighlighter를 인스턴스화하고(하이라이트할 쿼리 텍스트와 하이라이트된 텍스트가 어떻게 보일지 나타내는 주변 태그를 포함), 이를 전체 텍스트 검색 요청에 매개변수로 제공합니다.
그런 다음 Milvus가 검색을 수행하고 어휘 로직을 실행하여 정확한 일치를 찾고, 하이라이트할 부분 문자열에 대한 위치 정보를 반환합니다.
모범 사례 및 팁
- LexicalHighlighter는 BM25 전체 텍스트 검색에서만 작동합니다. 밀집 벡터 검색에서는 작동하지 않습니다.
pre_tags와post_tags를 정의하여 일치한 용어를 웹 페이지에서 직접 렌더링되는 HTML 태그(예: 사용자 지정 CSS 클래스, 굵게, 기울임 등)로 감쌀 수 있습니다.
N-gram 인덱스
N-gram 인덱스는 문자열을 더 작고 겹치는 문자 시퀀스(예: "coffee"를 3-그램으로 -> "cof", "off", "ffe", "fee")로 분해하여 부분적이고 유연하며 와일드카드 스타일의 일치를 가능하게 하는 강력한 검색 엔진 인덱싱 기법입니다.
다음은 n-gram 인덱스가 유용한 몇 가지 시나리오입니다:
- 부분 문자열 검색 성능 향상(예:
LIKE %deep%) - 입력 중 검색 / 자동 완성
- 퍼지 검색
- 도메인 이름 및 식별자 검색(예:
example.com,facebook.com)
어떻게 작동하나요?
지정된 n-gram을 포함하는 문서는 각 n-gram을 해당 n-gram을 포함하는 문서의 식별자 목록에 매핑하는 인덱스, 흔히 역색인이라고 불리는 것을 사용하여 효율적으로 찾을 수 있습니다. 이 목록은 효율적인 압축과 효율적인 쿼리 실행을 모두 가능하게 하기 위해 정렬된 상태로 유지됩니다. Milvus의 경우 ngram index는 Tantivy 위에 구축되며, Tantivy는 delta encoding, bitpacking, skip lists와 같은 압축 기법을 사용하여 역목록의 크기를 압축하고 줄여 인덱스를 가볍게 만듭니다.
텍스트 필드에 대한 전체 스캔 대신, Milvus는 먼저 deep과 같은 조건자를 추출하고, 구성된 gram 크기에 따라 이를 n-gram으로 분해한 뒤, 역색인 조회를 수행하고 결과를 교집합 처리하여 모든 gram을 포함하는 후보를 식별한 다음, 원래 LIKE 패턴에 대해 정확한 일치 여부를 검증합니다.
Milvus에서는 생성될 n-gram의 최소 및 최대 길이를 각각 나타내는 min_gram과 max_gram을 지정할 수 있습니다. ngram index를 생성하고 사용하는 방법에 대한 자세한 내용은 NGRAM Index 문서를 참조하세요.
다음은 Milvus의 ngram index 기능을 사용하여 구현한 자동 완성의 짧은 데모입니다.
모범 사례 및 팁
- 대표 쿼리로 벤치마크하세요: 프로덕션에 배포하기 전에 실제 쿼리 패턴으로 테스트하여
min_gram및max_gram설정이 실제 사용자 행동과 일치하는지 검증하세요. - 벡터 검색과 전략적으로 결합하세요: 벡터 유사도 계산 전에 후보 집합을 줄이기 위한 사전 필터로 NGRAM 가속 필터링을 사용하여 전체 쿼리 지연 시간을 개선하세요.
- 과도한 인덱싱을 피하세요: 모든 VARCHAR 필드가 NGRAM index의 이점을 얻는 것은 아닙니다. 와일드카드 패턴이 있는
LIKE쿼리에서 자주 사용되는 필드를 우선하세요. - n-gram index는 대소문자를 구분한다는 점에 유의하세요. 이는 토큰이 원본 텍스트에 나타나는 그대로 인덱싱되어 대문자와 소문자의 차이가 보존됨을 의미합니다. 쿼리는 인덱싱된 콘텐츠에 사용된 정확한 대소문자와 일치해야 합니다.
Decay Ranker
연구 논문을 위한 시맨틱 검색 엔진을 구축하고 있으며, 10년 이상 된 논문보다 지난 10년 동안 출판된 논문을 선호한다고 상상해 보세요.
Milvus의 decay ranker가 없다면, 아마도 출판 연도 필드를 기준으로 벡터 데이터베이스 외부에서 검색 결과를 다시 순위화해야 할 것입니다. 이는 애플리케이션 서버 / 클라이언트 측 처리를 필요로 하며, 복잡성과 지연 시간을 모두 증가시켜 사용자 경험에 부정적인 영향을 줄 수 있습니다.
Milvus의 decay ranker의 핵심에는 Decay Function이 있습니다. Decay Functions는 숫자 필드(예: 타임스탬프)를 기반으로 관련성 점수를 조정합니다. 최종 점수는 다음과 같이 계산됩니다:
final_score = normalized_similarity_score x decay_score
현재 세 가지 서로 다른 decay functions, 즉 Linear, Exponential, Gaussian이 있습니다. 각 decay function은 서로 다른 시나리오에 유용합니다. 예를 들어, Linear Function은 특정 지점(예: 연도, 거리 등)을 넘어서는 엔티티를 제외해야 할 때 사용해야 합니다. Exponential Function은 더 최근 항목이 결과를 지배하도록 하면서도 오래된 결과도 발견 가능하게 하고 싶을 때 사용할 수 있습니다. Gaussian Function은 위치 기반 검색에 유용합니다. 즉, 현재 위치에 더 가까운 항목이 더 높은 순위를 받게 됩니다.
Decay functions는 매우 사용자 지정이 가능하며, 초기화할 때 여러 매개변수를 사용하여 그 형태를 제어할 수 있습니다:
- origin: 기준점(예: 현재 타임스탬프)
- offset: 항목이 전체 점수(decay = 1.0)를 유지하는 "감쇠 없음 영역"을 만듭니다. 매우 최근이거나 매우 가까운 항목이 전혀 페널티를 받지 않도록 보장하는 데 유용합니다.
- scale: 값이 클수록 관련성이 완만하게 감소하고, 값이 작을수록 더 가파르게 감소합니다.
- decay: 곡선의 가파름을 제어합니다. 낮은 값(예: 0.3)은 더 가파른 감소를 만들고, 높은 값(예: 0.7)은 더 완만한 감소를 만듭니다. 기본값은 0.5입니다.
감쇠 함수 매개변수를 설정하는 방법을 알아보는 예시는 다음과 같습니다:
- 현재 연도를 원점으로 사용하려면:
origin=2026 - 2021년부터 2026년까지의 연구 논문은 감쇠가 적용되지 않아 동일하게 관련성이 있음:
offset=6 - scale 거리에서의 점수 승수:
decay=0.5 - 2010년 논문은 (이전에 지정된) 감쇠 점수 0.5를 가져야 함:
scale=16(2026 - 2010 = 16이므로)
모범 사례 및 팁
- 감쇠 구성을 A/B 테스트하세요.
scale및decay매개변수의 작은 변경도 사용자 경험에 큰 영향을 미칠 수 있습니다. - 모든 시간 기반 매개변수(
origin,scale,offset)가 컬렉션 데이터와 동일한 단위를 사용하도록 하세요. - FunctionScore는 쿼리당 단일 DecayFunction만 허용합니다. 여러 DecayFunction을 체이닝하거나 조합하는 것은 현재 지원되지 않습니다.
- 각 감쇠 랭커는 하나의 숫자 필드만 지원합니다. 단일 랭커에서 여러 감쇠 요인을 결합할 수 없습니다.
- 희소하거나 치우친 필드에는 감쇠를 피하세요. 감쇠 필드에 null 값, 이상치 또는 고도로 치우친 분포가 많으면 감쇠 랭킹이 직관적이지 않은 결과를 낼 수 있습니다.
부스팅
부스팅은 도메인 신호를 벡터 검색 랭킹에 통합하기 위한 실용적인 메커니즘입니다. 시맨틱 검색은 쿼리가 무엇에 관한 것인지 포착하지만, 특정 도메인에서 무엇이 더 중요한지는 종종 무시합니다. 부스팅을 사용하면 임의의 메타데이터 필드를 사용해 결과를 재랭킹할 수 있으며, 이를 통해 비즈니스 또는 도메인 직관을 검색 계층에 효과적으로 인코딩할 수 있습니다.
예를 들어 연구 논문 검색 워크플로에서 두 논문이 모두 "deep learning"과 관련이 있을 수 있지만, 동일하게 중요하지는 않습니다. 인용 횟수가 많은 논문은 유사도 점수가 약간 낮더라도 인용 횟수가 적은 논문보다 위에 표시될 자격이 있을 수 있습니다. 부스팅을 사용하면 유사도 점수가 0.79이지만 인용 수가 1,200회인 논문이, 점수는 0.81이지만 인용 수가 10회뿐인 논문보다 더 높게 랭킹될 수 있습니다.
위 내용은 인용 수를 기반으로 논문을 부스팅하여 구현할 수 있습니다. 간단한 구현은 다음과 같습니다:
하지만 인용 수가 100에서 1000 사이인 연구 논문을 부스팅하고, 더 최근 논문을 선호하도록 감쇠 함수까지 포함하려면 어떻게 해야 할까요. 알고 보니 FunctionScore class를 사용하면 단일 검색 요청에서 감쇠 함수를 여러 부스트 랭커와 체이닝할 수 있습니다.
모범 사례 및 팁
- FunctionScore는 현재 dense vector search에만 지원됩니다. Hybrid search는 FunctionScore를 지원하지 않으므로, 대신 단일 랭커를 사용하세요.
- 연속값 필드를 기반으로 부스팅하는 경우, 값을 이산 버킷에 넣고 각 버킷에 고유한 부스트 가중치를 할당하는 것을 고려하세요.
마무리
Milvus 2.6은 벡터 데이터베이스가 기본적으로 수행할 수 있는 것에서 의미 있는 진전을 나타냅니다. 위에서 논의한 기능과 역량은 단순히 있으면 좋은 것이 아니라, 개발자가 이전에 데이터베이스 외부에서 구축하고 유지해야 했던 글루 코드를 제거합니다.
외부 임베딩 파이프라인, 커스텀 재랭킹 로직, 부분 문자열 검색 우회 방법을 이어 붙이는 대신, 이제 Milvus 쿼리에서 이를 직접 표현할 수 있습니다. 그 결과 애플리케이션 코드는 더 깔끔해지고, 지연 시간은 낮아지며, 문제가 발생했을 때 디버깅해야 할 움직이는 부분은 줄어듭니다.
Milvus를 "그저" 벡터 저장소로만 다뤄왔다면, 이제 무엇이 가능한지 다시 살펴볼 때일지도 모릅니다. 이 모든 기능은 이제 Zilliz Cloud에서 GA로 제공되므로, 오늘 바로 실험을 시작할 수 있습니다.
리소스
계속 읽기

3 Easiest Ways to Use Claude Code on Your Mobile Phone
Run Claude Code from your phone with Remote Control, Happy Coder, or SSH + Tailscale. Comparison table, setup steps, and tools for typing, memory, and parallel tasks.

Smarter Autoscaling in Zilliz Cloud: Always Optimized for Every Workload
With the latest upgrade, Zilliz Cloud introduces smarter autoscaling—a fully automated, more streamlined, elastic resource management system.

How to Build an Enterprise-Ready RAG Pipeline on AWS with Bedrock, Zilliz Cloud, and LangChain
Build production-ready enterprise RAG with AWS Bedrock, Nova models, Zilliz Cloud, and LangChain. Complete tutorial with deployable code.


