--- id: intelligence-verification-layer title: "Intelligence 검증 레이어" category: "AI_and_ML" status: "draft" verification_status: "applied" canonical_id: "" aliases: ["self-evolving", "critic", "confidence engine", "epistemic guard", "correction loop", "anti-hallucination", "자기검증", "환각 방지"] duplicate_of: "" source_trust_level: "A" confidence_score: 0.93 created_at: 2026-06-13 updated_at: 2026-06-13 review_reason: "" merge_history: [] tags: ["intelligence", "verification", "hallucination", "self-evolving", "ai", "astraai"] raw_sources: ["AstraAI/src/intelligence/criticAgent.ts", "AstraAI/src/intelligence/confidenceEngine.ts", "AstraAI/src/intelligence/epistemicGuardBlock.ts", "AstraAI/src/intelligence/correctionLoop.ts"] applied_in: ["AstraAI"] github_commit: "" --- # [[Intelligence 검증 레이어]] ## 🎯 한 줄 통찰 (One-line insight) 작은 로컬 LLM 의 환각·오류를 시스템이 잡으려면 "**저렴한 결정론적 검사를 항상, 비싼 LLM 검사는 조건부로**" 돌리고, 사용자 정정 한 번을 시스템 성장으로 환원하는 폐루프가 핵심이며, AstraAI 는 Epistemic Guard(사전 억제)·Confidence Engine(측정)·Critic(사후 검수)·Correction Loop(학습)로 이를 계층화한다 [S1][S2][S3][S4]. ## 🧠 핵심 개념 (Core concepts) 1. **Epistemic Guard (사전):** 시스템 프롬프트에 "확실/추정/모름 3등급" 을 강제하는 블록을 주입. 검색 근거가 없을수록 지시가 강해진다("지어내지 말고 질문하라") [S3]. 2. **Confidence Engine (측정):** LLM 호출 없이 검색 그라운딩 신호 + 답변 텍스트 신호(정규식)만으로 0~100 확신도를 *결정론적* 산출. latency 0 [S2]. 3. **Critic Agent (사후):** 결정론적 검사가 문제를 신호할 때만 LLM 검수 1회 — 조건부 1-pass. 누락·근거 없는 단정·미결 구분을 검사 [S1]. 4. **Correction Loop (학습):** 사용자 정정을 Ground Truth 로 보고 레슨 저장 + 회귀 케이스 적립 + 약점 프로필 → 다음 턴 프롬프트에 자동 주입 [S4]. 5. **CoVe vs Epistemic Guard 분업:** CoVe 는 출처가 *있을 때* 주장-출처 매핑 검증, Epistemic Guard 는 출처 *유무 무관* 등급 표시 강제 [S3]. ## 🧩 추출된 패턴 (Extracted patterns) - **저렴한 것 항상, 비싼 것 조건부:** 결정론적(정규식/카운트) 검사는 매 턴, LLM 검수는 신호가 있을 때만 — 로컬 모델 latency 비용 통제 [S1][S2]. - **"확신도는 모델 자신감이 아니라 검증 가능성":** 모델이 솔직히 "(확인 필요)" 를 쓰면 점수가 *내려가는* 게 올바른 동작 — 사용자 검토를 유도해야 하므로 [S2]. - **가중치 합산 + factor 기록:** 확신도를 요인별 delta 합으로 계산하고 각 factor 를 footer 에 노출 — 점수가 왜 그렇게 나왔는지 설명가능 [S2]. - **정답지를 사람이 안 만든다:** 정정 발화 자체가 Ground Truth. 회귀 테스트가 "같은 실수 반복?" 을 LLM-judge 로 판정 [S4]. - **통찰→행동의 기계화:** 태그 통계가 리포트에 머물지 않고 `buildSelfReviewBlock` 으로 다음 턴 시스템 프롬프트를 바꾼다(같은 태그 2회+일 때만) [S4]. - **JSON 강건 파싱:** LLM 의 JSON 출력에 잡설이 섞여도 첫 균형 `{}` 블록을 스캔해 추출 [S1]. - **fire-and-forget 캡처:** 정정 캡처는 비동기로 흘려 응답 속도에 영향 없음 [S4]. ## 📖 세부 내용 (Details) ### Confidence Engine — 결정론적 가중 합산 중립 출발점 55에서 시작해 요인별로 가감한다 [S2]: - 그라운딩: 청크 3건+ & topScore 0.5+ → +25, 1건+ → +12, 없음 → -15. - 출처 인용 +8 / 모델 지식만 -5. - 출처 충돌 건당 -8(최대 -16), 요청 모호성 -10. - Requirement 커버리지 전부 충족 +10 / 누락당 -6(최대 -18). - 헤지 표현 개당 -4(최대 -12). 구간: 90+ 높음 / 70-89 보통 / 50-69 낮음 / <50 매우 낮음(에스컬레이션). ### Critic — 조건부 1-pass 검수 완전한 작성→비판→재작성 debate 는 로컬 Gemma latency 때문에 미룬다. v1 은 "커버리지 누락 또는 확신도 <70" 일 때만 Critic LLM 1회 호출, 결과를 답변 아래 보완 카드로 표시. `maxRounds` knob 만 준비해 두고 다회전은 후속 [S1]. ### Correction Loop — 정정 1회가 3곳을 성장 ``` 사용자 정정 → ① 감지(보수적 정규식) + LLM 분류(6개 오류 태그) ├→ 태깅된 레슨 저장 (lessons/) └→ 회귀 케이스 적립 (.astra/eval/corrections.jsonl) ② 주간 성장 사이클: 회귀 재검사 + 태그 통계 → 약점 프로필 ③ 약점 프로필 → 시스템 프롬프트 자기검토 블록 자동 주입 ``` 설계 원칙: 정답지는 정정 자체, 통찰→행동은 기계적, 모든 산출물은 사람이 열어 수정/삭제 가능(Permission Based Learning), 캡처는 fire-and-forget [S4]. ### 폭주 방지 장치들 - 자기검토 블록은 같은 태그 2회+일 때만(1회성 실수로 프롬프트 어지럽힘 방지) [S4]. - 지식 공백 학습 큐는 같은 질문 1회만 등록(해시 id) + proposed 20건 쌓이면 사람이 정리할 때까지 중단 [S4]. ## ⚖️ 모순 및 업데이트 (Contradictions & updates) - **휴리스틱 가중치의 임시성:** Confidence 가중치는 "휴리스틱 v1" 으로, 골든셋이 쌓이면 사람 평가와의 상관으로 보정 예정 — 현재 절대 점수보다 *상대 비교* 와 추세에 의미가 있다. - **정규식 정정 감지의 한계:** 보수적이라 미묘한 정정("음 그건 좀…")은 놓친다. 오탐이 레슨 노이즈를 만들기에 의도적으로 보수적. - **Critic 의 1-pass 한계:** 다회전 debate 가 더 정확하지만 비용 때문에 보류 — 정확도 vs latency 트레이드오프의 현실적 타협. ## 🛠️ 적용 사례 (Applied in summary) - `AstraAI/src/intelligence/confidenceEngine.ts` — 결정론적 확신도 + footer [S2]. - `AstraAI/src/intelligence/criticAgent.ts` — 조건부 검수 + 균형 JSON 파싱 [S1]. - `AstraAI/src/intelligence/epistemicGuardBlock.ts` — 사전 억제 프롬프트 [S3]. - `AstraAI/src/intelligence/correctionLoop.ts` — 정정→레슨→약점프로필→프롬프트 폐루프 [S4]. ## 💻 코드 패턴 (Code patterns) ```typescript // 1) 결정론적 확신도 — 요인별 delta 합산 + 설명가능 (src/intelligence/confidenceEngine.ts) let score = 55; // 중립 출발점 if (retrieval.chunkCount >= 3 && retrieval.topScore >= 0.5) factors.push({ label: '검색 근거 강', delta: +25 }); else if (retrieval.chunkCount >= 1) factors.push({ label: '검색 근거 있음', delta: +12 }); else factors.push({ label: '검색 근거 없음', delta: -15 }); if (answer.hedgeCount > 0) factors.push({ label: '불확실 표시', delta: -Math.min(12, answer.hedgeCount * 4) }); for (const f of factors) score += f.delta; score = Math.max(0, Math.min(100, Math.round(score))); // 0~100 clamp // 2) 균형 괄호 JSON 추출 — LLM 잡설 내성 (src/intelligence/criticAgent.ts) let depth = 0, end = -1, inString = false, escaped = false; for (let i = start; i < raw.length; i++) { const ch = raw[i]; if (escaped) { escaped = false; continue; } if (ch === '\\') { escaped = true; continue; } if (ch === '"') { inString = !inString; continue; } if (inString) continue; if (ch === '{') depth++; else if (ch === '}' && --depth === 0) { end = i; break; } } // 3) 통찰→행동 — 약점 통계를 다음 턴 프롬프트로 (src/intelligence/correctionLoop.ts) const significant = profile.tagCounts.filter(t => t.count >= 2).slice(0, 2); // 2회+만 // → "너는 최근 '사실오류' 정정을 N회 받았다. 수치·날짜는 근거 없으면 '확인 필요'로 표시하라." ``` ## ✅ 검증 상태 및 신뢰도 - **상태:** draft - **검증 단계:** applied - **출처 신뢰도:** A - **신뢰 점수:** 0.93 - **중복 검사 결과:** 신규 생성 (New discovery) ## 🔗 지식 그래프 (Knowledge Graph) - **상위/루트:** [[AstraAI 아키텍처 개요]] - **관련 개념:** [[의존성 주입과 서비스 인터페이스]], [[프롬프트 엔지니어링 패턴]], [[Agent 오케스트레이터 분해]] - **참조 맥락:** 로컬 LLM 이 자기검증·환각 억제·피드백 학습 루프를 설계할 때 참조. ## 📚 출처 (Sources) - [S1] AstraAI/src/intelligence/criticAgent.ts — 조건부 검수, 균형 JSON 파싱, 함수 주입 - [S2] AstraAI/src/intelligence/confidenceEngine.ts — 결정론적 확신도 산출 - [S3] AstraAI/src/intelligence/epistemicGuardBlock.ts — 3등급 인식론 가드 - [S4] AstraAI/src/intelligence/correctionLoop.ts — 정정 폐루프, 약점 프로필, 폭주 방지 ## 📝 변경 이력 (Change history) - 2026-06-13: AstraAI 코드 분석 기반 초안 생성.