튜토리얼
64개의 포스트

키워드와 의미, 둘 다 쓴다 — BM25·벡터·RRF·리랭커, 논문과 실측으로 보는 하이브리드 검색 (한국어 검색 스택 2편)
원문 메모의 그림은 이랬습니다. BM25와 벡터 검색을 나란히 돌리고, 결과를 RRF로 합치고, 리랭커로 다시 고른다. 이 글은 그 그림의 각 칸을 논문과 실측으로 채웁니다. 2009년 SIGIR의 두 쪽짜리 논문이 제안한 RRF는 점수 대신 등수만 쓰는 단순한 공식인데 왜 통하는지, k=60은 어디서 왔는지, 2023년 TOIS 논문은 왜 '점수 융합이 RRF보다 낫다'고 했는지, 2025년의 '약한 고리' 발견은 무엇인지. 그리고 1편의 한국어 코퍼스로 직접 재 보니, 등가중 RRF는 벡터 단독보다 오히려 나빴고 이유는 BM25가 약한 고리였기 때문이었습니다. 반면 강한 임베딩 둘(Qwen3-8B + BGE-M3)을 RRF로 합치자 어느 쪽 단독보다 좋아졌습니다. 리랭커는 '따로 읽고 비교'하는 바이 인코더와 '같이 읽고 판정'하는 크로스 인코더의 차이로 풀고, 로컬 LLM을 리랭커로 써서 상위 10개의 순서가 얼마나 바뀌는지 잽니다. 인터랙티브 5개와 삽화 8장.

2026년 9월 프론트엔드 라이브러리 지도 — 11개 라이브 데모로 직접 보고 고르기
Tailwind·shadcn/ui·Motion·GSAP·Lenis·Three.js는 같은 문제를 푸는 도구가 아닙니다. 스타일, 인터페이스 구조, 상태 변화, 복합 연출, 스크롤 감각, 3D를 각각 맡습니다. 2026년 9월 30일 npm 레지스트리와 GitHub에서 버전·날짜·라이선스를 다시 확인해 역할별로 정리했고, 올해 주목받은 Paper Shaders·Torph·Sileo·Pretext·json-render까지 다뤘습니다. 무엇보다 각 라이브러리를 이 페이지에서 실제로 불러 돌리는 인터랙티브 데모 11개를 붙였습니다. 컨테이너 쿼리로 배치가 바뀌는 카드, Motion의 상태 전환 네 가지, 스크롤로 조종하는 GSAP 타임라인, Lenis와 기본 스크롤 비교, 멈추면 렌더도 멈추는 3D, 셰이더 재질 8종, 한국어 말풍선을 DOM 없이 재는 Pretext, AI가 승인된 컴포넌트로만 화면을 조립하는 json-render를 직접 만져 보고 고르세요.

한국어 임베딩 모델, 우리 문서로 직접 재봤다 — Qwen3-Embedding 8B·4B·0.6B, BGE-M3, Nomic v2 MoE 실측 비교 (한국어 검색 스택 1편)
RAG를 만들 때 가장 먼저 부딪히는 질문이 '임베딩 모델은 뭘 쓰지?'입니다. 이 글은 그 질문에 남의 벤치마크가 아니라 우리 문서로 답합니다. 코어닷투데이 블로그와 뉴스 589건을 코퍼스로, 사람이 일부러 다른 말로 쓴 질문 22개와 로컬 LLM이 바꿔 쓴 질문 45개, 키워드 질문 18개를 만들고, 맥 한 대의 Ollama에서 Qwen3-Embedding 8B·4B·0.6B, BGE-M3, Nomic Embed v2 MoE 다섯 모델을 같은 조건으로 돌렸습니다. 임베딩이 무엇인지, 코사인 유사도가 왜 각도인지부터 시작해, '청년 일자리'라는 말이 없는 문서를 각 모델이 어떻게 찾는지 실제 값으로 보여 주고, 지시문 접두어 한 줄이 점수를 어떻게 바꾸는지, 같은 한국어 문서를 토크나이저가 얼마나 다르게 쪼개는지, 8B와 4B의 차이가 어디서 나는지를 따져 봅니다. 결론은 순위표 하나가 아니라 '어떤 환경에서 무엇을 고르나'이고, 인터랙티브 6개와 삽화 8장으로 함께 읽습니다. 2편은 BM25·RRF·리랭커, 3편은 마트료시카 임베딩입니다.

Claude Opus 5.5 사용 설명서 — 생각은 끌 수 없고, 손잡이는 effort 하나다
2026년 9월 22일 공개된 Claude Opus 5.5는 Fable 5.1급 성능을 Opus 5보다 20% 싼 값에 내고, 출력은 30% 넘게 빠릅니다. 그런데 Opus 5에서 잘 돌던 코드가 그대로 400 에러를 내거나, 에러 없이 화면만 조용해질 수 있습니다. 생각은 끌 수 없고, 기본 effort는 high에서 medium으로 내려갔고, 도구 호출 사이의 진행 메모는 thinking 블록으로 옵니다. Anthropic이 공개한 Opus 5.5 프롬프팅 가이드와 마이그레이션·effort·비용 문서를 모두 읽고, 이전 모델과 무엇이 다른지, 예시 프롬프트 14개를 원문과 한국어로, 그리고 Haiku·Sonnet·Opus·Fable 중 언제 무엇을 어떤 effort로 쓸지 정리했습니다. SWE-bench Pro 부분집합에서 Opus 5.5 medium은 Fable 5.1 기본값과 같은 정답률을 약 1/5 비용에 냈습니다. 인터랙티브 5개와 삽화 8장.

팀 프로젝트 폴더 구조 — 단일 파일에서 도메인형까지 (FastAPI 입문 7편)
한 파일짜리 할 일 API를 여러 사람이 동시에 고쳐도 충돌하지 않는 구조로 옮긴다. 단일 파일·계층형·도메인형 세 가지 폴더 구조를 비교하고 고르는 기준을 세운 뒤, 권장하는 도메인형 구조를 사용자·할 일 두 도메인으로 실제로 만들어 테스트까지 통과시킨다. 라우터는 얇게, 규칙은 service에, 저장은 repository에 두는 법, 도메인 사이 import 규칙, APIRouter·Depends·dependency_overrides, pyproject.toml·uv.lock·.env.example 같은 루트 파일, 팀 규칙과 PR 체크리스트까지 — FastAPI 입문 시리즈의 마지막 편이다. 댓글 기능 하나를 추가할 때 구조마다 무엇을 건드리는지 보여 주는 폴더 탐험기 위젯을 포함한다.

에이전트 여럿, 저장소 하나 부록 — 도구 지도 2026: 언제 무엇을 쓰나
git worktree 위에는 CLI·에이전트 앱 내장 기능·관제 앱이 층층이 올라가 있고, 옆에는 GitButler·Jujutsu처럼 방식이 다른 도구와 Forgejo 같은 자체 호스팅이 있습니다. 2026년 9월 기준으로 공식 저장소와 문서에서 확인한 사실만으로 각 도구가 무엇이고 worktree와 어떤 관계인지, 언제 쓰고 언제 피할지를 정리하고, 결정 흐름도와 비교표로 '우리 팀은 무엇부터 깔까'에 답합니다.

GPT-6 삼형제 사용 설명서 — Astra·6.1 Sol·Luna, 무엇이 달라졌고 언제 무엇을 쓰나
OpenAI가 9월 한 달 동안 GPT-6 Astra(9/3), GPT-6 Sol·Luna(9/22), GPT-6.1 Sol과 Ultrafast(9/29 DevDay)를 잇달아 내놓았습니다. 최상위 Astra는 입력 10달러·출력 50달러, 새 주력 6.1 Sol은 그 1/5인 2달러·10달러, Luna는 0.10달러·0.50달러입니다. OpenAI 발표문 세 편의 차트에 내장된 원자료 230여 점을 뽑아 비용 대비 점수 곡선을 다시 그렸고, 개발자 문서의 GPT-6 프롬프팅 가이드와 마이그레이션 문서를 읽고 정리했습니다. 6.1 Sol은 DeepSWE에서 추론 '높음'으로 Astra 최고점을 넘었지만 '최대'로 올리자 점수가 오히려 떨어졌습니다. 이전 세대와 달리 GPT-6는 더 자주 묻고, 덜 위임하고, 스킬 파일의 지시에 더 민감합니다. 예시 프롬프트 14개(원문·한국어), 7칸 모델 선택 사다리, Claude Opus 5.5와의 비교, 인터랙티브 5개와 삽화 8장.

CRUD ① GET과 POST — Pydantic 모델로 요청 받고 응답하기 (FastAPI 입문 5편)
CRUD와 HTTP 메서드의 대응, REST식 주소 짓는 법을 정리한 뒤 할 일 API의 만들기(POST)와 읽기(GET)를 구현한다. 4편에서 익힌 Pydantic 모델을 FastAPI에 연결해 요청 본문을 검증하고, 입력 모델과 출력 모델을 나누는 이유, response_model로 민감한 필드를 숨기는 법, 201·404 상태 코드와 HTTPException 사용법을 실제 실행 결과와 함께 다룬다. JSON을 고치면 FastAPI의 응답이 바로 바뀌는 본문 검증기 위젯을 포함한다.

CRUD ② PUT·PATCH·DELETE — 통째로 바꾸기, 일부 고치기, 지우기 (FastAPI 입문 6편)
할 일 API의 나머지 절반인 수정과 삭제를 만든다. PUT(전체 교체)과 PATCH(부분 수정)가 무엇이 다른지, 왜 PUT은 안 보낸 필드를 지워 버리는지, PATCH에서 model_dump(exclude_unset=True)가 하는 일과 exclude_none과의 차이, 그리고 초보자가 거의 반드시 밟는 ‘PATCH로 null이 들어가는’ 함정과 해결법을 실제 실행 결과로 보여 준다. DELETE와 204, 멱등성까지 정리하고, 같은 본문을 다른 메서드로 보내 보는 실험실 위젯을 포함한다.

에이전트 여럿, 저장소 하나 5편 — 두 에이전트에게 같은 일 시키고 좋은 것만 합치기
같은 기능을 Claude Code와 Codex에게 각자의 worktree·브랜치에서 동시에 맡기고, git log·diff A...B·range-diff·같은 테스트로 두 결과를 비교한 뒤 좋은 부분만 골라 합치는 법을 실제 출력으로 따라갑니다. 통째로 채택(squash), 커밋만 가져오기(cherry-pick -x), 파일 하나 가져오기(restore --source), 세 번째 에이전트에게 합치기를 맡기는 법과 뒷정리, 그리고 이 방법이 오히려 손해인 경우까지 다룹니다.

에이전트 여럿, 저장소 하나 6편 — 에이전트가 길을 잃지 않는 저장소
에이전트는 매번 기억 없이 새로 시작하고, Mac은 저마다 설치된 버전이 다릅니다. 규칙은 AGENTS.md와 CLAUDE.md(@AGENTS.md)에, 도구 버전과 명령은 mise.toml에, 비밀은 .env.example 견본에, 큰 파일은 LFS·S3에, 안전장치는 pre-commit 훅·CI·main 보호에 담아 저장소 자체가 규칙과 환경을 들고 다니게 만드는 법을 실제 실행 결과와 함께 정리합니다. 마지막엔 새 Mac에서 다섯 줄로 똑같은 환경을 되살립니다.

/docs 하나로 협업하기 — Swagger UI·ReDoc·OpenAPI 제대로 쓰는 법 (FastAPI 입문 3편)
FastAPI가 자동으로 만들어 주는 /docs(Swagger UI), /redoc, /openapi.json 세 주소를 실제 화면 캡처와 함께 설명한다. Try it out으로 요청을 보내고 응답을 읽는 법, tags·summary·description·examples·responses·deprecated로 문서 품질을 끌어올리는 법, openapi.json으로 프론트엔드 타입을 자동 생성하는 법, 운영 환경에서 문서를 닫는 법까지. 체험판 Swagger UI 위젯으로 할 일 API를 직접 호출해 볼 수 있다.