feat: 增强饮食分析服务,支持文本饮食记录处理

- 新增分析用户文本中的饮食信息功能,自动记录饮食信息并提供营养分析。
- 优化饮食记录处理逻辑,支持无图片的文本记录,提升用户体验。
- 添加单元测试,确保文本分析功能的准确性和稳定性。
- 更新相关文档,详细说明新功能的使用方法和示例。
This commit is contained in:
richarjiang
2025-08-19 08:58:52 +08:00
parent a56d1d5255
commit 8e27e3d3e3
3 changed files with 347 additions and 7 deletions

View File

@@ -320,12 +320,87 @@ export class AiCoachService {
content: `用户尝试记录饮食但识别失败:${recognitionResult.analysisText}`
});
}
} else {
// 处理文本饮食记录:没有图片,分析用户文本中的饮食信息
const textAnalysisResult = await this.dietAnalysisService.analyzeDietFromText(commandResult.cleanText);
if (textAnalysisResult.shouldRecord && textAnalysisResult.extractedData) {
// 自动记录饮食信息
const createDto = await this.dietAnalysisService.processDietRecord(
params.userId,
textAnalysisResult,
'' // 文本记录没有图片
);
if (createDto) {
// 构建用户的最近饮食上下文用于营养分析
const nutritionContext = await this.dietAnalysisService.buildUserNutritionContext(params.userId);
if (nutritionContext) {
messages.unshift({ role: 'system', content: nutritionContext });
}
params.systemNotice = `系统提示:已成功为您记录了${createDto.foodName}的饮食信息(${createDto.portionDescription || ''},约${createDto.estimatedCalories || 0}卡路里)。`;
messages.push({
role: 'user',
content: `用户通过文本记录饮食:${textAnalysisResult.analysisText}`
});
messages.unshift({ role: 'system', content: this.dietAnalysisService.buildEnhancedDietAnalysisPrompt() });
}
} else {
// 分析失败或置信度不够,提供普通的饮食建议
messages.push({
role: 'user',
content: `用户提到饮食相关内容:${commandResult.cleanText}。分析结果:${textAnalysisResult.analysisText}`
});
// 为饮食相关话题提供营养分析上下文
const nutritionContext = await this.dietAnalysisService.buildUserNutritionContext(params.userId);
if (nutritionContext) {
messages.unshift({ role: 'system', content: nutritionContext });
}
messages.unshift({ role: 'system', content: NUTRITION_ANALYST_PROMPT });
}
}
}
// else if (this.isLikelyNutritionTopic(params.userContent, messages)) {
// messages.unshift({ role: 'system', content: NUTRITION_ANALYST_PROMPT });
// }
// 检测是否为饮食相关话题但不是指令形式
if (!commandResult.isCommand && this.isLikelyNutritionTopic(params.userContent, messages)) {
// 尝试从用户文本中分析饮食信息
const textAnalysisResult = await this.dietAnalysisService.analyzeDietFromText(params.userContent);
if (textAnalysisResult.shouldRecord && textAnalysisResult.extractedData && textAnalysisResult.confidence > 70) {
// 置信度较高,自动记录饮食信息
const createDto = await this.dietAnalysisService.processDietRecord(
params.userId,
textAnalysisResult,
'' // 文本记录没有图片
);
if (createDto) {
// 构建用户的最近饮食上下文用于营养分析
const nutritionContext = await this.dietAnalysisService.buildUserNutritionContext(params.userId);
if (nutritionContext) {
messages.unshift({ role: 'system', content: nutritionContext });
}
params.systemNotice = `系统提示:检测到您提到了具体的饮食信息,已自动为您记录了${createDto.foodName}${createDto.portionDescription || ''},约${createDto.estimatedCalories || 0}卡路里)。`;
messages.push({
role: 'user',
content: `${params.userContent}\n\n[系统已自动识别并记录饮食信息:${textAnalysisResult.analysisText}]`
});
messages.unshift({ role: 'system', content: this.dietAnalysisService.buildEnhancedDietAnalysisPrompt() });
}
} else {
// 置信度不够或无法识别具体食物,提供营养分析模式
const nutritionContext = await this.dietAnalysisService.buildUserNutritionContext(params.userId);
if (nutritionContext) {
messages.unshift({ role: 'system', content: nutritionContext });
}
messages.unshift({ role: 'system', content: NUTRITION_ANALYST_PROMPT });
}
}
this.logger.log(`messages: ${JSON.stringify(messages)}`);