DSPy로 프롬프트 자동 최적화 파이프라인 구축하기
손으로 짜는 프롬프트의 한계 프롬프트를 문자열로 하드코딩하면 몇 가지 문제가 누적된다. 첫째, 성능 개선이 "예시 몇 개 더 넣기" 같은 감(感)에 의존한다. 둘째, 모델을 교체하면(예: 상위 모델…
서버·CI/CD·AI 개발 최적화 실전 노트 — 파이프라인, 인프라, 모델 서빙까지 현장에서 검증한 방법만 기록합니다.
손으로 짜는 프롬프트의 한계 프롬프트를 문자열로 하드코딩하면 몇 가지 문제가 누적된다. 첫째, 성능 개선이 "예시 몇 개 더 넣기" 같은 감(感)에 의존한다. 둘째, 모델을 교체하면(예: 상위 모델…
문제: 워커마다 웨이트를 통째로 복제한다 추론 서버를 스케일 아웃할 때 흔히 프로세스를 여러 개 띄운다. gunicorn/uvicorn 워커 4개를 올리면 각 워커가 모델을 load_state_di…
왜 길이 제어가 어려운가 LLM은 토큰을 순차 생성하며 "정확히 500자"를 세면서 멈추지 않는다. 학습 데이터의 분포와 문장 종결 확률에 따라 길이가 결정되기 때문에, 프롬프트에 "500자로"라고…
TTFT가 왜 사용자 경험을 지배하는가 TTFT(Time To First Token)는 요청을 보낸 시점부터 모델이 첫 토큰을 내보내는 순간까지의 지연이다. 스트리밍 UI에서는 전체 응답 시간보다 …
왜 한 번에 전환하면 위험한가 새 버전을 배포할 때 모든 트래픽을 즉시 신규 파드로 넘기면, 문제가 있어도 100% 사용자가 즉시 영향을 받는다. 헬스체크는 통과하지만 특정 요청 패턴에서만 터지는 …
왜 pooling이 문제가 되는가 BERT 계열 인코더는 토큰마다 벡터를 출력한다. 그런데 검색·클러스터링·분류에서는 문장 하나당 벡터 하나가 필요하다. 이 "토큰 시퀀스 → 단일 벡터" 축약을 담…
왜 청크 단위 검색만으로는 부족한가 RAG의 기본 구조는 문서를 작은 청크로 나눠 임베딩하고, 질의와 유사한 청크를 top-k로 뽑아 LLM에 넣는 방식이다. 문제는 검색 정확도와 답변 완결성이 서…
왜 한 번에 전환하면 위험한가 새 버전을 배포할 때 모든 트래픽을 즉시 신규 파드로 넘기면, 문제가 있어도 100% 사용자가 즉시 영향을 받는다. 헬스체크는 통과하지만 특정 요청 패턴에서만 터지는 …
왜 공급망 보안이 문제가 되는가 현대 애플리케이션은 직접 작성한 코드보다 외부 의존성의 비중이 압도적으로 크다. npm, PyPI, 컨테이너 베이스 이미지까지 포함하면 수백 개의 전이 의존성(tra…
왜 프리뷰 환경이 필요한가 스테이징 환경 하나를 여러 브랜치가 공유하면 병목이 생긴다. A 브랜치를 배포해 QA가 검증하는 동안 B 브랜치는 대기해야 하고, 두 변경이 섞여 배포되면 버그의 원인 브…
손으로 짜는 프롬프트의 한계 프롬프트를 문자열로 하드코딩하면 몇 가지 문제가 누적된다. 첫째, 성능 개선이 "예시 몇 개 더 넣기" 같은 감(感)에 의존한다. 둘째, 모델을 교체하면(예: 상위 모델…
문제: 워커마다 웨이트를 통째로 복제한다 추론 서버를 스케일 아웃할 때 흔히 프로세스를 여러 개 띄운다. gunicorn/uvicorn 워커 4개를 올리면 각 워커가 모델을 load_state_di…
왜 길이 제어가 어려운가 LLM은 토큰을 순차 생성하며 "정확히 500자"를 세면서 멈추지 않는다. 학습 데이터의 분포와 문장 종결 확률에 따라 길이가 결정되기 때문에, 프롬프트에 "500자로"라고…
왜 문제가 되는가 운영 중 "타임아웃"이라는 단어는 자주 등장하지만, 대부분의 장애는 이 둘을 구분하지 못해서 발생한다. 커넥션 타임아웃(connect timeout)은 TCP 3-way hands…
왜 문제가 되는가 글로벌 사용자를 대상으로 하는 서비스에서 단일 리전 DNS와 유니캐스트 구성은 물리적 거리에 비례한 지연을 그대로 노출한다. 서울 사용자가 버지니아 리전의 권한 있는 네임서버(au…
왜 rate limiting이 필요한가 특정 클라이언트가 초당 수백 건씩 요청을 쏟아내면 백엔드 커넥션 풀과 DB가 먼저 고갈된다. 애플리케이션 레벨에서 Redis 카운터로 막을 수도 있지만, 이 …