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:
@@ -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)
|
||||
|
||||
38
fam-core/src/fam_core/chat_handler/prompts.py
Normal file
38
fam-core/src/fam_core/chat_handler/prompts.py
Normal 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 或列表格式。"""
|
||||
Reference in New Issue
Block a user