iT邦幫忙

2026 iThome 鐵人賽

DAY 17
0

前言

上一篇的 /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

為什麼不直接改原本的 /ai/rank?

因為我比較希望可以保留原本 Day 12~15 的版本。

這樣如果新功能出問題,我們還有舊版本可以比較。

測試 http://127.0.0.1:5000/ai/rank-db

這次終於不是單純回:

{
    "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,就來測它到底可靠不可靠。


上一篇
Day 16|把資料整理成結構化、統一的格式,方便後續丟給 LLM。
系列文
如果 AI 幫我安排每日的任務?——讓待辦清單不只是清單:LLM × Flask × MySQL 打造動態任務規劃系統 共 17 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言