StructVerify
레퍼런스 매뉴얼
모든 공개 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] | asyncpg | KOSIS 공공통계 사실검증 (pgvector 카탈로그) |
[korean] | kss | 한국어 문장 분리 (없으면 정규식 폴백) |
[url] | trafilatura, beautifulsoup4 | URL 기사 본문 추출 |
[docs] | python-docx | DOCX 문서 지원 |
[pdf-ocr] | PyMuPDF AGPL | OCR·이미지 렌더링 PDF (기본 경로는 pdfplumber·MIT: 명시적 opt-in) |
[graph] | neo4j | 그래프 저장 (기본 비활성) |
[training] | unsloth, trl, peft, bitsandbytes, accelerate, datasets, transformers, torch | QLoRA 학습 레시피 (NVIDIA: RTX 3060 12GB / Colab T4·L4) |
[training-mac] | mlx-lm | LoRA 학습 레시피 (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)
| 인자 | 기본값 | 설명 |
provider | config 기본 | "upstage" · "openai" · "gemini" · "hcx" |
api_key | 환경변수 | 직접 주입 시 환경변수 불필요 |
model | provider 기본 | 단일 모델명: 모든 티어(heavy/light/structured)에 적용 |
embedding_provider / _api_key | provider 따라감 | 임베딩만 다른 provider 사용 시 |
tolerance | 1.0 | 수치 허용오차(%) |
data | KOSIS | DataSource 또는 경로 문자열(확장자로 유형 추론) |
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_size | 120 | 조항 분할 크기 (단어 기준) |
agent | False | True면 검사마다 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)
| 인자 | 기본값 | 설명 |
file | None | 지정 시 파일에도 저장 (콘솔은 항상) |
level | "INFO" | "DEBUG" · "INFO" · "WARNING" |
verbose | False | False면 검증·에이전트 핵심 로그만, True면 내부 상세까지 |
with sv.progress_dashboard(*, port=8765, open_browser=True,
terminal=True, hold=True, web=True): ...
| 인자 | 기본값 | 설명 |
web | True | 로컬 웹페이지(실시간 카드+주장별 로그). False면 터미널만 |
terminal | True | 터미널 라이브 진행바 |
port | 8765 | 사용 중이면 다음 빈 포트 |
open_browser | True | 진입 시 브라우저 자동 오픈 |
hold | True | 검증 후에도 페이지 유지 (비대화형은 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) | → dict | backend: 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이면 어느 트레이너든 진단 가능 (백엔드 무관) |
EvalGate | EvalGate(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 (실시간 감독 코어)
| 파라미터 | 기본값 | 설명 |
patience | 200 | 이동평균 개선 없이 허용하는 스텝 → 초과 시 "수렴 완료" 조기 종료 |
min_steps | 120 | 이 전에는 절대 조기 종료 안 함 (워밍업 보호) |
window | 20 | 이동평균 창 |
improve_eps | 0.02 | "개선"으로 인정할 최소 상대 하락폭 (2%) |
spike_ratio | 3.0 | 이동평균 대비 이 배수 초과 시 스파이크 기록 |
diverge_ratio | 2.0 | 이동평균이 최저 대비 이 배수로 window만큼 유지되면 발산 종료 |
06 CLI 명령어
python -m structverify.training.recipe.train_qlora (NVIDIA QLoRA)
| 옵션 | 기본값 | 설명 |
--model | unsloth/Qwen2.5-7B-Instruct | 4bit 베이스 (unsloth 허브 권장; 6GB GPU면 3B 계열) |
--data | 필수 | chat jsonl 데이터셋 |
--out | ./adapter | 어댑터 출력 폴더 (+ trainer_state.json · training_meta.json) |
--max-steps | 60 | 최대 스텝 (조기 종료가 먼저 멈출 수 있음) |
--lr | 2e-4 | 학습률 (warmup 5스텝 · linear decay) |
--rank | 16 | LoRA rank (alpha=rank×2, dropout 0) |
--seq-len | 2048 | 최대 시퀀스 길이 |
--batch / --grad-accum | 1 / 8 | 유효 배치 = batch×grad-accum = 8 |
--early-stop / --no-early-stop | ON | 실시간 감독 조기 종료 on/off (off여도 관찰·기록은 유지) |
--patience | 200 | 개선 없음 허용 스텝 |
--keep-checkpoints | off | 중간 checkpoint-* 보존 (기본: 성공 시 삭제 → 어댑터만 수십 MB) |
python -m structverify.training.recipe.train_mlx (Apple Silicon LoRA)
| 옵션 | 기본값 | 설명 |
--model | mlx-community/Qwen2.5-7B-Instruct-4bit | MLX 허브 모델 (메모리 부족 시 -3B-4bit) |
--data / --out | 필수 / ./adapter | chat jsonl / 어댑터 출력 |
--iters / --batch / --rank / --lr | 100 / 1 / 8 / 1e-4 | 학습 하이퍼파라미터 (50 iter마다 어댑터 저장) |
--early-stop·--no-early-stop / --patience | ON / 200 | 스트리밍 실시간 감독 + 조기 종료 |
python -m structverify.training.recipe.sample (어댑터 스모크 테스트)
| 옵션 | 기본값 | 설명 |
--adapter | ./adapter | 어댑터 폴더 (GPU 머신에서 실행) |
| (옵션 없음) | — | 내장 미학습 문장 4건으로 schema·verdict 일반화 확인 |
--task + --claim | — | 단일 테스트 (schema 또는 verdict) |
--evidence / --unit | — | verdict 테스트용 근거값·단위 |
--max-tokens | 120 | 생성 길이 |
07 config 설정값 (config/default.yaml)
build_config()가 이 파일을 기본으로 깔고 인자를 덮어씁니다. 임의 키는
build_config(extra={...})(deep-merge) 또는 반환 dict 직접 수정으로 오버라이드.
llm (판정용 LLM)
| 키 | 기본값 | 설명 |
llm.provider | upstage | upstage · openai · gemini · hcx |
llm.models | provider별 기본 | 티어별 모델 dict: 부분 오버라이드 허용: heavy(복잡 추론·설명) / light(분류·랭킹) / structured(JSON 추출·판정) / reasoning |
llm.base_url | provider 기본 | OpenAI 호환 엔드포인트 교체: 자체 서빙(vLLM/Ollama) 연결에 사용 |
llm.temperature / max_tokens | 0.1 / 4096 | 생성 파라미터 |
llm.api_key_env / _direct_api_key | provider별 | 키를 읽을 환경변수 이름 / 코드 직접 주입 값 |
llm.min_call_interval_ms | 600 | 호출 간 최소 간격: 429 방지 (500=보통, 1000=매우 안전) |
llm.max_concurrency | 4 | 동시 LLM 요청 상한 (rate limit 나면 1로) |
embedding · verification
| 키 | 기본값 | 설명 |
embedding.provider / model / api_key_env | upstage | 의미검색 임베딩. 인덱스는 첫 사용 시 구축 → 디스크 캐시 |
verification.tolerance_percent | 1.0 | match 판정 수치 허용오차(%) |
verification.min_confidence | 0.7 | 이 미만 신뢰도면 unverifiable 처리 |
agent (ReAct 루프)
| 키 | 기본값 | 설명 |
agent.loop.max_iterations | 10 | claim당 reflect 최대 반복 |
agent.loop.early_stop_on_confidence | 0.9 | 이 신뢰도 이상이면 finish 권장 |
agent.loop.single_pass_fallback | true | 에이전트 실패/예산 초과 시 단일 패스 폴백 |
agent.budget.max_tokens_per_job | 100000 | 문서당 토큰 상한 |
agent.budget.max_concurrent_claims | 3 | 동시 처리 claim 수 |
agent.llm.plan_model / reflect_model / explain_model | structured / light / heavy | 에이전트 단계별 모델 티어 |
agent.workspace.backend / scope | local / 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_tier | true / 0.15 / 20 / 10 / light | LLM 배치 랭킹: 후보 표를 의미 점수로 정렬, 임계 미만 거부 |
...kosis.relevance_guard.enabled / llm_fallback / model_tier | true / true / light | 표 단위 관련성 가드 (+ row_match_llm_fallback: 행 매칭 0건 시 LLM 구조) |
...custom_db.dsn_env | CUSTOM_DB_DSN | DB 접속 문자열 환경변수 (API로 dsn 직접 주면 불필요) |
catalog_search · candidate_detection
| 키 | 기본값 | 설명 |
catalog_search.deep_explore.enabled / top_n / rows_per_table | true / 3 / 5 | 애매할 때 후보 표의 샘플 행까지 조회해 재판단 |
catalog_search.deep_explore.trigger_low_score / trigger_score_gap / max_per_claim | 0.6 / 0.1 / 2 | 발동 조건(1위 점수·1-2위 격차)과 상한 |
catalog_search.query_rewriter.enabled / n_variations | true / 3 | 검색어 변형 생성 개수 |
candidate_detection.threshold | 0.65 | 주장 후보 점수 임계 |
candidate_detection.concurrency | 2 | 후보 스코어링 동시성 |
domain · 기타 인프라
| 키 | 기본값 | 설명 |
domain.language / classifier_labels | ko / 내장 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_level | INFO | configure_logging이 우선 |
preprocessing.sandbox_backend | docker | 스크래퍼 샌드박스: exec · docker · e2b |
08 환경변수
| 변수 | 용도 |
UPSTAGE_API_KEY / OPENAI_API_KEY / GEMINI_API_KEY / NCP_API_KEY | provider별 LLM 키 (api_key 인자 직접 주입 시 불필요) |
KOSIS_API_KEY · PGVECTOR_DSN | KOSIS 소스 사용 시 |
CUSTOM_DB_DSN | config로 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분 데모 영상 참조.