Files
connectai/src/lib/contextBuilders/selfAssessContext.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

84 lines
5.7 KiB
TypeScript

/**
* 자기 평가/개선 질의 컨텍스트 — "기능 개선 아이디어 줘" 류 질문에 ASTRA 의
* *현행* 기능 인벤토리(자동 생성 문서)를 결정론적으로 직접 주입한다.
*
* 문제 (3회 재발한 자기 지식 구식화의 마지막 구멍): 인벤토리 문서를 자동 생성해도
* RAG 점수 경쟁에서 안 뽑히거나 모델이 검색 없이 기억으로 답하면 — 실제 사례:
* 답변 말미에 "출처: 모델 지식 (검색 미사용)" — 이미 있는 기능을 신규 제안한다.
* 프롬프트 규칙("인벤토리와 대조하라")은 검색을 강제할 수 없다.
*
* 수정: scheduleContext(일정 질의→캘린더 실데이터 강제 주입)와 동일 패턴 —
* 자기 평가 질의를 감지하면 인벤토리 전문을 RAG 경쟁 없이 컨텍스트에 넣는다.
* "검색 안 함" 실패 모드 자체를 제거.
*/
import * as fs from 'fs';
import * as path from 'path';
import { INVENTORY_FILE } from '../../extension/featureInventory';
// "검토|리뷰|점검|진단|어때" 추가 — "아래 내용 검토해줘" 같은 실사용 재검토
// 프롬프트가 매치 안 되던 갭 (회귀 테스트로 발견).
// "학습|배우|기억|작동|어떻게" 추가 — "너는 어떻게 학습해?" 류 자기 작동 방식
// 질문이 인벤토리(학습 메커니즘 정본 포함) 없이 답변되어 허구 설명이 나오던 갭.
const IMPROVE_RE = /(개선|고도화|발전|보완|제안|평가|분석|검토|리뷰|점검|진단|어때|방향|방법|아이디어|로드맵|업그레이드|날카롭|강화|학습|배우|기억|작동|어떻게)/i;
const SELF_RE = /(기능|역량|능력|아키텍처|구조|시스템|self.?evolv|자기\s*진화|자기\s*개선|아스트라|astra|connectai|프로젝트|업무\s*능력|너(가|의|는)?|네가)/i;
const CAPABILITY_RE = /(무슨|어떤|할\s*수\s*있는)\s*(기능|일|것)|기능\s*(목록|리스트)|capabilit/i;
/**
* 자기 평가·개선·기능 질의인지. 오탐 비용이 낮으므로(인벤토리 ~3KB 추가 주입뿐)
* 누락(또 구식 제안)보다 과잉 감지를 택한다. 길이 상한 없음 — 사용자가 이전 답변
* 전문(5천자+)을 붙여넣고 "이거 어때?"라고 묻는 재검토 패턴이 흔한데, 1500/4000
* 상한이 그런 실사용 프롬프트를 탈락시켜 인벤토리 미주입 → 기존 기능 재제안
* 버그가 반복 재발했다. 정규식 검사는 큰 문자열에도 저비용.
*/
export function isSelfAssessRequest(prompt: string): boolean {
const p = (prompt || '').trim();
if (!p) return false;
return CAPABILITY_RE.test(p) || (IMPROVE_RE.test(p) && SELF_RE.test(p));
}
/**
* 분석/검토 대상이 ASTRA/ConnectAI *자신*인지 — isSelfAssessRequest 보다 넓은
* 보조 판정 (개선 키워드 없이 "검토해줘/어때?" 만으로 자기 분석을 요청하는 경우).
* 분석 경로(isAnalysisRequest)와 결합해 인벤토리 주입 트리거를 보강한다.
*/
export function isAboutSelf(prompt: string): boolean {
const p = (prompt || '').trim();
if (!p) return false;
return /(아스트라|astra|connectai|자기\s*진화|자기\s*개선|self.?evolv|기능\s*인벤토리)/i.test(p);
}
const MAX_INVENTORY_CHARS = 7000;
/** 인벤토리 전문 + 대조 지시 블록. 파일 없으면 정직한 안내 (지어내기 방지). */
export function buildSelfAssessContext(brainPath: string): string {
const header = '[ASTRA 현행 기능 인벤토리 — 소스 코드에서 자동 생성된 정본]';
let body = '';
try {
const file = path.join(brainPath, INVENTORY_FILE);
if (fs.existsSync(file)) body = fs.readFileSync(file, 'utf8').slice(0, MAX_INVENTORY_CHARS);
} catch { /* 아래 fallback */ }
if (!body.trim()) {
return [
header,
'상태: 인벤토리 문서가 아직 생성되지 않음 (다음 활성화 때 자동 생성).',
'→ 기억에 의존해 기능 목록을 단정하지 말고, 기능 존재 여부가 불확실하면 "확인 필요"로 표시하라.',
].join('\n');
}
return [
header,
'자기 기능 평가·개선 제안 시 반드시 아래 인벤토리와 대조하라:',
'- 아래에 **이미 있는 기능을 신규 제안하지 마라.** 특히 "개선 제안 전 필독" 섹션의 개념들(CoVe·노후 점검 자동화·충돌 해결·피드백 태깅 등)은 명칭이 달라도 이미 구현돼 있다 — 이를 "도입하라"고 제안하면 그 답변은 오답이다.',
'- 제안은 "현재 X가 있고, 빠진 증분은 Y" 형태로.',
'- 아래에 없는 기능을 있다고 주장하지도 마라.',
'- 직전 대화에서 본인이 했던 제안 목록을 그대로 반복하지 마라 — 이 인벤토리가 그 제안들보다 우선하는 최신 사실이다.',
'⚠️ [의무 형식 — 위반 시 오답 처리] 개선 제안을 하나라도 포함하는 답변은, **각 제안의 첫 줄에** 아래 대조 태그를 반드시 붙여라:',
' `[인벤토리 대조: 신규]` — 아래 문서 어디에도 없는 기능',
' `[인벤토리 대조: 기구현 — <항목명>]` — 이미 있음 (이 경우 "도입" 대신 그 기능의 *증분 확장*만 제안 가능)',
' `[인벤토리 대조: 부분 구현 — <항목명>]` — 일부 겹침',
' 태그를 붙이려면 아래 문서를 실제로 읽어야 한다. 태그 없는 제안은 검증 안 된 추측으로 간주된다.',
'- 답변 끝에 "출처: ASTRA 기능 인벤토리 v<버전>" 을 표기하라 (이 블록을 실제로 읽었다는 증거).',
'',
body,
].join('\n');
}