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)에 가입하여 경험 공유하기
- 밀버스의 부트캠프 저장소에서 멀티모달 애플리케이션에 대한 더 많은 예시를 살펴보세요.
계속 읽기

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.

Migrating from S3 Vectors to Zilliz Cloud: Unlocking the Power of Tiered Storage
Learn how Zilliz Cloud bridges cost and performance with tiered storage and enterprise-grade features, and how to migrate data from AWS S3 Vectors to Zilliz Cloud.

DeepRAG: Thinking to Retrieval Step by Step for Large Language Models
In this article, we’ll explore how DeepRAG works, unpack its key components, and show how vector databases like Milvus and Zilliz Cloud can further enhance its retrieval capabilities.
