Notes on gotchas while migrating 35kb preprompts from Opus to self-hosted Ollama
35KB 프리프롬프트를 Opus에서 자체 호스팅 Ollama로 옮기며 발견한 함정들
보안 분야 저자가 Anthropic·OpenAI의 세션 데이터 활용과 안전 필터 거부에 대한 불신을 바탕으로, 35KB 규모의 에이전트 프리프롬프트를 자체 호스팅 Ollama로 옮긴 시행착오를 정리한 글입니다. 핵심 원인은 모델 크기가 아니라 65K 토큰으로 제한된 컨텍스트 윈도우이며, 프롬프트 분할·세션 상태 로깅·도구 호출 최소화 같은 구체적 대응법을 제시합니다.
- 주제
본문
OpenAI·Anthropic 같은 프론티어 제공자가 사용자 세션을 학습에 활용할 수 있다는 불신과, 보안 테스트를 '윤리적 거부'로 차단하는 안전 필터에 대한 불만에서 출발한 글입니다. 저자는 Claude Opus에서 잘 동작하던 35KB 프리프롬프트를 128GB AMD Ryzen AI MAX+ 395 머신의 Ollama로 옮기는 과정에서 겪은 문제와 대응법을 정리했습니다. 호스트 OS에 32GB를 남기고 나머지를 추론에 할당한 환경입니다.
왜 자체 호스팅인가
저자는 개인 데이터보다 세션 메타데이터, 즉 문제를 풀기 위해 AI를 구슬리는 직관과 가장 어려운 작업들의 에이전트 세션 전사록이 더 가치 있는 자산일 수 있다고 주장합니다. OpenAI의 Navier-Stokes 논란을 거론하며, 해당 제공자가 변호인과 상의해 내놓은 최선의 방어가 '배제할 수 없다(Cannot rule it out)'였다고 지적합니다. 또한 취약점 탐색을 '해킹 관련'이라는 이유로 거부하는 안전 필터가 오히려 방어자가 자기 시스템의 취약점을 발견하는 것을 막아 모두의 방어·프라이버시·보안을 해친다고 비판합니다. 검증 가능한 보호를 위해서는 자체 하드웨어에서 추론하는 것이 유일한 해법이며, 방어자는 거짓 양성을 용납할 수 없으므로 취약점의 악용 가능성을 입증할 수 있는 모델이 필요하다고 강조합니다.
35KB 프롬프트가 로컬에서 무너지는 이유
프론티어 API에서 깨끗하게 동작하던 프롬프트가 로컬에서는 3분 안에 동력을 잃었습니다. 원인은 모델의 작은 크기가 아니라 컨텍스트 윈도우였습니다. 자체 호스팅 시스템의 최대 컨텍스트는 65K 토큰인데, 35KB 프롬프트 하나가 시작부터 전체의 14%를 차지합니다. 프롬프트와 세션 이력이 금세 한계를 넘으면서 에이전트는 동일한 도구 호출을 반복하고, 이미 읽은 파일을 다시 읽고, 완료한 작업을 다시 작성합니다. 저자는 이를 '90초마다 환생하는 사람에게 브리핑하는 것'에 비유합니다. 마지막 지시는 수행하지만 그 앞의 15개 요구사항은 인식하지 못하는 상태이며, 어떤 경우에는 첫 응답을 받기도 전에 컨텍스트가 포화됩니다.
SOP: Single Objective Prompting
제약 안에서 작동하도록 프롬프트를 튜닝하는 방법들입니다. 프리프롬프트를 목표 하나당 하나의 문제/해결 단위로 분할해야 합니다. opencode에서는 ~/.config/opencode/agents에 선언적으로 에이전트를 정의해야 하는데, Claude Code로 파일을 읽어 프리프롬프트처럼 쓰던 임시방편 방식과 달리 더 형식적인 정의가 필요하고, opencode의 시스템 프롬프트를 선언적 에이전트로 극복해야 하며 권한(permissions) 체계도 익혀야 합니다. Ollama의 기본 컨텍스트 길이는 극도로 작으므로 명시적으로 튜닝해야 합니다. 또한 에이전트가 세션 상태를 디스크에 로깅해 잦은 세션 핸드오프를 지원하고 필요한 조각만 다시 읽게 만들어야 하며, 에이전트 단계당 도구 호출 수를 줄이고, 'X를 하지 마' 같은 부정 지시를 'Y만 해' 같은 긍정 지시로 바꾸는 것이 권장됩니다.
MTTF: Mean Tokens To Forget
컨텍스트 고갈을 나타내는 실패 신호를 로그에서 시간에 따라 측정·모니터링하라고 조언합니다. 연속된 동일 도구 호출, 같은 파일에 대한 반복 읽기, 에이전트가 자기 목표를 다시 진술하는 현상, 도구 호출 파싱 실패(파싱 응답이 컨텍스트에 원시 데이터를 쏟아부어 '만찬 자리의 파열한 수도관'처럼 세션을 파괴한다고 표현합니다), 파일 변경 대비 높은 턴 수 등이 신호입니다.
TCO: Total Custody of Output
프론티어 제공자가 주는 가장 큰 자산은 모델이 아니라 대형 컨텍스트 윈도우라고 진단합니다. 큰 컨텍스트는 Chain of Thought에 여유를 줘서 엉망으로 만든 프롬프트도 좋은 결과를 내게 하지만, Anthropic과 OpenAI는 CoT의 요약만 제공하므로 사용자는 자기 프롬프트의 문제조차 모른 채 제공자에 종속되는 '파우스트적 거래'라고 말합니다. 제공자를 금더미 위에서 쉬는 스마우그(Smaug)에 비유하며, 사용자 손의 동전 하나를 보면 빼앗으러 든다고 경고합니다.
Hacker News 반응
- @SyneRyder — 호스팅된 100만 토큰 윈도우에서 잘 되던 35KB 프롬프트가 로컬 65K 토큰 윈도우에서는 무너진다는 요지를 정리하며, 부정적이고 싶진 않지만 흥미로운 주제에 비해 더 깊은 내용을 기대했다고 아쉬워합니다.
- @0o_MrPatrick_o0(저자) — 주말 내내 문제를 해결하고 글을 썼으며, 주말의 Dario 관련 논란 때문에 빨리 공개해야 한다고 느꼈다고 답합니다. 로컬 추론용으로 프롬프트를 분할하는 과정을 자동화로 가속하는 방법 등 상세한 후속 글을 약속합니다.
- @SyneRyder — 동기 부분과 노하우 부분을 두 글로 나눴다면 더 좋았을 것이라고 하며, 65K 윈도우로는 본격적인 사이버 방어 작업이 매우 어렵고 과거 Anthropic의 25만 토큰 윈도우도 좁게 느껴졌다고 지적합니다.
- @vardalab — Strix Halo를 진지하게 쓸 거라면 Halogen 같은 대안이 있으며, 현재 가장 비용 효율적인 로컬 옵션은 듀얼 R9700이라고 소개합니다. 27B dense Qwen을 FP8로 돌리면 26만 토큰 컨텍스트의 동시 세션 2~3개, MXFP4에서는 4~5개가 가능하고 FP8 기준 초당 60~80, MXFP4 기준 150+ 토큰, 프리필 4K+ 성능으로 호스팅 제공자 수준의 속도가 나온다고 덧붙입니다.
- @0o_MrPatrick_o0 — '내가 그리워하던 Hacker News다'라며 이런 실무 정보 교환을 반깁니다.
원문: Hacker News / 번역·요약: Trawling