/** * Citation Trace — 답변 *끝* 에 "출처:" 한 줄 명시 지시. * * CoVe Strict 모드 (v2.2.184) 와 차이: * - CoVe Strict: 모든 사실 주장 뒤에 inline `[S1]` 인용 강제 — verbose, 학술적 * - Citation Trace: 답변 끝에 *사용된 출처* 한 줄 정리 — 가벼움, 항상 ON 권장 * * 둘은 함께 동작 가능. CoVe 가 [S1]..[SN] 라벨을 system prompt 에 노출하면, * Citation Trace 는 LLM 에게 "그 라벨들 중 답변에 *실제로 사용된* 것을 끝에 한 줄 * 정리" 라고 지시. * * 효과: 사용자가 답변 검증 가능 — "이 답변이 어느 출처에 기반했나" 명시. * 할루시네이션 억제 — LLM 이 출처 없는 주장 줄임. * * 비용: 시스템 프롬프트 ~10줄 추가. LLM 출력에 1줄 추가. */ import { RetrievalChunk } from './types'; export interface CitationTraceOptions { /** 답변 끝 *출처 한 줄* 형식. 'tail' 만 v1 지원. */ format: 'tail'; } /** * Citation Trace 블록 — chunks 가 *있어야* 의미 있으니 비어 있으면 빈 문자열. * Casual conversation 모드는 호출자가 미리 걸러야. */ export function buildCitationTraceBlock( chunks: RetrievalChunk[], options: Partial = {}, ): string { if (!chunks || chunks.length === 0) return ''; const lines: string[] = []; lines.push('[CITATION TRACE]'); lines.push('답변에서 *검색된 출처를 사용했다면*, 답변 끝에 다음 형식으로 *한 줄* 정리:'); lines.push(''); lines.push('*출처:* `파일명.md` · `chunk-title` · `chunk-title2`'); lines.push(''); lines.push('[규칙]'); lines.push('1. 실제 답변 작성에 *사용한* 출처만 나열. 검색됐지만 안 쓴 출처는 제외.'); lines.push('2. 출처 라벨은 파일명(있으면) 또는 chunk title 그대로 — 임의 변형 금지.'); lines.push('3. 일반 모델 지식만 사용했다면: *출처: 모델 지식 (검색 출처 미사용)*'); lines.push('4. 답변이 검증 가능하도록 — 사용자가 그 파일을 열면 답변 근거를 확인할 수 있어야.'); lines.push('5. *출처:* 라인은 답변 *맨 끝* 한 번만 — 본문 중간에 흩어 놓지 말 것.'); lines.push('[/CITATION TRACE]'); return lines.join('\n'); }