이 마지막 lesson 모양
여기서 quest를 하나로 묶어서 진짜 물건을 하나 띄워. 작은 backend service인데, cloud provider를 골라서 user prompt에 답하고, cloud에 못 닿을 땐 조용히 Ollama로 넘어가. 앞의 모든 track에서 배운 패턴이 production 모양으로 돌아간다는 걸 보이는, 가장 작은 증거야.
Production check-list
- Adapter 패턴. Cloud랑 Ollama 둘 다
stream()구현. - Health check. 둘 다 빠른 timeout 가진
health_check(). - Orchestrator. Cloud를 먼저 부르고, 실패하거나 health가 나쁘면 Ollama로 넘어가. Priority는 기본값이 아니라 인자야. adapters 트랙은 같은 클래스를 local-first로 만들거든. cloud-first를 뜻하는 서비스면 그렇게 말해 줘야 해.
- Streaming. 어느 vessel이 답하든 frontend는 끊김 없는 SSE stream 하나만 봐.
- Pin한 모델 tag. Ollama 쪽도 cloud 쪽도 버전을 못 박아둬.
- Observability. 매 request마다 뭐가 답했는지 남겨. 아래 skeleton은 model tag를 기록해. chunk가 실어 오는 게 그거니까. vessel 키가 필요하면 orchestrator가 그걸 실어 보내게 해. 그리고 믿기 전에 그 로그를 한 번은 읽어봐. 이름 필드가 아예 없는 게 아니라 빈 값이면, 로그는 평생 빈칸만 성실하게 찍거든. 나중에 어떤 답이 유독 다르게 느껴질 때 이 로그가 없으면 아무것도 못 해.
- Mini mode. Local 모델이 작으면 system prompt를 확 덜어내.
- Warm-up. Startup task에서
keep_alive: -1로 local 모델을 미리 올려둬. 그래야 첫 fallback이 견딜 만한 속도로 나와. tag는 adapter에서 읽어야 데운 모델이랑 부르는 모델이 갈라지지 않아.
이게 동작할 때 만든 거
privacy도, 비용도, 장애도 아는 서비스야. Cloud가 죽어도 user는 답을 계속 받아. Cloud가 rate-limit을 걸어도 계속 받고. Cloud가 비싸지면 bulk batch job이 local로 흘러가. Orchestrator는 단순하고 adapter는 좁아. 그래서 잘 안 부러져.