2026.05 - 2026.06
기간 - 2026.05 - 2026.06
온프레미스 RAG·Agent LLM 시스템
외부 API 없이 사내 GPU 서버에서 동작하는 설비 유지보수 전문가 AI 시스템입니다. 문서 기반 RAG, 하이브리드 검색, Tool Calling Agent, 품질 가드레일, 관측성 지표를 구현했습니다.
Python / FastAPI / Ollama / llama.cpp
역할, 구현 흐름, 결과 중심으로 정리
문제에서 구현 결과까지
외부 API 없이 사내 GPU 서버에서 동작하는 설비 유지보수 전문가 AI 시스템입니다. 문서 기반 RAG, 하이브리드 검색, Tool Calling Agent, 품질 가드레일, 관측성 지표를 구현했습니다.
제조·플랜트 환경의 설비 매뉴얼과 정비 이력은 외부 API로 보내기 어려운 기밀 데이터이므로, 내부망에서만 동작하면서도 문서 근거가 있는 답변과 복합 추론을 제공해야 했습니다.
요구사항을 화면, API, 데이터 저장/조회, 알람/진단 흐름으로 분해하고 구현했습니다.
Ollama 기반 로컬 LLM, BGE-M3 임베딩, Chroma 벡터 DB, BM25, Cross-Encoder 리랭커를 결합하고, FastAPI로 RAG·스트리밍·Agent API를 제공했습니다. 응답 품질은 사전 방어와 사후 검증 레이어로 관리했습니다.
7개 API 엔드포인트: chat, streaming, upload, RAG, Agent, metrics / Vector Search + BM25 + RRF + Cross-Encoder 리랭킹 검색 파이프라인 / 외부 API 없이 내부 서버에서 동작하는 설비 유지보수 질의응답 구조 설계
기능 개발 단위로 본 구현 범위
하나의 프로젝트 안에서 직접 설계하고 구현한 주요 기능을 화면, 역할, 구현 내용, 결과 단위로 나눠 정리했습니다.
외부 반출 불가 설비 데이터 → 온프레미스 로컬 LLM RAG
설비 유지보수 자료는 외부 API로 보낼 수 없어, 폐쇄망 안에서만 도는 질의응답 구조가 필요했습니다.
RAG 파이프라인·서버 설계
- 외부 API 없이 내부 서버에서 동작하는 로컬 LLM(Ollama) 기반 질의응답 구성
- chat·streaming·upload·RAG·Agent·metrics 등 7개 엔드포인트로 구조화
- Docker Compose로 폐쇄망에 이식 가능하게 패키징
결과 설비 매뉴얼·정비 자료를 외부 반출 없이 근거 기반으로 답하는 사내 에이전트 구축
근거 없는 답변·환각 → 하이브리드 검색 + 이중 가드레일
정비 판단에 쓰려면 출처 없는 답변이나 환각을 구조적으로 막아야 했습니다.
검색·품질 파이프라인 구현
- Vector Search + BM25 + RRF 융합 + Cross-Encoder 리랭킹 하이브리드 검색
- 사전 방어 + 사후 검증 + 최대 3회 자동 재시도로 응답 품질 관리
- LLM-as-Judge 품질 평가를 비동기 백그라운드로 분리
결과 근거 문서가 없으면 답을 거부하고 출처를 강제해 환각을 차단
복합 질문·운영 관측 → Tool Calling Agent + 관측성 API
단순 검색을 넘어 계산·시간 등 도구를 조합한 복합 질문 처리와, 운영 상태를 지표로 볼 방법이 필요했습니다.
에이전트·관측성 구현
- 문서 검색·현재 시간·계산 도구를 조합하는 Tool Calling Agent 구현
- P95/P99 레이턴시·차단율·품질 점수를 SQLite에 기록하는 관측성 API 구현
결과 복합 질문을 처리하면서 응답 지연·차단·품질을 지표로 추적 가능하게 구성
트러블슈팅 — 겪은 문제와 해결
개발·운영 중 실제로 마주친 문제를 증상, 원인 추적, 조치, 결과 단위로 정리했습니다.
로컬 LLM 응답 지연 → 스트리밍 + 평가 비동기 분리
로컬 LLM 특성상 응답이 느렸고, 품질 평가까지 동기로 돌리면 체감 지연이 더 커졌습니다.
- SSE 스트리밍으로 토큰을 즉시 전달해 체감 지연 감소
- LLM-as-Judge 품질 평가를 비동기 백그라운드 작업으로 분리
결과 응답 지연을 낮추면서 품질 평가는 별도로 수집
근거 부족한데도 답변 생성 → 방어·검증·재시도로 차단
검색 근거가 약할 때도 모델이 그럴듯한 답을 만들어 정비 판단에 위험했습니다.
- 생성 전 사전 방어로 위험·근거 부족 요청을 차단
- 생성 후 검증 + 최대 3회 자동 재시도로 품질 관리
결과 근거 없으면 답을 거부하고 출처를 강제해 환각을 차단
문제
제조·플랜트 환경의 설비 매뉴얼과 정비 이력은 외부 API로 보내기 어려운 기밀 데이터이므로, 내부망에서만 동작하면서도 문서 근거가 있는 답변과 복합 추론을 제공해야 했습니다.
해결
Ollama 기반 로컬 LLM, BGE-M3 임베딩, Chroma 벡터 DB, BM25, Cross-Encoder 리랭커를 결합하고, FastAPI로 RAG·스트리밍·Agent API를 제공했습니다. 응답 품질은 사전 방어와 사후 검증 레이어로 관리했습니다.
상세 설명
상세 구현 설명 펼쳐보기
맡은 역할
외부 LLM API를 사용할 수 없는 환경을 전제로 온프레미스 RAG와 Agent 구조를 설계했습니다.
문서 업로드, 임베딩, 하이브리드 검색, 리랭킹, 응답 생성, 품질 검증, 실행 로그 저장까지 이어지는 백엔드 흐름을 구현했습니다.
단순 Q&A를 넘어 날짜 계산, 문서 검색, 산술 계산을 조합하는 Tool Calling Agent를 구성했습니다.
주요 구현
Vector Search와 BM25 검색을 Reciprocal Rank Fusion으로 결합해 장비명·번호 검색과 의미 검색을 함께 보완했습니다.
Cross-Encoder 리랭커로 최종 검색 결과의 정밀도를 높였습니다.
입력 길이, 위험 키워드, 도메인 키워드를 확인하는 사전 방어 레이어를 만들고, 응답 이후에는 한국어 비율, XML/JSON 아티팩트, 엔티티 교차 검증을 수행했습니다.
SSE 스트리밍으로 토큰 단위 응답을 제공하고, 모든 실행의 레이턴시·차단 여부·품질 점수를 SQLite에 저장했습니다.
RAGAS 형태의 품질 평가는 사용자 응답을 막지 않도록 백그라운드 비동기로 처리했습니다.
자체 LLM 서버 연동 하네스
이 RAG/Agent 시스템과 별도로, 사내 GPU 서버(NVIDIA A10 ×2)에서 llama.cpp로 서빙하는 자체 LLM(Qwen3.5-27B-Q5_K_M, OpenAI 호환 API)을 안정적으로 활용하기 위한 엔터프라이즈 패턴 클라이언트 하네스를 직접 구현했습니다(직접 호출 Level 0 → Level 3).
설정 분리: 환경변수 기반(@dataclass)으로 모델 서버·키·타임아웃·재시도 횟수를 .env로 전환(12-Factor).
재시도: Exponential Backoff(2초→4초→8초)로 5xx만 재시도하고 4xx(인증 오류 등)는 재시도하지 않아 과부하 서버를 악화시키지 않게 처리.
스트리밍: llama.cpp의 OpenAI 호환 SSE(data: {…})를 줄 단위로 파싱해 delta.content만 generator로 yield.
구조화 로깅: request_id·tokens·latency_ms를 포함한 JSON 로그로 ELK/Grafana Loki 등 수집 도구와 호환.
프롬프트 템플릿 관리와 다단계 파이프라인(분석→요약 등 단계별 입출력 추적)을 레이어로 분리.
requests/httpx 없이 stdlib(urllib)만으로 동작하도록 구성해 서버 환경에서 설치 없이 즉시 실행 가능.
성과
- 외부 API 없이 내부 서버에서 동작하는 설비 유지보수 질의응답 구조 설계
- Vector Search + BM25 + RRF + Cross-Encoder 기반 하이브리드 검색 구현
- Tool Calling Agent로 문서 검색, 현재 시간, 계산 도구를 조합한 복합 질문 처리
- Defensive/Harness 이중 가드레일로 위험 요청 차단과 응답 품질 검증 자동화
- P95/P99 레이턴시, 차단율, 품질 점수를 SQLite에 기록하는 관측성 API 구현
핵심 지표
- 7개 API 엔드포인트: chat, streaming, upload, RAG, Agent, metrics
- Vector Search + BM25 + RRF + Cross-Encoder 리랭킹 검색 파이프라인
- 사전 방어 + 사후 검증 + 최대 3회 자동 재시도 품질 관리
- LLM-as-Judge 품질 평가를 비동기 백그라운드 작업으로 분리