refactor(prompt): Prompt 集中化 - 新增 fam-edge ai_orchestrator/prompts.py(视频分析/智能问答/人物合并三模板共享,消除 gemini/nvidia 两份发散);gemini/nvidia _build_video_prompt 改调共享函数并注入 camera_name;person_service 改调 build_person_merge_prompt;fam-core chat_handler 独立 prompts.py(跨模块风格一致)替代内联 CHAT_SYSTEM_PROMPT;输出硬约束(首字符{/禁markdown)、3 秒密度抽取、people_mentioned 一致性强制、描述 7 维度、人物合并唯一性约束

This commit is contained in:
ericwyuan
2026-08-21 14:42:27 +08:00
parent 4e85a98944
commit a72b286bd7
7 changed files with 199 additions and 79 deletions

View File

@@ -18,28 +18,12 @@ from flask import Blueprint, request, jsonify
from ..logger import setup_logger
from ..config_loader import load_config
from .. import db_layer
from .prompts import build_chat_prompt
logger = setup_logger('fam-core.chat_handler')
chat_bp = Blueprint('chat_handler', __name__)
CHAT_SYSTEM_PROMPT = """你是家庭监控助手。根据以下监控数据,回答用户问题。
监控数据(按时间顺序,每条一行):
{context}
已知家庭成员: {members}
用户问题: {question}
要求:
- 只基于上述数据回答,不要编造
- 按时间顺序总结
- 若有关注事件(跌倒、哭闹、陌生人等),重点提示
- 若当天没有该人员的数据,明确说"今天没有观察到{person}"
- 用自然语言回答,不要输出 JSON
"""
def _format_events(rows):
"""将 sync_events 查询行格式化为上下文文本"""
@@ -104,11 +88,11 @@ def chat_ask():
context = _format_events(rows)
context_summary = f"查询 sync_events {len(rows)}"
members = db_layer.get_sync_known_members_context()
prompt = CHAT_SYSTEM_PROMPT.format(
prompt = build_chat_prompt(
context=context,
members=members or queried_person,
question=question,
person=queried_person
queried_person=queried_person
)
try:
answer = _call_edge_qa(prompt)

View File

@@ -0,0 +1,38 @@
"""Chat-Handler 的 Prompt 模板。
fam-core 不能 import fam-edge 的 ai_orchestrator故 chat prompt 独立维护于此。
设计原则见 fam-edge/src/fam_edge/ai_orchestrator/prompts.py跨模块不共享但风格一致
"""
def build_chat_prompt(context: str, members: str, question: str,
queried_person: str) -> str:
"""构建智能问答 system prompt。
Args:
context: sync_events 格式化后的上下文文本(每行一条事件)
members: known_members_context 文本
question: 用户原始问题
queried_person: 用户指定的人物
"""
members_block = members.strip() if members and members.strip() else queried_person
context_block = context.strip() if context and context.strip() else "(今日无该人员的监控记录)"
return f"""你是家庭监控助手。仅根据下方监控数据回答用户问题。
【监控数据】(按时间顺序,每行一条事件)
{context_block}
【已知家庭成员】
{members_block}
【用户问题】
{question}
(用户关心的人物:{queried_person}
【回答要求】
1. 只基于上述监控数据,不编造、不补充数据外信息。
2. 按时间顺序组织回答,突出关键事件。
3. 若有关注事件(跌倒、哭闹、陌生人等),重点提示。
4. 若数据为空或当天未观察到 {queried_person},明确说"今天没有观察到{queried_person}"
5. 用自然语言回答,不要输出 JSON 或列表格式。"""