fix(agent): 빈 응답 진단 정확도 — MoE 활성 파라미터 인식 (v2.2.254)

약한 모델이 큰 입력에 첫 토큰 EOS로 빈 응답을 낼 때, 모델명 파서가
gemma-4-26b-a4b를 "26B 큰 모델"로 오판하던 문제 수정.

- estimateActiveParamsB 추가: MoE 활성 파라미터 추정(a4b→4, A3B→3, e2b→2)
- 빈 응답 에러 메시지 개선: 원인이 답변 길이가 아니라 입력 크기임을 명시,
  MoE 총/활성 파라미터 표기, LM Studio 로드 context length 불일치 1순위 점검 안내
- 테스트 +6건(전체 662 통과)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-18 17:08:49 +09:00
parent 64d8093080
commit 1efbe2ec0f
5 changed files with 63 additions and 21 deletions
+18
View File
@@ -73,6 +73,24 @@ export function estimateModelParamsB(modelId: string | null | undefined): number
return Number.isFinite(n) && n > 0 && n < 2000 ? n : null;
}
/**
* 실제 생성 능력을 좌우하는 "활성(active) 파라미터" 규모를 추출합니다. MoE 모델은
* 총 파라미터보다 활성 파라미터가 작아 긴 프롬프트에서 첫 토큰 EOS(빈 응답)로
* 무너지기 쉽습니다. 활성 표기(예: "...-a4b", "...-A22B", "gemma-3n-e2b")가 있으면
* 그 값을, 없으면 총 파라미터(estimateModelParamsB)를 돌려줍니다.
* 예: "gemma-4-26b-a4b-it" → 4, "qwen3-30b-a3b" → 3, "llama-3.1-8b" → 8.
*/
export function estimateActiveParamsB(modelId: string | null | undefined): number | null {
if (!modelId) return null;
// 활성 표기: 구분자 뒤 a/e + 숫자 + b (예: -a4b, _A22B, .e2b)
const moe = String(modelId).match(/[-_/:.\s][ae](\d+(?:\.\d+)?)\s*b(?![a-z0-9])/i);
if (moe) {
const n = Number(moe[1]);
if (Number.isFinite(n) && n > 0 && n < 2000) return n;
}
return estimateModelParamsB(modelId);
}
/** role/구분자 등 메시지 1개당 발생하는 고정 오버헤드(대략). */
const PER_MESSAGE_TOKEN_OVERHEAD = 4;