59e38d80b0
E.3 400→600자 튜닝 전후 비교 + 단계 5 failure mode 분석의 기준 필드 추가. - migrations/135: answer_length/covered_aspects/missing_aspects/model_name/prompt_version 컬럼 + prompt_version 인덱스 - ORM: ask_event.py에 동일 5개 필드 매핑 - prompt_versions.py: ASK_PROMPT_VERSION="search_synthesis.v1-400char" 상수 + resolve_primary_model() helper - search_telemetry.record_ask_event: 시그니처에 keyword-only 필드 5개 추가 (하위 호환) - search.py: refused + success 두 호출사이트에서 새 필드 전달. answer_length는 len(sr.answer or ""), model_name/prompt_version은 상수 모듈 기반 기존 호출 구조(이미 search_telemetry+background_tasks로 DB insert 중)는 유지. 순수 확장 커밋. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
41 lines
1.7 KiB
Python
41 lines
1.7 KiB
Python
"""프롬프트/모델 버전 상수 — telemetry 기록용 (Phase E.1)
|
|
|
|
목적: ask_events / analyze_events 에 prompt_version 과 model_name 을 기록해서
|
|
튜닝 전/후 비교와 실험 분기를 식별 가능하게 함.
|
|
|
|
규칙:
|
|
- 프롬프트 파일이 의미 있게 바뀌면 해당 상수 문자열을 bump (예: v1-400char → v2-600char)
|
|
- 하드코딩 금지. 파이프라인은 여기 상수만 참조.
|
|
- 모델명은 런타임 config(settings.ai.primary.model)에서 읽어서 resolve_primary_model() 사용.
|
|
|
|
E.3 배포 타임라인:
|
|
- v1-400char → 현재 (search_synthesis.txt 17행 "400 characters max")
|
|
- v2-600char → E.3 배포 시 bump (동일 파일 "600 characters max")
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
# ─── ask (/search/ask) 프롬프트 버전 ─────────────────────────
|
|
# synthesis_service.py 가 로드하는 app/prompts/search_synthesis.txt 기준
|
|
ASK_PROMPT_VERSION: str = "search_synthesis.v1-400char"
|
|
|
|
# ─── /analyze 프롬프트 버전 ──────────────────────────────────
|
|
# documents.py analyze 라우트가 로드하는 app/prompts/document_analyze.txt 기준
|
|
ANALYZE_PROMPT_VERSION: str = "document_analyze.v1"
|
|
|
|
|
|
def resolve_primary_model() -> str | None:
|
|
"""런타임 config에서 primary 모델명을 resolve.
|
|
|
|
settings.ai 가 미구성이면 None.
|
|
telemetry 기록은 None 허용 (측정 필드는 nullable).
|
|
"""
|
|
try:
|
|
from core.config import settings
|
|
|
|
if settings.ai and settings.ai.primary:
|
|
return settings.ai.primary.model
|
|
except Exception:
|
|
pass
|
|
return None
|