Milvus Lite·Mistral·LlamaIndex로 RAG 애플리케이션 구축하기

Milvus Lite·Mistral·LlamaIndex로 RAG 애플리케이션 구축하기

프랑스 의회 데이터와 대화하는 RAG(검색 증강 생성) 애플리케이션을 만드는 노트북이에요. LLM 연산에는 Ollama의 Mistral을, 오케스트레이션에는 LlamaIndex를, 벡터 저장에는 Milvus를 사용합니다. 로컬에서부터 Mistral API까지, 환경에 맞춰 유연하게 LLM을 바꿔 쓸 수 있는 구조를 보여줍니다.

출처: 문서

본문

Ollama 설치

Ollama가 노트북에 설치되고 실행 중인지 확인하세요. → https://ollama.com/

의존성 설치

필요한 패키지들을 설치합니다.

!pip install -U pymilvus ollama llama-index-llms-ollama llama-index-vector-stores-milvus llama-index-readers-file llama-index-embeddings-mistralai llama-index-llms-mistralai

데이터 다운로드

저장소를 클론하지 않았다면 이 셀을 실행해 데이터를 내려받습니다.

!wget 'https://raw.githubusercontent.com/mistralai/cookbook/main/third_party/Milvus/data/french_parliament_discussion.xml' -O './data/french_parliament_discussion.xml'

Mistral 임베딩 사용하기

Mistral 플랫폼에서 API Key를 만들고 환경 변수로 로드해야 해요. 이 튜토리얼에서는 .env 파일에 저장된 환경 변수를 불러옵니다.

from dotenv import load_dotenv
import os
load_dotenv()
MISTRAL_API_KEY = os.environ.get("MISTRAL_API_KEY")
from llama_index.embeddings.mistralai import MistralAIEmbedding

model_name = "mistral-embed"
embed_model = MistralAIEmbedding(model_name=model_name, api_key=MISTRAL_API_KEY)

Milvus에 저장할 데이터 준비

이 코드는 Mistral Embed & Mistral-7B로 텍스트 임베딩을 처리해 Milvus에 저장할 수 있게 해 줍니다. 반드시 노트북에서 Ollama가 실행 중이어야 해요!

  • Mistral-7B 모델 초기화: Ollama로 Mistral-7B 모델을 초기화합니다.
  • 서비스 컨텍스트(Service Context): 위에서 정의한 Mistral과 임베딩 모델로 서비스 컨텍스트를 구성합니다.
  • 벡터 스토어(Vector Store): Milvus에 텍스트 임베딩을 저장할 컬렉션을 설정합니다. 데이터베이스 파일, 컬렉션 이름, 벡터 차원을 지정해요.
  • 스토리지 컨텍스트(Storage Context): Milvus 벡터 스토어로 스토리지 컨텍스트를 구성합니다.

이렇게 하면 텍스트 데이터의 벡터 임베딩을 효율적으로 저장하고 검색할 수 있습니다.

from llama_index.llms.ollama import Ollama
from llama_index.vector_stores.milvus import MilvusVectorStore
from llama_index.core import StorageContext, Settings

llm = Ollama(model="mistral", request_timeout=120.0)
Settings.llm = Ollama(model="mistral", request_timeout=120.0)
Settings.embed_model = embed_model
Settings.chunk_size = 350
Settings.chunk_overlap = 20

vector_store = MilvusVectorStore(
    uri="milvus_mistral_rag.db",
    collection_name="mistral_french_parliament",
    dim=1024,
    overwrite=True  # drop table if exist and then create
)
storage_context = StorageContext.from_defaults(vector_store=vector_store)

Mistral AI API 사용하기

모델을 로컬에서 실행하고 싶지 않거나 더 강력한 모델이 필요하다면 Ollama 대신 Mistral API를 쓸 수 있어요. API는 다음 장점을 제공합니다.

  • mistral-large, mistral-small 같은 더 강력한 모델 접근
  • 로컬 GPU/CPU 요구사항 없음
  • 일관된 성능과 안정성
  • 프로덕션 준비 배포

먼저 Mistral 플랫폼에서 API Key를 만들어야 해요.

from llama_index.llms.mistralai import MistralAI

# Initialize Mistral LLM
mistral_llm = MistralAI(api_key=MISTRAL_API_KEY, model="mistral-7B")

# Configure settings for Mistral
Settings.llm = mistral_llm

Milvus를 사용하는 나머지 설정은 동일하게 유지됩니다.

데이터 처리 및 로드

from llama_index.core import SimpleDirectoryReader, VectorStoreIndex

docs = SimpleDirectoryReader(input_files=['data/french_parliament_discussion.xml']).load_data()
vector_index = VectorStoreIndex.from_documents(docs, storage_context=storage_context)
from llama_index.core.tools import RetrieverTool, ToolMetadata

milvus_tool_openai = RetrieverTool(
    retriever=vector_index.as_retriever(similarity_top_k=3),  # retrieve top_k results
    metadata=ToolMetadata(
        name="CustomRetriever",
        description='Retrieve relevant information from provided documents.'
    ),
)

RAG 시스템에 질문하기

query_engine = vector_index.as_query_engine()
response = query_engine.query("What did the French parliament talk about the last time?")
print(response)

더 알아보기 (Learn more)

  • Milvus 공식 문서 — 오픈소스 벡터 데이터베이스
  • MilvusVectorStore — Milvus를 LlamaIndex 벡터 스토어로 사용하는 어댑터
  • Ollama — 로컬 LLM 실행 도구 (여기서는 mistral/mistral-7B 모델)
  • mistral-embed — Mistral의 임베딩 모델