feat: 增强饮食分析服务,支持文本饮食记录处理
- 新增分析用户文本中的饮食信息功能,自动记录饮食信息并提供营养分析。 - 优化饮食记录处理逻辑,支持无图片的文本记录,提升用户体验。 - 添加单元测试,确保文本分析功能的准确性和稳定性。 - 更新相关文档,详细说明新功能的使用方法和示例。
This commit is contained in:
@@ -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)}`);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user