LLM API 키가 유출됐을 때, 로테이션과 사용량 이상 탐지부터 챙기세요

LLM API 키가 유출됐을 때 뭐부터 해야 하는지 궁금해서 검색하셨다면, 순서는 이렇습니다. 노출된 키를 공급자 대시보드에서 즉시 폐기하고, 새 키를 발급해 서비스에 반영한 다음, 유출됐을 것으로 추정되는 시점 이후의 사용량 로그를 훑어 이상 호출이 있었는지 확인하는 순서입니다. 이 글은 OpenAI, Anthropic, Google Gemini(Google Cloud)처럼 REST API 키 방식을 쓰는 클라우드 LLM 서비스를 기준으로 설명합니다. vLLM이나 … Read more

Nginx에서 413 Request Entity Too Large 뜰 때, 어디를 얼마나 올려야 할까요

Nginx 기본 설정값인 client_max_body_size는 딱 1m로 잡혀 있습니다. 그래서 1MB를 살짝 넘는 이미지 파일 하나만 올려도 Nginx에서 413 Request Entity Too Large가 그대로 뜹니다. 결론부터 정리하면, 이 값은 http, server, location 세 곳 중 아무 데나 넣는다고 되는 게 아니라 업로드가 실제로 필요한 범위에 맞춰 넣어야 하고, 값도 무작정 키우기보다 실제 최대 업로드 용량보다 살짝 … Read more

파이썬 데코레이터로 재시도 로직 짜는 법, tenacity 실전 설정

결론부터 말씀드리면, 파이썬 데코레이터로 재시도 로직을 직접 만들기보다 tenacity 라이브러리를 쓰는 편이 훨씬 안전합니다. 지수 백오프, 예외 필터링, 재시도 로깅까지 옵션 몇 줄로 끝나고, 직접 짠 재시도 로직에서 흔히 나는 버그(무한 루프, 예외 삼킴, 스레드 폭주)를 피할 수 있기 때문입니다. 이 글에서는 @retry 데코레이터를 실전에 쓸 때 꼭 챙겨야 할 설정과, 반대로 재시도를 걸면 안 … Read more

LLM 프롬프트에 few-shot 예시를 넣을수록 느려지는 이유와 손익 계산

결론부터 말씀드리면, LLM 프롬프트에 few-shot 예시를 넣을수록 느려지는 이유는 간단합니다. 예시 하나하나가 모델이 실제로 읽어야 하는 입력 토큰으로 그대로 쌓이기 때문입니다. 예시를 넣을수록 형식 준수율과 답변 일관성은 좋아지지만, 그만큼 입력 시퀀스가 길어지면서 처리 시간과 비용이 함께 늘어납니다. 이 글은 OpenAI Chat Completions API(gpt-4, gpt-3.5-turbo 계열, cl100k_base 토크나이저 기준)와 Anthropic Claude API의 프롬프트 캐싱 기능을 기준으로 … Read more

크롤러가 같은 페이지를 중복 수집할 때 — URL 정규화로 막기

이 글에서는 크롤러가 같은 페이지를 반복해서 긁어오는 원인을 짚어보고, 파이썬 표준 라이브러리만으로 URL을 정규화해 중복 수집을 막는 코드를 실제로 확인하실 수 있어요. 핵심은 간단합니다. urllib.parse로 URL을 쪼갠 뒤 대소문자·포트·트레일링 슬래시·쿼리 파라미터 순서를 하나의 기준으로 통일하고, 그 결과 문자열을 집합(set)에 저장해서 이미 방문한 URL인지 검사하면 됩니다. 다만 쿼리 파라미터가 실제로 다른 콘텐츠를 구분하는 경우엔 이 규칙을 … Read more

FastAPI CORS 설정이 프로덕션에서만 막힐 때 점검 순서

로컬 개발 환경에서는 문제없이 잘 열리던 API가 배포만 하면 브라우저 콘솔에 CORS 에러를 뿌린다면, ‘FastAPI CORS 설정이 프로덕션에서만 막힐’ 때 뭐부터 봐야 하는지 찾아서 이 글에 오셨을 겁니다. 먼저 답을 드리면, 원인은 대부분 CORSMiddleware 코드 로직이 아니라 배포 환경 쪽에 있습니다. allow_origins에 등록한 도메인과 브라우저가 실제로 보내는 Origin이 문자 하나까지 일치하지 않거나, Nginx 같은 리버스 … Read more

LLM 임베딩을 캐시할 때, 키를 뭘로 잡아야 할까요

LLM 임베딩을 캐시할 때 키를 뭘로 잡아야 캐시 적중률이 떨어지지 않는지는, 실서비스에서 API 요금과 응답 속도를 동시에 좌우하는 문제입니다. 이 글에서는 텍스트 해시 하나만 믿고 키를 설계했을 때 실제로 생기는 문제와, 파이썬 코드로 안전하게 캐시 키를 만드는 방법을 다룹니다. 미리 정리하면, 정규화한 텍스트의 SHA-256 해시만으로는 부족하고 여기에 모델명·임베딩 차원 같은 파라미터를 함께 묶어야 캐시가 새지 … Read more

파이썬 스크립트가 서버 재부팅 후 안 살아날 때 자동 시작 등록법

서버를 재부팅했는데 돌려두었던 파이썬 스크립트가 다시 살아나지 않아서 검색하셨다면, 원인은 대부분 하나입니다. 그 파이썬 스크립트가 서버의 부팅 과정에 아예 등록되어 있지 않기 때문입니다. nohup python3 app.py &나 터미널에서 그냥 실행한 스크립트는 세션이 끝나거나 서버가 재부팅되면 함께 사라지고, 다시 켜주는 절차가 없으면 영영 안 살아납니다. 이 글에서는 systemd와 cron 두 가지 방식으로 실제 등록하는 절차, 그리고 … Read more

SQLite WAL 모드인데도 database is locked 뜨는 이유, 원인부터 좁혀보기

결론부터 말씀드리면, SQLite WAL 모드인데도 database is locked 에러가 나는 경우는 원인이 하나가 아닙니다. 에러 메시지 텍스트를 자세히 보면 두 갈래로 갈리는데, 단순히 “database is locked”만 뜨는지 아니면 “database table is locked”처럼 테이블 이름까지 붙어서 뜨는지가 첫 번째 단서입니다. 전자는 다른 커넥션과의 충돌(SQLITE_BUSY)이고, 후자는 같은 커넥션 안에서 커서를 안 닫아 생기는 자기 잠금(SQLITE_LOCKED)이라 해결 방법이 … Read more

LLM 답변에 최신 정보가 없을 때, 웹 검색 도구는 언제 필요할까요

어제 발표된 금리 인상 소식을 챗봇에게 물었더니, 몇 달 전 자료를 근거로 태연하게 틀린 답을 내놓은 경험이 있으실 거예요. LLM 답변에 최신 정보가 없을 때는 모델 자체를 바꾸기보다, 웹 검색 도구를 연결하는 쪽이 훨씬 빠르고 확실한 해결책입니다. 다만 이 도구를 붙이는 게 항상 정답은 아니라서, 언제 붙이고 언제 다른 방법을 써야 하는지 기준이 필요합니다. 왜 … Read more