Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

bizplan-loop

사업계획서를 여러 버전 생성 → 루브릭 채점 → 피드백 반영 재생성하는 Rust CLI. LLM 백엔드는 Claude Code CLI(claude -p) 서브프로세스. 별도 API 키 불필요.

단계별 사용법·워크플로우·트러블슈팅: USAGE.md 설계 근거(문헌): DESIGN.md

요구사항

  • Rust 1.70+
  • claude CLI 설치 및 로그인 (PATH에 없으면 --claude-bin)

빌드

cargo build --release   # target/release/bizplan

3가지 모드

# 1) 초안 N개 생성 + 채점 + 랭킹
bizplan --model sonnet --judge-model haiku \
  gen --spec specs/example-grant.toml --idea idea.md -n 6 --rounds 2 --concurrency 3 --out runs/grant

# 2) 기존 문서 채점만
bizplan --judge-model sonnet,haiku \
  score --spec specs/example-grant.toml --input 내신청서.md --rounds 3 --out runs/check

# 3) 목표 점수까지 자기개선 루프 (+ held-out 검증)
bizplan --model opus --judge-model sonnet --gate-model haiku \
  loop --spec specs/example-grant.toml --idea idea.md --target 85 --max-iter 4 --out runs/loop

백엔드 동작

호출은 항상 다음 형태다 (claude --help 실측 기준).

claude -p --output-format json --safe-mode --no-session-persistence --tools "" \
       [--model M] [--append-system-prompt S] [--json-schema SCHEMA] [--max-budget-usd X]
플래그 이유
--safe-mode 실행 디렉터리의 CLAUDE.md·스킬·플러그인·훅·MCP를 로드하지 않음 → 재현성 확보. --load-context로 해제
--tools "" 내장 도구(Read/Edit/Write/Bash) 전면 차단 → 순수 텍스트 생성, 파일 접근 없음. 적용 전후 haiku 1콜 2~4분 → 약 20초
--no-session-persistence 세션 파일 미생성. 병렬 실행 시 경합 회피
--json-schema 채점 결과를 스키마로 강제. 검증된 객체가 응답의 structured_output으로 옴 (프롬프트 유도 + 문자열 파싱보다 안정)
--output-format json result / structured_output / total_cost_usd 수집. 누적 비용을 실행 끝에 출력

--bare는 쓰지 않는다. OAuth·키체인을 읽지 않고 ANTHROPIC_API_KEY만 허용하므로 구독 로그인 사용자의 인증이 깨진다.

프롬프트는 stdin으로 전달하고(인자 길이 제한 회피, CLI 상한 10MB), stdin 쓰기와 stdout/stderr 읽기를 별도 스레드로 동시에 처리한다(파이프 버퍼 포화 교착 방지). 호출당 타임아웃은 --timeout-secs(기본 600).

채점 방식

  1. 결정론적 검사(Rust, LLM 미사용): 필수 섹션 누락, 섹션별·전체 분량 초과/부족, 출처 표기(「」) 개수, 표 유무. LLM 루브릭에서는 이 항목을 제외해 판정 분산을 줄인다.
  2. LLM 루브릭 채점: 항목별 0~100점. 채점 전에 "수상작이 갖춰야 할 조건"을 먼저 쓰게 하고(de-anchoring), 항목마다 문서 원문 인용과 **"왜 더 높은 점수가 아닌가"**를 강제한다. 근거 인용을 못 하면 60점 상한.
  3. 집계: --rounds N 회 채점 → 모델·관점 순환 → 항목별 절사평균(n≥4면 최소·최대 제외) → 가중 합산.
  4. 불안정 지표: 항목별 점수 산포(±)를 리포트에 표시. 산포가 크면 그 항목 판정은 신뢰하지 말 것.
  5. held-out 게이트(--gate-model): 루프에 참여하지 않은 모델로 최초본·최고본만 재채점. 루프 점수는 올랐는데 held-out 점수가 안 오르면 채점자 최적화(reward hacking)로 표시한다.

양식 스펙 (specs/*.toml)

name = "양식 이름"
context = "주최·심사 맥락. 프롬프트에 그대로 삽입"
scoring_source = "배점 근거(공고 원문). 리포트에 표시됨"
total_chars = 5500
min_citations = 3      # 「자료명」 표기 최소 개수
require_table = true

[[sections]]
id = "background"
title = "1. 추진 배경"    # 문서의 `## 1. 추진 배경` 헤딩과 매칭 → 누락·분량 검사
guide = "작성 지침"
chars = 1100
required = true

[[criteria]]
id = "creativity"
name = "창의성"
weight = 30             # 공고 배점 그대로 써도 됨(내부 정규화)
guide = "감점 기준을 구체적으로"

동봉 스펙: specs/example-grant.toml — 실제 공모전에 쓸 때는 이 파일을 복사해 공고문의 심사기준·배점을 그대로 옮겨 넣을 것.

한계 · 가정

  • LLM 점수는 실제 심사 점수가 아니다. 같은 스펙·같은 채점 모델 안에서의 상대 비교개선 방향 도출용.
  • 생성 모델과 채점 모델이 같으면 자기 문체를 후하게 본다(--judge-model 미지정 시 경고 출력).
  • 동일 모델을 N회 반복해도 오차가 상관되어 유효 표본은 N보다 훨씬 작다. --rounds를 키우기보다 --judge-model a,b로 모델을 섞는 편이 낫다.
  • claude -p는 temperature를 노출하지 않는다 → 초안 다양성은 angle 프롬프트로만 만든다.
  • 출력은 마크다운. hwpx/PDF 변환은 범위 밖.

About

사업계획서를 여러 버전 생성 → 루브릭 채점 → 피드백 반영 재생성하는 Rust CLI (claude -p 백엔드)

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages