Milvus, Qwen 및 vLLM으로 RAG 애플리케이션 구축하기
소개
2023년 8월, Alibaba Group은 다국어 유창성, 고급 추론 능력, 높은 효율성을 결합한 Qwen이라는 최첨단 오픈 소스 모델 제품군을 출시했습니다. Qwen은 자연어 이해, 비전 및 오디오 기능, 수학 문제 해결, 코드 생성 등 다양한 애플리케이션에 최적화된 확장 가능한 트랜스포머 기반 아키텍처를 도입합니다. 이 디코더 전용 대규모 언어 모델(LLMs) 시리즈는 검색 증강 생성(Retrieval Augmented Generation, RAG) 시스템 구축을 위한 강력한 가능성을 열어 주며, 현재 경쟁이 치열한 오픈 소스 생태계에 혁신적인 기능을 제공합니다.
LLM은 CPU에서 실행하거나 전용 추론 엔드포인트를 통해 실행할 수 있지만, vLLM 과 같은 도구는 효율적인 대규모 모델 배포를 위한 전문 솔루션을 제공합니다. vLLM은 특히 Qwen과 같은 방대한 모델 크기의 트랜스포머 기반 모델 추론 프로세스를 최적화하도록 설계된 오픈 소스 라이브러리입니다. 최첨단 메모리 최적화 및 병렬화 기법을 활용함으로써 vLLM은 대형 모델의 성능을 향상시켜 프로덕션 환경에서 더 쉽게 접근하고 확장할 수 있게 합니다. Qwen을 vLLM과 통합하면 복잡한 모델을 원활하고 효율적으로 배포할 수 있어 다양한 산업 전반의 실시간 애플리케이션에서 LLM 활용을 촉진합니다.
이 블로그에서는 Qwen과 vLLM을 살펴보고, 두 가지를 Milvus 벡터 데이터베이스와 결합하여 견고한 RAG 시스템을 구축하는 방법을 알아봅니다. 이 세 가지 기술은 검색 기반 접근 방식과 생성형 접근 방식의 강점을 결합하여 복잡한 쿼리를 실시간으로 처리할 수 있는 시스템을 만듭니다. Milvus는 대규모 임베딩을 효율적으로 관리하고 쿼리함으로써 시스템을 강화하며, Qwen의 고급 언어 기능은 응답의 기반을 제공합니다. vLLM이 배포를 최적화함으로써, 이 통합은 광범위한 AI 기반 애플리케이션을 위한 고성능 솔루션을 제공합니다.
Qwen 시리즈 모델 개요
첫 번째 기술 보고서에서 Alibaba Group은 Qwen이라는 이름이 중국어로 "수천 개의 프롬프트"를 의미하는 "Qianwen"에서 유래했다고 설명했습니다. Qwen 모델은 최대 3조 개의 다국어 텍스트 및 코드 토큰을 사용해 학습되었으며, 지도 미세 조정(Supervised Fine-Tuning, SFT) 및 인간 피드백 기반 강화 학습(Reinforcement Learning from Human Feedback, RLHF)과 같은 고급 미세 조정 기법을 통합했습니다.
Figure 1- Qwen 시리즈의 모델 계보
그림 1: Qwen 시리즈의 모델 계보 (출처)
기본 Qwen 모델은 18억 개에서 720억 개의 파라미터에 이르는 네 가지 크기로 제공됩니다. 이 모델들은 수학 및 코딩과 같은 작업을 위한 특화 버전도 갖추고 있습니다. 최초 출시 이후 Qwen 모델은 모델 크기, 성능, 언어 기능, 컨텍스트 길이를 개선하며 발전해 왔습니다. 현재 Qwen 모델은 다음과 같이 분류됩니다:
최초 출시: Qwen 1.8B, 7B, 14B 및 72B
Figure 2- Qwen 최초 출시 .png
그림 2: Qwen 최초 출시 (출처)
Qwen 비전 모델 시리즈
Qwen Vision Model은 처음에 Qwen-VL과 Qwen-VL-Chat 두 가지 버전으로 출시되었습니다. 이 모델들은 문서 읽기, 수학적 추론, 시각적 질의응답과 같은 비전 기반 작업을 처리하도록 설계되었습니다. 이후 Qwen-VL 및 Qwen2-VL 버전으로 업그레이드되었으며, 최신 버전은 가장 진보된 모델로, 다양한 비전 벤치마크에서 Google의 Gemini와 OpenAI의 GPT 같은 모델을 능가하는 상당한 성능 향상을 제공합니다:
Qwen-VL: Qwen-VL-Plus 및 Qwen-VL-Max.
Qwen2-VL: Qwen2-VL-2B, Qwen2-VL-7B 및 Qwen2-VL-72B.
Figure 3- Qwen-VL Benchmark Comparison.png
그림 3: Qwen-VL 벤치마크 비교 (출처)
Figure 4- Qwen2-VL Architecture.png
그림 4: Qwen2-VL 아키텍처 (출처)
Figure 5- Qwen2-VL-72B Benchmark Comparison.png
그림 5: Qwen2-VL-72B 벤치마크 비교 (출처)
Qwen Audio Series
비전 모델과 유사하게, Qwen Audio 시리즈는 처음에 Qwen-Audio(멀티태스크 오디오-언어 모델)와 Qwen-Audio-Chat(지침으로 파인튜닝된 버전) 두 가지 버전으로 출시되었습니다. 이 모델들은 오디오와 텍스트 입력을 모두 처리하고 텍스트 기반 출력을 생성하도록 설계되었습니다. Qwen2 시리즈의 등장으로 두 모델 모두 더욱 향상되었습니다:
- Qwen2-Audio-7B 및 Qwen2-Audio-7B-Instruct: 이 모델들은 오디오와 텍스트 입력을 모두 받아들이고 텍스트 출력을 생성할 수 있으며, 음성 인식, 전사, 음성 기반 AI 어시스턴트와 같은 애플리케이션을 위한 다국어 기능을 향상시킵니다
Figure 6- Qwen-Audio Architecture
그림 6: Qwen-Audio 아키텍처 (출처)
Figure 7- Qwen2-Audio Architecture
그림 7: Qwen2-Audio 아키텍처 (출처)
Qwen 2.5 Series
Qwen 2.5 시리즈는 원래 Qwen 모델의 기반 위에 Qwen 1.5와 Qwen 2라는 두 가지 중요한 업그레이드를 더한 것입니다. 이 시리즈는 수학, 코딩, 일반 언어 이해와 같은 다양한 영역에서 고급 향상을 제공하며 Qwen 제품군의 역량을 더욱 확장하도록 설계된 특화 모델을 도입합니다. 특히 Qwen 1.5 릴리스에는 Mixture of Experts (MoE) 버전도 포함되어 모델 제품군에 다재다능함과 성능 개선을 더했습니다. 이러한 발전으로 Qwen 2.5 시리즈는 폭넓은 적용 가능성을 유지하면서도 특화된 작업에 매우 유연하게 대응할 수 있습니다.
Qwen 2.5 모델은 0.5B, 1.5B, 3B, 7B, 14B, 32B, 72B를 포함한 다양한 크기로 제공되어 다양한 사용 사례에 유연성을 제공합니다:
Qwen 2.5-Math: 이 모델은 복잡한 수학 문제를 해결하도록 특별히 설계되었습니다. 기본 산술부터 고급 미적분까지 다양한 분야에서 정확한 해답을 제공합니다. 이 시리즈에는 1.5B, 7B, 32B 등 다양한 크기의 모델과 더불어, 수학 작업에서 더욱 높은 정밀도를 위해 수학적 보상 모델로 최적화된 특화 버전인 Qwen 2.5-Math-RM-72B가 포함됩니다.
Qwen 2.5-Coder: 코드 생성 및 디버깅을 위해 미세 조정된 모델인 Qwen 2.5-Coder는 스크립트 작성, 코드 완성, 코드 리뷰를 포함한 프로그래밍 작업 자동화에 이상적입니다. 이 모델은 0.5B, 1.5B, 3B, 7B, 14B, 32B 크기로 제공되어, 다양한 코딩 애플리케이션을 작업하는 개발자에게 유연성을 제공합니다.
그림 8- Qwen 2-5 벤치마크 비교.png
그림 8: Qwen 2-5 벤치마크 비교 (출처)
그림 9- Qwen 2-5-Coder 벤치마크 비교
그림 9: Qwen 2-5-Coder 벤치마크 비교 (출처)
그림 10- Qwen 2-5-Math 벤치마크 .png
그림 10: Qwen 2-5-Math 벤치마크 (출처)
QwQ 시리즈
현재 실험적 연구 모델인 QwQ 시리즈는 고급 AI 추론을 향한 대담한 도약을 나타냅니다. 이 모델은 사려 깊은 학생처럼 행동하며, 통찰을 제공하기 전에 자신의 생각에 의문을 제기하는 호기심을 구현합니다. 수학, 코딩, 추론의 복잡한 문제 해결에 중점을 둔 첫 번째 릴리스인 QwQ-32B-Preview,는 GPQA, AIME, MATH-500과 같은 벤치마크에서 뛰어난 성능을 보여줍니다.
그림 11- QwQ 벤치마크 비교
그림 11: QwQ 벤치마크 비교 (출처)
vLLM: 대형 모델 추론 최적화
vLLM (Virtual Large Language Model)은 대규모 transformer 기반 아키텍처 배포의 주요 과제를 해결하며, 대형 언어 모델의 추론을 최적화하도록 설계된 오픈 소스 라이브러리입니다. PagedAttention, tensor parallelism, 효율적인 캐싱 전략과 같은 혁신적인 기법을 통해 vLLM은 추론 중 계산 오버헤드와 메모리 사용량을 크게 줄입니다. 이러한 최적화는 더 크고 복잡한 모델을 향상된 효율성으로 배포할 수 있게 하며, 최첨단 AI 시스템을 실행하는 데 필요한 비용과 노력을 줄여줍니다.
그림 12- vLLM 시스템 개요.png
그림 12: vLLM 시스템 개요 (출처)
주요 기능 및 혁신
PagedAttention
vLLM의 두드러진 기능인 PagedAttention은 운영 체제의 메모리 관리 원칙을 채택하여 GPU 메모리 관리를 혁신합니다. 이 접근 방식은 추론 중 메모리의 동적 할당과 페이징을 가능하게 하여 처리량을 크게 향상시키고 지연 시간을 줄입니다. GPU 리소스를 효율적으로 관리함으로써 PagedAttention은 광범위한 하드웨어 리소스 없이도 더 큰 모델을 사용할 수 있게 하며, AI 애플리케이션 확장을 위한 실용적인 선택지가 됩니다.
Tensor Parallelism 및 Caching
PagedAttention 외에도 vLLM은 여러 GPU에 걸쳐 워크로드를 효과적으로 분산하기 위해 고급 tensor parallelism을 사용합니다. 또한 중복 계산을 최소화하기 위한 효율적인 캐싱 메커니즘을 통합하여, 추론 중 모델 성능을 더욱 향상시킵니다. 이러한 기법들은 종합적으로 vLLM이 transformer 모델에 대해 고속의 비용 효율적인 추론을 제공하도록 보장합니다.
애플리케이션
vLLM은 다양한 도메인에서 대형 언어 모델의 실시간 배포를 지원합니다:
자연어 처리(NLP): 텍스트 요약, 감정 분석, 개체명 인식과 같은 작업.
Conversational AI: 실시간 챗봇 시스템 및 가상 비서.
검색 증강 생성(Retrieval-Augmented Generation, RAG): 고급 질의응답 및 지식 검색 작업을 위한 대규모 모델과 검색 시스템의 통합.
Milvus, vLLM 및 Qwen을 활용한 RAG 애플리케이션
이 튜토리얼은 Milvus를 벡터 데이터베이스로, Qwen을 언어 모델로, vLLM을 최적화된 추론용으로, LangChain을 프레임워크로 사용하여 RAG 파이프라인을 구현하는 방법을 보여줍니다. 이 튜토리얼의 전체 코드는 다음 notebook에서 확인할 수 있습니다.
1단계: 환경 설정
vLLM을 효율적으로 사용하려면 GPU가 필요합니다. 다음 notebook은 A100 GPU를 사용하여 Google Colab에서 실행되었습니다. 또한 임베딩을 생성하려면 OpenAI API Key가 필요합니다.
2단계: 데이터 로드
지식 베이스의 소스로, Qwen 모델 출시 기간 동안의 몇 가지 블로그를 로드하고 LangChain의 RecursiveCharacterTextSplitter 메서드로 청크로 분할합니다.
# Load documents
loader = WebBaseLoader(
web_paths=(
"https://qwenlm.github.io/blog/qwq-32b-preview/",
"https://qwenlm.github.io/blog/qwen2.5/",
"https://qwenlm.github.io/blog/qwen2.5-coder-family/",
)
)
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=200)
docs = text_splitter.split_documents(documents)
3단계: Milvus Retriever 생성
다음으로, 효율적인 검색을 위해 텍스트 콘텐츠와 메타데이터로 Milvus retriever를 구성합니다. 메타데이터는 지식 베이스에 추가적인 지원 컨텍스트를 더해 주기 때문입니다.
# Set Milvus retriever
embeddings = OpenAIEmbeddings()
vectorstore = Milvus.from_documents(
documents=docs,
embedding=embeddings,
connection_args={
"uri": "./milvus_demo.db",
},
text_field="page_content",
metadata_field="metadata",
drop_old=True,
)
retriever = vectorstore.as_retriever(
search_type="similarity",
search_kwargs={"k": 4})
4단계: LLM 엔진 초기화
vLLM 엔진은 특정 모델을 로드하기 위해 효율적으로 초기화되어야 하며, 이 경우에는 "Qwen/Qwen2.5-1.5B”입니다. 최적화된 GPU 메모리 사용량(80%) 및 효율적인 연산을 위한 bfloat16과 같은 구성을 통해 메모리 부족을 방지하고, 최대 500개의 토큰을 생성하기 위한 빠르고 리소스를 고려한 작업을 보장합니다.
# Initialize vLLM
llm = VLLM(
model="Qwen/Qwen2.5-1.5B",
max_new_tokens=500,
enforce_eager=True,
dtype="bfloat16",
gpu_memory_utilization=0.8)
5단계: RAG 파이프라인 구현
그런 다음 Qwen 모델, Milvus retriever 및 컨텍스트와 질문을 입력하기 위한 프롬프트 템플릿으로 RAG 파이프라인을 구축합니다. 또한 응답뿐 아니라 소스 컨텍스트도 시각화하기 위해 응답 표시 함수를 추가합니다.
# Set QA chain
template = """
You are an assistant for question-answering tasks.
Use the following pieces of retrieved context to answer the
question.
If you don't know the answer, just say that you don't know.
Please provide the answer in the English language.
Question: {question}
Context: {context}
Answer:
"""
prompt = PromptTemplate.from_template(template)
qa_chain = RetrievalQA.from_chain_type(
llm,
retriever=retriever,
chain_type_kwargs={"prompt": prompt },
return_source_documents=True
)
# Print statements for response details
def display_response_details(response):
print("Query:", response["query"])
print("Result:", response["result"])
# Extract metadata from the first source document
source_doc = response["source_documents"][0].metadata
print("Source:", source_doc["source"])
print("Description:", source_doc["description"])
print("Title:", source_doc["title"])
# Set the question
question = "What can you tell me about QwQ model?"
# Initialize the query
response = qa_chain.invoke({"query": question, "context": retriever})
Output:
Query: QwQ 모델에 대해 무엇을 알려줄 수 있나요?
Result: QwQ 모델(Qwen with Questions)은 깊이 있게 생각하고, 질문하고, 이해할 수 있음을 보여줍니다. 답을 내기 전에 항상 궁금해하고 신중하게 생각하는 학생과 같습니다. 새로운 것을 배우는 것처럼, 자신이 아무것도 모른다는 것을 알고 더 많이 배우기 위해 계속 질문합니다. 또한 몇 가지 한계가 있으며, 나아가면서 더 배워야 합니다. 누구나 그렇듯, 항상 성장하고 개선되고 있습니다.
Source: https://qwenlm.github.io/blog/qwq-32b-preview/
Description: GITHUB HUGGING FACE MODELSCOPE DEMO DISCORD
참고: 이것은 QwQ의 발음입니다: /kwju:/ , “quill”이라는 단어와 비슷합니다.
생각한다는 것, 질문한다는 것, 이해한다는 것은 무엇을 의미할까요? 이것이 바로 QwQ(Qwen with Questions)가 들어서는 깊은 물입니다. 지혜를 추구하는 영원한 학생처럼, 수학이든 코드든 우리 세계에 대한 지식이든 모든 문제에 진정한 경이와 의심을 가지고 접근합니다. QwQ는 고대의 철학적 정신을 구현합니다. 자신이 아무것도 모른다는 것을 알고 있으며, 바로 그것이 호기심을 이끄는 원동력입니다.
Title: QwQ: 미지의 경계에 대해 깊이 성찰하기 | Qwen
다른 모델들에 대해서도 두 번째 질문을 추가할 수 있습니다. 두 경우 모두 응답이 상세하고 정확하다는 것을 확인할 수 있으며, 이는 Milvus와 Qwen, 그리고 1초 미만으로 답변을 제공한 vLLM의 높은 성능을 보여줍니다.
# Set the question
question = "What can you tell me about Qwen2.5 open-source models: Qwen2.5, Qwen2.5-Coder, Qwen2.5-Math?"
# Initialize the query
response = qa_chain.invoke({"query": question, "context": retriever})
Output:
Query: Qwen2.5 오픈소스 모델인 Qwen2.5, Qwen2.5-Coder, Qwen2.5-Math에 대해 무엇을 알려줄 수 있나요?
Result: Qwen2.5 모델, 즉 Qwen2.5, Qwen2.5-Coder, Qwen2.5-Math는 이전 모델들과 비교해 다양한 측면에서 상당한 개선을 이루었습니다. 주요 요점은 다음과 같습니다:
1. **학술적 성능:**
- Qwen2.5는 여러 인기 코드 생성 벤치마크(EvalPlus, LiveCodeBench, BigCodeBench)에서 오픈소스 모델 중 최고의 성능을 달성했습니다.
- Qwen2.5는 또한 Instructive 평가 과제에서 높은 점수를 기록해, 인간과 유사한 지시 따르기 능력과의 강한 정렬성을 보여주었습니다.
- Qwen2.5는 GPT-4o와 경쟁력 있는 성능을 제공하며, 이전 모델들보다 우수함을 입증했습니다.
2. **실용적 응용:**
- Qwen2.5 모델은 다양한 프로그래밍 언어를 처리하는 데 뛰어나며, 적응성과 다재다능함을 보여줍니다.
- Qwen2.5 모델은 상당한 향상을 거쳐, 더 복잡한 추론 작업을 처리할 수 있도록 역량을 확장했습니다.
3. **모델 학습:**
- Qwen2.5는 Qwen2.5-Coder 및 Qwen2.5-Math와 함께 18조 개 토큰을 포함하는 대규모 데이터셋으로 학습되었습니다. 여기에는 코드 관련 데이터가 포함되어 있어, 더 작은 코딩 모델도 더 크고 포괄적인 모델들과 경쟁력 있게 성능을 낼 수 있습니다.
4. **모델 지원:**
- 모든 Qwen2.5 모델은 광범위한 프로그래밍 언어를 지원할 수 있어, 사용자에게 접근성과 적용 가능성을 제공합니다.
5. **일반 역량:**
- Qwen2.5 모델은 이제 코드 수정 및 코드 작성과 같은 추론 및 생성 작업에서 향상된 성능을 보여줍니다.
6. **특화 모델:**
- Qwen2.5-Coder는 코딩 작업에 중점을 두며, 코드 생성, 수정, 나아가 추론 능력에서도 더 나은 성능을 제공합니다.
- Qwen2.5-Math는 기반 모델인 Qwen2-Math를 개선하여 중국어 지원을 확장하고, Chain-of-Thought (CoT), Program-of-Thought (PoT), Tool-Integrated Reasoning (TIR)과 같은 정교한 추론 방법을 통합합니다.
7. **모델 라이선스:**
- 모든 오픈 소스 모델은 Apache 2.0 라이선스에 따라 제공되어, 다양한 개발 환경에서의 호환성과 사용 편의성을 보장합니다.
이러한 개선 사항들은 더 광범위한 기능과 향상된 성능을 갖춘 강력하고 다재다능한 지능형 프로그래밍 어시스턴트 개발에 종합적으로 기여합니다.
출처: https://qwenlm.github.io/blog/qwen2.5/
설명: GITHUB HUGGING FACE MODELSCOPE DEMO DISCORD
소개 Qwen2 출시 이후 지난 3개월 동안 수많은 개발자들이 Qwen2 언어 모델을 기반으로 새로운 모델을 구축하며 우리에게 귀중한 피드백을 제공했습니다. 이 기간 동안 우리는 더 스마트하고 더 많은 지식을 갖춘 언어 모델을 만드는 데 집중해 왔습니다. 오늘, Qwen 제품군의 최신 추가 모델인 Qwen2.5를 소개하게 되어 기쁩니다. 우리는 역사상 가장 큰 오픈 소스 릴리스일지도 모르는 것을 발표합니다!
제목: Qwen2.5: 기반 모델들의 파티! | Qwen
결론
이번 탐구에서 선보인 기술 혁신, 특히 vLLM의 PagedAttention 통합과 Milvus의 효율적인 벡터 관리는 대규모 언어 모델을 실용적이고 접근 가능하게 만드는 데 있어 인프라의 핵심적인 중요성을 강조합니다. 이러한 기술은 메모리 최적화, 추론 속도, 확장 가능한 지식 검색과 같은 모델 배포의 주요 과제를 해결합니다. 이러한 기술적 병목 현상을 해결함으로써 개발자와 조직은 이제 이전에는 복잡하거나 리소스 집약적이었던 정교한 Retrieval-Augmented Generation (RAG) 시스템을 구현할 수 있게 되었으며, 의료, 교육, 소프트웨어 개발, 과학 연구와 같은 산업 전반에서 AI 기반 애플리케이션의 새로운 지평을 열고 있습니다.
관련 리소스
계속 읽기

Zilliz Cloud On-Demand Compute: Pay Only for What You Use
The customer case behind Zilliz Cloud On-Demand: how a $10K vector search bill came down to under $500, and the engineering changes that made it possible.

Creating Collections in Zilliz Cloud Just Got Way Easier
We've enhanced the entire collection creation experience to bring advanced capabilities directly into the interface, making it faster and easier to build production-ready schemas without switching tools.

Demystifying the Milvus Sizing Tool
Explore how to use the Sizing Tool to select the optimal configuration for your Milvus deployment.



