AI
40개의 글
Claude 토큰 절약하는 법
Claude를 쓰다 보면 생각보다 사용량 한도가 빨리 차는 날이 있습니다. API로 서비스를 만들고 있다면 청구서가 예상보다 크게 나오기도 합니다. 작업이 복잡해서만은 아니고, 긴 대화 기록을 끌고…
로컬 임베딩 API로 RAG 검색 붙이기
RAG 파이프라인을 짜다 보면 가장 먼저 걸리는 게 임베딩 비용이다. 문서 수십만 건을 한 번 색인하고 끝이면 모르겠는데, 게시판처럼 글이 계속 쌓이는 서비스는 임베딩 호출이 끊기지 않는다. 사내 …
vLLM에서 유효한 JSON만 뱉게 만들기
LLM으로 분류 결과나 추출 데이터를 받아 파이프라인에 넘기는 서비스를 운영하다 보면, 모델이 가끔 JSON 앞에 "물론이죠, 아래가 결과입니다" 같은 말을 붙이거나 마지막 중괄호를 빼먹는다. 프롬…
NIM Operator로 LLM 추론 선언형으로 배포하기
GPU 노드에 LLM 추론을 올릴 때 Deployment와 Service, PVC, ConfigMap, HPA를 손으로 엮다 보면 모델 하나 올리는 데 매니페스트가 대여섯 개로 불어난다. 모델 가중…
llama.cpp로 로컬에 비전 모델 서빙하기
로컬에서 LLM을 돌릴 때 llama.cpp를 쓰는 사람은 많은데, 이미지를 넣는 멀티모달 쪽은 한동안 손이 잘 안 갔다. 예전엔 llava용 바이너리, clip 변환 스크립트가 모델마다 따로 있어…
vLLM KV 캐시를 CPU와 NVMe로 오프로딩하기
GPU 한 장으로 챗봇을 돌리다 보면 동시 접속이 조금만 늘어도 TTFT가 늘어지는 지점이 온다. 긴 시스템 프롬프트에 멀티턴 대화, 거기에 RAG로 끌어온 문서까지 매번 다시 prefill하면 G…
SGLang과 vLLM 중 무엇을 쓸까
요즘 LLM 서빙 엔진을 고르다 보면 거의 vLLM과 SGLang 둘로 좁혀진다. 예전에 vLLM EAGLE3로 처리량 끌어올리는 글을 쓴 적이 있는데, 그때 댓글이고 사내 메신저고 "RAG 챗봇은…
DCGM Exporter로 쿠버네티스 GPU 모니터링
GPU 노드를 쿠버네티스에 붙여 놓고 나면 다음 질문은 항상 같다. 저 비싼 카드가 지금 얼마나 일하고 있나, 어느 파드가 메모리를 다 먹고 있나, 혹시 조용히 맛이 가고 있는 건 아닌가. CPU야…
MCP 서버에 OAuth 2.1 붙이기
로컬에서 stdio로 돌리던 MCP 서버를 사내망 밖으로 꺼내 HTTP로 열려고 하면 제일 먼저 막히는 게 인증이다. stdio는 프로세스를 띄운 쪽이 이미 신뢰 경계 안에 있으니 환경변수로 토큰만…
Dynamo로 vLLM prefill과 decode 나누기
GPU로 LLM을 서빙하는 글을 몇 번 썼다. 쿠버네티스에 vLLM을 올리는 것부터 EAGLE3 같은 추측 디코딩으로 처리량을 끌어올리는 것까지. 그런데 막상 운영에 넣어 보면 반복해서 걸리는 지점…
vLLM EAGLE3로 추론 처리량 끌어올리기
로컬이나 사내 GPU에서 LLM을 서빙하다 보면 지연 시간에 먼저 발목이 잡힌다. 모델을 더 키우긴 어렵고 GPU를 더 붙이자니 비용이 걸린다. 이럴 때 손대볼 만한 게 추측 디코딩(speculat…
OrcaRouter, 모델 200개를 잇는 게이트웨이
OrcaRouter(orcarouter.ai)는 OpenAI 호환 주소 하나로 200개가 넘는 AI 모델을 호출하게 해 주는 AI 게이트웨이입니다. 운영사는 Continuum AI로, 스스로를 연구…
로컬 LLM으로 함수 호출 에이전트 만들기
로컬에 Ollama 하나 띄워 두고 함수 호출 에이전트를 붙이려는 분을 자주 본다. 클라우드 API 키 없이, 데이터도 밖으로 안 내보내고, OpenAI SDK 코드는 거의 그대로 재사용하고 싶다는…
쿠버네티스 GPU를 DRA로 할당하기
GPU 노드를 쿠버네티스에 붙여본 사람이면 nvidia.com/gpu: 1 한 줄로 파드에 GPU를 꽂던 디바이스 플러그인 방식에 익숙할 것이다. 몇 년을 그렇게 썼는데, 1.34에서 DRA가 정식…
MCP 서버를 stateless 스펙에 맞게 고치기
사내 도구용으로 MCP 서버를 몇 개 띄워 둔 곳이 많습니다. 7월 28일 새 스펙이 나온 뒤로는 "지금 서버를 그대로 둬도 되느냐"는 질문을 자주 받습니다. 1년 전에 만든 SSE 엔드포인트 설정…
pgvector가 버거울 때 Qdrant로 넘어가기
사내 RAG를 pgvector로 시작했다. 처음 수십만 벡터까지는 PostgreSQL 한 대로 충분했다. 그런데 문서가 쌓이고 벡터가 수백만 단위로 늘자 인덱스 빌드 시간이 길어지고, 검색 지연이 …
LiteLLM 소개와 시작하기
Azure 환경을 운영하다 보면 LLM 공급자를 하나만 쓰는 팀을 만나기가 점점 어려워진다. 공급자가 늘어날 때마다 키를 어디에 두고 호출 코드를 어떻게 맞출지 고민하게 된다. 그 질문이 나올 때마…
Python으로 커스텀 MCP 서버 만들기
사내에 굴러다니는 조회용 API와 운영 DB가 있다. 매번 "이 주문 상태 좀 봐줘" 같은 요청이 오면 누군가 쿼리를 던지고 결과를 복사해 전달한다. 이런 반복 작업을 Claude 같은 LLM이 직…
GGUF 양자화 레벨 벤치마크로 고르기
로컬에서 LLM을 돌리기 시작하면 모델 자체보다 "어느 양자화 레벨을 받아야 하나"에서 더 오래 고민하게 된다. Hugging Face 저장소에 같은 모델이 Q4_K_M, Q5_K_M, Q8_0으로…
쿠버네티스에서 GPU로 LLM 추론 서빙하기
GPU 노드를 쿠버네티스에 붙여달라는 요청은 요즘 거의 LLM 추론 때문에 온다. 모델 하나 띄우자고 A100 한 장을 통째로 파드에 묶어두면 아깝고, 그렇다고 CPU로 돌리자니 토큰이 안 나온다.…
LLM 응답을 깨지지 않는 JSON으로 강제하기
사내에 vLLM이나 Ollama로 모델을 띄워놓고 거기에 데이터 추출이나 함수호출을 맡기다 보면, 결국 같은 자리에서 막힌다. 모델이 뱉은 텍스트를 json.loads() 에 넣는 순간이다. 열에 …
RAG 정확도를 리랭커로 끌어올리기
RAG를 붙여 놓고 나면 꼭 한 번은 겪는 장면이 있다. 질문은 멀쩡한데 모델이 엉뚱한 문단을 근거로 답을 지어낸다. 로그를 열어 보면 벡터 검색이 가져온 상위 문서부터 질문과 미묘하게 어긋나 있다…
Claude Code/Codex 프록시로 관측하기
사내 모니터링 시스템에 LLM 호출 관측은 이미 있었다. 없는 것은 "코드를 못 건드리는 클라이언트"의 호출을 잡는 방법이었다. 그래서 투명 게이트웨이 프록시를 만들었고, Claude Code는 3…
AIDC 모니터링은 어디로 가야 하나
예전에 NVML은 무엇이고 어디에 쓰나 라는 글에서 GPU 한 장의 온도와 전력, ECC 카운터를 읽는 방법을 다뤘다. 그런데 GPU 서버가 몇 대에서 몇십 대, 몇백 대로 늘어나면 고민이 달라진다…