Files
connectai/src/extension/featureConceptMap.ts
T
g1nation a114d968b0 feat(core): 자기지식 접지·웹 접근·환경 자가점검 — 할루시네이션 방어 3중화 (v2.2.247)
- Alignment Self-Learning: 자가 조사(질문 전 두뇌 검색)·사용자 답변 두뇌 저장·핵심메시지/프로젝트 컨텍스트 주입 (alignmentResearch.ts 신규)
- 웹 접근: Bridge 폴백 직접 fetch(webFetch.ts 신규)·<fetch_url> 액션 태그·기업 모드 URL/아키텍처 컨텍스트 주입·bare 도메인 인식
- 트리거 버그 수정: startsWith('/') 가 절대경로를 슬래시 명령으로 오인 — 분석 지시·URL 주입 전멸 원인 (회귀 테스트 고정)
- 자기지식 접지: 기능 인벤토리 lazy 재생성·학습 메커니즘 정본 섹션·[인벤토리 대조] 태그 의무화·결정론적 재구현 제안 정정 훅(featureConceptMap.ts 신규)
- 환경 자가점검: HealthCheckMonitor 에 Bridge/두뇌 볼륨/git 자격증명/확장 버전 검사 4종 + readyBar ⚠ 표시
- 두뇌 동기화: 원격 미설정 시 로컬 새로고침 모드·staged 기준 commit 판정·인증 부재 안내
- 기타: outputFormat 기본 markdown(제목 렌더 복구)·레슨/행동제약 truncation 보호 구역 이동·[CONTEXT] 절단 우선순위 재정렬

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 23:46:07 +09:00

137 lines
7.9 KiB
TypeScript

/**
* 기능 개념 지도 — vscode 의존 없는 순수 모듈 (테스트 용이).
*
* 두 소비처:
* 1. featureInventory.ts — "ASTRA 기능 인벤토리" 마크다운 생성 (LLM 프롬프트 주입용)
* 2. postAnswerHooks inventory-cross-check — 답변이 *이미 구현된 기능*을 신규
* 제안하는지 결정론적으로 검사해 정정 푸터를 붙임
*
* 2번이 존재하는 이유: 인벤토리를 프롬프트에 주입해도 작은 로컬 모델은 mid-prompt
* 컨텍스트를 무시하고 일반론으로 "X를 도입하라"고 제안하는 실패가 반복 재현됐다.
* 프롬프트 주입은 1차 방어선일 뿐 — 모델이 무시해도 사용자에게 정정이 보이는
* 결정론적 안전망(LLM 콜 0)이 최종 방어선이다.
*/
export interface ConceptEntry {
/** 학술/일반 명칭 (마크다운 표기용). */
concept: string;
/** ASTRA 구현 내역 한 줄. */
impl: string;
/** 답변 본문에서 이 개념을 식별하는 키워드 (소문자 비교, 한·영). */
keywords: string[];
}
export const CONCEPT_ENTRIES: ConceptEntry[] = [
{
concept: 'CoVe / Chain-of-Verification / Self-Critique',
impl: '구현됨 — coveEnabled(답변 전 그라운딩 체크리스트) + critic-loop 훅(문제 신호 턴 LLM 검수) + citationTrace(출처 역추적)',
keywords: ['cove', 'chain-of-verification', 'self-critique', 'selfcritique', 'self-correction', '자기 검증', '자기검증', '자기 수정', '크리틱 에이전트', '비판적 사고 루프', '스스로 검토하는 단계'],
},
{
concept: '지식 노후 점검 자동화 / Automated Decay Audit',
impl: '구현됨 — 주간 성장 사이클이 매주 자동 실행 (decay-report.md) + "Astra: 지식 노후 점검" 수동 명령',
keywords: ['노후화', '노후 점검', 'decay', '지식 신선도'],
},
{
concept: '지식 충돌 감지/해결 / Conflict Resolver',
impl: '구현됨 — 검색 시점 [CONFLICT WARNING] + 일일 충돌 스캔 + 신뢰도(trust·confidence·최신성) 비교 우선 권고. 최종 결정만 사람',
keywords: ['충돌 감지', '충돌 해결', 'conflict resolver', '상충되는 정보 발견'],
},
{
concept: '피드백 태깅 / 오류 분류 / Feedback Tagging',
impl: '구현됨 — Correction Loop가 사용자 정정을 자동 분류(사실오류/근거누락/맥락누락/추론오류/지시불이행/형식오류)해 레슨+회귀 케이스로 저장',
keywords: ['피드백 태깅', '피드백 루프 자동화', '오류 분류', '교훈으로 자동', '자동으로 \'교훈\'', '교훈을 자동', 'feedback tagging'],
},
{
concept: '멀티스텝 플래닝 / Multi-Step Planning / CoT 강제',
impl: '구현됨 — multiAgentEnabled(Planner→Researcher→Writer, 기본 OFF) + 1인 기업 모드 디스패처',
keywords: ['멀티스텝 플래닝', 'multi-step planning', 'cot 강제', 'reasoning chain', '추론 체인', 'chain of thought', '생각 단계(thought)', '생각의 단계'],
},
{
concept: '골든셋 자동 평가 / Regression Test',
impl: '구현됨 — 주간 사이클 자동 평가 + 직전 대비 회귀 경보(regression-alert.md) + 정정 회귀 재검사',
keywords: ['골든셋', '회귀 테스트', 'regression test'],
},
{
concept: 'Sleep-time / 유휴 시간 학습',
impl: '구현됨 — 일일 지식 사전 소화 (Digests/)',
keywords: ['sleep-time', '유휴 시간 학습', '유휴시간 학습'],
},
{
concept: '확신도 게이팅 / 환각 방지 표명',
impl: '구현됨 — [GROUNDING] 강함/보통/약함 + 약함 시 표명 강제 + 학습큐 자동 등록',
keywords: ['확신도 게이팅', '환각 방지', '확신 편향'],
},
{
concept: 'Reflection Layer / 자기 성찰 / 메타 학습 루프 / Self-Reflection',
impl: '구현됨 — Self-Reflector Phase A(답변 자가 점검 블록, opt-in) + Phase B(외부 검증 LLM + 자동 재시도) + Phase C(생성 파일 syntax 검증) + Hollow Code Check(빈 깡통 감지 + 자동 재작업) + 약점 프로필→자기검토 블록(최근 정정 통계가 다음 턴 행동을 직접 변경)',
keywords: ['reflection layer', 'self-reflection', '자기 성찰', '성찰 계층', '성찰 단계', '성찰(reflection)', '메타 학습'],
},
{
concept: '질문 전 자가 조사 / Self-Research / 경험 기반 제약 주입',
impl: '구현됨 — Intent Alignment 자가 조사(질문을 사용자에게 노출하기 전 두뇌 검색으로 선해결) + 사용자 답변 두뇌 자동 저장(Alignment Knowledge 학습 루프) + 레슨 체크리스트 truncation 보호 구역 주입',
keywords: ['자가 조사', 'self-research', '경험 기반 제약'],
},
];
/**
* 신규 도입/추가/구축을 제안하는 문장인지 (또는 부재를 단정하는 문장).
* '합' 포함 — "추가합니다/구축합니다" 활용형 미매치 갭 (회귀 테스트로 발견).
* '강화' 동사 + "도입:" 명사형(소제목 스타일) 추가 — 12B 답변의
* "Reasoning Chain 도입: ..." 패턴 미매치 갭 (회귀 테스트로 발견).
*/
const PROPOSAL_RE = /(도입|추가|구축|신설|개발|보강|강화|만들)(하|해|할|합|을|를)|(도입|추가|구축|신설)\s*[::]|필요합니다|제안합니다|추천합니다|부족합니다|부재|없습니다|미흡/;
/** 같은 문장에서 이미 구현 사실을 인지하고 있으면 정정 불필요. */
const ACKNOWLEDGED_RE = /(이미|기)\s*(구현|존재|있)|구현돼|구현되어|작동\s*중/;
export interface ReimplementationHit {
concept: string;
impl: string;
/** 감지된 문장 (검증/디버그용, 120자 cap). */
sentence: string;
}
/**
* 답변이 이미 구현된 기능을 "도입하라/없다"고 제안·단정하는 문장을 결정론적으로
* 감지. LLM 콜 0 — 문장 단위 키워드 + 제안 동사 공기(co-occurrence) 검사.
* 보수적 설계: 같은 문장에 "이미 구현/존재" 인지가 있으면 제외 (정정 노이즈 방지).
*/
export function detectReimplementedProposals(answer: string): ReimplementationHit[] {
if (!answer || !answer.trim()) return [];
// 문장 분리 — 마침표/줄바꿈/콜론 기준의 느슨한 분할이면 충분.
const sentences = answer.split(/(?<=[.!?다요음됨])\s+|\n+/);
const hits: ReimplementationHit[] = [];
const seen = new Set<string>();
for (const sentence of sentences) {
const lower = sentence.toLowerCase();
if (!PROPOSAL_RE.test(sentence)) continue;
if (ACKNOWLEDGED_RE.test(sentence)) continue;
for (const entry of CONCEPT_ENTRIES) {
if (seen.has(entry.concept)) continue;
if (entry.keywords.some((k) => lower.includes(k.toLowerCase()))) {
seen.add(entry.concept);
hits.push({
concept: entry.concept,
impl: entry.impl,
sentence: sentence.trim().slice(0, 120),
});
}
}
}
return hits;
}
/** 정정 푸터 마크다운 — 빈 hits 면 ''. */
export function formatReimplementationFooter(hits: ReimplementationHit[]): string {
if (hits.length === 0) return '';
const lines: string[] = [];
lines.push('\n\n---');
lines.push('⚠️ **기능 인벤토리 자동 대조** (결정론적 검사 — LLM 아님): 위 답변이 신규 도입을 제안한 항목 중 다음은 **이미 구현되어 있습니다**.');
for (const h of hits) {
lines.push(`- **${h.concept}** → ${h.impl}`);
}
lines.push('');
lines.push('_위 제안을 채택하기 전에 기존 구현을 먼저 확인하세요. (두뇌의 "ASTRA 기능 인벤토리.md" 참조)_');
return lines.join('\n');
}