skip to Main Content
[AI 인프라 혁신 3편] 사내 RAG 챗봇, 단 30분 만에 배포하기

[AI 인프라 혁신 3편] 사내 RAG 챗봇, 단 30분 만에 배포하기

사내에서 LLM을 위한 개발을 하려면 무엇을 준비해야 할까요?

ChatGPT나 Gemini 등은 브라우저에서 사용자가 질문만 하면 바로 답을 하지만, 사내 데이터를 넣어 RAG 챗봇을 만들거나 외부에 데이터를 못 보내는 환경에서 자체 LLM을 구축하려면 이야기가 완전히 달라집니다. 최소한 누군가는 vLLM을 GPU 위에 띄워야 하고, 누군가는 임베딩 모델을 따로 서빙해야 하고, 또 누군가는 벡터 DB를 운영해야 하고, 마지막으로 사용자가 만질 수 있는 채팅 UI까지 만들어야 합니다.

아코디언 카탈로그로 LLM 환경을 만들어 보겠습니다. 이번 글에서는 간단히 추론엔진인 vLLM과 벡터데이터베이스인 Qdrant, 그리고 RAG 개발을 위한 IDE 도구인 code-server를 아코디언 카탈로그로 배포하여 간단한 예제를 실행해 보도록 하겠습니다.

만들어 볼 챗봇의 흐름은 다음과 같습니다.

 

1. vLLM 카탈로그로 LLM을 OpenAI처럼

vLLM은 현재 가장 널리 쓰이는 오픈소스 LLM 추론 엔진입니다. PagedAttention 기술로 GPU 메모리를 효율적으로 활용하고,

OpenAI API 호환 엔드포인트(/v1/chat/completions, /v1/completions)를 제공하므로 기존 OpenAI SDK를 그대로 사용할 수 있습니다.

HuggingFace 모델 ID 또는 로컬 경로에서 모델을 로딩하며, GPU 자원(일반 GPU 또는 MIG 슬라이스)을 필수로 요구합니다.

아코디언 카탈로그에서는 vLLM 추론엔진을 쉽게 배포하기 위해 필수로 입력해야 하는 값들만 입력받아 1~2분 내에 배포가능 하도록 지원합니다.

 

2. Qdrant 카탈로그로 RAG를 위한 벡터 데이터베이스 구축

Qdrant는 RAG(Retrieval-Augmented Generation) 파이프라인의 핵심 구성요소인 벡터 데이터베이스입니다.

문서, 이미지, 코드 등의 임베딩 벡터를 저장하고 유사도 검색(ANN)을 고속으로 수행합니다.

아코디언 카탈로그로 배포하면 영속 스토리지(PVC)가 자동 구성되어 Pod 재시작 후에도 데이터가 보존됩니다.

 

 

3. Code Server 카탈로그로 브라우저 기반 AI 개발환경 구축

Code Server는 VS Code를 브라우저에서 실행할 수 있게 해주는 오픈소스 프로젝트입니다.

로컬 PC에 별도 개발 환경을 구성할 필요 없이, 아코디언 카탈로그로 배포하면 GPU 가속 개발 환경이 즉시 준비됩니다.

AI/ML 개발에 필요한 Python, Jupyter 등을 사전 설치할 수 있으며, vLLM 등 동일 네임스페이스의 서비스와 직접 통신이 가능합니다.

 

4. 코드 구현 및 테스트

이제 AI 개발에 필요한 인프라는 구축되었습니다. 개발자는 만들어진 도구들을 이용하여 개발에만 신경쓰면 됩니다.

RAG 예제를 아주 간단하게 두 단계로 살펴보면 학습할 문서를 임베딩하여 벡터DB에 저장하는 단계와 사용자가 질문하면 벡터DB에서 자료를 검색하여 LLM을 통해 답변하는 챗봇 기능으로 나뉩니다. (물론 rerank나 history 저장 등 여러 단계가 추가될 수는 있으나 이 블로그에서는 아주 간단한 실습을 진행해보겠습니다.)

 

4-1) ingest.py

from qdrant_client import QdrantClient, models
from sentence_transformers import SentenceTransformer
import os, glob, uuid


QDRANT_HOST = "qdrant" # 같은 네임스페이스 서비스명
COLLECTION = "rag_docs"
EMBED_MODEL = "BAAI/bge-m3" # 다국어 임베딩 모델


client = QdrantClient(host=QDRANT_HOST, port=6333)
embedder = SentenceTransformer(EMBED_MODEL)


# 문서 청크 분할 및 임베딩
points = []
for filepath in glob.glob("docs/**/*", recursive=True):
text = open(filepath).read() if filepath.endswith(".txt") else extract_pdf(filepath)
chunks = [text[i:i+500] for i in range(0, len(text), 400)] # 500자, 100자 오버랩
… (코드 생략)
print(f"총 {len(points)}개 청크 인덱싱 완료")

 

실행 후 Qdrant 벡터 DB에 데이터가 잘 저장되었는지를 아코디언 UI를 통해 조회하실 수 있습니다.

 

 

이제 실제 저장된 DB를 이용해 사용자가 질문한 내용을 검색하여 LLM을 통해 답변해 보도록 하겠습니다.

 

 

4-2) rag_chatbot.py

from openai import OpenAI
from qdrant_client import QdrantClient
from sentence_transformers import SentenceTransformer

# ── 설정 ──────────────────────────────────────────────
VLLM_BASE_URL = "http://vllm:8000/v1" # vLLM 서비스명:포트
QDRANT_HOST = "qdrant" # Qdrant 서비스명
QDRANT_PORT = 6333
COLLECTION = "rag_docs"
EMBED_MODEL = "BAAI/bge-m3"
TOP_K = 3 # 검색할 관련 문서 수
SCORE_THRESHOLD = 0.4 # 이 점수 미만이면 관련 문서 없음으로 간주

SYSTEM_PROMPT = (
"당신은 주어진 참고 문서를 바탕으로 정확하게 답하는 AI 어시스턴트입니다. "
"문서에 없는 내용은 추측하지 말고 모른다고 답하세요."
)

… ( 코드 생략 )

def main():
init_clients()
print("=" * 50)
print(" RAG 챗봇 (종료: exit / quit / 빈 줄)")
print("=" * 50)

history = [] # LLM에 넘길 대화 기록 (원본 질문/답변 기준)
while True:
…
try:
answer = rag_answer(query, history)
except Exception as e:
print(f"[오류] {e}")
continue

print(f"\n답변> {answer}")

if __name__ == "__main__":
main()

 

아코디언에서 실행한 Code-Server에서 코드 실행을 한 결과는 다음과 같습니다.

 

 

💡 30분 만에 완성한 것들

  • –  Step 1 (0 ~10분): AI 인프라 구축

  • –  Step 2 (10 ~15분): 문서 청크 분할 → 임베딩 → Qdrant 인덱싱

  • –  Step 3 (15 ~25분): RAG 핵심 로직 작성 (검색 → 프롬프트 → LLM 호출)

  • –  Step 4 (25 ~30분): 챗봇 실행 및 검증

 

“인프라 걱정 없이 코드에만 집중할 수 있었던 이유는 아코디언이 vLLM, Qdrant, Code Server등을 쉽게 구축할 수 있도록 지원하기 때문입니다.”

마지막 4편에서는 통합 관찰성과 운영일관성에 대해 소개하겠습니다.