검색 및 RAG를 위한 Voyage AI 임베딩과 리랭커
소개
과거에는 AI가 주로 정보를 분석하고 제안하는 데 활용되었지만, 생성형 AI의 등장으로 이제 우리는 새롭고 독창적인 콘텐츠를 생성할 수 있게 되었습니다. 멋지게 들리지만, 때로는 콘텐츠가 오해를 불러일으킬 수 있습니다.
RAG(Retrieval Augmented Generation)는 쿼리의 컨텍스트가 제공될 때 대규모 언어 모델의 출력을 최적화합니다. Zilliz와 Voyage AI 는 RAG 파이프라인을 쉽게 구축할 수 있도록 협력했으며, 이는 뒤에서 이 글에서 살펴볼 것입니다. Voyage AI는 검색을 위한 도메인별 맞춤형 임베딩 모델과 리랭커를 제공합니다. 이 글에서는 그중 일부를 논의하겠습니다.
Crafting RAG with Zilliz Cloud Pipelines and Voyage Ai.png
임베딩 모델과 Voyage AI
컴퓨터는 텍스트나 이미지와 같은 데이터의 정보를 이해할 수 없습니다. 우리는 비정형 데이터 뒤에 있는 의미를 컴퓨터가 이해할 수 있도록 임베딩 모델을 사용합니다. 이 섹션에서는 임베딩 모델의 기본, 생성형 AI에서의 유용성, 그리고 왜 RAG가 기업용 생성형 AI의 지배적인 접근 방식인지 다룹니다.
임베딩 모델에 대한 간략한 설명
임베딩 모델은 주어진 데이터에 대한 벡터 임베딩을 생성하는 딥러닝 모델입니다. 이러한 모델은 제공된 텍스트, 이미지, 음성 또는 어떤 형태의 비수치 데이터, 심지어 수치 데이터까지도 압축된 벡터 표현으로 변환합니다. 벡터 임베딩이라고도 알려진 이 표현은 정보를 수치 벡터 공간에 매핑합니다.
비정형 데이터를 벡터 임베딩으로 인코딩
생성형 AI의 한계
기업 수준에서 생성형 AI의 사용은 번거로운 작업을 자동화하고 최소한의 노력으로 결과를 산출하는 매력적인 능력 덕분에 급증하고 있습니다. Gen AI는 다양한 시나리오에서 우리를 지원하는 데 칭찬할 만하지만, 단점도 있습니다. ChatGPT와 같은 GenAI 모델은 여러 도메인의 수백만 또는 수조 개 데이터 항목으로 학습된 범용 모델입니다. 이 사실은 때때로 문제가 될 수 있습니다. 모델은 확률적이며 제공된 컨텍스트를 기반으로 다음 단어를 생성합니다. 컨텍스트가 제한적이거나 모델에 더 새로운 경우, 모델은 환각을 시작합니다. 바로 그 지점에서 RAG가 빛을 발합니다.
RAG와 그것이 환각을 줄이는 방법
RAG 기법은 제공된 쿼리를 임베딩하기 위해 도메인별 임베딩 모델을 사용해야 합니다. 그런 다음 이 쿼리는 벡터 데이터베이스로 전달되며, 여기서 의미 검색이 적용되어 유사한 컨텍스트 벡터 임베딩을 가져옵니다. 벡터 데이터베이스의 모든 관련 문서와 제공된 쿼리가 모델에 전달됩니다. 모델은 쿼리의 추가 정보와 컨텍스트를 사용하여 관련성 있고 최신이며 정확한 결과를 공식화합니다. 이러한 방식으로 RAG 아키텍처는 모델의 환각을 줄이고 더 견고하고 신뢰할 수 있는 LLM을 가능하게 합니다.
RAG 아키텍처
이제 임베딩 모델과 RAG에서의 역할에 대해 논의했으므로, 몇 가지 Voyage AI 임베딩 모델에 대해 논의해 보겠습니다. Voyage AI는 효과적이고 효율적인 RAG 기법을 수행하기 위해 여러 도메인에 걸쳐 다양한 맞춤형 임베딩 모델을 제공합니다. 이러한 모델은 생성된 쿼리와 관련된 벡터 임베딩을 저장하고 검색하기 위해 Zilliz의 Milvus와 같은 벡터 데이터베이스와 연결됩니다.
Voyage AI 임베딩 모델
Voyage AI는 효율적이고 효과적인 다양한 도메인 특화 및 범용 임베딩 모델을 제공합니다. 이러한 모델은 검색과 RAG에 크게 기여합니다. 대부분의 임베딩 모델보다 더 높은 검색 품질을 제공합니다.
여러 임베딩 모델 중 최고의 모델에는 voyage-code-2, voyage-law-2, voyage-large-2-instruct가 포함됩니다. Voyage AI는 특정 코드, 법률, 금융 및 다국어 도메인을 위해 이러한 모델을 개발했습니다. 또한, 특정 사용 사례에 맞게 이러한 모델을 맞춤화할 수 있습니다. 최신 모델을 살펴보겠습니다:
- voyage-code-2: 쿼리와 관련된 코드를 정확하게 제공하는 데 정통한 모델입니다. 다음 그림은 코드 검색 작업에 대한 voyage-code-2의 성능을 보여줍니다:
voyage-code-2 performance analysis.png
- voyage-law-2: 법률 문서의 컨텍스트와 임베딩을 얻도록 훈련된 모델입니다. 이 모델은 여러 도메인의 장문 컨텍스트 법률 문서와 관련하여 최상의 결과를 제공하며, 여러 도메인의 범용 코퍼스에서도 더 나은 성능을 발휘합니다. 다음 그림은 voyage-law-2의 성능을 강조합니다:
voyage-law-2 performance analysis
위 그림은 Massive Text Embedding Benchmark (MTEB)에서 최상위로 평가된 Voyage AI 임베딩 모델의 성능 역량을 보여줍니다.
Rerankers와 Voyage AI
RAG가 이러한 모델의 hallucinations를 줄임으로써 GenAI 출력의 품질을 어떻게 향상시키는지 논의했습니다. 그러나 한 가지 작은 문제는 여전히 GenAI 모델의 컨텍스트 윈도우와 관련되어 있습니다. 컨텍스트 윈도우는 AI 모델이 처리하기 위해 주어진 시점에 받아들일 수 있는 최대 정보량을 의미합니다. 더 작은 윈도우는 모델이 더 적은 정보를 얻는다는 뜻이고, 더 큰 윈도우는 처리 비용과 시간이 증가한다는 뜻입니다.
reranker는 제공된 쿼리와의 관련성 점수를 계산하여 벡터 데이터베이스에서 가져온 문서의 순위를 매겨 최적의 결과를 제공합니다. 이 순위 지정은 가장 관련성이 높은(정보가 풍부한) 문서를 필터링하여 컨텍스트 윈도우 내에 맞추고 가장 정확한 결과를 생성하는 데 도움이 됩니다.
RAG 기법이 컨텍스트 정보를 제공하고 검색을 지원하기 위해 벡터 임베딩을 가져오는 반면, 이러한 모델은 관련성 점수를 사용하여 가져온 모든 임베딩의 순위를 다시 매겨 LLM에 가장 관련성 높은 데이터를 제공합니다.
Simple Reranker Architecture
Voyage AI Rerankers
Voyage AI는 rerank-lite-1로 알려진 reranker 모델을 개발했습니다. 이 voyage 모델은 지연 시간과 품질에 최적화된 범용 reranker입니다. 4000 토큰의 컨텍스트 윈도우를 가지고 있습니다. 다음 그림은 이 모델의 성능을 보여줍니다.
voyage:ranke-lite-1 performance analysis
Zilliz Cloud Pipelines에서 Voyage Embeddings 사용하기
Zilliz와 Voyage AI는 Zilliz Cloud에서 비정형 데이터를 검색 가능한 벡터 임베딩으로 변환하는 과정을 간소화하기 위해 파트너십을 맺었습니다.
이 섹션에서는 간소화된 임베딩 생성 및 검색을 위해 Zilliz Cloud와 Voyage AI 임베딩 모델을 통합하는 방법을 보여줍니다. 또한 이 통합과 Cohere(LLM)를 사용하여 RAG 애플리케이션을 구축하는 방법도 보여드리겠습니다. 시작해 보겠습니다.
Zilliz Cloud 설정하기
첫 번째 단계는 Zilliz Cloud를 설정하는 것입니다. 아직 Zilliz Cloud 계정이 없다면 무료로 가입하세요.
처음 로그인하면 다음 콘솔이 화면에 표시됩니다.
Zilliz cloud console for creating a cluster
- 필요에 따라 클러스터를 생성하겠습니다. Zilliz는 학습, 실험, 프로토타이핑을 위한 무료 티어를 제공하며, 이후 다른 프로덕션 플랜으로 마이그레이션할 수 있습니다.
Zilliz에서 새 클러스터 생성.png
- 새 클러스터를 생성하면, 연결에 필요한 모든 정보가 표시됩니다.
클러스터 연결
프로젝트 ID는 상단 메뉴 바의 Projects에서 가져올 수 있습니다. 대상 프로젝트를 찾아 해당 ID를 Project ID 열에 복사합니다.
Project ID용 Projects 대시보드
- 이제 클러스터에 연결하는 데 필요한 모든 요소가 준비되었습니다. 이제 파이프라인을 구축할 차례입니다. RAG 애플리케이션의 LLM으로 Cohere를 사용하겠습니다. 이를 위해
cohere를 설치하겠습니다.
%pip install cohere
이 노트북에 필요한 import는 다음과 같습니다.
import os
import requests
아래 코드에서는 CLOUD_REGION, CLUSTER_ID, API_KEY, PROJECT_ID를 설정했습니다:
CLOUD_REGION = 'gcp-us-west1'
CLUSTER_ID = 'your CLUSTER_ID'
API_KEY = 'your API_KEY'
PROJECT_ID = 'your PROJECT_ID'
Zilliz Cloud Pipelines
Zilliz Cloud Pipelines는 비정형 데이터를 검색 가능한 벡터 컬렉션으로 변환하며, 임베딩, 수집, 검색, 삭제 프로세스를 처리합니다. Zilliz Cloud는 세 가지 유형의 파이프라인을 제공합니다:
- 수집 파이프라인: 비정형 데이터를 검색 가능한 벡터 임베딩으로 변환하고 Zilliz Cloud Vector Databases에 저장합니다. 여기에는 입력 필드를 변환하고 검색을 위한 추가 정보를 보존하는 다양한 함수가 포함됩니다.
검색 파이프라인: 이 파이프라인은 쿼리 문자열을 벡터 임베딩으로 변환하고 해당 텍스트 및 메타데이터와 함께 Top-K 유사 벡터를 검색하여 시맨틱 검색을 가능하게 합니다. 하나의 함수 유형만 허용합니다.
삭제 파이프라인: 컬렉션에서 지정된 엔터티를 제거하며, 하나의 함수 유형만 허용합니다.
수집 파이프라인
수집 파이프라인에서는 입력 데이터를 기반으로 동작을 맞춤 설정하기 위해 함수를 지정할 수 있습니다. 현재 네 가지 함수를 지원합니다:
INDEX_DOC: 문서를 입력으로 받아 청크로 분할하고 각 청크에 대한 벡터 임베딩을 생성합니다. 입력 필드를 컬렉션의 네 가지 출력 필드(doc_name, chunk_id, chunk_text, embedding)에 매핑합니다.PRESERVE: 사용자 정의 입력을 컬렉션의 추가 스칼라 필드로 저장하며, 일반적으로 게시자 정보 및 태그와 같은 메타 정보에 사용됩니다.INDEX_TEXT: 각 텍스트를 벡터 임베딩으로 변환하여 텍스트를 처리하고, 입력 필드(text_list)를 두 개의 출력 필드(text 및 embedding)에 매핑합니다.INDEX_IMAGE: 이미지 임베딩을 생성하여 이미지를 처리하고, 두 개의 입력 필드(image_url 및 image_id)를 두 개의 출력 필드(image_id 및 embedding)에 매핑합니다.
아래 코드 스니펫에서는 requests 라이브러리를 사용하여 Zilliz cloud에 요청을 post하겠습니다. post 요청은 URL, headers, 그리고 전송할 data로 구성됩니다. 헤더를 만들어 보겠습니다:
headers = {
"Content-Type": "application/json",
"Accept": "application/json",
"Authorization": f"Bearer {API_KEY}"
}
아래 코드에서 collection_name과 embedding_service를 정의하겠습니다. 임베딩 서비스는 Voyage AI 모델, 특히 voyage-2를 활용하며, 이는 검색 작업, 기술 문서, 일반 애플리케이션에서 탁월한 성능을 보여주었습니다.
create_pipeline_url = f"https://controller.api.{CLOUD_REGION}.zillizcloud.com/v1/pipelines"
collection_name = 'Documents'
embedding_service = "voyageai/voyage-large-2"
아래 코드 스니펫에서는 ingestion_pipeline을 위한 인덱스 함수를 정의하겠습니다:
data = {
"name": "ingestion_pipeline",
"description": "A pipeline that generates text embeddings and stores title information.",
"type": "INGESTION",
"projectId": PROJECT_ID,
"clusterId": CLUSTER_ID,
"collectionName": collection_name,
"functions": [
{
"name": "index_doc",
"action": "INDEX_DOC",
"language": "ENGLISH",
"embedding": embedding_service
}
]
}
response = requests.post(create_pipeline_url, headers=headers, json=data)
print(response.json())
pipelineId는 나중에 데이터를 데이터베이스로 수집하는 데 사용됩니다. 이 단계 후에는 클러스터에 생성된 컬렉션과 수집 파이프라인을 확인할 수 있습니다:
ingestion_pipe_id = response.json()["data"]["pipelineId"]
print(ingestion_pipe_id)
>> pipe-cf…
다음은 클라우드에 생성된 컬렉션입니다:
클라우드에 생성된 컬렉션
그리고 수집 파이프라인은 다음과 같습니다:
Zilliz Cloud의 수집 파이프라인
검색 파이프라인
검색 파이프라인은 쿼리 문자열을 벡터 임베딩으로 변환하고 Top-K 최근접 이웃 벡터를 검색하여 시맨틱 검색을 지원합니다. 검색 파이프라인에는 검색할 클러스터 지정과 컬렉션이 필요한 SEARCH_DOC_CHUNK 함수가 포함되어 있습니다.
Zilliz는 많은 함수를 지원합니다. 여기서는 사용자 쿼리를 입력받아 지식 베이스에서 관련 문서 청크를 반환하는 SEARCH_DOC_CHUNK를 사용하겠습니다.
data = {
"projectId": PROJECT_ID,
"name": "search_pipeline",
"description": "A pipeline that receives text and search for semantically similar doc chunks",
"type": "SEARCH",
"functions": [
{
"name": "search_chunk_text",
"action": "SEARCH_DOC_CHUNK",
"inputField": "query_text",
"clusterId": f"{CLUSTER_ID}",
"collectionName": f"{collection_name}",
"embedding": embedding_service
}
]
}
response = requests.post(create_pipeline_url, headers=headers, json=data)
search_pipe_id = response.json()["data"]["pipelineId"]
수집 및 검색 파이프라인을 만들었습니다. 이제 이 글을 수집 파이프라인에 삽입하고 검색 파이프라인을 실행할 차례입니다.
수집 파이프라인 실행
수집 파이프라인은 AWS S3 또는 Google Cloud Storage (GCS)와 같은 Object Storage Services에서 파일을 가져올 수 있습니다. 허용되는 파일 형식에는 .txt, .pdf, .md, .html 등이 포함됩니다. Zilliz 콘솔에서 수집 파이프라인을 실행할 수 있습니다. 단계별로 진행해 보겠습니다.
1. 왼쪽에서 Pipelines로 이동한 다음 아래와 같이 ingestion_pipeline으로 이동합니다:
클라우드에 생성된 수집 파이프라인
2. Run을 클릭하면 다음 페이지로 이동하라는 메시지가 표시됩니다:
수집 파이프라인에 파일 첨부
텍스트 파일을 첨부하고 파이프라인을 실행합니다. 성공하면 텍스트 파일이 컬렉션에 로드됩니다. 다음은 데이터 미리보기입니다:
컬렉션의 데이터 미리보기
검색 파이프라인 실행
RAG (retrieval augmented generation)에는 두 가지 주요 구성 요소가 있습니다: 검색기와 LLM입니다. 검색기를 만드는 것은 검색 파이프라인을 실행하는 것만큼 간단합니다. 검색 파이프라인은 쿼리를 받아 데이터베이스에서 가장 관련성 높은 청크를 검색합니다. 아래 코드에서 retriever 함수는 query와 topk(선택할 문서 수)를 받아 검색 파이프라인을 실행합니다.
def retriver(question, topk):
run_pipeline_url = f"https://controller.api.{CLOUD_REGION}.zillizcloud.com/v1/pipelines/{search_pipe_id}/run"
data = {
"data": {
"query_text": question
},
"params": {
"limit": topk,
"offset": 0,
"outputFields": [
"chunk_text",
"id",
"doc_name"
],
}
}
response = requests.post(run_pipeline_url, headers=headers, json=data)
return [result['chunk_text'] for result in response.json()['data']['result']]
LLM으로 Cohere를 사용하는 RAG 애플리케이션
문서를 검색한 후에는 Cohere를 LLM으로 사용할 것입니다. 검색된 문서를 프롬프트로 감싸 Cohere chat API에 제공하고, 이에 대한 질문을 할 것입니다.
import cohere
co = cohere.Client(api_key="your_api_key")
def chatbot(query, topk):
chunks = retriver(query, topk)
response = co.chat(
model="command-r-plus",
message= f"Given this information: '{[chunk for chunk in chunks]}', generate a response for the following {query}"
)
return response.text
question = "I'm looking for a good model for legal retrieving tasks?"
print(chatbot(question, 2))
다음은 챗봇의 응답입니다:
Based on the provided information, it seems you are specifically interested in a proficient model in legal retrieving tasks. In that case, the model best suits your needs is "voyage-law-2."
결론
Voyage AI는 고급 검색을 위한 도메인 특화 맞춤형 임베딩 모델과 리랭커를 제공합니다. Zilliz Cloud Pipelines는 Voyage AI 모델을 Zilliz Cloud와 원활하게 통합하여 RAG 개발을 훨씬 더 간소화합니다.
이 글에서는 인기 있는 voyage AI 임베딩 모델과 리랭커, 그리고 Zilliz Cloud와의 통합에 대해 논의했습니다. 또한 Voyage AI, Zilliz Cloud Pipeline, Cohere를 사용하여 RAG를 구축하는 방법도 시연했습니다.
자세한 내용은 Unstructured Data Meetup by Zilliz에서 진행된 Tengyu Ma의 발표 다시보기를 시청하세요.
계속 읽기

How Zilliz Saw the Future of Vector Databases—and Built for Production
An inside look at how Zilliz built vector databases for real-world use, focusing on scalability, stability, and running them reliably at scale.

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.

VidTok: Rethinking Video Processing with Compact Tokenization
VidTok tokenizes videos to reduce redundancy while preserving spatial and temporal details for efficient processing.



