본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 28. 18:39

InternFlow 구축하기 (Part 2): GPT API를 호출하지 않고 AI 파이프라인 설계하기

요약

호스팅된 LLM API 대신 로컬 RAG 파이프라인을 구축하여 환각 현상을 줄이고 데이터 보안을 강화하는 방법을 설명합니다. InternFlow 프로젝트를 통해 임베딩 모델, FAISS, 로컬 모델 최적화 과정을 다룹니다.

핵심 포인트

  • 호스팅된 API 대신 로컬 RAG를 사용하여 환각 현상 방지
  • SentenceTransformer와 FAISS를 활용한 효율적인 검색 구현
  • 로컬 모델 운영 시 추론 속도 및 메모리 관리의 중요성
  • Docker 이미지 최적화를 위한 모델 가중치 분리 전략

코드 리뷰 및 이력서 생성을 위한 검색 증강 생성 (RAG) 시스템을 어떻게 구축했는지, 그리고 왜 호스팅된 LLM을 피하는 것이 올바른 결정이었는지에 대해 설명합니다.

InternFlow의 AI 레이어를 설계할 때 제가 내린 첫 번째 결정 중 하나는 이것이었습니다: 핵심 기능을 위해 OpenAI나 그 어떤 호스팅된 LLM API에도 의존하고 싶지 않았습니다.

이는 단순히 비용 문제 때문만은 아니었습니다. 물론 학생 프로젝트로서 비용도 중요하지만, 마케팅 이면에 숨겨진 AI 제품이 실제로 어떻게 작동하는지 이해하는 것이 목적이었습니다.

왜 그냥 GPT를 호출하지 않았을까요?

맥락(Context) 없이 코드를 호스팅된 LLM에 보내는 방식의 핵심적인 문제는 바로 환각 (Hallucination) 현상입니다. 모델은 자신이 본 적 없는 패턴에 대해 자신감 넘치는 리뷰 코멘트를 작성할 것입니다. 이력서 생성기의 경우, 존재하지 않는 수치를 지어낼 것입니다. 인턴십을 구하려는 학생에게 이 중 어느 것도 유용하지 않습니다.

호스팅된 LLM API ❌로컬 RAG 파이프라인 ✅
저장소(Repo) 특화 코드에 대한 환각 발생실제 저장소 데이터에 기반한 답변 제공
......

RAG 파이프라인

RAG는 검색 증강 생성 (Retrieval-Augmented Generation)의 약자입니다. 모델에게 기억에 의존해 답변하도록 요청하는 대신, 먼저 관련 맥락을 검색한 다음 질문과 함께 모델에 전달합니다.

InternFlow 파이프라인이 단계별로 작동하는 방식은 다음과 같습니다:

Step 1: fetch_repository()
        ↓
        GitHub API에서 메타데이터 + 소스 파일 가져오기
...

RAG는 모델이 기억이 아닌 검색된 증거를 바탕으로 답변하기 때문에 환각을 줄여줍니다. 코드 리뷰의 경우, 이 점이 매우 중요합니다.

사용한 도구들

# 임베딩 모델 (Embedding model)
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
...

all-MiniLM-L6-v2 모델은 유의미한 지연 시간 없이 CPU에서 실행될 수 있을 만큼 충분히 작습니다. FAISS는 저장소당 수천 개의 청크(Chunk)가 있더라도 유사도 검색 (Similarity search)을 효율적으로 처리합니다.

예상보다 어려웠던 점

추론 속도 (Inference speed) — GPU 없이는 로컬 모델 (Local models)이 느립니다. 양자화 (Quantization)를 실험하고 모델 크기를 신중하게 선택해야 했습니다. 이 유스케이스 (Use case)에 적합한 모델은 수용 가능한 출력을 생성하는 가장 작은 모델입니다.

Docker 이미지 크기 (Docker image size) — 모델 가중치 (Model weights)가 포함된 단일 AI 서비스 이미지는 기가바이트 단위로 비대해집니다. 결국 이미지는 레이어에 포함하는 대신 컨테이너 시작 시점에 가중치를 다운로드하도록 구성했으며, 이를 통해 배포 속도를 훨씬 빠르게 만들었습니다.

메모리 관리 (Memory management) — 여러 모델을 동시에 로드하면 OOM (Out of Memory) 오류가 발생했습니다. 각 서비스에는 명시적인 메모리 예산 (Memory budgets)과 지연 로딩 (Lazy loading)이 필요했습니다. 즉, 모델을 시작 시점이 아닌 첫 번째 요청 시에 로드하도록 했습니다.

프롬프트 엔지니어링 (Prompt engineering) — 로컬 모델로부터 일관되고 구조화된 출력을 얻어내는 것은 호스팅된 API (Hosted APIs)를 사용할 때보다 훨씬 더 많은 반복 작업이 필요했습니다. 모델은 출력 형식에 대해 매우 명시적인 지침을 필요로 합니다.

결과

학생이 자신의 GitHub 리포지토리 (Repo)를 연결하고 커밋 (Commit)을 푸시하면, 이제 InternFlow는 다음과 같은 작업을 수행할 수 있습니다:

  • 기존 코드베이스 문맥 (Context)에 따른 디프 (Diff) 검토
  • 일반적인 상용구 (Boilerplate)가 아닌, 실제 함수, 실제 지표, 실제 의사결정을 참조하는 이력서 불렛 포인트 (Resume bullets) 생성

이 파이프라인은 요청당 API 비용 없이 당사의 인프라에서 완전히 실행됩니다.

더 큰 교훈은 다음과 같습니다: AI 제품의 엔지니어링 대부분은 AI와 아무런 관련이 없다는 점입니다. 그것은 데이터 파이프라인 (Data pipelines), 메모리 관리, 지연 시간 예산 (Latency budgets), 그리고 출력 파싱 (Output parsing)에 관한 것입니다. 호스팅된 API를 호출하면 이 모든 것이 사용자로부터 숨겨집니다.

Part 3에서는 배포 과제에 대해 다루겠습니다. Docker, Nginx, SSL 및 지속성 스토리지 (Persistent storage)를 사용하여 이 모든 것을 프로덕션 환경에서 안정적으로 실행하는 방법을 살펴볼 것입니다.

저는 InternFlow를 구축하고 있습니다 — GitHub를 연결하고, 모든 커밋에 대해 AI 코드 리뷰를 받으며, 실제 작업 내용을 바탕으로 ATS(지원자 추적 시스템)에 최적화된 이력서 불렛 포인트를 생성해 보세요.

intern-flow.in에서 무료로 체험해 보세요.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0