레퍼런스 매뉴얼

모든 공개 API의 시그니처와 인자, CLI 명령어의 전체 옵션, config 설정값과 환경변수를 한 곳에 정리한 문서. 빠른 시작·개념 설명은 사용설명서, 학습의 배경은 학습 가이드 참조.

v0.3.4 · MIT License · Python ≥ 3.10 · github.com/2026-StructVerify-Lab/structverify · pypi.org/project/structverify

01 설치와 extras

코어는 의존성 7개(pydantic·httpx·pyyaml·openai·pdfplumber·python-dotenv·json5)만 설치합니다. 나머지는 전부 선택 extra:

extra설치되는 것용도
pip install structverify코어 7개규정 준수 검사 + 텍스트 사실검증 + 학습 루프 코어
[db]SQLAlchemy회사 DB 커넥터 (sqlite·postgres·mysql; Snowflake는 +snowflake-sqlalchemy)
[kosis]asyncpgKOSIS 공공통계 사실검증 (pgvector 카탈로그)
[korean]kss한국어 문장 분리 (없으면 정규식 폴백)
[url]trafilatura, beautifulsoup4URL 기사 본문 추출
[docs]python-docxDOCX 문서 지원
[pdf-ocr]PyMuPDF AGPLOCR·이미지 렌더링 PDF (기본 경로는 pdfplumber·MIT: 명시적 opt-in)
[graph]neo4j그래프 저장 (기본 비활성)
[training]unsloth, trl, peft, bitsandbytes, accelerate, datasets, transformers, torchQLoRA 학습 레시피 (NVIDIA: RTX 3060 12GB / Colab T4·L4)
[training-mac]mlx-lmLoRA 학습 레시피 (Apple Silicon M1~M4, CUDA 불필요)
[platform]fastapi, uvicorn, celery, redis 등sv_platform REST API 서버
[all]허용적 라이선스 전부AGPL([pdf-ocr]) 제외 일괄 설치

02 핵심 API

sv.verify() (일회성 사실 검증)

sv.verify(text, *, provider=None, api_key=None, model=None, **kwargs) → Report

**kwargs는 build_config 인자(tolerance, data, embedding_provider 등)를 그대로 받습니다.

Verifier (재사용 검증 엔진)

sv.Verifier(*, provider=None, api_key=None, model=None,
            embedding_provider=None, embedding_api_key=None,
            tolerance=None, data=None, config=None)
인자기본값설명
providerconfig 기본"upstage" · "openai" · "gemini" · "hcx"
api_key환경변수직접 주입 시 환경변수 불필요
modelprovider 기본단일 모델명: 모든 티어(heavy/light/structured)에 적용
embedding_provider / _api_keyprovider 따라감임베딩만 다른 provider 사용 시
tolerance1.0수치 허용오차(%)
dataKOSISDataSource 또는 경로 문자열(확장자로 유형 추론)
config—전체 config dict 직접 전달 (다른 인자 무시)

메서드: .verify(text) (= .check) · .verify_file(path), PDF/DOCX/txt · async는 .averify / .averify_file. 반환은 모두 Report.

Ruleset (규정 준수 검사)

sv.Ruleset.from_file(path, *, provider=None, api_key=None,
    embedding_provider=None, embedding_api_key=None, tolerance=None,
    chunk_size=120, name=None, agent=False) → Ruleset
sv.Ruleset.from_text(text, **kwargs) → Ruleset
인자기본값설명
path필수규정집 파일: PDF / txt / md
chunk_size120조항 분할 크기 (단어 기준)
agentFalseTrue면 검사마다 ConformanceAgent(ReAct 루프) 기본 사용: 큰 규정집에서 검색→판정→검색어 재구성→재검색 반복
name파일명표시용 이름

메서드 (async는 a 접두):

메서드반환설명
.check(statement, *, top_k=5, agent=None)Verdict문장 하나 준수 검사. agent로 호출 단위 오버라이드, top_k는 검색 조항 수
.check_document(text, ...)list[Verdict]본문에서 측정값 있는 문장을 골라 일괄 판정
.check_file(path, ...)list[Verdict]파일(PDF/txt) 전체 판정
len(rules)int색인된 조항 수

DataSource (정답 데이터 연결)

생성자인자 (기본값)
DataSource.csv(path, *, columns=None)columns: 내 컬럼명 → 표준 필드 매핑 예: {"value": "amount"}
DataSource.docs(path, *, chunk_size=120, embedding=None)문서 폴더(PDF/txt/md)를 의미검색 정답으로
DataSource.db(dsn, *, table=None, query=None, columns=None, agentic=False, tables=None, use_embedding=None, embed_threshold=None) dsn: SQLAlchemy 접속 문자열 · table/query: 정돈된 표 또는 직접 SQL · agentic=True: 원시 테이블: 에이전트가 스키마 조사 후 claim마다 읽기전용 집계 SELECT 자동 생성 · tables: (agentic) 조사 대상 화이트리스트 · use_embedding: "auto"(기본, 규모 기반)/"true"/"false" · embed_threshold: auto일 때 임베딩 전환 지표 수 기준
DataSource.kosis()내장 KOSIS 공공통계 (extra [kosis] + KOSIS_API_KEY·PGVECTOR_DSN)

03 결과 객체

Report (문서 단위 · iterable)

속성/메서드설명
.ok (= .passed, bool(report))mismatch가 하나도 없으면 True
.all_match더 엄격: 모든 주장이 적극적으로 확인됨
.matches / .mismatches / .unverifiable판정별 Result 리스트
.summary · .raw요약문 · 저수준 VerificationReport
.to_dict() · len() · report[i] · iterate직렬화·컬렉션 프로토콜

Result (주장 하나)

속성설명
.verdict"match" · "mismatch" · "unverifiable"
.claim / .reason / .confidence원문 주장 · 근거 설명 · 신뢰도 [0,1]
.value / .unit / .source대조한 공식 값 · 단위 · 출처 소스명
.ok / .is_match / .is_mismatch / .is_unverifiable · bool(r)판정 불리언

Verdict (규정 준수 판정)

속성설명
.verdict"compliant" · "violation" · "unverifiable"
.compliant (= .ok, bool(v)) / .violated준수/위반 불리언
.article / .rule_value / .claim_value / .unit적용 조항 · 기준값 vs 측정값 · 단위
.reason · .iterations근거 설명 · 에이전트 반복 횟수 (일반 모드는 None)

04 설정 · 로깅 · 진행상황

sv.build_config(*, provider=None, api_key=None, model=None,
    embedding_provider=None, embedding_api_key=None,
    tolerance=None, data=None, extra=None) → dict

config/default.yaml을 깔고 인자를 덮어쓴 전체 엔진 config dict를 반환. extra는 임의 키의 deep-merge 오버라이드. 반환 dict는 직접 수정 후 Verifier(config=cfg)로 사용 가능.

sv.configure_logging(file=None, *, level="INFO", verbose=False)
인자기본값설명
fileNone지정 시 파일에도 저장 (콘솔은 항상)
level"INFO""DEBUG" · "INFO" · "WARNING"
verboseFalseFalse면 검증·에이전트 핵심 로그만, True면 내부 상세까지
with sv.progress_dashboard(*, port=8765, open_browser=True,
                            terminal=True, hold=True, web=True): ...
인자기본값설명
webTrue로컬 웹페이지(실시간 카드+주장별 로그). False면 터미널만
terminalTrue터미널 라이브 진행바
port8765사용 중이면 다음 빈 포트
open_browserTrue진입 시 브라우저 자동 오픈
holdTrue검증 후에도 페이지 유지 (비대화형은 SV_DASHBOARD_HOLD초)

환경변수 SV_PROGRESS=off|terminal|web이 인자를 덮어씀. 색 끄기 NO_COLOR=1.

05 학습 API (structverify.training)

LearningLoop

LearningLoop(engine=None, base_model="unsloth/Qwen2.5-7B-Instruct")
메서드인자 (기본값)설명
.add_seed()—내장 시드 29건 (한국어 숫자 파싱·SQL 패턴·판정 톤). 체이닝 가능
.add_reports(reports, include=("verdict",))Report 리스트검증 결과의 확정 정답 → verdict 예시로 변환
.add_jsonl(path)chat jsonl 경로교정·합성·직접 만든 예시 추가
.prepare(out="train.jsonl", verbose=True)→ (path, CurationReport) DataCurator 품질검사 후 clean 데이터셋 저장
.train(dataset, output="./adapter", *, backend="auto", run=False, steps=60, early_stop=True, patience=200)→ dictbackend: qlora(NVIDIA)/mlx(Apple)/auto 감지 · run=False면 실행 명령만 반환(핸드오프) · early_stop: plateau/발산 시 조기 종료 · patience: 개선 없음 허용 스텝
.diagnose(trainer_state, verbose=True)→ Diagnosis 사후 진단: 발산·NaN·spike(복귀 판정)·overfit·수렴 스텝 분석 + 처방
.evaluate(eval_set, *, tuned_engine, margin=0.0, verbose=True)→ GateDecision 학습 전(자신의 engine)/후(tuned_engine) 정확도 비교 → .accepted. eval_set은 [{"text": ..., "expected": "match"}, ...]

감독 에이전트 단독 사용

클래스핵심 메서드비고
DataCurator.curate(rows, min_per_task=3) → (clean, CurationReport)포맷·JSON/SQL 유효성·중복·과소·편중(전체 5% 미만) 검사. 격리 사유를 리포트에 기록
TrainDoctor.diagnose(trainer_state) → Diagnosis표준 HF trainer_state.json이면 어느 트레이너든 진단 가능 (백엔드 무관)
EvalGateEvalGate(engine).score(labeled) / .evaluate(labeled, tuned_engine=..., margin=0.0)margin: 채택에 요구하는 최소 정확도 개선폭

데이터 유틸

함수설명
build_example(task, **fields)chat 포맷 예시 생성. task: schema(claim_text·output) / sql(indicator·schema_hint·claim_text·output[·dialect]) / verdict(claim_text·evidence_value·evidence_unit·output)
build_seed_dataset(out) · export_dataset(reports, out, include)시드 저장 · Report → 학습 예시 변환
write_jsonl(rows, path) · read_jsonl(path)jsonl 입출력
generate_dataset(llm_config, out="gen.jsonl", *, indicators=None, domain="회사", n=80, batch=8)강한 클라우드 모델로 합성 예시 생성(증류): schema:verdict ≈ 6:4. llm_config는 build_config(...)["llm"]

LossMonitor (실시간 감독 코어)

파라미터기본값설명
patience200이동평균 개선 없이 허용하는 스텝 → 초과 시 "수렴 완료" 조기 종료
min_steps120이 전에는 절대 조기 종료 안 함 (워밍업 보호)
window20이동평균 창
improve_eps0.02"개선"으로 인정할 최소 상대 하락폭 (2%)
spike_ratio3.0이동평균 대비 이 배수 초과 시 스파이크 기록
diverge_ratio2.0이동평균이 최저 대비 이 배수로 window만큼 유지되면 발산 종료

06 CLI 명령어

python -m structverify.training.recipe.train_qlora (NVIDIA QLoRA)

옵션기본값설명
--modelunsloth/Qwen2.5-7B-Instruct4bit 베이스 (unsloth 허브 권장; 6GB GPU면 3B 계열)
--data필수chat jsonl 데이터셋
--out./adapter어댑터 출력 폴더 (+ trainer_state.json · training_meta.json)
--max-steps60최대 스텝 (조기 종료가 먼저 멈출 수 있음)
--lr2e-4학습률 (warmup 5스텝 · linear decay)
--rank16LoRA rank (alpha=rank×2, dropout 0)
--seq-len2048최대 시퀀스 길이
--batch / --grad-accum1 / 8유효 배치 = batch×grad-accum = 8
--early-stop / --no-early-stopON 실시간 감독 조기 종료 on/off (off여도 관찰·기록은 유지)
--patience200개선 없음 허용 스텝
--keep-checkpointsoff중간 checkpoint-* 보존 (기본: 성공 시 삭제 → 어댑터만 수십 MB)

python -m structverify.training.recipe.train_mlx (Apple Silicon LoRA)

옵션기본값설명
--modelmlx-community/Qwen2.5-7B-Instruct-4bitMLX 허브 모델 (메모리 부족 시 -3B-4bit)
--data / --out필수 / ./adapterchat jsonl / 어댑터 출력
--iters / --batch / --rank / --lr100 / 1 / 8 / 1e-4학습 하이퍼파라미터 (50 iter마다 어댑터 저장)
--early-stop·--no-early-stop / --patienceON / 200스트리밍 실시간 감독 + 조기 종료

python -m structverify.training.recipe.sample (어댑터 스모크 테스트)

옵션기본값설명
--adapter./adapter어댑터 폴더 (GPU 머신에서 실행)
(옵션 없음)—내장 미학습 문장 4건으로 schema·verdict 일반화 확인
--task + --claim—단일 테스트 (schema 또는 verdict)
--evidence / --unit—verdict 테스트용 근거값·단위
--max-tokens120생성 길이

07 config 설정값 (config/default.yaml)

build_config()가 이 파일을 기본으로 깔고 인자를 덮어씁니다. 임의 키는 build_config(extra={...})(deep-merge) 또는 반환 dict 직접 수정으로 오버라이드.

llm (판정용 LLM)

키기본값설명
llm.providerupstageupstage · openai · gemini · hcx
llm.modelsprovider별 기본티어별 모델 dict: 부분 오버라이드 허용: heavy(복잡 추론·설명) / light(분류·랭킹) / structured(JSON 추출·판정) / reasoning
llm.base_urlprovider 기본OpenAI 호환 엔드포인트 교체: 자체 서빙(vLLM/Ollama) 연결에 사용
llm.temperature / max_tokens0.1 / 4096생성 파라미터
llm.api_key_env / _direct_api_keyprovider별키를 읽을 환경변수 이름 / 코드 직접 주입 값
llm.min_call_interval_ms600호출 간 최소 간격: 429 방지 (500=보통, 1000=매우 안전)
llm.max_concurrency4동시 LLM 요청 상한 (rate limit 나면 1로)

embedding · verification

키기본값설명
embedding.provider / model / api_key_envupstage의미검색 임베딩. 인덱스는 첫 사용 시 구축 → 디스크 캐시
verification.tolerance_percent1.0match 판정 수치 허용오차(%)
verification.min_confidence0.7이 미만 신뢰도면 unverifiable 처리

agent (ReAct 루프)

키기본값설명
agent.loop.max_iterations10claim당 reflect 최대 반복
agent.loop.early_stop_on_confidence0.9이 신뢰도 이상이면 finish 권장
agent.loop.single_pass_fallbacktrue에이전트 실패/예산 초과 시 단일 패스 폴백
agent.budget.max_tokens_per_job100000문서당 토큰 상한
agent.budget.max_concurrent_claims3동시 처리 claim 수
agent.llm.plan_model / reflect_model / explain_modelstructured / light / heavy에이전트 단계별 모델 티어
agent.workspace.backend / scopelocal / job_id작업공간 저장 위치·격리 단위 (doc_hash=캐시 재사용, job_id=매번 fresh)

data_sources (검증 기준 데이터)

키기본값설명
data_sources.enabled / default_source["kosis"]활성 소스 목록: DataSource API가 자동 설정
...kosis.catalog_ranker.enabled / score_threshold / pool_limit / max_try / model_tiertrue / 0.15 / 20 / 10 / lightLLM 배치 랭킹: 후보 표를 의미 점수로 정렬, 임계 미만 거부
...kosis.relevance_guard.enabled / llm_fallback / model_tiertrue / true / light표 단위 관련성 가드 (+ row_match_llm_fallback: 행 매칭 0건 시 LLM 구조)
...custom_db.dsn_envCUSTOM_DB_DSNDB 접속 문자열 환경변수 (API로 dsn 직접 주면 불필요)

catalog_search · candidate_detection

키기본값설명
catalog_search.deep_explore.enabled / top_n / rows_per_tabletrue / 3 / 5애매할 때 후보 표의 샘플 행까지 조회해 재판단
catalog_search.deep_explore.trigger_low_score / trigger_score_gap / max_per_claim0.6 / 0.1 / 2발동 조건(1위 점수·1-2위 격차)과 상한
catalog_search.query_rewriter.enabled / n_variationstrue / 3검색어 변형 생성 개수
candidate_detection.threshold0.65주장 후보 점수 임계
candidate_detection.concurrency2후보 스코어링 동시성

domain · 기타 인프라

키기본값설명
domain.language / classifier_labelsko / 내장 5종분류 라벨: 회사 자체 분류체계로 교체 가능 (classifier_labels_path로 YAML 분리)
kosis.base_url / api_key_env / pgvector_dsn_env—KOSIS OpenAPI·카탈로그 pgvector 접속
graph / storage / redis / database비활성/로컬Neo4j·MinIO·Redis·Postgres: 플랫폼([platform]) 배포용, 라이브러리 단독 사용엔 불필요
observability.log_levelINFOconfigure_logging이 우선
preprocessing.sandbox_backenddocker스크래퍼 샌드박스: exec · docker · e2b

08 환경변수

변수용도
UPSTAGE_API_KEY / OPENAI_API_KEY / GEMINI_API_KEY / NCP_API_KEYprovider별 LLM 키 (api_key 인자 직접 주입 시 불필요)
KOSIS_API_KEY · PGVECTOR_DSNKOSIS 소스 사용 시
CUSTOM_DB_DSNconfig로 DB 소스 쓸 때 접속 문자열
SV_PROGRESS = off · terminal · web진행상황 표시를 코드 수정 없이 제어 (인자 오버라이드)
SV_DASHBOARD_HOLD비대화형에서 대시보드 유지 시간(초)
NO_COLOR / SV_COLOR=1터미널 색 강제 off / 강제 on (파이프에 물려도 색 유지)
SV_VERBOSE=1학습 레시피가 숨긴 서드파티 로그(배너·경고) 전부 표시: 디버깅용
.env 파일python-dotenv로 자동 로드

09 학습 모델 주입

학습된 어댑터를 OpenAI 호환 엔드포인트로 서빙(Ollama ADAPTER / vLLM --enable-lora)한 뒤, config 두 줄로 파이프라인에 꽂습니다. 티어 단위 부분 주입이 가능해서 학습된 자리만 점진 전환:

cfg = sv.build_config(provider="upstage", api_key="none", data=data)
cfg["llm"]["base_url"] = "http://GPU서버:11434/v1"     # 자체 서빙 주소
cfg["llm"]["models"]   = {"structured": "sv-tuned"} # 스키마·판정 자리만 교체
tuned = sv.Verifier(config=cfg)
gate = loop.evaluate(eval_set, tuned_engine=tuned)      # 개선 확인 후 채택
어떤 자리(티어)에 무엇이 주입되는지는 학습 가이드, 모델이 쓰이는 자리 지도를 참조하십시오.

StructVerify v0.3.4 · MIT License. 개념·시작 안내는 사용법, 학습 배경·데이터 전략은 학습 가이드, 실행 화면은 3분 데모 영상 참조.