iT邦幫忙

2025 iThome 鐵人賽

DAY 18
0
生成式 AI

從零開始 : 學習運用 n8n 與 Dify 的 AI 自動化實戰系列 第 18

Day 18 : Notion - AI 會議記錄自動結構化

  • 分享至 

  • xImage
  •  

今日目標

讓 AI 將一段非結構化的會議文字稿,轉換為包含 標題、類型、摘要、待辦事項結構化 JSON,並精確寫入 Notion 資料庫的對應欄位。

一、Notion 資料庫準備

在開始 n8n 流程前,先建立一個 Notion 資料庫作為 AI 寫入的目標。

  1. 新增資料庫: 在 Notion 中建立一個新的完整頁面資料庫 (Full Page Database),命名為:「自動化會議記錄」。
  2. 建立欄位 (Properties): 確保資料庫有以下四個欄位(名稱與類型必須吻合):
欄位名稱 (Notion Property Name) 欄位類型 (Property Type) 備註
標題 Title (標題) 必備的主欄位
會議類型 Select (選擇) 新增幾個選項,例如:專案討論行政會議技術決策
重點摘要 Text (文字)
待辦事項 Text (文字)

https://ithelp.ithome.com.tw/upload/images/20251015/20169078kl2BohTZIy.png

  1. 取得資料庫連接 :
    • 點擊 Notion 資料庫頁面右上角的 Share (分享) -> Copy Link (複製連結)
    • 連結格式類似:https://www.notion.so/你的工作區/資料庫名稱-**[DATABASE_ID]**?v=...
    • 建立 Notion Integration(讓 n8n 有權限寫入)
      • 打開瀏覽器 → 登入 Notion 官網
      • 前往:https://www.notion.so/my-integrations
      • 點擊右上角「+ New Integration」
      • 填寫資訊:
        1. Name: n8n Meeting Bot(或隨便你取)
        2. Associated workspace: 選你的 Notion 工作區
        3. Capabilities: 勾選 ✅ Read content ✅ Update content ✅ Insert content
      • 建立完成後,你會看到一組:
            Internal Integration Token: secret_xxxxxxxxxxxxxxxxx
        
      • 請複製這組 Token 等下貼到 n8n 的 Credential to connect with Notion account。
      • 完成 Notion 節點回到 Notion connect :
        https://ithelp.ithome.com.tw/upload/images/20251015/20169078dI3ILtaJcV.png

二、Dify Prompt 工程(AI 結構化指令)

在 Dify 應用中,我們必須用一個系統指令 (System Prompt) 來強制 AI 輸出 JSON。

  1. 進入 Dify 應用: 找到您 Day XX 成功串接的 Chatbot 應用。
  2. 設定 Context/Prompt:
    • 在 Prompt 編輯區中,新增或編輯以下指令,將其視為 AI 的系統角色
你是一位專業的會議記錄分析師,你的任務是將提供的會議文字稿轉換成精確的結構化資料。

請嚴格輸出以下 JSON 格式,且不得包含額外的說明或文字:

{
  "meeting_title": "從會議記錄中總結一個簡短標題",
  "type": "請從 '專案討論', '行政會議', '技術決策' 中選取最符合的類型",
  "summary": "以兩到三句話總結會議的核心內容和決議。",
  "action_items": "以條列或用分號 (;) 隔開所有待辦事項和負責人。"
}

https://ithelp.ithome.com.tw/upload/images/20251015/20169078PMLgcFoAd8.png

三、n8n 工作流程建構(四個節點)

1. 節點:Manual Trigger(手動觸發)

  • 目的: 用於模擬接收外部的原始會議記錄文字。

  • 操作:

    • 點擊 + 新增節點,搜尋 Manual Trigger
    • 無需任何設定,點擊節點右側的 set mock data -> Add JSON
    • 貼上以下 JSON :
    {
      "meeting_text": "今天的專案討論會議主要討論了n8n鐵人賽的進度,決定明天完成Notion串接,負責人是小王。"
    }
    

https://ithelp.ithome.com.tw/upload/images/20251015/20169078IcDKDMh2yl.png

2. 節點:HTTP Request(呼叫 Dify API)

  • 目的: 將會議文字和 Dify Prompt 結合,送出請求。

  • 操作:

    • Authentication: : None
    • Method: POST
    • URL: Dify 的 chat-messages API 端點 (例如:https://api.dify.ai/v1/chat-messages)
    • Body (JSON): 我們需要將 Dify Prompt會議文字 結合起來。
    {
      "inputs": {
        "meeting_transcript": "{{ $json.meeting_text }}"
      },
      "query": "請根據上方會議內容輸出符合格式的 JSON 結構。",
      "response_mode": "blocking",
      "user": "api-user"
    }
    

https://ithelp.ithome.com.tw/upload/images/20251015/20169078dZkMNQS8MD.png

3. 節點:Code in JavaScript

  • 目的: 將 Dify 返回的 JSON 字串,轉換為 n8n 可操作的 結構化物件 (Object)
  • 操作:
    • Mode 選擇 Run Once for All Items
    • Language: 選擇 JavaScript
    • JavaScript:
    // 處理所有傳入的資料項
    

for (const item of $input.all()) {

// 檢查 Dify 的答案是否存在
if (item.json && item.json.answer) {
    
    let rawAnswer = item.json.answer;
    
    // --- 核心 JSON 清理邏輯 ---
    
    let cleanedString = rawAnswer;
    
    // 1. 移除開頭和結尾的 Markdown 標籤 (```json 和 ```)
    // 使用正則表達式來尋找 JSON 物件的邊界
    
    const jsonMatch = cleanedString.match(/\{[\s\S]*\}/);
    
    if (jsonMatch && jsonMatch[0]) {
        // 如果找到 { 開頭和 } 結尾的區塊,我們只取那個區塊
        cleanedString = jsonMatch[0];
    } else {
        // 如果找不到,則將整個字串 trim() 後嘗試解析
        cleanedString = cleanedString.trim();
    }
    
    // 2. 移除所有不必要的換行符(雖然 JSON.parse 應該能處理,但保險起見)
    // 注意:這裡不移除所有的 \n,因為 \n 在字串值內是合法的。
    
    try {
        // 嘗試解析最終清理過的字串
        let parsedData = JSON.parse(cleanedString);
        
        // 成功:輸出解析後的物件
        return [{ json: parsedData }];
    } catch (e) {
        // 失敗:輸出錯誤資訊,並將清理過的字串一起輸出,方便您確認
        console.error("JSON Parsing failed:", e);
        
        // 這是讓流程中斷並顯示錯誤的原因
        return [{ json: { 
            error: "JSON_PARSE_ERROR", 
            raw_output: rawAnswer,
            cleaned_attempt: cleanedString,
            parse_error: e.toString()
        } }];
    }
}

}
// 如果沒有找到答案,返回錯誤
return [{ json: { error: "No answer found in the previous node." } }];
```

https://ithelp.ithome.com.tw/upload/images/20251015/20169078UlTOeFcMi5.png

4. 節點:Notion(資料寫入)

  • 目的: 讀取 JSON 節點解析後的資料,並寫入 Notion。
  • 操作:
    • Credential: 設定您的 Notion API Key 憑證。
    • Resource: Database
    • Operation: Create
    • Database: 選擇 自動化會議記錄
      https://ithelp.ithome.com.tw/upload/images/20251015/20169078PqSVuDJsPS.png

Properties:

Notion Property Name Value (Expression) 引用資料來源
標題 {{ $json.meeting_title }} JSON 節點的輸出
會議類型 {{ $json.type }} JSON 節點的輸出
重點摘要 {{ $json.summary }} JSON 節點的輸出
待辦事項 {{ $json.action_items }} JSON 節點的輸出

https://ithelp.ithome.com.tw/upload/images/20251015/2016907872a8sg12sz.png
https://ithelp.ithome.com.tw/upload/images/20251015/20169078WMAoGaoiMR.png

四、執行與驗證

  1. 在 n8n 中執行: 點擊 Manual Trigger 節點的 Execute Workflow
  2. 追蹤結果:
    • 檢查 JSON 節點的輸出,它應該是一個乾淨的 JSON 物件,不再是字串。
    • 檢查 Notion 節點的執行結果,它應該顯示頁面創建成功。
  3. 檢查 Notion: 打開「自動化會議記錄」資料庫,會看到一筆新的紀錄,並且各個欄位(標題、類型、摘要、待辦事項)都已被 AI 結構化並精準填入!
    https://ithelp.ithome.com.tw/upload/images/20251015/20169078IrLdQYW7Xh.png

上一篇
Day 17 : 實現多輪對話
下一篇
Day 19 : 將資料儲存至Google sheet
系列文
從零開始 : 學習運用 n8n 與 Dify 的 AI 自動化實戰30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言