VectorTrainer
VectorTrainer 프로젝트 요약
프로젝트/팀 기본정보
- 팀명: Cozymori
- 프로젝트명: VectorTrainer
- GitHub 저장소: https://github.com/cozymori/vectortrainer
제품 링크 또는 실행 방법
VectorTrainer 사용 가이드
개요
VectorTrainer는 LLM 서비스의 운영(Serving)과 개선(Fine-tuning)을 자동화하는 Self-Evolving AI Loop 엔진입니다.
운영 중 LLM 호출 로그 수집 (VectorWave)
↓
밀도 기반 골든 데이터 선별 (Extractor)
↓
피드백 분석 → 규칙 합성 → 훅 스크립트 생성 (Synthesizer)
↓
골든 데이터로 파인튜닝 (Trainer)
↓
개선된 모델로 다시 서비스 → 반복
설치
# 패키지 설치
pip install -e ".[dev]"
# VectorWave 의존성 (Weaviate 실행 필요)
docker compose up -d전체 파이프라인 실행
가장 일반적인 사용 방법입니다. 데이터 선별 → 규칙 합성 → 파인튜닝을 한 번에 수행합니다.
from vectorwave import VectorWaveDatasetManager
from vector_trainer.extractor import DensityBasedExtractor
from vector_trainer.synthesizer import run_synthesis_pipeline
from vector_trainer.pipeline import OpenAITrainer, TrainingPipeline
from vector_trainer.dashboard import CLIDashboard
from vector_trainer.types import FeedbackPair
# ── 1. VectorWave 연결 ──────────────────────────────────
dataset_manager = VectorWaveDatasetManager()
# ── 2. 골든 데이터 선별기 생성 ──────────────────────────
extractor = DensityBasedExtractor(
dataset_manager=dataset_manager,
epsilon=0.3, # 유사도 임계값 (낮을수록 엄격)
top_k=50, # 전략별 최대 선별 수
)
# ── 3. 피드백 쌍 정의 ───────────────────────────────────
# "모델이 이렇게 답했는데(bad), 이렇게 답했어야 했다(fixed)"
feedback_pairs = [
FeedbackPair(
input_prompt="이 제품의 리뷰를 요약해주세요",
bad_output="좋은 제품입니다",
fixed_output="이 제품은 내구성과 디자인이 우수하며, 배송도 빠릅니다.",
context={"function": "generate_review_summary"},
),
FeedbackPair(
input_prompt="사용자 리뷰를 분석해주세요",
bad_output="별로입니다",
fixed_output=(
"사용자 리뷰 분석 결과: 긍정 요소(디자인, 가격)와 "
"개선 필요 요소(AS, 설명서)가 혼재합니다. 만족도: 3.8/5."
),
context={"function": "generate_review_summary"},
),
]
# ── 4. 트레이너 & 대시보드 ──────────────────────────────
trainer = OpenAITrainer(api_key="sk-...")
dashboard = CLIDashboard()
# ── 5. 파이프라인 조립 & 실행 ───────────────────────────
pipeline = TrainingPipeline(
extractor=extractor,
synthesizer_output_dir="./output/hooks",
trainer=trainer,
monitor=dashboard,
)
result = pipeline.run(
function_name="generate_review_summary",
feedback_pairs=feedback_pairs,
output_dir="./output",
)
# ── 6. 결과 확인 ────────────────────────────────────────
dashboard.summary()
print(f"파인튜닝 모델: {result['train']['fine_tuned_model']}")
print(f"골든 데이터: {result['golden_data_path']}")
print(f"훅 스크립트: {result['hook_script_path']}")모듈별 개별 사용
각 모듈은 독립적으로도 사용할 수 있습니다.
1. Extractor — 골든 데이터 선별
실행 로그에서 벡터 그래프를 구축하고, 밀도 분석으로 학습 가치가 높은 데이터를 자동 선별합니다.
from vector_trainer.extractor import DensityBasedExtractor
extractor = DensityBasedExtractor(
dataset_manager=dataset_manager,
epsilon=0.3,
top_k=50,
)
# 정상 상태 (Steady State): 고밀도 클러스터의 중심점
# → 모델의 '기본기' 강화용 데이터
steady = extractor.select_steady_state("generate_review_summary")
for c in steady[:5]:
print(f" [{c.uuid}] 밀도={c.density:.4f} | {c.return_value[:60]}")
# 이상치 (Anomaly): 저밀도이지만 SUCCESS인 노드
# → 새로운 패턴 학습을 위한 경계 데이터
anomalies = extractor.select_anomalies("generate_review_summary")
for c in anomalies[:5]:
print(f" [{c.uuid}] 밀도={c.density:.4f} | {c.return_value[:60]}")
# ChatML JSONL로 내보내기 (OpenAI 파인튜닝 포맷)
extractor.extract_golden_data("generate_review_summary", "./golden_data.jsonl")출력 예시 (golden_data.jsonl):
{
"messages": [
{"role": "system", "content": "You are a function executor for 'generate_review_summary'. ..."},
{"role": "user", "content": "function_name: generate_review_summary
strategy: steady
density: 23.05"},
{"role": "assistant", "content": "이 제품은 품질이 우수하고 배송이 빠릅니다. 평점: 5/5"}
]
}2. Synthesizer — 피드백 분석 & 훅 스크립트 생성
피드백 쌍(bad → fixed)을 분석하여 규칙을 추출하고, 런타임에 적용 가능한 Python 스크립트를 생성합니다.
from vector_trainer.synthesizer import (
FeedbackDiffAnalyzer,
RuleSetSynthesizer,
HookScriptGenerator,
run_synthesis_pipeline,
)
from vector_trainer.types import FeedbackPair
# ── 방법 1: 한 줄로 실행 ────────────────────────────────
hook_path = run_synthesis_pipeline(
pairs=feedback_pairs,
output_dir="./hooks",
)
print(f"훅 스크립트 생성 완료: {hook_path}")
# ── 방법 2: 단계별 실행 ─────────────────────────────────
# 2-1. 피드백 차이 분석
analyzer = FeedbackDiffAnalyzer()
for pair in feedback_pairs:
diff = analyzer.analyze(pair)
print(f" 편집거리={diff['edit_distance']}, 유사도={diff['similarity_score']:.3f}")
# 2-2. 규칙 합성
diffs = [analyzer.analyze(p) for p in feedback_pairs]
synthesizer = RuleSetSynthesizer()
rules = synthesizer.synthesize(diffs)
for rule in rules:
print(f" [{rule.rule_id}] {rule.description[:60]}")
# 2-3. 훅 스크립트 생성
generator = HookScriptGenerator()
hook_path = generator.generate(rules, "./hooks")생성되는 훅 스크립트 사용법:
# 생성된 훅 스크립트를 임포트하여 즉시 적용
from generated_prompt_hook import intercept_prompt, intercept_output
# 사용자 입력 전처리
modified_prompt = intercept_prompt(user_input, context={})
# 모델 출력 후처리
corrected_output = intercept_output(model_output, context={})3. Trainer — 파인튜닝 실행
OpenAI 파인튜닝 API를 래핑한 트레이너입니다. Strategy Pattern으로 다른 벤더로 교체할 수 있습니다.
from vector_trainer.pipeline import OpenAITrainer
trainer = OpenAITrainer(api_key="sk-...")
# 데이터 업로드
file_id = trainer.prepare_data("./golden_data.jsonl")
# 파인튜닝 시작
job_id = trainer.start_training(file_id, model="gpt-4o-mini-2024-07-18")
# 상태 확인
status = trainer.get_status(job_id)
print(f"상태: {status['status']}")
# 결과 조회
result = trainer.get_result(job_id)
print(f"파인튜닝 모델: {result['fine_tuned_model']}")대시보드
CLI 대시보드
터미널에서 파이프라인 진행 과정을 실시간으로 확인합니다.
python demo.pyTrainingPipeline에 CLIDashboard를 연결하면 각 단계의 시작/완료/에러를 자동으로 표시합니다.
웹 대시보드 (Streamlit)
브라우저에서 파이프라인 결과를 시각적으로 탐색합니다.
streamlit run streamlit_app.pyhttp://localhost:8501 에서 확인 가능하며, 4개 탭을 제공합니다:
핵심 파라미터
DensityBasedExtractor
FeedbackPair
데모 실행
# Mock 모드 (VectorWave/OpenAI 없이 즉시 실행)
python demo.py
# 실제 VectorWave 연동 (Weaviate + OpenAI 키 필요)
export OPENAI_API_KEY='sk-...'
docker compose -f /path/to/vectorwave/docker-compose.yml up -d
python demo.py테스트
# 전체 테스트 (42개)
pytest tests/ -v
# 모듈별 테스트
pytest tests/ -v -k "extractor"
pytest tests/ -v -k "synthesizer"
pytest tests/ -v -k "pipeline"
pytest tests/ -v -k "dashboard"외부 의존성(VectorWave, OpenAI API)은 모두 Mocking 처리되어 있어, API 키 없이도 테스트가 가능합니다.
문제 정의 (Problem)
LLM 기반 서비스를 운영하면 실행 로그가 계속 쌓이지만, 이 데이터에서 Golden Data를 선별하고, 프롬프트를 개선하고, 파인튜닝을 실행하는 과정이 모두 수작업으로 이루어진다. 이로 인해 모델 개선 주기가 길어지고, 운영 비용이 증가한다.
해결 방식 (Solution)
핵심 구현 아이디어와 접근 방식을 정리했습니다.
한 줄 소개
Self-Evolving AI Loop — 운영 로그에서 Golden Data를 자동 선별하고 LLM 파인튜닝까지 자동화하는 엔진
데모 설명 (3분 이내 기준)
FastAPI 백엔드(localhost:8000) + Next.js 프론트엔드(localhost:3000)로 구성된 풀스택 대시보드. 파이프라인 실행 → 골든 데이터 시각화 → 교정 규칙 확인 → 훅 스크립트 생성 → 파인튜닝 비용 검증까지 브라우저에서 원클릭으로 체험 가능. Mock 모드 제공으로 외부 API 없이 즉시 실행 가능.
팀 소개 및 역할
- 김준영: 백엔드
- 조은설: 백엔드, 기획
기술 스택
Python, FastAPI, Next.js 16, TypeScript, Tailwind CSS v4, shadcn/ui, Weaviate(VectorWave), OpenAI Fine-tuning API, Streamlit, pytest
라이선스/출처
MIT License. VectorWave(Weaviate), OpenAI API 활용