fix: AI 추천 토큰 한도 부족으로 응답 잘림 → 추천 실패 수정
4개 카테고리(필수/관리/보안/부가) 구조화 JSON 응답이 max_tokens=1024 를 넘으면 중간에 잘려 JSON 파싱이 실패하고 '추천을 가져오지 못했습니다' 로 떴음. - callClaude 에 maxTokens 파라미터 추가, suggestChecklist 는 3072 사용 - parseSuggestions 파싱 실패/빈 결과 시 원본 일부를 warn 로그로 남겨 진단 가능 런타임 재현: 동일 입력으로 필수5·관리5·보안5·부가4(총 19개) 정상 반환 확인. 백엔드 build/lint 0. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -203,9 +203,12 @@ export class AiService {
|
||||
content,
|
||||
].join('\n');
|
||||
|
||||
// 4개 카테고리 × 다수 항목의 구조화 JSON 이라 토큰 여유를 넉넉히 준다
|
||||
// (1024 면 응답이 중간에 잘려 JSON 파싱이 실패할 수 있음)
|
||||
const raw = await this.callClaude(
|
||||
[{ role: 'user', content: userMsg }],
|
||||
SUGGEST_SYSTEM_PROMPT,
|
||||
3072,
|
||||
);
|
||||
return { groups: this.parseSuggestions(raw) };
|
||||
}
|
||||
@@ -225,6 +228,9 @@ export class AiService {
|
||||
try {
|
||||
parsed = JSON.parse(text);
|
||||
} catch {
|
||||
this.logger.warn(
|
||||
`추천 JSON 파싱 실패(응답 잘림 가능) — 원본 ${raw.length}자: ${raw.slice(0, 300)}`,
|
||||
);
|
||||
throw this.suggestFailed();
|
||||
}
|
||||
|
||||
@@ -243,7 +249,12 @@ export class AiService {
|
||||
.slice(0, 15);
|
||||
if (items.length > 0) result.push({ category, items });
|
||||
}
|
||||
if (result.length === 0) throw this.suggestFailed();
|
||||
if (result.length === 0) {
|
||||
this.logger.warn(
|
||||
`추천 결과가 비어 있음 — 원본 ${raw.length}자: ${raw.slice(0, 300)}`,
|
||||
);
|
||||
throw this.suggestFailed();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -418,6 +429,7 @@ export class AiService {
|
||||
private async callClaude(
|
||||
messages: { role: 'user' | 'assistant'; content: string }[],
|
||||
system: string,
|
||||
maxTokens: number = MAX_TOKENS,
|
||||
): Promise<string> {
|
||||
let response: Response;
|
||||
try {
|
||||
@@ -430,7 +442,7 @@ export class AiService {
|
||||
},
|
||||
body: JSON.stringify({
|
||||
model: this.model,
|
||||
max_tokens: MAX_TOKENS,
|
||||
max_tokens: maxTokens,
|
||||
system,
|
||||
messages,
|
||||
}),
|
||||
|
||||
Reference in New Issue
Block a user