거대 언어 모델(LLM)의 세계는 폭발적인 속도로 확장되고 있지만, 오랫동안 최첨단 기능에 접근하려면 클라우드 기반 API에 의존해야 했습니다. 이러한 의존성은 종종 개인 정보 보호, 비용 및 사용자 정의에 대한 우려를 야기합니다. 그러나 강력한 오픈 소스 모델과 Ollama와 같은 도구 덕분에 로컬 머신에서 LLM을 실행하는 것이 그 어느 때보다 쉬워지면서 상황이 바뀌고 있습니다.
가장 흥미로운 최근 개발 중 하나는 알리바바 클라우드(Alibaba Cloud)의 Qwen3 모델 제품군 출시입니다. 이 모델들, 특히 특수 임베딩 및 재순위 지정(reranker) 버전은 성능에 있어 새로운 기준을 제시하고 있습니다. Ollama와 함께 사용하면 개발자와 연구자가 고급 검색 엔진 및 검색 증강 생성(RAG) 시스템과 같은 정교한 AI 애플리케이션을 자신의 하드웨어에서 편안하게 구축할 수 있는 강력한 툴킷을 제공합니다.
이 글은 이러한 강력한 기능을 활용하기 위한 포괄적이고 단계별 가이드입니다. 임베딩 및 재순위 지정 모델이 무엇인지 명확히 설명하고, Ollama 설정을 안내하며, 완전한 엔드투엔드 RAG 워크플로우를 위해 Qwen3 임베딩 및 재순위 지정 모델을 실행하는 실용적인 Python 코드를 제공할 것입니다.
개발팀이 최대 생산성으로 함께 작업할 수 있는 통합된 올인원 플랫폼을 원하십니까?
Apidog는 귀하의 모든 요구 사항을 충족하며, 훨씬 더 저렴한 가격으로 Postman을 대체합니다!
강력한 듀오: 임베딩 및 재순위 지정 모델 이해하기
"어떻게"에 대해 알아보기 전에 "무엇"인지 이해해 봅시다. RAG 시스템의 맥락에서 임베딩 및 재순위 지정 모델은 서로 다르지만 상호 보완적인 역할을 수행합니다.
1. 사서: 임베딩 모델
수백만 권의 책이 있지만 카탈로그 시스템이 없는 거대한 도서관을 상상해 보세요. 정보를 찾는 것은 악몽이 될 것입니다. 임베딩 모델은 모든 문서를 읽고 광대하고 다차원적인 "개념 공간"에 특정 위치를 할당하는 초지능 사서와 같습니다.
기술적으로 텍스트 임베딩은 텍스트 조각(단어, 문장 또는 전체 문서)을 밀집된 숫자 벡터로 변환하는 프로세스입니다. 이 벡터는 텍스트의 의미론적 의미를 포착합니다. 의미가 유사한 문서는 이 공간에서 서로 "가까운" 벡터를 갖게 됩니다.
쿼리가 있을 때 임베딩 모델은 질문을 벡터로 변환한 다음 라이브러리에서 가장 가까운 문서 벡터를 검색합니다. 이 초기 검색은 믿을 수 없을 정도로 효율적이며 잠재적으로 관련성 있는 광범위한 문서를 검색합니다.
2. 전문 컨설턴트: 재순위 지정 모델
임베딩 모델의 초기 검색은 빠르지만 항상 완벽하지는 않습니다. 주제적으로 관련이 있지만 사용자 쿼리에 정확하게 답하지 않는 문서를 가져올 수 있습니다. 이때 재순위 지정 모델이 필요합니다.
임베딩 모델이 일반 사서라면, 재순위 지정 모델은 특정 분야의 전문가입니다. 초기 검색에서 상위 결과를 가져와서 더 미묘하고 계산 집약적인 분석을 수행합니다. 쿼리 벡터를 문서 벡터와 독립적으로 비교하는 대신, 재순위 지정 모델(일반적으로 교차 인코더)은 쿼리와 각 문서를 쌍으로 살펴봅니다.
이 직접적인 비교를 통해 재순위 지정 모델은 훨씬 더 정확한 관련성 점수를 계산할 수 있습니다. 그런 다음 이 점수를 기반으로 문서의 순서를 다시 지정하여 가장 관련성이 높은 결과를 맨 위로 올립니다. 빠른 초기 검색과 정밀한 재순위 지정이라는 이 2단계 프로세스는 최첨단 RAG 성능의 비결입니다.
Qwen3 모델을 만나다: 오픈 소스 AI의 새로운 표준
알리바바 클라우드의 Qwen3 시리즈는 단순히 또 다른 모델 세트가 아닙니다. 이는 오픈 소스 NLP의 중요한 진전을 나타냅니다. 임베딩 및 재순위 지정 모델이 돋보이는 이유는 다음과 같습니다.
- 최첨단 성능: Qwen3-Embedding-8B 모델은 출시 당시 경쟁이 치열한 MTEB(Massive Text Embedding Benchmark) 다국어 리더보드에서 1위를 차지하며 기존의 많은 모델을 능가했습니다.
- 탁월한 다국어 기능: 방대한 코퍼스로 훈련된 이 모델은 100개 이상의 언어를 지원하므로 전 세계적인 규모의 애플리케이션을 구축하는 데 이상적입니다.
- 유연하고 효율적: 이 모델은 다양한 크기(예: 0.6B, 4B, 8B 매개변수)로 제공되어 개발자가 성능, 속도 및 하드웨어 요구 사항의 최적 균형을 선택할 수 있습니다. 또한 다양한 양자화 수준을 지원하여 정확도에 미치는 영향을 최소화하면서 메모리 사용량을 더욱 줄입니다.
- 명령 인식: 모델에 사용자 지정 명령을 제공하여 특정 작업 또는 도메인에 대한 성능을 조정할 수 있으며, 이 기능은 상당한 성능 향상을 가져올 수 있습니다.
로컬 AI 환경 설정하기
이제 실전에 돌입해 봅시다. 첫 번째 단계는 Ollama를 설정하고 Qwen3 모델을 다운로드하는 것입니다.
1단계: Ollama 설치
Ollama는 macOS 및 Linux용 간단한 한 줄 설치 명령을 제공합니다. 터미널을 열고 다음을 실행하세요.
curl -fsSL https://ollama.com/install.sh | sh
Windows의 경우 Ollama 웹사이트에서 공식 설치 프로그램을 다운로드하세요.
설치 후 다음을 실행하여 제대로 작동하는지 확인할 수 있습니다.
ollama --version
2단계: Qwen3 모델 다운로드
Ollama가 실행 중이면 Ollama 라이브러리에서 모델을 가져올 수 있습니다. Qwen3 모델은 dengcao
네임스페이스에 호스팅되어 있습니다. 임베딩 및 재순위 지정 모델의 권장 버전을 가져올 것입니다. :Q5_K_M
태그는 성능과 리소스 사용량 사이의 훌륭한 균형을 제공하는 특정 양자화 수준을 나타냅니다.
터미널에서 다음 명령을 실행하세요.
# 8B 매개변수 임베딩 모델 다운로드
ollama pull dengcao/Qwen3-Embedding-8B:Q5_K_M
# 4B 매개변수 재순위 지정 모델 다운로드
ollama pull dengcao/Qwen3-Reranker-4B:Q5_K_M
이러한 다운로드는 인터넷 연결에 따라 시간이 걸릴 수 있습니다. 완료되면 ollama list
를 실행하여 로컬에서 사용 가능한 모델을 확인할 수 있습니다.
1부: Qwen3로 임베딩 생성하기
임베딩 모델을 다운로드했으니, 이제 벡터를 생성해 봅시다. 공식 ollama
Python 라이브러리를 사용할 것입니다. 설치되어 있지 않다면 pip install ollama
를 실행하세요.
다음은 텍스트 조각에 대한 임베딩을 생성하는 간단한 Python 스크립트입니다.
import ollama
# Define the model name as downloaded
EMBEDDING_MODEL = 'dengcao/Qwen3-Embedding-8B:Q5_K_M'
def get_embedding(text: str):
"""Generates an embedding for a given text."""
try:
response = ollama.embeddings(
model=EMBEDDING_MODEL,
prompt=text
)
return response['embedding']
except Exception as e:
print(f"An error occurred: {e}")
return None
# --- Example Usage ---
sentence = "Ollama makes it easy to run LLMs locally."
embedding = get_embedding(sentence)
if embedding:
print(f"Embedding for: '{sentence}'")
# Print the first few dimensions for brevity
print(f"First 5 dimensions: {embedding[:5]}")
print(f"Total dimensions: {len(embedding)}")
이 스크립트는 생성된 벡터의 처음 다섯 개 값과 전체 크기(8B 모델의 경우 4096)를 출력합니다. 이 벡터는 문장의 숫자 표현이며, 저장하고 비교할 준비가 된 것입니다.
2부: Qwen3 재순위 지정 모델로 결과 개선하기
재순위 지정 모델을 사용하는 방법은 약간 다릅니다. 전용 rerank
엔드포인트 대신 표준 chat
엔드포인트를 사용합니다. 모델이 재순위 지정 모델 역할을 하도록 특정 프롬프트를 작성하여 쿼리와 문서를 입력으로 받아 관련성 점수를 출력하도록 합니다.
이를 처리할 Python 함수를 만들어 봅시다. 모델에게 관련성을 나타내기 위해 간단한 "Yes" 또는 "No"를 반환하도록 요청할 것이며, 이를 쉽게 점수로 변환할 수 있습니다.
import ollama
# Define the model name as downloaded
RERANKER_MODEL = 'dengcao/Qwen3-Reranker-4B:Q5_K_M'
def rerank_document(query: str, document: str) -> float:
"""
Uses the Qwen3 Reranker to score the relevance of a document to a query.
Returns a score of 1.0 for 'Yes' and 0.0 for 'No'.
"""
prompt = f"""
You are an expert relevance grader. Your task is to evaluate if the
following document is relevant to the user's query.
Please answer with a simple 'Yes' or 'No'.
Query: {query}
Document: {document}
"""
try:
response = ollama.chat(
model=RERANKER_MODEL,
messages=[{'role': 'user', 'content': prompt}],
options={'temperature': 0.0} # For deterministic output
)
answer = response['message']['content'].strip().lower()
if 'yes' in answer:
return 1.0
return 0.0
except Exception as e:
print(f"An error occurred during reranking: {e}")
return 0.0
# --- Example Usage ---
user_query = "How do I run models locally?"
doc1 = "Ollama is a tool for running large language models on your own computer."
doc2 = "The capital of France is Paris."
score1 = rerank_document(user_query, doc1)
score2 = rerank_document(user_query, doc2)
print(f"Relevance of Doc 1: {'Relevant' if score1 > 0.5 else 'Not Relevant'} (Score: {score1})")
print(f"Relevance of Doc 2: {'Relevant' if score2 > 0.5 else 'Not Relevant'} (Score: {score2})")
이 함수는 재순위 지정 모델과 상호 작용하는 방법을 보여줍니다. doc1
이 쿼리에 매우 관련성이 높은 반면 doc2
는 그렇지 않음을 올바르게 식별합니다.
모두 함께: 간단한 RAG 구현
이제 하이라이트입니다. 우리의 두 모델을 사용하여 작은 지식 기반에서 쿼리에 답하는 미니 RAG 파이프라인을 구축해 봅시다. 유사성 검색을 위해 numpy
를 사용할 것입니다. pip install numpy
로 설치하세요.
import ollama
import numpy as np
# --- Model Definitions ---
EMBEDDING_MODEL = 'dengcao/Qwen3-Embedding-8B:Q5_K_M'
RERANKER_MODEL = 'dengcao/Qwen3-Reranker-4B:Q5_K_M'
# --- 1. Corpus and Offline Embedding Generation ---
documents = [
"The Qwen3 series of models was developed by Alibaba Cloud.",
"Ollama provides a simple command-line interface for running LLMs.",
"A reranker model refines search results by calculating a precise relevance score.",
"To install Ollama on Linux, you can use a curl command.",
"Embedding models convert text into numerical vectors for semantic search.",
]
# In a real application, you would store these embeddings in a vector database
corpus_embeddings = []
print("Generating embeddings for the document corpus...")
for doc in documents:
response = ollama.embeddings(model=EMBEDDING_MODEL, prompt=doc)
corpus_embeddings.append(response['embedding'])
print("Embeddings generated.")
def cosine_similarity(v1, v2):
"""Calculates cosine similarity between two vectors."""
return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
# --- 2. Online Retrieval and Reranking ---
user_query = "How do I install Ollama?"
# Embed the user's query
query_embedding = ollama.embeddings(model=EMBEDDING_MODEL, prompt=user_query)['embedding']
# Perform initial retrieval (semantic search)
retrieval_scores = [cosine_similarity(query_embedding, emb) for emb in corpus_embeddings]
top_k_indices = np.argsort(retrieval_scores)[::-1][:3] # Get top 3 results
print("\n--- Initial Retrieval Results (before reranking) ---")
for i in top_k_indices:
print(f"Score: {retrieval_scores[i]:.4f} - Document: {documents[i]}")
# --- 3. Rerank the top results ---
retrieved_docs = [documents[i] for i in top_k_indices]
print("\n--- Reranking the top results ---")
reranked_scores = [rerank_document(user_query, doc) for doc in retrieved_docs]
# Combine documents with their new scores and sort
reranked_results = sorted(zip(retrieved_docs, reranked_scores), key=lambda x: x[1], reverse=True)
print("\n--- Final Results (after reranking) ---")
for doc, score in reranked_results:
print(f"Relevance Score: {score:.2f} - Document: {doc}")
이 스크립트를 실행하면 2단계 프로세스의 강력함을 확인할 수 있습니다. 초기 검색은 "Ollama" 및 "설치"와 관련된 문서를 올바르게 찾습니다. 그러나 재순위 지정 모델은 curl
사용에 대한 문서를 가장 관련성이 높은 것으로 정확하게 식별하여 완벽한 점수로 맨 위로 올립니다.
결론
이제 로컬 머신에서 오늘날 사용 가능한 가장 강력한 오픈 소스 AI 탠덤 중 하나를 성공적으로 설정하고 사용했습니다. Qwen3 임베딩 모델의 광범위한 도달 범위와 Qwen3 재순위 지정 모델의 날카로운 정밀도를 결합하여, 이전에는 대규모 독점 시스템의 전유물이었던 미묘한 수준으로 언어를 이해하고 처리하는 애플리케이션을 구축할 수 있습니다.
여정은 여기서 끝나지 않습니다. 다양한 모델 크기를 실험하고, 여러 양자화 수준을 시도하며, 이 파이프라인을 더 복잡한 애플리케이션에 통합할 수 있습니다. 이러한 도구를 로컬에서 실행할 수 있는 능력은 개인 정보 보호나 성능을 저해하지 않으면서 생성, 혁신 및 탐색할 수 있는 무한한 가능성의 세계를 열어줍니다. 로컬 오픈 소스 AI의 새로운 시대에 오신 것을 환영합니다.
개발팀이 최대 생산성으로 함께 작업할 수 있는 통합된 올인원 플랫폼을 원하십니까?
Apidog는 귀하의 모든 요구 사항을 충족하며, 훨씬 더 저렴한 가격으로 Postman을 대체합니다!