LLM 요청에 캐시가 안 걸릴 때, 프롬프트 순서 점검법

이 글에서는 LLM 요청에 캐시가 걸릴 조건과, 실제로는 왜 캐시가 자꾸 깨지는지를 프롬프트 구조 관점에서 확인합니다. 결론부터 말씀드리면, 캐시는 요청 전체가 아니라 앞쪽 프리픽스(prefix)를 통째로 비교하기 때문에, 정적인 내용보다 앞에 단 한 글자라도 바뀌는 값(날짜, 세션 ID, 사용자 질문)을 배치하면 그 뒤 전체가 캐시 미스로 처리됩니다. 순서만 바꿔도 캐시 적중률이 크게 달라지는 이유가 여기에 있습니다. … Read more

파이썬 venv 대신 uv venv 써보니 달라진 점 정리

“파이썬 venv 대신 uv를 써도 되는지” 궁금해서 검색하셨다면, 답부터 말씀드릴게요. 가상환경을 만들고 패키지를 설치하는 루틴 작업이라면 uv venv로 바꿔도 거의 대부분 문제없이 대체됩니다. 다만 팀 전체가 아직 pip·venv 조합을 쓰고 있거나, 사내 네트워크가 외부 파이썬 배포판 다운로드를 막아둔 환경이라면 이야기가 조금 달라집니다. 이 글은 macOS와 Ubuntu 환경, Python 3.11 기준으로 uv 최신 버전을 직접 설치해서 … Read more

GitHub Actions로 배포 자동화할 때, SSH 키는 이렇게 지켜야 합니다

깃허브 공개 저장소에 SSH 개인키를 워크플로 파일에 그대로 적어 넣으면, git log로 과거 커밋만 거슬러 올라가도 키 전체가 그대로 남아 있습니다. 한 번 커밋된 값은 이후 삭제해도 히스토리에 흔적이 남기 때문에, 키를 되돌리는 게 아니라 폐기하고 새로 발급하는 것이 유일한 해결책입니다. GitHub Actions로 배포 자동화할 때 가장 먼저 손대야 할 부분이 바로 이 시크릿 관리이고, … Read more

LLM 에이전트가 도구 결과를 무시하고 할루시네이션할 때 생기는 일

LLM 에이전트가 검색이나 API 호출 같은 도구를 쓰고도 엉뚱한 답을 내놓으면, 흔히 “모델이 부족해서” 혹은 “더 똑똑한 모델로 바꿔야 해서”라고 생각하기 쉽습니다. 하지만 실무에서 이런 문제를 뜯어보면 원인이 모델 자체가 아니라 도구 결과를 프롬프트 어디에, 어떤 role로 넣었는지에 있는 경우가 많습니다. 즉 LLM 에이전트가 도구 결과를 무시하고 할루시네이션할 때는 모델 교체보다 메시지 구조 점검이 먼저입니다. … Read more

벡터 DB 백업, 스냅샷만으로 충분한가 — 복구 테스트까지의 거리

벡터 DB 백업은 스냅샷을 찍는 순간이 아니라 그 스냅샷으로 실제 서비스를 되살릴 수 있는지 확인하는 순간에 완성됩니다. 스냅샷 파일이 스토리지에 잘 쌓여 있어도, 복구 절차를 한 번도 실행해 본 적이 없다면 그건 백업이 아니라 그냥 파일일 뿐입니다. 이 글에서는 Milvus·Qdrant·Weaviate·pgvector 네 가지 도구를 기준으로, 스냅샷과 실제 복구 사이에 벌어지는 구체적인 간극과 이를 좁히는 복구 테스트 … Read more

워드프레스 REST API로 자동 발행할 때 인증과 레이트리밋 정리

워드프레스 REST API로 글을 자동 발행하는 스크립트를 돌렸는데 갑자기 401이나 403이 뜬다면 원인이 뭘까요? 대부분은 인증 방식이 애플리케이션 비밀번호로 넘어가지 않았거나, 짧은 시간에 요청을 반복해서 서버 쪽에서 요청을 막은 경우입니다. 이 글에서는 워드프레스 5.6 이상을 기준으로 REST API 인증을 세팅하는 방법과, 자동으로 발행할 때 429 응답을 받으면 어떻게 재시도해야 안전한지 정리합니다. XML-RPC 대신 REST API로 … Read more

LLM에게 SQL을 생성시켰다가 털린 사례, 인젝션 막는 실전 가드

LLM에게 SQL을 생성시켰다가 회사 데이터베이스가 통째로 털렸다는 이야기, 정말 가능한 일일까요? 네, 가능합니다. 자연어 질문을 SQL로 바꿔주는 text-to-SQL 기능을 앱에 붙이는 순간, 사용자 입력이 LLM을 거쳐 실행 가능한 쿼리로 둔갑하는 새로운 인젝션 경로가 하나 더 생기기 때문입니다. 이 글에서는 LLM이 만든 SQL을 검증 없이 실행했을 때 실제로 어떤 경로로 뚫리는지, 그리고 파라미터 바인딩·권한 최소화·화이트리스트 검증으로 … Read more

파이썬 로깅에 traceback이 안 찍힐 때, exc_info부터 확인해 보세요

파이썬 로깅에 traceback이 안 찍혀서 당황했던 코드를 그대로 재현해 보면 원인은 거의 항상 한 가지로 좁혀집니다. except 블록 안에서 logging.error()를 호출하면서 exc_info 인자를 빠뜨린 경우입니다. 아래 코드를 그대로 실행해 보면, 예외 메시지 한 줄만 로그에 찍히고 정작 어디서 터졌는지 알려주는 traceback은 통째로 사라진다는 걸 확인할 수 있습니다. 이 글은 파이썬 3.8~3.12, 표준 라이브러리 logging 모듈 … Read more

requests에서 httpx로 옮길 때 진짜 달라지는 것들

“requests에서 httpx로 옮기면 코드가 얼마나 바뀔까요?” 검색창에 이렇게 쳐보신 적 있으실 텐데요, 정답은 “API는 거의 그대로지만 기본 동작 몇 가지가 조용히 달라진다”예요. 특히 타임아웃 기본값과 리다이렉트 처리 방식을 모르고 옮기면, 멀쩡하게 돌던 코드가 운영 환경에서 갑자기 예외를 던지는 경우가 생겨요. 이 글에서는 실제로 코드 동작이 달라지는 지점만 골라서, 조건과 예외 상황까지 함께 짚어볼게요. 먼저 전체 … Read more

Playwright로 로그인 세션을 재사용할 때, 쿠키 저장과 만료 감지부터 챙기세요

Playwright로 로그인 세션을 재사용할 때 가장 먼저 부딪히는 문제는 storageState()로 저장한 쿠키 파일을 그대로 믿어버리는 것입니다. 쿠키에는 만료 시각이 분명히 남아있지만, Playwright는 그 세션이 서버 쪽에서 이미 무효화됐는지까지는 알려주지 않습니다. 이 글에서는 로그인 세션을 저장하고 재사용할 때 실제로 쓰는 코드와, 파일 안의 만료 시각을 직접 검사하는 방법, 그리고 검사를 건너뛰면 어떤 일이 생기는지를 순서대로 정리합니다. … Read more