from typing import Dict, List, Optional def build_closedset_prompt( labels: List[str], fewshot_hints: Optional[Dict[str, str]] = None, ingredient_only: bool = False, ) -> str: label_str = ",".join(labels) hint_lines: List[str] = [] if fewshot_hints: hint_lines.append("以下是少量文字示例帮助你区分:") for k, v in list(fewshot_hints.items())[:20]: hint_lines.append(f"- {k}:{v}") hints = "\n".join(hint_lines) constraint = ( "你只需输出食材名称,不要包含任何烹饪方式或形态描述(如切丝/切片/炒/煮/红烧/清炒等)。\n" if ingredient_only else "" ) return ( "【重要】你必须且只能输出JSON格式,严禁输出任何其他内容(包括英文描述、解释、分析等)。\n\n" "你是食品图像分类专家。任务:从给定标签集合中选择最符合图片的一个标签。\n" f"标签集合(封闭集,中文):{label_str}\n\n" f"{constraint}" f"{hints}\n" "要求:\n" "1. 必须从标签集合中选择,禁止输出集合外的词\n" "2. 给出0-1的置信度分数\n" "3. 严格按以下JSON格式输出,不允许有任何偏差\n\n" '输出格式(必须严格遵守):\n{"label":"<标签>","confidence":0.95}\n\n' "4. 如果明显不在这些分类中,输出格式如下:" ' \n{"label":"<未知>","confidence":0.95}\n\n' "【再次强调】只输出上述JSON,不要有任何额外文字、描述、解释或其他内容。" ) def build_openset_prompt() -> str: """ 构建开放式识别提示词(不提供候选列表,让VLM自由识别) 用于"开放识别+向量匹配"方案 """ return ( "【重要】你必须且只能输出JSON格式,严禁输出任何其他内容(包括英文描述、解释、分析等)。\n\n" "你是专业的中国菜品识别专家。任务:识别图片中的菜品并输出标准中文名称。\n\n" "要求:\n" "1. 只输出菜品的标准中文名称,例如:宫保鸡丁、红烧肉、西红柿炒鸡蛋\n" "2. 禁止输出地域/菜系分类(如川菜、粤菜)\n" "3. 禁止输出烹饪方式后缀(如炒制、烹饪),除非该方式是菜名的一部分(如红烧肉)\n" "4. 禁止输出括号注释(如(川菜)、(辣味))\n" "5. 禁止输出英文翻译\n" "6. 给出0-1的置信度分数,表示你对识别结果的确信程度\n" "7. 严格按以下JSON格式输出,不允许有任何偏差\n\n" '输出格式(必须严格遵守):\n{"dish":"<菜品标准中文名>","confidence":0.95}\n\n' "示例输出:\n" '{"dish":"宫保鸡丁","confidence":0.92}\n' '{"dish":"红烧肉","confidence":0.88}\n' '{"dish":"西红柿炒鸡蛋","confidence":0.95}\n\n' "【再次强调】\n" "- 只输出上述JSON格式,不要有任何额外文字\n" "- 菜品名必须是标准中文,不带任何前缀、后缀、括号、英文\n" "- 如果无法识别,输出confidence接近0的值" )