“그 내용 예전에 누가 정리했는데… 어디 있었더라?”
저희가 사내에서 가장 자주 들었던 말입니다.
출시하는 프로덕트가 매년 늘어나고, 관련된 기술 문서가 증가할수록 내부 구성원들은 정보의 홍수 속에서 ‘어디에 있는지 모르는 정보’를 찾아 오랜 시간을 헤맸습니다.
문서가 없는 게 아니라, 문서량이 너무 많아 적합한 정보를 찾을 수 없는 것이 문제였죠.
사내 위키, 사내 기술 블로그, 마크다운 형태의 매뉴얼 등, 다양한 지식 자산이 이미 존재하고 있었지만, 기존 키워드 기반 검색이나 일반 챗봇 시스템으로는 맥락 있는 답변을 제공하는 데 한계가 분명했습니다.
실제로 “프로젝트 A 기준으로 어떻게 구현했느냐”라는 질문에, 기존 시스템은 적절한 답을 주지 못하고 결국 담당자에게 직접 물어보는 일이 반복됐습니다.
이런 상황에서 사내 개발자들은 새로운 접근이 필요하다고 판단했고, 문맥 중심의 답변이 가능한 RAG(Retrieval-Augmented Generation) 구조를 실험하게 되었습니다.
일반적인 LLM은 고정된 파라미터 내에 지식을 저장하고 있으므로, 학습 이후의 최신 정보나 훈련 데이터에 포함되지 않는 세부 정보를 알 수 없습니다.
이 문제를 해결하기 위해 RAG는 외부의 정보 소스를 질의 시점에 검색하여, LLM이 참고할 수 있도록 합니다.
즉, RAG는 정보 검색(Retrieval)과 텍스트 생성(Generation)을 결합한 구조로, 질문에 더 정확하고 사실적인 응답을 생성할 수 있도록 돕습니다.
이 구조는 특히 사내 위키, 매뉴얼, 프로젝트 기록 등 비정형 문서가 많을 때 빛을 발합니다.
쿠버네티스 기반 RAG 시스템, 이렇게 만들었습니다
RAG 시스템은 단순히 LLM에 사내 데이터를 붙이는 과정뿐만 아니라, 데이터 흐름과 운영 자동화까지 고려해야 하는 꽤 복합적인 구조입니다.
그래서 간단하지만 야심 차게 시작했던 프로젝트가, 결국 쿠버네티스 클러스터 환경에서, 임베딩 파이프라인, 벡터 검색, LLM 추론, UI까지, 전 구성요소를 클러스터 내부에서 통합 운영할 수 있는 형태로 발전했습니다.
전반적인 시스템의 개괄적인 부분만 설명하면 다음과 같습니다.
데이터 수집과 임베딩 자동화: Kubeflow + LlamaIndex
사내 위키, Markdown 문서, 기술 블로그 등 여러 소스에서 새로운 데이터를 수집합니다.
수집된 문서는 문단 단위로 분할한 뒤, LlamaIndex 라이브러리를 사용하여 벡터화합니다.
벡터는 오픈소스 벡터 DB인 Milvus에 저장되며, 전 과정을 Kubeflow Pipeline으로 자동화했습니다.
문서 변경 시 재처리되며, 이 작업은 매일 새벽 주기적으로 실행됩니다.
질문에 맞는 문서 검색: Milvus 벡터 DB
사용자가 챗봇에 질문을 입력하면, 해당 질문을 벡터로 변환하여 Milvus에 쿼리 합니다.
쿼리 과정에서는 벡터 DB에 저장된 유사도가 가장 높은 문서들을 Top-K로 검색합니다.
Milvus는 GPU 리소스를 사용할 수 있으며, 쿠버네티스 클러스터 내에서 안정적인 성능을 보여주었습니다.
답변 생성: LLaMA 3 + KServe
검색된 문서를 기반으로 프롬프트를 구성하고, 질문과 함께 다시 LLaMA 3 LLM에게 해당 내용을 전달합니다.
LLM 모델은 KServe를 통해 쿠버네티스상에서 서빙되며, 추론을 담당한 쿠버네티스 파드는 GPU 리소스를 사용합니다.
LLM 모델은 벡터 DB에서 검색된 내용을 토대로 사용자의 프롬프트에 알맞은 증강된 답변을 생성합니다.
각 마이크로 서비스의 부하가 높아지면, 자동으로 파드와 노드 수를 늘리도록 스케일링을 설정했습니다.
사용자를 위한 웹 UI: Open WebUI 기반의 인터페이스
웹 UI는 추후 LLM 모델을 쉽게 추가 및 선택할 수 있도록, Open WebUI 인터페이스를 활용해 구성했습니다.
사용자는 단순히 자연어로 질문만 입력하면 되고, 백엔드에서는 Milvus 검색 → 검색 결과 프롬프트 구성 → LLaMA 3 추론 요청 → 순서로 생성된 응답이 반환됩니다.
풀 텍스트는 아래 링크에서
https://yozm.wishket.com/magazine/detail/3302/?utm_source=stibee&utm_medium=email&utm_campaign=newsletter_yozm&utm_content=contents