로컬 LLM(Ollama) + ChromaDB 기반의 프로젝트 물류 Copilot.
Cursor IDE에서 DRY_RUN → 승인 → APPLY 계약으로 안전하게 운영한다.
pip install -r tools/requirements.txt실제 사용 모델/URL의 SSOT는
tools/config.py+ 환경 변수다.
ollama pull qwen2.5:7b-instruct
ollama pull nomic-embed-textGemma 4 파일럿(선택): 게이트 모델은 Ollama 0.20 이상이 필요하다(구버전은 manifest 412). 예시:
ollama pull gemma4:e4b-it-q4_K_M
python tools/bench/ollama_bench_one.py
python tools/poc/schema_extract.py --dry-run tests/fixtures/pilot_invoice_sample.txt파일럿 전용 모델 태그는 환경 변수 PILOT_OLLAMA_MODEL로 지정한다(기본 LLM_MODEL은 바꾸지 않는다).
BL PoC / RAG 모델 A-B(선택, plan-doc-2026-04-06-gemma-next-epics-full.md):
python tools/poc/bl_schema_extract.py --dry-run tests/fixtures/pilot_bl_sample.txt
python tools/bench/rag_model_compare.py --dry-run
# 실측: Chroma 인덱스 + Ollama. B 모델 필수 (--model-b 또는 PILOT_OLLAMA_MODEL)
python tools/bench/rag_model_compare.py --model-b gemma4:e4b-it-q4_K_M
# 질문 여러 개일 때 페어 단위 병렬: --jobs 4 (질문마다 A→B 순서는 유지)- A측은
--model-a또는 환경 변수AB_MODEL_A; 비우면 호스트의LLM_MODEL(미설정 시 config 기본)을 쓴다. ask.py를 두 번 호출해out/bench/rag_ab_report.json에 지연·exit·evidence 요약을 남긴다(저장소에는.gitignore).
ssot/pdf/ ← PDF (.pdf)
ssot/xlsx/ ← Excel (.xlsx)
ssot/facts/ ← Facts (.md, .json)
python tools/rag.py index # DRY_RUN (기본)
python tools/rag.py index --apply # 실제 인덱싱(승인 후)python tools/rag.py ask "BL번호 알려줘"tools/ask.py와 rag.py ask의 표준 출력은 한 줄 JSON이다. answer, evidence_count, route_used, evidence, timing_ms(retrieve·generate ms), llm_model, embed_model를 포함하며, 증거가 없을 때는 error_code(예: E007_NO_EVIDENCE)가 설정된다. rag.py ask는 동일 JSON을 out/rag/에 저장하고 qa_log에 요약을 남긴다.
| 계약 | 내용 |
|---|---|
| DRY_RUN 기본 | --apply 없으면 실제 쓰기 없음 |
| ZERO_STOP | Evidence 0건 → ExitCode=2, 답변 금지 |
| append-only 로그 | out/logs/ops_log.jsonl, out/logs/qa_log.jsonl |
| localhost 전용 | 기본 http://localhost:11434 (외부 네트워크 호출 금지) |
tools/config.py가 경로/기본값의 단일 근거다.
- 입력:
ssot/pdfssot/xlsxssot/facts
- 출력:
- VectorDB:
out/chroma - Q&A 결과:
out/rag - 운영 로그:
out/logs/ops_log.jsonl - Q&A 로그:
out/logs/qa_log.jsonl
- VectorDB:
| 변수 | 기본값 | 설명 |
|---|---|---|
OLLAMA_URL |
http://localhost:11434 |
Ollama 주소 |
LLM_MODEL |
tools/config.py 참조 |
생성 모델(RAG ask 등) |
EMBED_MODEL |
tools/config.py 참조 |
임베딩 모델 |
PILOT_OLLAMA_MODEL |
(미설정 시 스크립트 기본값) | 파일럿 벤치/PoC 전용 태그 |
RAG_CHROMA_DIR |
(미설정) | 테스트·격리용 Chroma 디렉터리 덮어쓰기(일반 운영에서는 비움) |
python tools/rag.py status
python tools/rag.py index
python tools/rag.py ask
python tools/rag.py replay
python tools/rag.py export테스트: python -m pytest tests -q (회귀 시나리오·스모크 포함). Ollama 통합만 보려면 pytest -m ollama.
의존성: GitHub에서 Dependabot이 tools/requirements.txt를 주간으로 스캔한다(.github/dependabot.yml).