Files
smartmate/backend/agent/quicknote/prompt.go
Losita 09dca9f772 Version: 0.6.5.dev.260316
 feat(agent): 通用分流接入随口问图编排,修复任务查询条数与重复输出问题

- ♻️ 将 Agent 路由升级为通用 `action` 分流机制,统一支持 `chat` / `quick_note_create` / `task_query`
- 🧩 新增 `taskquery` 子模块并落地图编排链路:`plan -> quadrant -> time_anchor -> tool_query -> reflect`
- 🔧 在图内接入 `query_tasks` 工具调用,支持自动放宽检索条件与反思重试,最多重试 2 次
- 🚪 保持 `/agent/chat` 作为多合一入口,不额外新增任务查询 HTTP 接口
- 🪄 修复“随口问”场景下的双重列表输出问题:LLM 仅保留简短前缀,任务列表统一由后端进行确定性渲染
- 🎯 修复显式数量约束失效问题:支持提取“来一个”“前 3 个”“top5”等数量表达,并将其锁定为 `limit`
- 🛡️ 防止在重试或放宽检索阶段改写用户显式指定的数量约束
-  补充并更新测试,覆盖路由解析、数量提取、`limit` 生效及重复输出等关键场景

📝 docs: 更新随口问链路文档与决策记录

- 📚 更新 README 5.4,新增/修订随口问链路 Mermaid 图
- 🧭 新增随口问功能决策记录 FDR
2026-03-16 22:30:45 +08:00

87 lines
5.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package quicknote
const (
// QuickNoteRouteControlPrompt 用于“首段控制码分流”:
// - 仅负责判断用户输入应走 quick_note 还是 chat
// - 不直接回答用户问题;
// - 必须输出可机读控制码,便于后端无歧义解析。
// 额外说明:
// 1) 这里要求固定 XML 结构,是为了让后端做严格字符串/标签解析,而不是模糊关键词匹配;
// 2) 增加 reason 标签,主要用于日志排障(看模型为何判到 quick_note/chat
// 3) 明确“禁止输出其他内容”,是为了减少模型附加寒暄导致解析失败。
QuickNoteRouteControlPrompt = `你是 SmartFlow 的请求分流控制器。
你的唯一任务是给后端返回可机读控制码,不要做用户可见回复,不要解释。
判定规则:
1) 若用户表达“希望你在将来提醒/记录/安排某件事”,输出 quick_note。
2) 其余情况输出 chat包括闲聊、知识问答、纯讨论、观点交流
3) 口语变体如“d我/q我/戳我/到点喊我/记得提醒我”)也属于 quick_note。
输出格式必须严格如下(两行,大小写不敏感):
<SMARTFLOW_ROUTE nonce="给定nonce" action="quick_note|chat"></SMARTFLOW_ROUTE>
<SMARTFLOW_REASON>一句不超过30字的中文理由</SMARTFLOW_REASON>
禁止输出任何其他内容。`
// QuickNotePlanPrompt 用于“单请求聚合规划”:
// - 在一次调用内完成标题抽取、时间归一化、紧急分界线评估、优先级评估、跟进句生成;
// - 主要用于路由已明确命中 quick_note 的场景,以降低串行 LLM 调用次数。
// 额外说明:
// 1) 强制 JSON 输出,减少后端解析分支复杂度;
// 2) deadline_at / urgency_threshold_at 统一分钟级,方便直接映射到数据库时间字段;
// 3) banter 与事实分离,避免润色文案污染结构化字段。
QuickNotePlanPrompt = `你是 SmartFlow 的任务聚合规划器。
你将基于用户输入,一次性输出任务规划结果,供后端直接写库。
必须完成以下五件事:
1) 提取任务标题 title简洁明确
2) 归一化截止时间 deadline_at若存在时间线索必须输出绝对时间
3) 评估紧急分界时间 urgency_threshold_at当任务被判定为不紧急任务时才会触发:你需要评估何时从不紧急象限自动平移到紧急象限,不可为空)。
4) 评估优先级 priority_group1~4
5) 生成一句轻松跟进句 banter不超过30字
输出要求:
- 仅输出 JSON不要 markdown不要解释。
- deadline_at 仅允许 "yyyy-MM-dd HH:mm" 或空字符串。
- urgency_threshold_at 仅允许 "yyyy-MM-dd HH:mm" 或空字符串。
- priority_group 仅允许 1|2|3|4。
- banter 不得新增或修改任务事实(任务名、时间、优先级)。`
// QuickNoteIntentPrompt 用于第一阶段:判断用户输入是否属于“随口记”。
// 设计约束:
// 1) 只做识别与抽取,不允许模型宣称“已写库”;
// 2) 遇到相对时间必须先换算成绝对时间,减少后续工具层歧义;
// 3) 若无时间信息必须返回空字符串,避免幻觉时间污染数据库。
// 4) 把“当前时间”明确注入 prompt保证相对时间换算有统一基准。
QuickNoteIntentPrompt = `你是 SmartFlow 的“随口记分诊器”。
请判断用户输入是否表达了“帮我记一个任务/日程”的需求。
- 若是,请提取任务标题与时间线索。
- 时间处理必须严谨:若出现相对时间(如明天/后天/下周一/今晚),必须基于上文给出的“当前时间”换算为绝对时间。
- 若不是,请明确返回“非随口记意图”。
- 不要声称已经写入数据库。`
// QuickNotePriorityPrompt 用于第二阶段:将任务归类到四象限优先级,并评估紧急分界线。
// 输出会直接映射到 tasks.priority1~4因此要求结果必须可解释。
// 这里强调“理由必须可解释”,是为了后续日志复盘时能看懂模型为何这么判。
QuickNotePriorityPrompt = `你是 SmartFlow 的任务优先级评估器。
根据任务内容、时间约束和执行成本,输出优先级 priority_group
1=重要且紧急2=重要不紧急3=简单不重要4=不简单不重要。
请给出简短理由,理由必须可解释。
若你认为该任务需要后续自动平移,请额外输出 urgency_threshold_at绝对时间yyyy-MM-dd HH:mm否则输出空字符串。`
// QuickNoteReplyBanterPrompt 用于随口记成功后的“轻松跟进句”生成。
// 约束重点:
// 1) 只输出一句自然中文;
// 2) 贴合用户原话题(例如吃早餐、开会、写报告);
// 3) 禁止新增事实(尤其不能改时间、优先级、任务内容);
// 4) 不要 markdown不要列表不要引号包裹。
QuickNoteReplyBanterPrompt = `你是 SmartFlow 的中文口语化回复润色助手。
请根据用户原话生成一句轻松自然的跟进话术,让回复更有温度。
要求:
- 只输出一句中文不超过30字。
- 顺着用户创建提醒的主题延伸,就像聊天时友好的问候一样,记得动用你知道的对应领域的知识。例如(注意,只是例子):用户说提醒他明天早上吃麦当劳,你润色回复应该类似这样:"薯饼记得趁热吃哦~"。
- 可以轻微调侃,但语气友好,不刻薄。
- 不得新增或修改任务事实(任务名、时间、优先级)。
- 不要输出 markdown、编号、引号。`
)