본문 바로가기
web/AI

[AI] Qdrant 로 RAG 구축하기(1)

by 뽀리님 2025. 12. 16.

Tool Calling 을 위해 RAG 구축이 필요하여 Qdrant 를 이용하려 한다.

 

일단 설치부터

 

[개발환경]

Window 11(64bit)

 

 

도커가 설치되어있다면 편하다

docker run -d -p 6333:6333 -p 6334:6334 --name qdrant qdrant/qdrant

 

 

그런다음 http://localhost:6333/dashboard 로 

 

접속해보면 아래와같은 화면이뜬다

 

✔️ 대시보드 화면

 

 

✔️임베딩모델 설치하기.

# 1. Qdrant 클라이언트
pip install qdrant-client

# 2. Sentence Transformers (임베딩 모델)
pip install sentence-transformers

# 3. PyTorch (자동으로 설치되지만 확인)
pip install torch

 

 

✔️데이터 Qdrant에 등록해보기

일단 나는 임시로 경로에 txt파일들을 몇개 넣고 실행했다.

# ========== 설정 ==========
DOCS_DIR = r"D:\RAG\proceedings"
QDRANT_HOST = "localhost"
QDRANT_PORT = 6333
COLLECTION_NAME = "documents"
EMBEDDING_MODEL = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"  # 한국어 지원
CHUNK_SIZE = 500  # 글자 단위

 

 

# ========== 1. 모델 로드 ==========
print("📦 임베딩 모델 로딩 중...")
model = SentenceTransformer(EMBEDDING_MODEL)
print(f"✅ 모델 로드 완료: {EMBEDDING_MODEL}")

 

 

# ========== 2. Qdrant 연결 ==========
print(f"\n🔌 Qdrant 연결 중... ({QDRANT_HOST}:{QDRANT_PORT})")
client = QdrantClient(host=QDRANT_HOST, port=QDRANT_PORT)
print("✅ Qdrant 연결 성공")

 

 

# ========== 3. 컬렉션 생성/확인 ==========
collections = client.get_collections().collections
collection_names = [col.name for col in collections]

if COLLECTION_NAME in collection_names:
    print(f"\n⚠️  컬렉션 '{COLLECTION_NAME}' 이미 존재 - 삭제 후 재생성")
    client.delete_collection(COLLECTION_NAME)

print(f"📁 컬렉션 생성 중: {COLLECTION_NAME}")
client.create_collection(
    collection_name=COLLECTION_NAME,
    vectors_config=VectorParams(
        size=384,  # paraphrase-multilingual-MiniLM-L12-v2 차원
        distance=Distance.COSINE
    )
)
print("✅ 컬렉션 생성 완료")

 

# ========== 4. 문서 읽기 & 청크 분할 ==========
def read_txt_file(file_path: str) -> str:
    """텍스트 파일 읽기"""
    with open(file_path, 'r', encoding='utf-8') as f:
        return f.read()

def split_into_chunks(text: str, chunk_size: int = CHUNK_SIZE) -> List[str]:
    """텍스트를 청크로 분할"""
    chunks = []
    for i in range(0, len(text), chunk_size):
        chunk = text[i:i + chunk_size]
        if chunk.strip():  # 빈 청크 제외
            chunks.append(chunk)
    return chunks

print(f"\n📄 문서 읽기 시작: {DOCS_DIR}")
all_points = []
point_id = 0

for file_path in Path(DOCS_DIR).glob("*.txt"):
    print(f"\n처리 중: {file_path.name}")
   
    # 파일 읽기
    content = read_txt_file(str(file_path))
    print(f"  📏 파일 크기: {len(content)} 글자")
   
    # 청크 분할
    chunks = split_into_chunks(content, CHUNK_SIZE)
    print(f"  ✂️  청크 개수: {len(chunks)}개")
   
    # 임베딩 생성
    print(f"  🧠 임베딩 생성 중...")
    embeddings = model.encode(chunks, show_progress_bar=True)
   
    # Point 생성
    for i, (chunk, embedding) in enumerate(zip(chunks, embeddings)):
        point = PointStruct(
            id=point_id,
            vector=embedding.tolist(),
            payload={
                "file_name": file_path.name,
                "chunk_id": i,
                "content": chunk,
                "file_path": str(file_path)
            }
        )
        all_points.append(point)
        point_id += 1
   
    print(f"  ✅ {file_path.name} 완료 ({len(chunks)}개 청크)")

# ========== 5. Qdrant에 저장 ==========
print(f"\n💾 Qdrant에 저장 중... (총 {len(all_points)}개 포인트)")
client.upsert(
    collection_name=COLLECTION_NAME,
    points=all_points
)
print("✅ 저장 완료!")

 

 

저장한다음 대시보드로 가서 새로고침하면 Collection이 생성되어있고 확인해볼수 있다.

 

'web > AI' 카테고리의 다른 글

[AI] Tool Calling  (0) 2025.12.17
[AI] RAG 와 VectorDB  (1) 2025.12.17
[AI] 챗봇만들기 프로젝트 (1)  (0) 2025.12.04
[AI] MCP 프로토콜  (0) 2025.12.03
[AI] JIRA를 연동하여 주간업무 Agent 만들기(2)  (0) 2025.11.28