vLLM 및 Milvus를 사용하여 멀티모달 RAG 시스템 배포하기
API 제공업체를 통해 특정 LLM을 중심으로 AI 애플리케이션을 미세 조정하는 데 몇 달을 보냈다고 상상해 보세요. 그런데 갑자기 한 통의 이메일을 받게 됩니다: "새 버전을 위해 현재 사용 중인 모델을 더 이상 지원하지 않습니다."라는 이메일입니다. 익숙한 일인가요? 클라우드 API 제공업체는 바로 사용할 수 있는 강력한 AI 기능의 편리함을 제공하지만, 여기에만 의존하는 것은 몇 가지 중대한 위험을 초래할 수 있습니다:
- 통제력 부족**: 모델 버전이나 업데이트에 대한 통제권이 없습니다.
- 예측 불가능성**: 모델 동작이나 기능의 갑작스러운 변화에 직면할 수 있습니다.
- 제한된 인사이트**: 성능 및 사용 패턴에 대한 가시성이 제한적인 경우가 많습니다.
- 개인정보 보호 우려**: 데이터 프라이버시는 특히 민감한 정보를 처리할 때 중요한 문제가 될 수 있습니다.
그렇다면 해결책은 무엇일까요? 어떻게 통제권을 되찾을 수 있을까요? 시스템 기능을 향상시키면서 이러한 위험을 어떻게 완화할 수 있을까요? 해답은 오픈소스 솔루션을 사용하여 보다 강력하고 독립적인 시스템을 구축하는 데 있습니다.
이 블로그에서는 Milvus 및 vLLM을 사용하여 멀티모달 RAG를 만드는 방법을 안내합니다. 오픈 소스 벡터 데이터베이스와 오픈 소스 LLM 추론이 결합된 기능을 활용하면 텍스트, 이미지, 오디오, 동영상 등 여러 유형의 데이터를 처리하고 이해할 수 있는 시스템을 설계할 수 있습니다. 이 접근 방식을 사용하면 기술을 완벽하게 제어할 수 있을 뿐만 아니라 기존의 텍스트 기반 솔루션을 능가하는 강력하고 다재다능한 시스템을 구축할 수 있습니다.
구축할 내용: 사용자가 완전히 제어할 수 있는 멀티모달 RAG
Milvus와 vLLM을 사용하여 멀티모달 RAG 시스템을 구축하여 LLM을 셀프 호스팅하고 AI 애플리케이션을 완벽하게 제어하는 방법을 보여드리겠습니다. 이 튜토리얼에서는 여러 데이터 유형을 통합하는 강력한 기능을 보여주는 Streamlit 애플리케이션을 만드는 과정을 안내합니다. 여기서 다룰 내용은 다음과 같습니다:
프레임을 추출하고 오디오를 트랜스크립션하여 비디오 입력 처리하기
Milvus를 사용하여 멀티모달 데이터를 저장하고 효율적으로 인덱싱합니다.
- OpenAI CLIP](https://zilliz.com/learn/exploring-openai-clip-the-future-of-multimodal-ai-learning)을 사용하여 이미지를 임베딩으로 인코딩한 후 Milvus로 검색할 수 있도록 합니다.
- 미스트랄 임베딩](https://docs.mistral.ai/capabilities/embeddings/) 모델을 사용하여 텍스트를 임베딩으로 인코딩합니다.
Milvus를 사용하여 사용자 쿼리를 기반으로 관련 컨텍스트를 검색합니다.
시각적 이해와 텍스트 이해를 모두 활용하여 vLLM과 함께 실행되는 Pixtral을 사용하여 응답을 생성합니다.
이 튜토리얼이 끝나면 API 사용 중단이나 예기치 않은 변경에 대해 더 이상 걱정할 필요 없이 유연하고 확장 가능한 시스템을 전적으로 사용자가 제어할 수 있게 됩니다.
Milvus란 무엇인가요?
Milvus](https://milvus.io/docs/overview.md)는 고차원 벡터 임베딩을 통해 수십억 규모의 비정형 데이터를 저장, 색인 및 검색할 수 있는 고성능의 확장성이 뛰어난 오픈 소스 벡터 데이터베이스입니다. 검색 증강 생성(RAG), 시맨틱 검색, 멀티모달 검색, 추천 시스템과 같은 최신 AI 애플리케이션을 구축하는 데 적합합니다. Milvus는 노트북부터 대규모 분산 시스템에 이르기까지 다양한 환경에서 효율적으로 실행됩니다.
vLLM이란?
vLLM(가상 대용량 언어 모델)의 핵심 아이디어는 효율적인 메모리 관리 기술을 활용하여 LLM의 제공 및 실행을 최적화하는 것입니다. 주요 내용은 다음과 같습니다:
- **최적화된 메모리 관리: vLLM은 고급 메모리 할당 및 관리 기법을 구현하여 사용 가능한 하드웨어 리소스를 최대한 활용합니다. 이러한 최적화를 통해 대규모 언어 모델을 효율적으로 실행하여 성능을 저해할 수 있는 메모리 병목 현상을 방지할 수 있습니다.
- 동적 배치**: vLLM은 기본 하드웨어의 메모리 및 컴퓨팅 성능에 따라 배치 크기와 시퀀스를 조정합니다. 이러한 동적 조정은 처리 처리량을 향상시키고 모델 추론 중 지연 시간을 최소화합니다.
- 모듈식 설계**: vLLM의 아키텍처는 모듈식으로 설계되어 다양한 하드웨어 가속기와 간편하게 통합할 수 있습니다. 또한 이러한 모듈성으로 인해 여러 디바이스 또는 클러스터에 걸쳐 쉽게 확장할 수 있어 다양한 배포 시나리오에 맞게 조정할 수 있습니다.
- 효율적인 리소스 활용**: vLLM은 CPU, GPU, 메모리와 같은 중요 리소스의 사용을 최적화합니다. 이러한 효율성을 통해 시스템은 더 큰 모델을 지원하고 더 많은 동시 요청을 처리할 수 있으며, 이는 확장성과 성능이 모두 중요한 프로덕션 환경에서 필수적인 요소입니다.
- 원활한 통합**: 기존 머신 러닝 프레임워크 및 라이브러리와 원활하게 통합되도록 설계된 vLLM은 사용자 친화적인 인터페이스를 제공합니다. 따라서 개발자는 광범위한 재구성 없이도 다양한 애플리케이션에 걸쳐 대규모 언어 모델을 쉽게 배포하고 관리할 수 있습니다.
멀티모달 RAG의 핵심 구성 요소
우리가 구축 중인 멀티모달 RAG 앱은 다음과 같은 핵심 구성 요소로 이루어져 있습니다:
- vLLM은 Pixtral 멀티모달 모델의 추론 및 제공에 사용할 추론 라이브러리입니다.
- Koyeb](http://Koyeb.com)**는 배포를 위한 인프라 계층을 제공하며, AI 워크로드에 특화된 서버리스 플랫폼을 제공합니다. 네이티브 vLLM 통합](https://www.koyeb.com/deploy/vllm) 및 자동화된 GPU 리소스 관리를 통해 프로덕션급 성능과 확장성을 유지하면서 LLM을 쉽게 배포할 수 있습니다.
- 미스트랄 AI**의 픽스트랄](https://mistral.ai/news/pixtral-12b/)은 400M 파라미터 비전 인코더와 12B 파라미터 멀티모달 디코더를 결합한 멀티모달 두뇌 역할을 합니다. 이 아키텍처를 통해 동일한 컨텍스트 창 내에서 이미지와 텍스트를 모두 처리할 수 있습니다.
- 밀버스](https://github.com/milvus-io/milvus)**는 벡터 스토리지 기반을 제공하여 다양한 모달리티의 임베딩을 효율적으로 관리합니다. 여러 벡터 유형을 처리하고 빠른 유사성 검색을 수행할 수 있어 멀티모달 애플리케이션에 적합합니다.
그림-멀티모달 RAG 아키텍처.png](https://assets.zilliz.com/Figure_The_multimodal_RAG_architecture_3fd1ccb67e.png)
그림: 멀티모달 RAG 아키텍처
시작하기
먼저 종속 요소를 설치해 보겠습니다:
'''Python
핵심 LlamaIndex 패키지
pip install -U llama-index-vector-stores-milvus llama-index-multi-modal-llms-mistralai llama-index-embeddings-mistralai llama-index-multi-modal-llms-openai llama-index-embeddings-clip llama_index
비디오 및 오디오 처리
pip 설치 무비파이 파이튜브 pydub 음성 인식 오픈AI-위스퍼 ffmpeg-파이썬 사운드 파일
이미지 처리 및 시각화
pip 설치 토치 토치비전 matplotlib scikit-image git+https://github.com/openai/CLIP.git
유틸리티 및 인프라
파이밀버스 스트림라이트 FTFY 정규식 TQDM을 설치한다.
## 환경 설정
환경을 구성하고 필요한 라이브러리를 가져오는 것부터 시작하겠습니다:
'''파이썬
import os
import base64
import json
pathlib에서 Path
from dotenv import load_dotenv
에서 llama_index.core import 설정
에서 llama_index.embeddings.mistralai import MistralAIEmbedding
# 환경 변수 로드
load_dotenv()
# 기본 임베딩 모델 구성
Settings.embed_model = 미스트랄에이아이엠베딩(
"mistral-embed",
api_key=os.getenv("MISTRAL_API_KEY")
)
비디오 처리 파이프라인
시스템의 핵심은 비디오 처리 파이프라인으로, 원시 비디오 콘텐츠를 RAG 시스템이 이해하고 효율적으로 처리할 수 있는 데이터로 변환합니다.
def process_video(video_path: str, output_folder: str, output_audio_path: str) -> dict:
# 출력 디렉터리가 존재하지 않는 경우 생성
Path(output_folder).mkdir(parents=True, exist_ok=True)
# 비디오에서 프레임 추출
video_to_images(video_path, output_folder)
# 오디오 추출 및 텍스트 변환
video_to_audio(video_path, output_audio_path)
text_data = audio_to_text(output_audio_path)
# 트랜스크립션 저장
open(os.path.join(output_folder, "output_text.txt"), "w")를 파일로 사용합니다:
file.write(text_data)
os.remove(output_audio_path)
반환 {"Author": "예제 작성자", "제목": "예제 제목", "조회 수": "1000000"}
이 파이프라인은 동영상을 다음과 같이 분류합니다:
- 이미지 프레임(0.2 FPS로 추출)
- Whisper를 사용한 오디오 트랜스크립션
- 동영상에 대한 메타데이터
벡터 인덱스 구축하기
Milvus를 사용하여 멀티모달 임베딩을 저장합니다. 인덱스를 생성하는 방법은 다음과 같습니다:
def create_index(output_folder: str):
# 텍스트와 이미지에 대해 서로 다른 컬렉션을 생성합니다.
text_store = MilvusVectorStore(
uri="milvus_local.db",
collection_name="text_collection",
overwrite=True,
dim=1024
)
이미지 저장소 = 밀버스 벡터 저장소(
uri="milvus_local.db",
collection_name="image_collection",
overwrite=True,
dim=512
)
저장소_컨텍스트 = 저장소컨텍스트.from_defaults(
벡터_저장소 = 텍스트_저장소,
image_store=image_store
)
# 문서 로드 및 색인 생성
documents = SimpleDirectoryReader(output_folder).load_data()
멀티모달벡터스토어인덱스.from_documents(
documents,
storage_context=storage_context
)
픽스트랄로 쿼리 처리
사용자가 질문을 하면, 우리는 질문을 처리해야 합니다:
- 벡터 스토어에서 관련 컨텍스트를 검색합니다.
- 텍스트와 이미지를 모두 사용하여 Pixtral로 쿼리를 처리합니다.
다음은 쿼리 처리 기능입니다:
def process_query_with_image(query_str, context_str, metadata_str, image_document):
client = OpenAI(
base_url=os.getenv("KOYEB_ENDPOINT"),
api_key=os.getenv("KOYEB_TOKEN")
)
open(image_document.image_path, "rb")를 image_파일로 사용합니다:
image_base64 = base64.b64encode(image_file.read()).decode("utf-8")
qa_tmpl_str = """
제공된 정보(관련 이미지 및 동영상에서 검색된 컨텍스트 포함)가 주어지면
등 제공된 정보가 주어지면, 추가적인 사전 지식 없이도
추가 사전 지식 없이 정확하고 정확하게 답변합니다.
---------------------
컨텍스트: {context_str}
메타데이터: {metadata_str}
---------------------
쿼리: {query_str}
Answer: """
# Pixtral에 대한 메시지 준비
messages = [
{
"role": "user",
"content": [
{
"type": "text",
"text": qa_tmpl_str.format(
context_str=context_str,
쿼리_str=쿼리_str,
메타데이터_str = 메타데이터_str
)
},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{image_base64}"
}
},
],
}
]
completion = client.chat.completions.create(
model="mistralai/Pixtral-12B-2409",
messages=메시지,
max_tokens=300
)
반환 완료.선택사항[0].메시지.내용
스트림라이트 인터페이스 구축하기
마지막으로 Streamlit으로 사용자 친화적인 인터페이스를 만듭니다:
def main():
st.title("Pixtral & Milvus가 포함된 멀티모달 RAG")
# 세션 상태 초기화
'index'가 st.session_state에 없는 경우:
st.session_state.index = None
st.session_state.retriever_engine = None
st.session_state.metadata = None
# 비디오 입력
video_path = st.text_input("동영상 경로 입력:")
video_path가 아니고 st.session_state.index:
st.spinner("비디오 처리 중..."):
# 비디오 처리 및 인덱스 생성
[... 처리 코드 ...]
if st.session_state.index:
st.subheader("동영상과 채팅")
query = st.text_input("동영상에 대해 질문하세요:")
if query:
with st.spinner("응답 생성 중..."):
# 응답 생성 및 표시
[... 쿼리 처리 코드 ...]
if __name__ == "__main__":
main()
애플리케이션 실행
애플리케이션을 시작하기 전에 다음 사항을 확인하세요:
- .env`에서 환경 변수를 설정합니다.
- 필요한 모든 종속성을 설치합니다.
그런 다음 애플리케이션을 실행합니다:
streamlit 실행 app.py
홈페이지가 표시됩니다:
- 처리할 동영상 업로드
- 동영상 콘텐츠에 대해 질문하기
- 관련 동영상 프레임과 함께 픽스트랄의 답변 읽기
그림- Milvus와 Pixtral로 구축된 멀티모달 RAG 앱의 인터페이스.png](https://assets.zilliz.com/Figure_The_interface_of_your_multimodal_RAG_app_built_with_Milvus_and_Pixtral_34db5892ff.png)
그림: Milvus 및 Pixtral로 구축된 멀티모달 RAG 앱의 인터페이스
이제부터는 비디오와 상호 작용하여 가우스 분포에 대해 자세히 알아볼 수 있습니다.
그림-멀티모달 검색 수행하기.png](https://assets.zilliz.com/Figure_Performing_the_multimodal_search_a416ae862d.png)
그림: 멀티모달 검색 수행하기
결론
이 블로그 게시물에서는 Milvus, Pixtral, vLLM을 사용해 강력한 멀티모달 RAG 시스템을 구축하는 방법을 보여드렸습니다. Milvus의 효율적인 벡터 스토리지 기능과 Pixtral의 고급 멀티모달 이해도를 결합하여 비디오 콘텐츠에 대한 쿼리를 처리하고, 이해하고, 응답할 수 있는 시스템을 만들었습니다. 그리고 이 시스템은 사용자가 완전히 제어할 수 있습니다.
여러분의 의견을 듣고 싶습니다!
이 블로그 게시물이 마음에 드신다면 의견을 남겨주세요:
- 깃허브](https://github.com/milvus-io/milvus)에 별을 달아주세요.
- 밀버스 디스코드 커뮤니티](https://discord.gg/FG6hMJStWu)에 가입하여 경험 공유하기
- 밀버스의 부트캠프 저장소에서 멀티모달 애플리케이션에 대한 더 많은 예시를 살펴보세요.
계속 읽기

How to Install and Run OpenClaw (Previously Clawdbot/Moltbot) on Mac
Turn your Mac into an AI gateway for WhatsApp, Telegram, Discord, iMessage, and more — in under 5 minutes.

Introducing Zilliz MCP Server: Natural Language Access to Your Vector Database
Developers can easily manage and query vector databases with natural language via Zilliz MCP Server in AI-native environments.

Knowledge Injection in LLMs: Fine-Tuning and RAG
Explore knowledge injection techniques like fine-tuning and RAG. Compare their effectiveness in improving accuracy, knowledge retention, and task performance.
