diff --git a/src/gateway/guards/prompt-gates.ts b/src/gateway/guards/prompt-gates.ts index aa68808..7da3c99 100644 --- a/src/gateway/guards/prompt-gates.ts +++ b/src/gateway/guards/prompt-gates.ts @@ -152,7 +152,16 @@ export function isFactualInfoRequest(message: string): boolean { if (isExecutionLikeRequest(m) || isGreetingLikeMessage(m)) return false; if (isExemptFromVerification(m)) return false; return /\b(vs\.?|versus)\b/i.test(m) - || /(비교|차이점?|스펙|사양|성능|가격|버전|몇\s*(세대|개|년|만원)|추천해|어떤\s*(게|것|모델|제품|카드)|뭐가\s*있|무엇이\s*있|종류가)/.test(m); + || /(비교|차이점?|스펙|사양|성능|가격|버전|몇\s*(세대|개|년|만원)|추천해|어떤\s*(게|것|모델|제품|카드)|뭐가\s*있|무엇이\s*있|종류가)/.test(m) + // 2026-08-11 실제 사고: "5060 보다 얼마나 빠르지 4080?"에 도구 호출 0건, "RTX 5060은 아직 + // 출시되지 않은 차세대 모델"이라고 완전히 지어냈다(실제로는 이미 출시돼 지서버가 쓰고 있는 + // 카드). "성능"/"비교" 같은 위 키워드를 하나도 안 썼고 "빠르지"라는 캐주얼한 비교 표현만 + // 썼다 — 위 주석의 "casual paraphrases slip through unmatched" 경고가 실제로 뚫린 사례. + // "A보다 (얼마나) 빠른/느린/좋은/나은/강한" 형태의 비교 질문을 형용사 목록으로 넓게 잡는다. + // 빠르다/느리다는 러-불규칙 활용이라 관형형이 "빠르ㄴ"이 아니라 "빠른"으로 어간 자체가 + // 바뀐다("느리다"→"느린"도 동일) — 어간 "빠르"/"느리"만 넣으면 이 활용형을 못 잡는다 + // (테스트로 실제로 잡아냄: "이게 저것보다 느린가?"가 최초 버전에서 빠졌었다). + || /보다\s*(얼마나\s*)?(빠르|빠른|느리|느린|좋|나은|낫|강|약)/.test(m); } // Output-side counterpart to isFactualInfoRequest()/isLiveDataRequest(): those only catch diff --git a/tests/prompt-gates.test.ts b/tests/prompt-gates.test.ts index 53c8d62..1124d50 100644 --- a/tests/prompt-gates.test.ts +++ b/tests/prompt-gates.test.ts @@ -161,6 +161,16 @@ describe('isFactualInfoRequest — 검증이 필요한 질문 분류', () => { assert.equal(isFactualInfoRequest('hello'), false); assert.equal(isFactualInfoRequest(''), false); }); + + // [2026-08-11] 실제 사고: "5060 보다 얼마나 빠르지 4080?"에 도구 호출 0건, 모델이 "RTX 5060은 + // 아직 출시되지 않은 차세대 모델"이라고 완전히 지어냈다 — 실제로는 이미 출시돼 지서버가 쓰고 + // 있는 카드(RTX 5060 Ti). "성능"/"비교" 같은 기존 키워드를 하나도 안 써서 게이트를 그냥 + // 통과했다. "A보다 (얼마나) 빠른/느린/좋은" 캐주얼 비교 표현을 형용사로 넓게 잡는다. + test('[2026-08-11] "A보다 빠른가" 캐주얼 비교 표현도 잡는다', () => { + assert.equal(isFactualInfoRequest('5060 보다 얼마나 빠르지 4080?'), true); + assert.equal(isFactualInfoRequest('이게 저것보다 느린가?'), true); + assert.equal(isFactualInfoRequest('아이폰이 갤럭시보다 나은가'), true); + }); }); describe('isNewsRequest / isLiveDataRequest', () => {