diff --git a/exp_multimodal/exp_multimodal_gui.py b/exp_multimodal/exp_multimodal_gui.py index c57e14f..7b6ac23 100644 --- a/exp_multimodal/exp_multimodal_gui.py +++ b/exp_multimodal/exp_multimodal_gui.py @@ -15,7 +15,7 @@ from tkinterdnd2 import DND_FILES, TkinterDnD from exp_multimodal.labels import build_labels, _normalize, _base_ingredient from exp_multimodal.vlm_classifier import classify_image from exp_multimodal.ollama_client import OLLAMA_URL as DEFAULT_OLLAMA_URL, DEFAULT_MODEL as DEFAULT_VLM_MODEL -import ollama_client as _ollama_mod +from exp_multimodal import ollama_client as _ollama_mod ctk.set_appearance_mode("System") diff --git a/exp_multimodal/prompts.py b/exp_multimodal/prompts.py index adaaf84..a612d46 100644 --- a/exp_multimodal/prompts.py +++ b/exp_multimodal/prompts.py @@ -22,13 +22,19 @@ def build_closedset_prompt( ) return ( - "你是食品图像分类专家。请严格在给定的标签集合中选择最符合图片内容的一个标签。\n" - "只允许返回一个标签,禁止输出集合外的词。请同时给出0-1置信度。\n" + "【重要】你必须且只能输出JSON格式,严禁输出任何其他内容(包括英文描述、解释、分析等)。\n\n" + "你是食品图像分类专家。任务:从给定标签集合中选择最符合图片的一个标签。\n" + f"标签集合(封闭集,中文):{label_str}\n\n" f"{constraint}" - f"标签集合(封闭集,中文):{label_str}\n" f"{hints}\n" - '请仅输出合法 JSON:{"label":"<标签>","confidence":0-1}\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,不要有任何额外文字、描述、解释或其他内容。" ) diff --git a/exp_multimodal/vlm_classifier.py b/exp_multimodal/vlm_classifier.py index bd88149..7a2e024 100644 --- a/exp_multimodal/vlm_classifier.py +++ b/exp_multimodal/vlm_classifier.py @@ -49,8 +49,10 @@ def classify_image( f"ingredient_only={ingredient_only} fewshot={bool(fewshot_hints)}" ) prompt = build_closedset_prompt(labels, fewshot_hints, ingredient_only) - _preview_prompt = (prompt[:120]).replace("\n", " ") - print(f"[VLM] Prompt length={len(prompt)} preview={_preview_prompt}...") + # _preview_prompt = (prompt[:120]).replace("\n", " ") + final_prompt = prompt.replace("\n", " ") + # print(f"[VLM] Prompt length={len(prompt)} preview={_preview_prompt}...") + print(f"[VLM] Prompt length={len(prompt)} preview={final_prompt}") print("[VLM] Calling chat_vision...") text = chat_vision(prompt, [image_path], temperature=0.1)