diff --git a/msh_single_uniapp/pages/tool/ai-nutritionist.vue b/msh_single_uniapp/pages/tool/ai-nutritionist.vue index f6d78b0..07eab65 100644 --- a/msh_single_uniapp/pages/tool/ai-nutritionist.vue +++ b/msh_single_uniapp/pages/tool/ai-nutritionist.vue @@ -717,30 +717,42 @@ export default { * @returns {Array} messages 数组 [{role, content}] */ buildChatMessages(content, type) { + // test-0415 反馈3-4:图文问答需明确告诉模型「请基于图片识别食物 / 营养建议」, + // 否则模型容易回退到通用客套话;纯文字场景仍走旧逻辑(避免影响 3-2 流式回归) + const SYSTEM_NUTRITIONIST = '你是一名专业的中文营养师助手。当用户消息中包含图片(image_url)时,请先识别图片中的食物或菜品,然后基于其常见营养成分(能量、蛋白质、脂肪、碳水、钾、磷、钠、嘌呤等)给出针对慢性肾病/痛风/糖尿病人群的饮食建议;若图片不是食物,请明确说明「这张图不是食物」并简短回应用户。' + if (type === 'text') { return [{ role: 'user', content: typeof content === 'string' ? content : String(content) }] } if (type === 'image') { - // 图片:尝试构建多模态消息 let fileInfo = content if (typeof fileInfo === 'string') { try { fileInfo = JSON.parse(fileInfo) } catch (e) { /* 非JSON */ } } const imageUrl = (fileInfo && fileInfo.url) || (fileInfo && fileInfo.path) || '' if (imageUrl) { - return [{ - role: 'user', - content: [ - { type: 'image_url', image_url: { url: imageUrl } }, - { type: 'text', text: '请分析这张图片' } - ] - }] + return [ + { role: 'system', content: SYSTEM_NUTRITIONIST }, + { + role: 'user', + content: [ + { type: 'image_url', image_url: { url: imageUrl } }, + { type: 'text', text: '请基于这张图片识别食物,给出营养成分与饮食建议' } + ] + } + ] } return [{ role: 'user', content: '我发送了一张图片,请帮我分析' }] } - // multimodal:直接传多模态 parts + // multimodal:直接传多模态 parts;含 image_url 时附加 system prompt 引导模型分析图片 const parts = Array.isArray(content) ? content : [{ type: 'text', text: String(content) }] - return [{ role: 'user', content: parts }] + const hasImage = parts.some((p) => p && (p.type === 'image_url' || p.image_url)) + const messages = [] + if (hasImage) { + messages.push({ role: 'system', content: SYSTEM_NUTRITIONIST }) + } + messages.push({ role: 'user', content: parts }) + return messages }, async sendToAI(content, type) {