더 똑똑한 P∞m Brain 만들기
작은 언어 모델(sLM)을 사전학습 → 지시 학습(SFT) → 도메인 미세조정 순서로 키우는 방법이에요. 필요한 학습 데이터 일부는 DeepSeek이 선생님이 되어 만들어 줘요. 실행할 것은 모두 optimizebrain/train/ob.sh 하나이고, 그 안의 프로그램은 모두 Julia예요(Python이 필요 없어요). 앱과 같은 검사만 Rust로 해요.
0. poomx 두 언어 Brain (크기 M) — 지금의 계획
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 (이전 것은 보관)
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의 생성)는 이제 쓰지 않아요.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 / 73 | 54 / 73 |
| 문서에 있는 답을 말함 | 4 / 5 | 3 / 5 |
| 문서에 없을 때 "찾지 못했어요" | 1 / 3 | 2 / 3 |
| 의도 맞힘 (지금은 낱말 규칙, 120문장) | 70 % | 60 % |
예: "가을 시 써줘"에 방송 프로그램 설명처럼 답하고, "I had such a hard day"에 "Ask me anything about your documents"라고 답해요. 지금 지시 데이터 10.6만 쌍 중 8.2만 쌍이 틀에 박힌 문서 답이라서 그래요 — 새 데이터에서는 1.2만 쌍으로 줄이고, 앞의 대화 데이터로 채워요.
1. 바로 실행 (sf 금융 Brain) — 이 순서대로
cd kimbab/optimizebrain/train
./ob.sh status
./ob.sh planplan은 크기별 파라미터, 브라우저 파일 크기, 답 1개에 걸리는 시간, 학습 시간을 표로 보여 줘요../ob.sh 1-corpus위키백과(한국어, 쉬운 영어, 영어)에서 짧은 줄, 목록, 표, 마크업, 한글이 적은 문단, 같은 문단 반복, 너무 짧은 글을 빼요. 표본으로 시험하면 바이트 기준 약 3분의 2가 남아요../ob.sh 2-synth 6000분야(생활 경제, 과학, 역사…), 독자(초등학생~어르신), 글 형식(설명, 이야기, 대화, 묻고 답하기)을 바꿔 가며 짧고 정확한 한국어 글을 써요. 한자·일본어가 섞이거나, 너무 짧거나, 중복이면 버려요../ob.sh 3-tokenizerP∞m의 토크나이저(8,192개)를 그대로 써요. 그래야 지금 Brain에서 이어서 배울 수 있어요. 새로 만들려면 NEW=1 ./ob.sh 3-tokenizer를 쓰는데, 그러면 사전학습을 처음부터 해야 해요../ob.sh 4-tokensOB_HOURS=8 ./ob.sh 5-pretrain밤마다 같은 명령을 실행하면 이어서 해요. 처음 한 번은 지금 Brain(2.5억 토큰까지 배움)을 Julia 형식으로 바꿔서 시작해요. 다른 크기는 ./ob.sh 5-pretrain M 726처럼 쓰는데, 이건 처음부터 배워요. 그 전에 ./ob.sh bench M으로 실제 속도부터 재 보세요../ob.sh 6-sftdata 600설명, 방법 안내, 쉽게 바꿔 쓰기, 요약, 문서 근거 답(문서에 없으면 "찾지 못했어요"), 일상 대화, 되묻기, 권유 거절, 위험한 부탁 거절을 한국어로 만들어 P∞m의 지시 데이터와 합쳐요../ob.sh 7-sft./ob.sh 8-domain시크릿파이낸스 학습 데이터(계산 결과 설명, 권유 거절, 되묻기) 60%, 일반 지시 25%, 사전학습 글 15%를 섞어요. 일반 능력을 잊지 않게 하려는 비율이에요../ob.sh 9-export fin
./ob.sh 10-eval fin
./ob.sh 11-install fin10-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개당 적어도 20토큰, 자주 쓸 모델이면 40토큰 이상이 좋아요(아래 4·5장). 지금 Brain은 14토큰이라 아직 덜 배운 상태예요.
- 처음부터 다시 하지 말고 이어서 배워요. 같은 크기, 같은 토크나이저면 지금까지 배운 것을 버리지 않아요(
--init). - 한국어를 먼저 둬요. 토크나이저를 만들 때 한국어를 두 배로 넣었고, 사전학습도 한국어 비중이 가장 커요(정제 위키: 한국어 50%, 영어 38%, 쉬운 영어 12%. 합성 글은 4번 넘게 반복되지 않는 만큼만 섞어요).
- 순서를 지켜요: 사전학습 → 지시 학습 → 도메인. 앞 단계가 말을 배우고, 다음이 대화 형식을, 마지막이 금융 설명을 배워요. 도메인 단계에서도 일반 데이터를 섞어야 잊지 않아요.
- 숫자는 모델이 정하지 않아요. 계산은 계산 엔진이 하고, Brain은 그 결과를 설명만 해요. 그리고 검사기가 답 속 숫자, 날짜, 뜻을 하나하나 대조해요. 작은 모델이 틀려도 사용자는 틀린 숫자를 보지 않아요.
- 큰 모델은 선생님으로만 써요(증류). DeepSeek은 학습 데이터를 만들 때만 쓰고, 고객 데이터는 절대 보내지 않아요. 만든 데이터도 검사기를 통과한 것만 써요.
- 평가로 결정해요. 학습할 때마다 같은 평가(금융 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, 몇 초).
- 언어: 한국어가 아니면(영어, 스페인어, 프랑스어, 기타) 재치 있는 안내와 그 나라 말 한 줄로 바로 답해요. Brain은 쓰지 않아요.
- 악성: 욕설과 "이전 지시 무시해" 같은 공격을 막아요. 모델이 악성일 확률이 0.9 이상이면 막고, 그보다 낮으면 강한 욕설이 있으면서 모델이 정상 질문이라고 확신하지 않을 때만 막아요. 그래서 "존나 복잡하네, 이자 얼마야?"는 그대로 답해요. 시험 문장에서 정상 메시지가 막힌 건 0개였어요.
- 의도 22가지: 계산 15종(만기, 비교, 중도해지, 세금 방식, 풍차, 목표 2종, 주식, 비중, D-day, 예금자보호, 매도 세금, 해외주식, 배당, 금융소득), 다른 금융, 앱 사용법, 권유, 잡담, 범위 밖, 악성, 공격. fastText 방식 모델이고 Julia로 0.5초면 학습해요.
- 고르기: 확신이 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시간 |
| M | 3,630만 | 73 MB | 약 5초 | 약 950 토큰/초* | 7.3억 · 약 210시간 | 14.5억 · 약 420시간 |
| L | 6,470만 | 129 MB | 약 8초 | 약 540 토큰/초* | 13억 · 약 670시간 | 26억 · 약 1,350시간 |
* 크기에 반비례한다고 본 추정이에요. 큰 행렬은 계산 효율이 조금 더 좋아서 실제로는 더 빠를 수 있어요. ./ob.sh bench M으로 몇 분이면 실제 값을 잴 수 있어요.
7. 얼마나 학습해야 더 똑똑해지나 — 쉽게
모델 크기는 "뇌 용량", 학습 토큰은 "읽은 책의 양"이라고 생각하면 돼요.
- 용량에 비해 책을 너무 적게 읽으면 머리는 큰데 아는 게 없어요. 지금 Brain이 그래요. 파라미터 1개당 14토큰을 읽었어요.
- 보통 파라미터 1개당 20토큰을 읽으면 그 크기에서 "본전"이에요. 앱처럼 자주 쓰는 모델은 40토큰 이상 읽히는 게 좋아요. 학습할 때 한 번 더 들인 시간을 쓸 때마다 돌려받거든요.
- 같은 시간이면 크기를 키우기보다 더 읽히는 게 이 노트북에서는 훨씬 효율적이에요. 크기를 2배로 하면 1토큰 배우는 데 2배가 걸리고, 필요한 토큰도 2배라서 학습 시간이 약 4배가 돼요.
- 좋은 책이 많은 책보다 낫다: 정리된 설명문 1토큰이 잡다한 웹 글 여러 토큰만큼 도움이 돼요. 그래서 1단계(정제)와 2단계(교과서식 글)를 해요.
- 얼마나 좋아지나 (예상): 사전학습 손실(낮을수록 좋음)이 지금 약 3.16이에요. 40배까지 이어 배우면 대략 0.1~0.2 낮아질 것으로 예상해요. 숫자로는 작아 보여도 문장이 더 자연스럽고, 문서의 핵심을 더 잘 짚고, 엉뚱한 말이 줄어드는 정도예요. 금융 설명처럼 좁은 일은 이미 앱 기준 98.8%라서, 남은 약점(풍차 질문에서 물은 값 빠뜨림)은 데이터 보강 쪽이 더 효과적이에요.
- 그만 배워야 할 때: 평가 점수가 두 번 연속 좋아지지 않거나, 검증 손실이 오르는데 학습 손실만 내려가면(외우기 시작) 멈추고 데이터를 바꿔요.
8. 안전·비용·주의
- 컴퓨터가 멈추지 않게: 8스레드, 메모리 48 GB 상한, 스왑 없음(systemd), 가장 낮은 우선순위로 돌려요. CPU 85°C면 75°C까지 쉬고, 10분마다 저장해요.
OB_HOURS시간이 지나면 저장하고 멈춰요. - 한 번에 하나만: 다른 Brain 학습(P∞m 포함)이 돌면 시작하지 않아요.
- DeepSeek 비용: 비혼잡 시간에만 돌아요(한국 시간 평일 10–13시, 15–19시는 피함). 단계마다 상한이 있어요(합성 글 3달러, 지시 2달러,
OB_MAX_USD로 조정). 키는 환경 변수나~/.config/secret_finance/env에서만 읽고, 화면이나 파일에 쓰지 않아요. - 보내는 것: 지어낸 주제와 공개된 위키백과 제목뿐이에요. 개인정보나 고객 데이터는 보내지 않아요.
- 상업적 사용 전에: DeepSeek 이용약관이 출력물을 다른 모델 학습에 쓰는 것(상업 포함)을 허용하는지 확인하고, 확인한 날짜를 기록해 두세요.
- 되돌리기: 11-install은 이전 앱 모델을
.bak-날짜로 남겨요. 사전학습은runs/의 체크포인트에서 언제든 다시 시작할 수 있어요.
폴더
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/ 만든 데이터와 체크포인트 (실행하면 생김)