더 똑똑한 P∞m Brain 만들기

작은 언어 모델(sLM)을 사전학습 → 지시 학습(SFT) → 도메인 미세조정 순서로 키우는 방법이에요. 필요한 학습 데이터 일부는 DeepSeek이 선생님이 되어 만들어 줘요. 실행할 것은 모두 optimizebrain/train/ob.sh 하나이고, 그 안의 프로그램은 모두 Julia예요(Python이 필요 없어요). 앱과 같은 검사만 Rust로 해요.

0. poomx 두 언어 Brain (크기 M) — 지금의 계획

목표: 한국어와 영어를 같은 수준으로, 사용자의 의도를 알아듣고 몇 문장은 자연스럽게 말하는 Brain — "완전 바보는 아니네"라는 말을 듣는 수준. DeepSeek은 선생님(증류)으로만 쓰고, 사용자 데이터는 보내지 않아요. 모든 단계는 poomx 하나에서 해요(poomc는 2026-10-11부터 백업으로만 남겨 둠).
무엇어떻게시간비용(상한)
교과서식 글한국어·영어 각 22,000편, 같은 양밤 몇 번(비혼잡)≈ 11달러 (14)
사전학습크기 M(3,630만 파라미터)을 처음부터 7.3억 토큰 — 한국어 토큰 반, 영어 토큰 반실측 1,166토큰/초 → ≈ 174시간 = 밤 8시간 × 22무료
대화 데이터앱의 의도 5가지에 맞춘 12종(설명·사실·방법·창작·마음·잡담·문서 답·기억·후속 질문·바꿔 쓰기·되묻기·거절) × 한국어·영어 × 2,000개, 답 2개씩(다양한 반응)밤 한두 번≈ 8달러 (12)
지시 학습앱이 실제로 쓰는 프롬프트 모양 그대로([품]·[말투]·[기억]·[참고]·이전 대화) — Rust와 글자까지 같은지 검사함≈ 8,000스텝무료
의도 분류기한국어·영어 문장 15,000개 → 작은 모델(1 MB, 몇 초 학습) → 앱(poomc.wasm)에 들어감몇 분≈ 0.5달러 (1)
평가사람이 쓴 146문항(한국어 73 · 영어 73) + DeepSeek 채점(선택)≈ 15분한 번 ≈ 0.01달러

모든 DeepSeek 단계를 합친 상한은 OB_TOTAL_USD=30달러예요. 넘을 것 같으면 요청하기 전에 멈춰요.

순서 (cd kimbab/optimizebrain/train 에서, M 크기는 export OB_SIZE=M을 먼저):

export OB_SIZE=M
./ob.sh 3-tokenizer          # 그대로 씀 (몇 초)
./ob.sh 12-intent            # 의도 분류기 (≈ $0.5, 몇 분) → poomx 앱 다시 만들기
./ob.sh 2-synth              # 교과서식 글 한·영 (≈ $11, 비혼잡 시간, 이어서 가능)
./ob.sh 6-sftdata            # 대화 데이터 한·영 (≈ $8) + 합치기 + 토큰
./ob.sh 12-intent            # 한 번 더 (무료): 대화 데이터의 질문 4.8만 개도 의도 학습에 씀
./ob.sh 1-corpus             # 위키 정제 (약 1시간)
./ob.sh 4-tokens             # 약 30분 (2-synth 다음에)
OB_HOURS=8 ./ob.sh 5-pretrain M      # 밤마다 같은 명령 (약 22번)
./ob.sh 7-sft                # 지시 학습
./ob.sh 9-export sft
OB_JUDGE=1 ./ob.sh 10-eval sft       # 지금 앱 Brain과 나란히 보여 줌
./ob.sh 11-install sft       # poomx/code/kllm/base.ckpt (이전 것은 보관)
2026-10-11부터 선생님은 Claude: 학습 데이터(의도 문장·대화·교과서식 글)는 Claude가 비공개 리포의 training-data/에 써 올려요(요구사항: claude_data/REQUIREMENTS.md, 프롬프트: claude_data/PROMPT.md). ./ob.sh 0-pull이 받아서 다시 검사하고(시험 문장과 같은 줄은 빼요) 합친 뒤, 의도 분류기를 새로 학습해 시험 정확도가 85% 이상일 때만 poomx 앱에 넣고 앱을 다시 만들어요. 타이머(ob-train, 평일 05:00)가 매번 먼저 이걸 해요. 첫 데이터로 의도 맞힘이 65% → 95%(한국어 95% · 영어 95%)가 됐어요. 아래의 DeepSeek 단계(2-synth, 6-sftdata의 생성, 12-intent의 생성)는 이제 쓰지 않아요.
자동 실행(타이머): 평일 05:00–17:00에 알아서 이어 가요. ob-train(05:00, 10스레드)은 정제 → 토큰 → 사전학습 → 지시 학습 → 평가 중 다음 단계를 하고 17:00 전에 저장하고 멈춰요. ob-teacher(06:00, 12:00)는 DeepSeek 단계(의도 문장 → 교과서식 글 → 대화)를 8개씩 동시에 요청하고, 혼잡 시간(평일 03–06시, 08–12시)이 시작되거나 상한에 닿으면 멈춰요. 끝날 때마다 받은 데이터를 백업 폴더에 복사해요. 앱에 넣기(11-install)와 DeepSeek 채점은 직접 해요.
systemctl --user list-timers 'ob-*'          # 다음 실행 시각
tail -f runs/auto-train.log runs/auto-teacher.log
systemctl --user disable --now ob-train.timer ob-teacher.timer   # 자동 실행 끄기
DeepSeek 키는 타이머가 ~/.config/secret_finance/env(권한 600)에서 읽어요(셸 설정 파일은 읽지 않아요).

지금 앱의 Brain(크기 S)으로 잰 기준 점수 (같은 146문항, ./ob.sh 0-baseline):

한국어영어
같은 말 반복 없음72 / 7354 / 73
문서에 있는 답을 말함4 / 53 / 5
문서에 없을 때 "찾지 못했어요"1 / 32 / 3
의도 맞힘 (지금은 낱말 규칙, 120문장)70 %60 %

예: "가을 시 써줘"에 방송 프로그램 설명처럼 답하고, "I had such a hard day"에 "Ask me anything about your documents"라고 답해요. 지금 지시 데이터 10.6만 쌍 중 8.2만 쌍이 틀에 박힌 문서 답이라서 그래요 — 새 데이터에서는 1.2만 쌍으로 줄이고, 앞의 대화 데이터로 채워요.

현실적인 기대: 3,600만 파라미터는 아주 작은 모델이에요. 넓은 지식이나 긴 추론은 어려워요. 대신 짧은 질문을 알아듣고, 한두 문장을 두 언어로 자연스럽게 말하고, 문서에 있는 것만 말하고 없으면 솔직히 말하는 데까지는 갈 수 있어요. 성공 기준은 DeepSeek 채점에서 "말이 됨(3점 이상)"이 한국어·영어 모두 절반을 넘고, 두 언어 차이가 10%p 안쪽, 의도 맞힘 90% 이상이에요.

1. 바로 실행 (sf 금융 Brain) — 이 순서대로

추천 순서: 지금 Brain(크기 S)을 더 깨끗한 데이터로 이어서 사전학습한 다음 지시 학습과 금융 미세조정을 다시 해요. 가장 적은 시간으로 가장 확실하게 좋아지는 길이에요. 학습은 모두 노트북에서 돌고, 멈췄다가 같은 명령을 다시 실행하면 이어서 해요.
0
폴더로 가서 상태와 계획 보기
cd kimbab/optimizebrain/train
./ob.sh status
./ob.sh plan
plan은 크기별 파라미터, 브라우저 파일 크기, 답 1개에 걸리는 시간, 학습 시간을 표로 보여 줘요.
1
사전학습 데이터 다듬기 · 약 1시간 · 무료
./ob.sh 1-corpus
위키백과(한국어, 쉬운 영어, 영어)에서 짧은 줄, 목록, 표, 마크업, 한글이 적은 문단, 같은 문단 반복, 너무 짧은 글을 빼요. 표본으로 시험하면 바이트 기준 약 3분의 2가 남아요.
2
DeepSeek 교과서식 글 만들기 · 6,000편 ≈ 1.5달러 · 비혼잡 시간에만
./ob.sh 2-synth 6000
분야(생활 경제, 과학, 역사…), 독자(초등학생~어르신), 글 형식(설명, 이야기, 대화, 묻고 답하기)을 바꿔 가며 짧고 정확한 한국어 글을 써요. 한자·일본어가 섞이거나, 너무 짧거나, 중복이면 버려요.
3
토크나이저 준비 · 몇 초
./ob.sh 3-tokenizer
P∞m의 토크나이저(8,192개)를 그대로 써요. 그래야 지금 Brain에서 이어서 배울 수 있어요. 새로 만들려면 NEW=1 ./ob.sh 3-tokenizer를 쓰는데, 그러면 사전학습을 처음부터 해야 해요.
4
글을 토큰으로 · 약 30분
./ob.sh 4-tokens
5
사전학습 (가장 오래 걸림) · 크기 S로 4.5억 토큰 더 ≈ 63시간 → 8시간씩 약 8번
OB_HOURS=8 ./ob.sh 5-pretrain
밤마다 같은 명령을 실행하면 이어서 해요. 처음 한 번은 지금 Brain(2.5억 토큰까지 배움)을 Julia 형식으로 바꿔서 시작해요. 다른 크기는 ./ob.sh 5-pretrain M 726처럼 쓰는데, 이건 처음부터 배워요. 그 전에 ./ob.sh bench M으로 실제 속도부터 재 보세요.
6
지시 학습 데이터 · 600쌍 × 9종 ≈ 0.5달러
./ob.sh 6-sftdata 600
설명, 방법 안내, 쉽게 바꿔 쓰기, 요약, 문서 근거 답(문서에 없으면 "찾지 못했어요"), 일상 대화, 되묻기, 권유 거절, 위험한 부탁 거절을 한국어로 만들어 P∞m의 지시 데이터와 합쳐요.
7
지시 학습 · 6,000스텝 ≈ 5시간
./ob.sh 7-sft
8
금융 도메인 미세조정 · 4,000스텝 ≈ 3시간
./ob.sh 8-domain
시크릿파이낸스 학습 데이터(계산 결과 설명, 권유 거절, 되묻기) 60%, 일반 지시 25%, 사전학습 글 15%를 섞어요. 일반 능력을 잊지 않게 하려는 비율이에요.
9
내보내기 · 평가 · 앱에 넣기
./ob.sh 9-export fin
./ob.sh 10-eval fin
./ob.sh 11-install fin
10-eval은 앱과 같은 코드(Rust 검사기)로 금융 질문 418개를 풀어서 "숫자·날짜·뜻이 모두 맞음"과 "물은 값이 답에 있음"을 보여 줘요. 지금 앱 모델(finsft3)은 앱 기준 100% / 98.8%였어요. 그보다 좋을 때만 11-install을 하세요. 그다음 앱을 다시 만들어 올려요.
cd ../../sf/code && ./build.sh
cd ../.. && ./copyall2server.sh
언제든: ./ob.sh stop(저장하고 멈춤) · ./ob.sh status · ./ob.sh cost(DeepSeek에 쓴 돈) · OB_BG=1 ./ob.sh 5-pretrain(터미널을 닫아도 뒤에서 계속)

2. 지금까지 찾은 sLM 만드는 최적의 방법

  1. 데이터의 질이 양보다 먼저예요. 작은 모델은 배울 수 있는 양이 적어서, 지저분한 글(표, 목록, 중복)이 들어가면 그만큼 손해예요. 정제한 위키백과에 쉽고 정확한 교과서식 글을 조금 섞는 게 가장 효율적이에요.
  2. 크기에 맞는 양만큼 배워요. 파라미터 1개당 적어도 20토큰, 자주 쓸 모델이면 40토큰 이상이 좋아요(아래 4·5장). 지금 Brain은 14토큰이라 아직 덜 배운 상태예요.
  3. 처음부터 다시 하지 말고 이어서 배워요. 같은 크기, 같은 토크나이저면 지금까지 배운 것을 버리지 않아요(--init).
  4. 한국어를 먼저 둬요. 토크나이저를 만들 때 한국어를 두 배로 넣었고, 사전학습도 한국어 비중이 가장 커요(정제 위키: 한국어 50%, 영어 38%, 쉬운 영어 12%. 합성 글은 4번 넘게 반복되지 않는 만큼만 섞어요).
  5. 순서를 지켜요: 사전학습 → 지시 학습 → 도메인. 앞 단계가 말을 배우고, 다음이 대화 형식을, 마지막이 금융 설명을 배워요. 도메인 단계에서도 일반 데이터를 섞어야 잊지 않아요.
  6. 숫자는 모델이 정하지 않아요. 계산은 계산 엔진이 하고, Brain은 그 결과를 설명만 해요. 그리고 검사기가 답 속 숫자, 날짜, 뜻을 하나하나 대조해요. 작은 모델이 틀려도 사용자는 틀린 숫자를 보지 않아요.
  7. 큰 모델은 선생님으로만 써요(증류). DeepSeek은 학습 데이터를 만들 때만 쓰고, 고객 데이터는 절대 보내지 않아요. 만든 데이터도 검사기를 통과한 것만 써요.
  8. 평가로 결정해요. 학습할 때마다 같은 평가(금융 418문항, 의도 시험 문장 220개)로 재고, 좋아졌을 때만 바꿔요.

3. 단계별 학습 — 무엇을 배우나

단계배우는 것데이터크기 S 시간비용
사전학습한국어·영어 문장, 세상 지식, 다음 단어 맞히기정제 위키 약 7~8억 토큰 + 합성 글이어서 4.5억 ≈ 63시간합성 글 ≈ 1.5달러
지시 학습(SFT)"질문: … 답변:" 형식, 짧고 다정하게 답하기, 문서 근거로만 답하기, 모르면 모른다고 하기P∞m 지시 약 10만 쌍 + 한국어 지시 약 5,400쌍≈ 5시간≈ 0.5달러
도메인 미세조정[계산] 줄을 보고 정확히 설명하기, 권유 거절, 되묻기시크릿파이낸스 학습 쌍 약 3.9만 개(검사 통과분)≈ 3시간이미 만듦
내보내기·평가브라우저용 파일(f16)과 같은 결과인지 확인, 점수금융 418문항≈ 20분무료

시간은 이 노트북 기준이에요(크기 S 사전학습 약 2,000토큰/초). 8스레드로 재 보니 1,900~2,300토큰/초로 4스레드(2,015)와 거의 같았어요 — CPU가 80°C를 넘어 쉬는 시간이 생기기 때문이에요. 노트북은 스레드보다 열이 한계예요.

4. 의도 판단 — 질문이 Brain에 가기 전에

질문은 Brain보다 먼저 앞단(jiyoung)을 거쳐요. 이 순서는 sf 앱에 들어 있고, 학습은 여기서도 할 수 있어요(./ob.sh intent, 몇 초).

  1. 언어: 한국어가 아니면(영어, 스페인어, 프랑스어, 기타) 재치 있는 안내와 그 나라 말 한 줄로 바로 답해요. Brain은 쓰지 않아요.
  2. 악성: 욕설과 "이전 지시 무시해" 같은 공격을 막아요. 모델이 악성일 확률이 0.9 이상이면 막고, 그보다 낮으면 강한 욕설이 있으면서 모델이 정상 질문이라고 확신하지 않을 때만 막아요. 그래서 "존나 복잡하네, 이자 얼마야?"는 그대로 답해요. 시험 문장에서 정상 메시지가 막힌 건 0개였어요.
  3. 의도 22가지: 계산 15종(만기, 비교, 중도해지, 세금 방식, 풍차, 목표 2종, 주식, 비중, D-day, 예금자보호, 매도 세금, 해외주식, 배당, 금융소득), 다른 금융, 앱 사용법, 권유, 잡담, 범위 밖, 악성, 공격. fastText 방식 모델이고 Julia로 0.5초면 학습해요.
  4. 고르기: 확신이 0.6보다 낮고 두 후보가 다른 화면에서 답하는 거면 버튼 두 개로 되물어요. "대출, 연금, 세금 종류" 같은 주제는 그 말이 질문에 있어야 그 의도로 받아들여요. 그래서 "세금 얼마야?"는 이자 세금으로 가요.

5. 금지어와 검사 — Brain 답이 사용자에게 가기 전에

검사무엇을 막나어디에
권유 금지어추천, 사세요, 매수하세요, 매도하세요, 가입하세요, 꼭 가입, 투자하세요, 사는 게 좋, 팔아야, 파세요, 유망, 확실한 수익, 무조건, 보장된 수익. 단, 바로 뒤가 부정이면 괜찮아요("추천은 하지 않아요")train/lib/OB.jl, sf 검사기
숫자·날짜답 속 모든 금액, %, 개월, 년, 날짜, D-day가 계산 결과에 있어야 해요sf poom-c check.rs
뜻(claims)계산과 반대되는 말. 예: 원금만 재가입인데 "원금과 이자를 다시 넣어요", 손실인데 "이익을 봤어요", 세후 금액을 "세전"이라고 부르기sf training/claims.json
반복·무응답같은 말 되풀이, 금액을 물었는데 숫자 없는 답, 권유 질문에 거절 없는 답sf poom-c
한국어만한자, 일본어, 영어 문장(DeepSeek이 가끔 섞어요)모든 생성기
욕설 규칙강한 욕설과 변형("시1발", "ㅅㅂ"), 정상 단어 예외(시발점, 꺼져요)sf training/abuse.json

검사를 하나라도 통과하지 못하면, 같은 계산으로 채운 검증된 문장이나 계산 결과 그대로를 보여 줘요. 그래서 사용자 화면의 숫자는 늘 계산 엔진의 숫자예요.

6. 얼마나 크게 해도 되나

크기파라미터브라우저 파일답 1개학습 속도20배(최소)40배(권장)
S (지금)1,730만35 MB약 2초2,000 토큰/초3.5억 · 48시간6.9억 · 96시간
M3,630만73 MB약 5초약 950 토큰/초*7.3억 · 약 210시간14.5억 · 약 420시간
L6,470만129 MB약 8초약 540 토큰/초*13억 · 약 670시간26억 · 약 1,350시간

* 크기에 반비례한다고 본 추정이에요. 큰 행렬은 계산 효율이 조금 더 좋아서 실제로는 더 빠를 수 있어요. ./ob.sh bench M으로 몇 분이면 실제 값을 잴 수 있어요.

결론: 이 노트북에서 현실적인 최대는 M이에요. 밤 8시간씩 4~8주가 걸려요. L은 학습에만 몇 달이 걸리고, 폰에서 답 하나에 8초 넘게 걸려서 권하지 않아요. 브라우저 메모리(wasm 4 GB)는 L까지도 문제가 없어요. 진짜 한계는 학습 시간과 다운로드 크기·답 속도예요. 지금은 S를 40배까지 더 배우게 하는 것이 가장 이득이에요.

7. 얼마나 학습해야 더 똑똑해지나 — 쉽게

모델 크기는 "뇌 용량", 학습 토큰은 "읽은 책의 양"이라고 생각하면 돼요.

8. 안전·비용·주의

폴더

optimizebrain/
  index.htm            이 안내
  train/
    ob.sh              모든 단계 실행 (안의 프로그램은 모두 Julia)
    plan.jl            크기·시간 계산
    corpus.jl          1 말뭉치 정제
    synth.jl           2 DeepSeek 교과서식 글
    pt2jl.jl           5 지금 Brain(PyTorch .pt)을 Julia 체크포인트로 (Pickle.jl)
    instruct.jl        6 DeepSeek 한국어 지시 데이터
    build_sft.jl       6 지시 데이터 합치기
    lib/OB.jl          DeepSeek 연결(상한·비혼잡), 한국어·금지어 검사
    julia/             학습 코드 (Julia + MKL, 크기 S·M·L, 이어서 배우기)
    data/  runs/       만든 데이터와 체크포인트 (실행하면 생김)