🗓 이번 주 개요
- 주차: Week 03 (7/13~7/17)
- 키워드: #StructuredOutput #ToolCalling #SQLite #Pydantic #Tokenization #FineTuning
📚 이번 주 학습한 것
1. Week2 구조화 vs Week3 영속저장 — "구조화"와 "저장"은 다른 레이어
- 핵심 개념: response_format / with_structured_output은 답변의 "모양"만 Pydantic에 맞게 강제할 뿐 메모리 안에서 끝나고, @tool(args_schema=...)은 모델이 실제 함수를 호출하게 만들어 SQLite에 진짜 쓰기 동작(INSERT)을 실행시킨다.
- 내가 이해한 방식: DB 테이블 라우팅 같은 확정적 로직은 코드가 담당하고, 자연어 의미 해석처럼 코드가 못 하는 부분만 LLM이 담당한다. 그 LLM 판단(언제 어떤 tool을 부를지)을 유도하는 유일한 통로가 system prompt라는 구분으로 이해함.
- 관련 코드/링크: extract_schedule_request(구조화) → save_structured_request(SQLite 저장, structured_requests + schedules/todos/reminders로 분기) → list_saved_requests / get_saved_request / personal_list_saved_schedules(재조회) → SQLITE_MEMORY_PROMPT / WEEK03_TOOL_CALL_PROMPT / build_week03_agent
2. Tool 입력 필터링 (args_schema)
- 핵심 개념: @tool에 Pydantic 클래스를 args_schema로 붙이면, 모델이 만든 tool arguments가 실행 전에 타입/필드 검증을 통과해야 한다. 즉 "입력 필터" 역할. Agent의 출력 쪽도 같은 방식(response_format)으로 구조화할 수 있다.
- 내가 이해한 방식: 일정 데이터를 다루는 Pydantic 클래스를 스키마로 넣으면, 모델이 엉뚱한 필드/타입으로 tool을 호출하는 걸 코드 레벨에서 미리 막을 수 있다.
- 관련 코드/링크: save_structured_request 등 tool 함수 시그니처의 args_schema
3. LLM 토큰화 & 프리트레이닝/파인튜닝 기초
- 핵심 개념: LLM은 "단어"가 아니라 토큰 단위로 다음 토큰의 확률을 예측하는 모델이다. 토큰은 BPE(Byte Pair Encoding) 등으로 쪼갠 subword 단위라서, 하나의 단어보다 작을 수도(어미가 분리) 여러 글자가 뭉쳐 하나가 될 수도 있다.
- 내가 이해한 방식:
- 토큰화: 텍스트 → 정수 ID 시퀀스로 바꾸는 과정. 단어 단위로 쪼개면 어휘 수가 너무 커지고 신조어/오탈자에 취약해서, 실무 LLM은 자주 등장하는 문자열 조각을 하나의 토큰으로 묶는 subword 방식(BPE/WordPiece)을 쓴다.
- BOS/EOS/SOS: BOS(Beginning Of Sequence)와 SOS(Start Of Sequence)는 같은 개념을 부르는 서로 다른 이름(시퀀스 시작 표시)이고, EOS(End Of Sequence)는 끝 표시다. 둘 다 프리트레이닝 단계부터 어휘에 포함되는 기본 특수 토큰이다.
- 커스텀 토큰: 파인튜닝(특히 instruction/chat 튜닝) 단계에서 대화의 역할(user/assistant/system)과 턴 경계를 표시하려고 추가하는 특수 토큰이다. 예: <|im_start|>user, <|im_start|>assistant 같은 형태. 이 토큰들이 "여기까지는 사용자가 한 말, 여기부터는 내가 답할 차례"를 학습 데이터에서 명확히 구분해준다.
- 프리트레이닝 vs 파인튜닝: 프리트레이닝은 raw 텍스트(웹 문서 등)에 대해 대화 형식 없이 그냥 "다음 토큰 맞히기"만 반복 학습한다. 파인튜닝(SFT)은 user: 질문 / assistant: 답변 형태로 정리된 대화 데이터를 커스텀 토큰으로 턴을 감싸서 학습시켜, 모델이 "사용자 턴 다음엔 assistant 턴을 생성해야 한다"는 대화 패턴 자체를 배우게 만든다.
- 아직 헷갈리는 부분: 실제 토크나이저(tiktoken 등)가 문장을 어떻게 쪼개는지 코드로 직접 확인 안 해봄. 커스텀 토큰이 vocab에 추가될 때 embedding이 어떻게 새로 학습되는지(처음엔 랜덤 초기화인지 등)는 다음에 더 파야 함.
- 관련 코드/링크: 프리튜닝/파인튜닝 비교 슬라이드 (이미지 첨부분)
🧱 막혔던 지점 & 해결 과정
- 문제 상황: save_structured_request의 payload = {...} 딕셔너리를 잘못된 위치에서 닫아 문법 오류 발생, personal_list_saved_schedules에서 kind 인자를 안 쓰고 "personal_schedule"을 하드코딩한 로직 버그 존재. 이후 update 기능 구현 시 "수정"이 아니라 새 row를 "저장"해버리는 오류도 발생(새 request_id가 생기는 것으로 확인).
- 시도한 방법: AI에게 코드 점검을 요청해서 두 버그 위치를 확인하고, update 오류는 tool_call/tool_result trace를 추적해서 원인을 좁힘.
- 최종 해결 / 참고 자료: update 오류는 WEEK03_TOOL_CALL_PROMPT에 update 관련 지시를 명확히 추가해서 해결 — 수정 후 trace에서 동일 schedule_id/request_id로 값만 바뀐 것을 확인해 정상 동작 검증함. delete 기능은 store.delete_schedules_by_filter(...) / delete_all_schedules()로 분리 구현.
🔁 이번 주 회고 (KPT) — 과제 PR 회고 요약
- Keep: 코드를 그대로 베끼기 전에 "이 문법이 뭔지", "왜 이렇게 설계했는지" 먼저 질문하고 이해한 다음 타이핑함
- Problem: 기본 파이썬 문법(딕셔너리 컴프리헨션, 키워드 인자, dict 리터럴 범위)이 약해서 타이핑 과정에서 문법 오류·로직 버그가 생겼고, 스스로 못 잡고 리뷰 요청해서야 발견함
- Try: 코드 작성 후 python3 -m py_compile 같은 걸로 문법 오류부터 스스로 걸러보고, 딕셔너리/컴프리헨션/키워드 인자 같은 기본 문법을 짧게 복습할 계획
🎯 다음 주 목표
- 로우레벨 AI 공부 하기
- Week4 Agentic RAG(ChromaDB) 들어가기 전, 임베딩 벡터 계산 원리 가볍게 정리
'학교' 카테고리의 다른 글
| 2026 하계 모각코 5회차 (0) | 2026.07.30 |
|---|---|
| 2026 하계 모각코 4회차 (0) | 2026.07.24 |
| 2026 하계 모각코 2회차 (0) | 2026.07.08 |
| 2026 하계 모각코 1회차 (0) | 2026.07.02 |
| 2026 하계 모각코 0회차 (계획) (0) | 2026.06.26 |