Milvus
Zilliz
  • Home
  • Blog
  • Gemini 3 Pro + Milvus: 고급 추론 및 멀티모달 성능으로 더욱 강력한 RAG 구축

Gemini 3 Pro + Milvus: 고급 추론 및 멀티모달 성능으로 더욱 강력한 RAG 구축

  • Tutorial
November 20, 2025
Lumina Wang

Google의 Gemini 3 Pro는 단순한 과대 광고가 아니라 자연어 인터페이스의 기능을 실질적으로 확장하는 기능으로 개발자의 기대치를 진정으로 변화시키는 드문 릴리스입니다. 동적 도구 라우팅, 다단계 계획, API 오케스트레이션, 대화형 UX 생성이 모두 원활하게 결합되어 '원하는 앱 설명'을 실행 가능한 워크플로우로 전환합니다. 이는 바이브 코딩을 프로덕션 환경에서 실행 가능한 것으로 만드는 데 가장 근접한 모델입니다.

그리고 숫자가 이를 뒷받침합니다. Gemini 3 Pro는 거의 모든 주요 벤치마크에서 뛰어난 결과를 기록했습니다:

  • 인류의 마지막 시험: 도구 없이 37.5%, 도구 사용 시 45.8% - 가장 가까운 경쟁 제품은 26.5%에 그쳤습니다.

  • MathArena Apex: 23.4%, 대부분의 모델이 2%를 넘지 못했습니다.

  • ScreenSpot-Pro: 72.7%의 정확도로 36.2%의 차선책보다 거의 두 배나 높습니다.

  • 벤딩 벤치 2: 평균 순 가치 5,478.16달러로 2위보다 약 1.4배 높았습니다.

자세한 벤치마크 결과는 아래 표에서 확인하세요.

심층적인 추론, 강력한 도구 사용, 멀티모달의 유창함이 결합된 Gemini 3 Pro는 검색 증강 세대(RAG)에 매우 적합합니다. 수십억 개의 의미론적 검색을 위해 구축된 고성능 오픈 소스 벡터 데이터베이스인 Milvus와 함께 사용하면 응답을 근거로 하고, 깔끔하게 확장되며, 워크로드가 많은 상황에서도 생산성을 유지하는 검색 레이어를 확보할 수 있습니다.

이 포스팅에서는 Gemini 3 Pro의 새로운 기능, RAG 워크플로우를 향상시키는 이유, Milvus를 검색 백본으로 사용해 깔끔하고 효율적인 RAG 파이프라인을 구축하는 방법에 대해 자세히 설명합니다.

Gemini 3 Pro의 주요 업그레이드

Gemini 3 Pro는 모델이 추론하고, 작업을 생성하고, 실행하고, 사용자와 상호 작용하는 방식을 재구성하는 일련의 실질적인 업그레이드를 도입했습니다. 이러한 개선 사항은 크게 네 가지 주요 기능 영역으로 나뉩니다:

멀티모달 이해 및 추론

Gemini 3 Pro는 시각적 추론을 위한 ARC-AGI-2, 교차 모드 이해를 위한 MMMU-Pro, 동영상 이해 및 지식 습득을 위한 Video-MMMU 등 중요한 멀티모달 벤치마크에서 새로운 기록을 세웠습니다. 또한 이 모델에는 구조화된 다단계 논리 처리를 가능하게 하는 확장 추론 모드인 딥 씽크가 도입되었습니다. 그 결과 기존의 연쇄 사고 모델이 실패하는 경향이 있는 복잡한 문제에 대해 훨씬 더 높은 정확도를 제공합니다.

코드 생성

이 모델은 제너레이티브 코딩을 새로운 차원으로 끌어올립니다. Gemini 3 Pro는 하나의 자연어 프롬프트에서 대화형 SVG, 전체 웹 애플리케이션, 3D 장면, 심지어 Minecraft와 유사한 환경과 브라우저 기반 당구를 포함한 기능성 게임까지 모두 생성할 수 있습니다. 특히 프런트엔드 개발 시에는 기존 UI 디자인을 충실하게 재현하거나 스크린샷을 바로 제작 가능한 코드로 변환할 수 있어 반복적인 UI 작업을 훨씬 빠르게 진행할 수 있습니다.

AI 에이전트 및 툴 사용

사용자의 허가를 받으면 Gemini 3 Pro는 사용자의 Google 기기에서 데이터에 액세스하여 여행 계획이나 렌터카 예약과 같은 장시간에 걸친 다단계 작업을 수행할 수 있습니다. 이러한 에이전트 기능은 장시간의 도구 사용에 대한 스트레스 테스트를 위해 특별히 설계된 벤치마크인 Vending-Bench 2에서 강력한 성능을 보여줍니다. 또한 이 모델은 터미널 명령 실행, 잘 정의된 API를 통한 외부 도구와의 상호 작용 등 전문가 수준의 상담원 워크플로우를 지원합니다.

제너레이티브 UI

Gemini 3 Pro는 기존의 1문 1답 모델을 넘어 전체 대화형 경험을 동적으로 구축할 수 있는 제너레이티브 UI를 도입했습니다. 정적인 텍스트를 반환하는 대신 사용자 지시에 따라 직접 풍부하고 조정 가능한 여행 플래너와 같은 완전히 맞춤화된 인터페이스를 생성할 수 있습니다. 이를 통해 LLM은 수동적인 응답자에서 능동적인 인터페이스 생성자로 전환됩니다.

Gemini 3 Pro 테스트

벤치마크 결과 외에도 실제 워크플로우에서 Gemini 3 Pro가 어떻게 작동하는지 파악하기 위해 일련의 실습 테스트를 진행했습니다. 그 결과 멀티모달 추론, 생성 기능, 장기적인 계획이 개발자에게 실질적인 가치로 어떻게 전환되는지 확인할 수 있었습니다.

멀티모달 이해

Gemini 3 Pro는 텍스트, 이미지, 비디오 및 코드 전반에 걸쳐 인상적인 다용도성을 보여줍니다. 테스트에서는 YouTube에서 직접 Zilliz 동영상을 업로드했습니다. 이 모델은 내레이션, 전환, 화면 텍스트를 포함한 전체 클립을 약 40초 만에 처리했는데, 이는 긴 형식의 멀티모달 콘텐츠로서는 이례적으로 빠른 처리 속도입니다.

Google의 내부 평가에서도 비슷한 결과가 나타났습니다: Gemini 3 Pro는 여러 언어로 된 필기 레시피를 처리하고, 각 레시피를 전사 및 번역한 후 공유 가능한 가족 레시피 북으로 편집했습니다.

제로 샷 작업

Gemini 3 Pro는 사전 예제나 스캐폴딩 없이도 완전한 인터랙티브 웹 UI를 생성할 수 있습니다. 세련되고 복고풍의 미래형 3D 우주선 웹 게임을 만들라는 메시지가 표시되자 이 모델은 네온 보라색 그리드, 사이버펑크 스타일의 우주선, 빛나는 파티클 효과, 부드러운 카메라 컨트롤 등 완벽한 인터랙티브 장면을 단 한 번의 제로 샷으로 만들어냈습니다.

복잡한 작업 계획

이 모델은 또한 다른 경쟁사보다 더 강력한 장기 작업 계획을 보여줍니다. 받은 편지함 정리 테스트에서 Gemini 3 Pro는 복잡한 이메일을 프로젝트 버킷으로 분류하고, 실행 가능한 제안(회신, 후속 조치, 보관)을 작성하고, 깔끔하고 구조화된 요약을 제시하는 등 마치 AI 관리 비서처럼 작동했습니다. 모델의 계획이 마련되면 한 번의 확인 클릭으로 전체 받은 편지함을 정리할 수 있습니다.

Gemini 3 Pro와 Milvus로 RAG 시스템을 구축하는 방법

Gemini 3 Pro의 업그레이드된 추론, 멀티모달 이해, 강력한 도구 사용 기능은 고성능 RAG 시스템을 위한 훌륭한 기반이 됩니다.

대규모 시맨틱 검색을 위해 구축된 고성능 오픈 소스 벡터 데이터베이스인 Milvus와 함께 사용하면 책임 분담을 명확하게 할 수 있습니다: Gemini 3 Pro는 해석, 추론, 생성을 처리하고 Milvus는 빠르고 확장 가능한 검색 계층을 제공하여 엔터프라이즈 데이터에 기반한 응답을 유지합니다. 이 조합은 내부 지식 기반, 문서 지원, 고객 지원 부조종사, 도메인별 전문가 시스템과 같은 프로덕션급 애플리케이션에 매우 적합합니다.

전제 조건

RAG 파이프라인을 구축하기 전에 다음과 같은 핵심 Python 라이브러리가 설치되어 있거나 최신 버전으로 업그레이드되어 있는지 확인하세요:

  • pymilvus - 공식 Milvus Python SDK

  • google-generativeai - Gemini 3 Pro 클라이언트 라이브러리

  • 요청 - 필요한 경우 HTTP 호출 처리용

  • tqdm - 데이터 세트 수집 중 진행률 표시줄용

! pip install --upgrade pymilvus google-generativeai requests tqdm

그런 다음 Google AI Studio에 로그인하여 API 키를 받습니다.

import os
os.environ["GEMINI_API_KEY"] = "**********"

데이터 세트 준비하기

이 튜토리얼에서는 Milvus 2.4.x 문서의 FAQ 섹션을 RAG 시스템의 비공개 지식 베이스로 사용하겠습니다.

문서 아카이브를 다운로드하여 milvus_docs 라는 폴더에 압축을 풉니다.

! wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
! unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs

milvus_docs/en/faq 경로에서 모든 마크다운 파일을 로드합니다. 각 문서에 대해 # 제목을 기준으로 간단한 분할을 적용하여 각 마크다운 파일 내의 주요 섹션을 대략적으로 구분합니다.

from glob import glob
text_lines = []
for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    with open(file_path, "r") as file:
        file_text = file.read()
    text_lines += file_text.split("# ")

LLM 및 임베딩 모델 설정

이 튜토리얼에서는 gemini-3-pro-preview 을 LLM으로, text-embedding-004 을 임베딩 모델로 사용하겠습니다.

import google.generativeai as genai
genai.configure(api_key=os.environ["GEMINI_API_KEY"])
gemini_model = genai.GenerativeModel("gemini-3-pro-preview")
response = gemini_model.generate_content("who are you")
print(response.text)

모델 응답: 저는 Google에서 만든 대규모 언어 모델인 Gemini입니다.

테스트 임베딩을 생성하고 처음 몇 개의 값과 함께 차원을 인쇄하여 빠른 검사를 실행할 수 있습니다:

test_embeddings = genai.embed_content(
    model="models/text-embedding-004", content=["This is a test1", "This is a test2"]
)["embedding"]
embedding_dim = len(test_embeddings[0])
print(embedding_dim)
print(test_embeddings[0][:10])

테스트 벡터 출력:

768

[0.013588584, -0.004361838, -0.08481652, -0.039724775, 0.04723794, -0.0051557426, 0.026071774, 0.045514572, -0.016867816, 0.039378334]

밀버스에 데이터 로드하기

컬렉션 생성

from pymilvus import MilvusClient
milvus_client = MilvusClient(uri="./milvus_demo.db")
collection_name = "my_rag_collection"

MilvusClient 을 생성할 때 규모와 환경에 따라 세 가지 구성 옵션 중에서 선택할 수 있습니다:

  • 로컬 모드(Milvus Lite): URI를 로컬 파일 경로(예: ./milvus.db)로 설정합니다. 가장 쉽게 시작할 수 있는 방법으로, Milvus Lite가 모든 데이터를 해당 파일에 자동으로 저장합니다.

  • 자체 호스팅 Milvus(도커 또는 쿠버네티스): 대규모 데이터 세트 또는 프로덕션 워크로드의 경우, Docker 또는 Kubernetes에서 Milvus를 실행하세요. URI를 http://localhost:19530 와 같이 Milvus 서버 엔드포인트로 설정합니다.

  • Zilliz Cloud(완전 관리형 Milvus 서비스): 관리형 솔루션을 선호하는 경우 Zilliz Cloud를 사용하세요. URI를 퍼블릭 엔드포인트로 설정하고 API 키를 인증 토큰으로 제공하세요.

새 컬렉션을 생성하기 전에 먼저 해당 컬렉션이 이미 있는지 확인하세요. 존재한다면 삭제하고 다시 생성하여 깔끔하게 설정하세요.

if milvus_client.has_collection(collection_name):
    milvus_client.drop_collection(collection_name)

지정된 매개변수를 사용하여 새 컬렉션을 만듭니다.

스키마가 제공되지 않으면 Milvus는 기본 키로 기본 ID 필드와 임베딩을 저장하기 위한 벡터 필드를 자동으로 생성합니다. 또한 스키마에 정의되지 않은 추가 필드를 캡처하는 예약된 JSON 동적 필드도 제공합니다.

milvus_client.create_collection(
    collection_name=collection_name,
    dimension=embedding_dim,
    metric_type="COSINE",
    consistency_level="Strong",  # Strong consistency level
)

데이터 삽입

각 텍스트 항목을 반복하여 임베딩 벡터를 생성한 다음 데이터를 Milvus에 삽입합니다. 이 예에서는 text 이라는 추가 필드를 포함합니다. 이 필드는 스키마에 미리 정의되어 있지 않으므로 Milvus는 내부에서 동적 JSON 필드를 사용하여 자동으로 저장하므로 추가 설정이 필요하지 않습니다.

from tqdm import tqdm
data = []
doc_embeddings = genai.embed_content(
    model="models/text-embedding-004", content=text_lines
)["embedding"]
for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    data.append({"id": i, "vector": doc_embeddings[i], "text": line})
milvus_client.insert(collection_name=collection_name, data=data)

샘플 출력:

Creating embeddings: 100%|█████████████████████████| 72/72 [00:00<00:00, 431414.13it/s]
{'insert_count': 72, 'ids': [0, 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, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}

RAG 워크플로 구축하기

관련 데이터 검색

검색을 테스트하기 위해 Milvus에 대한 일반적인 질문을 합니다.

question = "How is data stored in milvus?"

컬렉션에서 쿼리를 검색하여 가장 관련성이 높은 상위 3개의 결과를 반환합니다.

question_embedding = genai.embed_content(
    model="models/text-embedding-004", content=question
)["embedding"]
search_res = milvus_client.search(
    collection_name=collection_name,
    data=[question_embedding],
    limit=3,  # Return top 3 results
    search_params={"metric_type": "COSINE", "params": {}},  # Inner product distance
    output_fields=["text"],  # Return the text field
)
import json
retrieved_lines_with_distances = [
    (res["entity"]["text"], res["distance"]) for res in search_res[0]
]
print(json.dumps(retrieved_lines_with_distances, indent=4))

결과는 가장 유사한 것부터 가장 덜 유사한 것까지 유사도 순으로 반환됩니다.

[
    [
        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](
https://min.io/
), [AWS S3](
https://aws.amazon.com/s3/?nc1=h_ls
), [Google Cloud Storage](
https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes
) (GCS), [Azure Blob Storage](
https://azure.microsoft.com/en-us/products/storage/blobs
), [Alibaba Cloud OSS](
https://www.alibabacloud.com/product/object-storage-service
), and [Tencent Cloud Object Storage](
https://www.tencentcloud.com/products/cos
) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
        0.8048489093780518
    ],
    [
        "Does the query perform in memory? What are incremental data and historical data?\n\nYes. When a query request comes, Milvus searches both incremental data and historical data by loading them into memory. Incremental data are in the growing segments, which are buffered in memory before they reach the threshold to be persisted in storage engine, while historical data are from the sealed segments that are stored in the object storage. Incremental data and historical data together constitute the whole dataset to search.\n\n###",
        0.757495105266571
    ],
    [
        "What is the maximum dataset size Milvus can handle?\n\n  \nTheoretically, the maximum dataset size Milvus can handle is determined by the hardware it is run on, specifically system memory and storage:\n\n- Milvus loads all specified collections and partitions into memory before running queries. Therefore, memory size determines the maximum amount of data Milvus can query.\n- When new entities and and collection-related schema (currently only MinIO is supported for data persistence) are added to Milvus, system storage determines the maximum allowable size of inserted data.\n\n###",
        0.7453694343566895
    ]
]

LLM으로 RAG 응답 생성하기

문서를 검색한 후 문자열 형식으로 변환합니다.

context = "\n".join(
    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
)

Milvus에서 검색한 문서로 구성된 시스템 프롬프트와 사용자 프롬프트를 LLM에 제공합니다.

SYSTEM_PROMPT = """
Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
"""
USER_PROMPT = f"""
Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
<context>
{context}
</context>
<question>
{question}
</question>
"""

이러한 프롬프트와 함께 gemini-3-pro-preview 모델을 사용하여 최종 응답을 생성합니다.

gemini_model = genai.GenerativeModel(
    "gemini-3-pro-preview", system_instruction=SYSTEM_PROMPT
)
response = gemini_model.generate_content(USER_PROMPT)
print(response.text)

출력 결과에서 Gemini 3 Pro가 검색된 정보를 기반으로 명확하고 잘 구조화된 답변을 생성하는 것을 확인할 수 있습니다.

Based on the provided documents, Milvus stores data in the following ways:
*   **Inserted Data:** Vector data, scalar data, and collection-specific schema are stored in persistent storage as an incremental log. Milvus supports multiple object storage backends for this purpose, including:
    *   MinIO
    *   AWS S3
    *   Google Cloud Storage (GCS)
    *   Azure Blob Storage
    *   Alibaba Cloud OSS
    *   Tencent Cloud Object Storage (COS)
*   **Metadata:** Metadata generated within Milvus modules is stored in **etcd**.
*   **Memory Buffering:** Incremental data (growing segments) are buffered in memory before being persisted, while historical data (sealed segments) resides in object storage but is loaded into memory for querying.

참고: 현재 무료 티어 사용자는 Gemini 3 Pro를 사용할 수 없습니다. 자세한 내용을 보려면 여기를 클릭하세요.

대신 OpenRouter를 통해 액세스할 수 있습니다:

from openai import OpenAI
client = OpenAI(
  base_url="https://openrouter.ai/api/v1",
  api_key="<OPENROUTER_API_KEY>",
)
response2 = client.chat.completions.create(
  model="google/gemini-3-pro-preview",
  messages=[
        {
            "role": "system",
            "content": SYSTEM_PROMPT
        },
        {
            "role": "user", 
            "content": USER_PROMPT
        }
    ],
  extra_body={"reasoning": {"enabled": True}}
)
response_message = response2.choices[0].message
print(response_message.content)

한 가지 더: Google 안티그래비티를 사용한 바이브 코딩

Gemini 3 Pro와 함께 Google은 편집기, 단말기 및 브라우저와 자율적으로 상호 작용하는 동영상 코딩 플랫폼인 Google 안티그래비티를 도입했습니다. 일회성 지침을 처리하던 이전의 AI 지원 도구와 달리, Antigravity는 작업 지향적 수준에서 작동하므로 개발자는 무엇을 만들지 지정하면 시스템이 방법을 관리하여 전체 워크플로를 엔드투엔드로 조율할 수 있습니다.

기존의 AI 코딩 워크플로에서는 일반적으로 개발자가 수동으로 검토, 통합, 디버그 및 실행해야 하는 고립된 스니펫을 생성했습니다. 반중력은 이러한 방식을 바꿉니다. 예를 들어 "간단한 애완동물 상호작용 게임 만들기 "와 같은 간단한 작업만 설명하면 시스템이 요청을 분해하고 코드를 생성하며 터미널 명령을 실행하고 브라우저를 열어 결과를 테스트한 후 작동할 때까지 반복합니다. 이는 AI를 수동적인 자동 완성 엔진에서 사용자의 선호도를 학습하고 시간이 지남에 따라 개인 개발 스타일에 적응하는 능동적인 엔지니어링 파트너로 격상시킵니다.

앞으로 에이전트가 데이터베이스와 직접 협력하는 것은 그리 어려운 일이 아닙니다. MCP를 통한 도구 호출을 통해 AI는 결국 Milvus 데이터베이스를 읽고, 지식 기반을 구성하고, 자체 검색 파이프라인을 자율적으로 유지 관리할 수 있게 될 것입니다. 여러 면에서 이러한 변화는 모델 업그레이드 자체보다 훨씬 더 중요합니다. AI가 제품 수준의 설명을 받아 일련의 실행 가능한 작업으로 변환할 수 있게 되면 인간의 노력은 자연스럽게 목표, 제약 조건, '정확성'의 정의, 즉 진정한 제품 개발을 주도하는 고차원적인 사고로 옮겨갈 수 있게 됩니다.

빌드할 준비가 되셨나요?

사용해 볼 준비가 되셨다면 지금 바로 단계별 튜토리얼을 따라 Gemini 3 Pro + Milvus로 RAG 시스템을 구축해 보세요.

궁금한 점이 있거나 기능에 대해 자세히 알아보고 싶으신가요? Discord 채널에 참여하거나 GitHub에 이슈를 제출하세요. Milvus 오피스 아워를 통해 20분간 일대일 세션을 예약하여 인사이트, 안내 및 질문에 대한 답변을 얻을 수도 있습니다.

    Try Managed Milvus for Free

    Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

    Get Started

    Like the article? Spread the word

    계속 읽기