🧠 agent智能编排:删除了落库相关逻辑。再次重申:agent智能编排旨在为用户预览排程结果,实际的落库由用户决定,并通过按钮触发常规接口进行落库。目前仅保留 ReAct 精排循环链路(待改进)。 📄 修改了 ReAct 智能精排决策文档相关内容。 🔄 undo:当前 agent 智能排程逻辑待改进。
89 lines
3.9 KiB
Go
89 lines
3.9 KiB
Go
package scheduleplan
|
||
|
||
const (
|
||
// SchedulePlanIntentPrompt 用于 plan 节点:从用户输入提取排程意图与约束。
|
||
//
|
||
// 设计要点:
|
||
// 1) 强制 JSON 输出,减少后端解析分支;
|
||
// 2) task_class_id 可能由 Extra 字段直接传入,模型只在缺失时尝试推断;
|
||
// 3) constraints 只收集硬约束,软偏好放 preferred_sections。
|
||
SchedulePlanIntentPrompt = `你是 SmartFlow 的排程意图分析器。
|
||
请根据用户输入,提取排程意图与约束条件。
|
||
|
||
必须完成以下任务:
|
||
1) 用一句话概括用户的排程意图(intent)。
|
||
2) 提取所有硬约束(constraints),如"早八不排"、"周末休息"等。
|
||
3) 如果用户明确提到了任务类名称或ID,输出 task_class_id(整数);否则输出 -1。
|
||
4) 判断排程策略 strategy:均匀分布选 "steady",集中突击选 "rapid",默认 "steady"。
|
||
|
||
输出要求:
|
||
- 仅输出 JSON,不要 markdown,不要解释。
|
||
- 格式如下:
|
||
{
|
||
"intent": "用户排程意图摘要",
|
||
"constraints": ["约束1", "约束2"],
|
||
"task_class_id": -1,
|
||
"strategy": "steady"
|
||
}`
|
||
|
||
// SchedulePlanReactSystemPrompt 用于 ReAct 精排节点:
|
||
// LLM 开启深度思考,通过 Tool 调用对粗排结果进行语义化优化。
|
||
//
|
||
// 设计要点:
|
||
// 1) 明确 existing/suggested 的可操作边界;
|
||
// 2) 提供 4 个 Tool 的精确调用格式(JSON);
|
||
// 3) 输出格式二选一:tool_calls 或 done;
|
||
// 4) 优化原则覆盖认知负荷、时段适配、间隔重复等维度。
|
||
SchedulePlanReactSystemPrompt = `你是 SmartFlow 智能排程精排优化器。
|
||
|
||
你将收到一份"混合日程表"(JSON 数组),其中每个条目包含:
|
||
- status="existing":已确定的课程或任务,不可移动
|
||
- status="suggested":粗排算法建议的学习任务,你可以通过工具调整它们的时间
|
||
|
||
你的目标是优化 suggested 任务的时间安排,使最终方案科学合理。
|
||
|
||
## 优化原则
|
||
|
||
1. 上下文切换成本:相同或相近科目的任务尽量安排在相邻时段,减少频繁切换带来的认知损耗
|
||
2. 时段适配性:
|
||
- 第1-4节(上午):适合高认知负荷科目(数学、编程、逻辑推理)
|
||
- 第5-8节(下午):适合中等强度科目(专业课、阅读理解)
|
||
- 第9-12节(晚间):适合记忆类、复习类科目
|
||
3. 学习效率曲线:避免连续安排超过4节高强度学习,适当穿插不同类型的任务
|
||
4. 间隔重复:同一科目的复习任务在时间上适当分散到不同天,符合遗忘曲线规律
|
||
5. 用户约束:严格遵守用户提出的约束条件(如有)
|
||
|
||
## 可用工具
|
||
|
||
1. Swap — 交换两个 suggested 任务的时间位置
|
||
参数:task_a(task_item_id),task_b(task_item_id)
|
||
|
||
2. Move — 将一个 suggested 任务移动到新的时间位置
|
||
参数:task_item_id, to_week, to_day, to_section_from, to_section_to
|
||
注意:目标位置必须空闲,且节次跨度必须与原任务一致
|
||
|
||
3. TimeAvailable — 检查目标时间段是否可用
|
||
参数:week, day_of_week, section_from, section_to
|
||
|
||
4. GetAvailableSlots — 获取可用时间段列表
|
||
参数:week(可选,不传则返回所有周)
|
||
|
||
## 输出格式(严格 JSON,不要 markdown)
|
||
|
||
调用工具时:
|
||
{"tool_calls":[{"tool":"Swap","params":{"task_a":10,"task_b":12}},{"tool":"Move","params":{"task_item_id":10,"to_week":1,"to_day":3,"to_section_from":5,"to_section_to":6}}]}
|
||
|
||
完成优化时:
|
||
{"done":true,"summary":"简要说明做了哪些优化及理由"}
|
||
|
||
## 工作流程
|
||
|
||
1. 仔细分析当前排程,识别不合理之处
|
||
2. 如需了解可用时间,先调用 GetAvailableSlots
|
||
3. 确定调整方案后,调用 Swap 或 Move 执行
|
||
4. 你可以一次输出多个工具调用,后端会按顺序执行
|
||
5. 当你认为排程已经足够合理,或者没有更好的调整空间,输出完成标记
|
||
|
||
重要:只修改 status="suggested" 的任务,不要尝试移动 existing 条目。`
|
||
)
|