내 말투 · 학습 과정 공유

태그를 붙이고,
내 글을 답하게 했다.

초기 LoRA · 글 종류 태그와 초기 QLoRA · 글 종류 태그는
같은 데이터에 글 종류 표시 + 요청문 → 내 글 조각을 학습한 모델입니다.

Share 목록으로 ↗
최근 검수한 112편으로 학습한 모델과는 다릅니다. 이 페이지는 초기 데이터와 저장된 학습 기록을 설명합니다. 모델을 다시 학습하거나 답변을 새로 생성하는 화면이 아닙니다.

01. 문서가 학습 데이터가 되기까지

  1. 백업 문서 수집

    Typora, Apple Notes, Google Keep, Notion, Confluence의 개인·업무 기록을 읽었습니다. 일부 경로와 파일명은 제외 규칙으로 걸렀습니다.

  2. 정제하고 조각으로 분할

    코드블록·표·이미지·URL 등을 제거하고 연락처를 마스킹했습니다. 문단을 약 900자 기준으로 묶고, 긴 문단은 문장 경계 규칙으로 나눴습니다. 짧은 조각·한글 비율이 낮은 조각·공백을 뺀 본문이 같은 중복은 제외했습니다.

  3. AI가 요청문을 역으로 작성

    Gemma 4 31B가 각 글 조각을 보고 “이 글이 답이 되려면 어떤 요청이 필요할까?”를 생성했습니다. 요청에는 주요 사실·수치를 넣되 문체 지시는 넣지 않도록 했습니다. 정답은 정제된 글 조각을 그대로 썼습니다.

  4. 같은 문서는 같은 분할에

    문서 경로를 기준으로 학습·평가를 나눴습니다. 같은 문서의 조각이 양쪽에 섞이지 않도록 했습니다. 분할의 기준이 경로이므로 내용이 유사한 별도 문서까지 완전히 차단한다는 뜻은 아닙니다.

  5. 출처별 태그를 붙여 학습

    내용을 읽어 분류한 태그가 아니라, 글을 가져온 앱·위키에 따라 정한 태그입니다. 모든 태그의 학습 조각을 함께 섞어 하나의 어댑터를 학습했습니다.

태그는 이렇게 배정했습니다

출처붙인 태그학습 조각평가 조각

예: Apple Notes의 일기도 [메일·편지]로 들어갈 수 있습니다. 이후 직접 검수한 정중한 소통·기술 업무·개인 서사·소설 분류와 다릅니다.

02. 입력·정답은 이런 구조입니다

아래 문장은 구조를 설명하기 위해 새로 쓴 가상 예시입니다. 실제 개인 원문이나 학습 데이터가 아닙니다. 공유 페이지에는 원문·원문에서 생성한 요청문을 포함하지 않았습니다.

입력 · 읽고 참고하는 부분

① 시스템 메시지

[업무기록]

② 요청문

이미지 10개 중 8개 생성에 성공했고, 밝기 문제를 다음 실험에서 확인할 예정이라는 업무 기록을 써줘.

태그와 요청문은 조건으로 읽으며 이 부분 자체를 정답으로 채점하지 않습니다.

정답 · 예측하도록 학습하는 부분

③ 글 조각

이미지 생성 결과

10개 중 8개 성공.
밝기 문제는 다음 실험에서 확인 예정.

실제 실험에서는 여기에 정제·분할된 작성자의 글을 넣었습니다.

03. 태그를 “정답”으로 외우는 게 아닙니다

주어진 것: [업무기록] + 요청문 + 정답의 앞부분

맞혀야 하는 것: 정답에서 그다음에 나올 토큰(글을 나눈 작은 단위)

예를 들어 정답이 “실험 결과를 공유드립니다.”라면, 학습 중에는 정답의 앞부분을 보여주면서 다음 토큰을 예측하게 합니다. 예측이 정답에서 벗어나면 오차(loss)를 계산해 어댑터를 수정합니다.

태그와 요청문은 조건으로 읽지만, 이 부분 자체를 맞히도록 점수를 매기지는 않습니다. 실제 코드에서 입력의 정답 표시를 -100으로 두어 채점에서 제외합니다.

기본 모델의 가중치는 고정하고 추가된 LoRA 가중치를 학습합니다. 그래서 하나의 어댑터 안에서 태그와 문체의 관계를 배우도록 한 구조입니다. 관계를 얼마나 잘 배웠는지는 실제 출력을 비교해야 합니다.

사용할 때 태그를 바꾸면?

시스템 메시지:

사용자 요청:

전달되는 입력만 보여주는 미리보기입니다. 선택한 태그로 다시 학습하거나 생성 결과를 예측해서 표시하지 않습니다. 사용자 요청은 위의 가상 예시입니다.

실제 비교 페이지에서는 이 선택이 초기 LoRA 태그·초기 QLoRA 태그에만 적용됩니다. 태그를 바꿔도 다른 모델의 입력에는 추가되지 않습니다.

04. 두 모델의 실제 학습 기록

공통 설정: 3 epochs(학습 데이터를 3회 반복), 학습률 0.0001, 한 번에 조각 1개·기울기 8개 누적, seed 42. 입력+정답 최대 1,536토큰. 학습률은 cosine 방식으로 줄이고 초기 5%는 서서히 올렸습니다.

일반 LoRA는 bf16 베이스와 AdamW, QLoRA는 4비트 NF4 베이스와 paged AdamW 8bit를 사용했습니다. 둘 다 답변 예측 오차로 어댑터를 학습했습니다.

이 실험을 해석할 때

  • 태그는 앱·위키 출처에 따른 거친 분류라 실제 글 종류와 다를 수 있습니다.
  • 초기 데이터는 이후의 사용/제외 검수와 112편 중복 정리 이전 자료입니다. 사용자 작성 문장만 완벽히 선별됐다고 볼 수 없습니다.
  • 정제 과정에서 표·코드·링크와 문맥이 사라지고, 조각을 나누면서 문서의 흐름이 끊길 수 있습니다.
  • AI가 만든 요청문이 원문 내용을 정확히 요약했는지는 별도 검토가 필요합니다.
  • 요청 → 글 생성 학습입니다. AI 문체 글 전체 → 내 원문을 학습한 최신 변환 LoRA와 과제가 다릅니다.

초기 학습 코드에는 이후 실험에서 적용한 gradient accumulation 손실 정규화 보정이 없습니다. 초기 로그의 학습 loss를 최근 실험 수치와 직접 비교하지 않습니다. 여기서는 새 성능 평가를 하지 않았습니다.

근거 파일과 확인 범위

보존된 data/{chunks,pairs,train,test}.jsonl, src/{clean,collect,pairs,fmt,train,model,config}.py, notebooks/06_qlora_tag_31b.ipynb·07_lora_tag_31b.ipynb, outputs/{lora_tag,qlora_tag}/train_log.json 및 각 adapter_config.json을 확인했습니다.

실행 로그에서 학습 수·반복·업데이트·시간을 확인하고, 현재 보존된 코드의 기본 인수와 당시 노트북 호출에서 나머지 설정을 확인했습니다. 당시 실행 환경 전체가 저장된 완전한 재현 명세는 아닙니다.

이 페이지를 만드는 동안 학습 파일은 변경하지 않았고 GPU 학습·추론도 실행하지 않았습니다. 이 공유본에는 집계와 설명용 가상 예시만 포함합니다. 개인 원문을 보는 페이지는 기존 내부 접근 제한을 유지합니다.