fix: 优化VLM提示词,输出更简洁,传入算法类型和区域名称
- prompt要求≤15字直接说结论,不再描述画面 - 加入算法类型中文名(离岗/周界入侵)让VLM更准确判断 - roi_name改为查询区域名称,不再传UUID - 给出告警成立和误报的示例引导输出格式 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -46,7 +46,11 @@ async def process_alarm_notification(alarm_data: Dict):
|
||||
# ========== 1. VLM 复核 ==========
|
||||
vlm_service = get_vlm_service()
|
||||
camera_name = alarm_data.get("camera_name", device_id)
|
||||
roi_name = alarm_data.get("scene_id", "")
|
||||
scene_id = alarm_data.get("scene_id", "")
|
||||
|
||||
# 查找区域名称用于 VLM prompt(比 UUID 更有意义)
|
||||
area_name_for_vlm, _ = _get_notify_persons(device_id, alarm_level)
|
||||
roi_name = area_name_for_vlm if area_name_for_vlm != "未知区域" else scene_id
|
||||
|
||||
# snapshot_url 可能是 COS object key,需转为可访问的预签名URL
|
||||
vlm_snapshot_url = snapshot_url
|
||||
@@ -77,7 +81,9 @@ async def process_alarm_notification(alarm_data: Dict):
|
||||
|
||||
# ========== 2. 查表获取通知人员 ==========
|
||||
description = vlm_result.get("description", "")
|
||||
area_name, persons = _get_notify_persons(device_id, alarm_level)
|
||||
# 复用 VLM 阶段已查询的 area_name,重新查人员列表
|
||||
area_name = area_name_for_vlm
|
||||
_, persons = _get_notify_persons(device_id, alarm_level)
|
||||
|
||||
# 演示模式:数据库无人员时,使用配置的测试 userid
|
||||
if not persons and settings.wechat.test_uids:
|
||||
|
||||
@@ -13,23 +13,39 @@ from openai import AsyncOpenAI
|
||||
|
||||
from app.utils.logger import logger
|
||||
|
||||
# 算法类型中文映射
|
||||
ALARM_TYPE_NAMES = {
|
||||
"leave_post": "离岗",
|
||||
"intrusion": "周界入侵",
|
||||
}
|
||||
|
||||
# 算法类型 → VLM Prompt 模板
|
||||
VLM_PROMPTS = {
|
||||
"leave_post": """你是安防监控AI复核员。判断{roi_name}岗位区域内是否有人在岗。
|
||||
confirmed=true表示确实无人在岗(告警成立),false表示有人(误报)。
|
||||
description用≤25字描述画面。
|
||||
"leave_post": """你是安防监控AI复核员。算法类型:离岗检测,监控区域:{roi_name}。
|
||||
判断该区域是否有人在岗。
|
||||
- confirmed=true:无人在岗(告警成立)
|
||||
- confirmed=false:有人在岗(误报)
|
||||
description要求:≤15字,直接说结论。
|
||||
告警成立示例:"该区域无人在岗"
|
||||
误报示例:"画面中无人员离岗情况"
|
||||
仅输出JSON:{{"confirmed":true,"description":"..."}}""",
|
||||
|
||||
"intrusion": """你是安防监控AI复核员。判断{roi_name}周界区域内是否有人员入侵。
|
||||
confirmed=true表示确实有人入侵(告警成立),false表示无人(误报)。
|
||||
description用≤25字描述画面。
|
||||
"intrusion": """你是安防监控AI复核员。算法类型:周界入侵检测,监控区域:{roi_name}。
|
||||
判断该区域是否有人员入侵。
|
||||
- confirmed=true:有人入侵(告警成立)
|
||||
- confirmed=false:无人入侵(误报)
|
||||
description要求:≤15字,直接说结论。
|
||||
告警成立示例:"有人员进入周界区域"
|
||||
误报示例:"画面中无周界入侵情况"
|
||||
仅输出JSON:{{"confirmed":true,"description":"..."}}""",
|
||||
}
|
||||
|
||||
# 通用降级 prompt(未知算法类型时使用)
|
||||
DEFAULT_PROMPT = """你是安防监控AI复核员。边缘AI触发了{alarm_type}告警,判断告警是否属实。
|
||||
confirmed=true表示告警成立,false表示误报。
|
||||
description用≤25字描述画面。
|
||||
DEFAULT_PROMPT = """你是安防监控AI复核员。算法类型:{alarm_type_name},监控区域:{roi_name}。
|
||||
判断告警是否属实。
|
||||
- confirmed=true:告警成立
|
||||
- confirmed=false:误报
|
||||
description要求:≤15字,直接说结论。
|
||||
仅输出JSON:{{"confirmed":true,"description":"..."}}"""
|
||||
|
||||
|
||||
@@ -102,10 +118,12 @@ class VLMService:
|
||||
|
||||
# 选择 prompt 模板
|
||||
template = VLM_PROMPTS.get(alarm_type, DEFAULT_PROMPT)
|
||||
alarm_type_name = ALARM_TYPE_NAMES.get(alarm_type, alarm_type)
|
||||
prompt = template.format(
|
||||
camera_name=camera_name or "未知位置",
|
||||
roi_name=roi_name or "未知区域",
|
||||
roi_name=roi_name or "监控区域",
|
||||
alarm_type=alarm_type,
|
||||
alarm_type_name=alarm_type_name,
|
||||
)
|
||||
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user