上一篇的 /ai/data-test 已經證明:
MySQL
↓
Flask
↓
JSON
↓
Gemini
是通的。
之前 Day 12~15 已經有 /ai/rank 和 /ai/next,可以讓 Gemini 根據任務條件做判斷。
所以今天就是把兩邊正式合起來:
┌── MySQL
│
↓
Flask
↓
整理任務資料
↓
JSON
↓
Gemini
↓
分析任務優先順序
↓
JSON 排序結果
/ai/rank-db api昨天的 /ai/data-test 只是測試 Gemini 有沒有成功讀到資料?
今天我們新增 /ai/rank-db ,它的任務就很明確:
直接從 MySQL 抓任務 → 丟給 Gemini → Gemini 排序 → Flask 回傳排序結果
@app.route("/ai/rank-db", methods=["GET"])
def ai_rank_db():
conn = get_connection()
cursor = conn.cursor(dictionary=True)
#從 MySQL 抓任務,取得所有還沒完成的任務。
cursor.execute("""
SELECT
task_id,
title,
description,
estimated_minutes,
importance,
deadline,
progress,
status
FROM tasks
#把已經完成的任務先排除。
WHERE status != 'done'
""")
tasks = cursor.fetchall()
for task in tasks:
task["deadline"] = task["deadline"].strftime("%Y-%m-%d %H:%M:%S")
#計算剩餘時間
task["remaining_minutes"] = (
task["estimated_minutes"]
* (100 - task["progress"])
/ 100
)
#把資料變成 JSON
task_json = json.dumps(tasks, ensure_ascii=False)
cursor.close()
conn.close()
prompt = f"""
你是一個待辦事項管理助手。
以下是使用者目前尚未完成的任務:
#把 JSON 塞進 Prompt
{task_json}
請根據以下條件判斷任務的優先順序:
1. Deadline 越接近,優先程度越高。
2. 重要程度越高,優先程度越高。
3. 已經開始進行的任務,請考慮目前進度。
4. remaining_minutes 越少,不代表一定優先,
請綜合 Deadline、重要程度與進度判斷。
5. 請綜合所有條件,不要只看單一條件。
6. 請從最應該先做的任務開始排序。
7. 每個任務都要提供排序原因。
非常重要:
- 只能回傳 JSON。
- 不要使用 Markdown。
- 不要加入 ```json。
- 不要加入其他說明文字。
- 第一個字元必須是 [
- 最後一個字元必須是 ]
格式如下:
[
{{
"task_id": 1,
"priority": 1,
"reason": "原因"
}}
]
"""
#Gemini 開始排序
response = client.models.generate_content(
model="gemini-3.5-flash-lite",
contents=prompt
)
#把 Gemini 回傳的 JSON 轉成 Python 資料
result = json.loads(response.text)
return result
因為我比較希望可以保留原本 Day 12~15 的版本。
這樣如果新功能出問題,我們還有舊版本可以比較。
這次終於不是單純回:
{
"answer": "我已成功讀取這些任務資料。"
}
而是真的幫我排出了順序。
例如第一個任務是:
{
"priority": 1,
"reason": "Deadline 最近(2026-09-09 22:00:00),且已在進行中(剩餘 72 分鐘),需最優先完成。",
"task_id": 4
}
也就是「寫鐵人賽文章」。
AI 判斷它應該優先,是因為:
Deadline 最近
已經在進行中
剩餘時間 72 分鐘
所以排在第一位。
接下來則是其他 Deadline、重要程度等條件綜合後的結果。
最後甚至連重要程度只有 1 的任務,也被排到了比較後面。
不過AI 排得出來,不代表它每次都一定排得合理。
例如有些任務 Deadline 很近,但重要程度比較低;有些任務重要程度很高,但 Deadline 又比較遠。
這些條件如果互相衝突,AI 到底會怎麼判斷?
所以接下來,我想開始故意丟一些不同的任務組合進去測試。
看看這個 AI 到底是真的有按照我的規則判斷,還是只是「看起來很會講」。
Day 18,就來測它到底可靠不可靠。