昨天我在單一「AI 摘要與任務提取」節點中建立了複雜的分析流水線,雖然功能變得更強大了,但也因此已經變成一個難以維護的「巨石應用」節點...
雖然能穩定運作,但所有邏輯都集中在單一節點中,導致會議摘要品質下降、任務指派不夠準確、期限邏輯還需要強化,而且參與夥伴目前是直接將人員資料庫的所有成員都設為參與者,這些問題都讓我意識到需要進行根本性的架構調整。
因此今天的目標是將單一 AI 呼叫的節點拆分為三個獨立、串連的節點,分別為會議屬性提取、獲取參與者、提取結構化任務,並為每個節點設計目標單一的 Prompt,讓整個工作流有了穩定性與可維護性。
現在的「AI 摘要與任務提取」節點同時處理了以下功能
我的設計思路是將複雜的處理流程拆分為三個專門的 AI 專家
每個節點都有單一明確的職責,降低複雜度並提升可維護性。
這個節點專門負責會議的基本資訊提取。
這個 Prompt 專注於會議的基本資訊提取,不處理複雜的任務分析
// 建立會議摘要與資訊提取的 Prompt
function buildMeetingAttributePrompt(projectList) {
const projectListFormatted = Array.isArray(projectList) ? projectList.join('\n- ') : projectList;
return `你是專業的會議屬性分析專家,專門負責從會議逐字稿中提取基本會議資訊。
【已知專案清單】
- ${projectListFormatted}
【你的唯一任務】
1. 判斷會議主要討論的專案(從清單中選擇,若無則回傳 null)。
2. 判斷會議類型(從 7 種固定類型中選擇)。
3. 生成一段簡潔的純文字會議摘要。
【會議類型限制 - 必須從以下選擇】
專案討論、技術討論、需求分析、進度報告、創意發想、決策會議、一般會議
【摘要撰寫要求】
summary 必須是**純文字段落摘要**,符合以下規則:
- 只使用自然的句子和段落,不要使用任何 Markdown 格式(如 #, -, *)。
- 不要包含「專案名稱:」、「會議類型:」等標籤。
- 重點描述會議的核心討論內容和主要決議。
- 長度控制在 100-200 字之間。
【輸出格式要求】
嚴格按照以下 JSON 格式,不可包含任何其他內容:
{
"project_name": "專案名稱或null",
"meeting_type": "會議類型",
"summary": "簡潔的純文字摘要"
}`;
}
在節點的程式碼中設定較低的溫度 temperature: 0.1
來確保輸出穩定。同時我還加入了錯誤處理機制,如果 AI 分析失敗,會回傳一個預設的 JSON 物件,避免工作流中斷。
這個節點專門負責從會議逐字稿中識別參與人員。
這個 Prompt 的核心在於「證據導向」,AI 必須在逐字稿中找到明確的證據才能將某人列為參與者。
// 建立參與者辨識的 Prompt
function buildParticipantIdentificationPrompt(memberList) {
const memberListFormatted = Array.isArray(memberList) ? memberList.join('\n- ') : memberList;
return `你是專業的參與者識別專家,專門從會議逐字稿中準確識別參與成員。
【已知成員清單】
- ${memberListFormatted}
【識別策略】
1. **直接發言標記**:「XX說」、「XX表示」、「XX提到」。
2. **角色稱呼**:對話中提到的職位、暱稱或簡稱。
3. **工作指派**:被分配任務的成員。
【重要原則】
- 只有在逐字稿中有明確證據的成員才能被識別為參與者。
- 不要因為「各位」、「大家」就自動包含所有成員。
- 謹慎處理暱稱和簡稱,確保映射正確。
【輸出格式】
{
"participants": ["實際參與者姓名列表"],
"evidence": ["用於判斷的證據句子列表"]
}`;
}
在 AI 回傳參與者姓名後,透過輔助函式 matchParticipantsToNotionIds
來遍歷 AI 回傳的 participants
陣列,並在「格式化成員列表」提供的成員資料中進行查找,比對姓名和所有暱稱,最後回傳一個包含 Notion User ID 的陣列。
這是任務鏈中最複雜的節點,負責任務分析、分配與整合。
這個 Prompt 的任務是從會議內容中辨識出具體的行動項目,並且將其結構化。
// 建立任務提取的 Prompt
function buildTaskExtractionPrompt(participants) {
const participantList = participants.join('、');
return `你是專業的任務提取專家,專門從會議內容中識別具體的行動項目和責任分配。
【會議參與者】
${participantList}
【任務識別規則】
1. **明確指派**:「XX,請你負責...」、「XX來處理...」。
2. **承諾性陳述**:「我會負責...」、「我來處理...」。
3. **帶期限的工作**:包含時間要求的具體任務。
4. **可執行行動**:有明確產出的工作項目。
【輸出格式】
{
"tasks": [
{
"title": "簡潔任務標題",
"description": "詳細任務描述",
"assignee": "負責人姓名或null",
"category": "任務分類",
"priority": "高/中/低",
"time_expression": "原始時間表達"
}
]
}`;
}
最後透過 generateIntelligentSummary
函式再次呼叫 AI,但這次是作為一個「資訊整合專家」,它會接收前面所有節點的分析結果(專案、摘要、參與者、任務),並執行以下操作
完成三個 AI 任務鏈節點後,需要調整整體的工作流程
{{ $json.meeting_info.project_name }}
修改為 {{ $json.meeting_attributes.project_name }}
,以讀取來自新任務鏈的資料。完成重構後,我進行了測試,先確保整個資料流的傳輸都沒問題。
使用包含豐富資訊的會議音訊檔進行測試
請生成會議摘要與提取行動任務
Notion「會議記錄」中的資料
✅ 完成項目
今天的架構重構雖然工程浩大,但結果令我非常滿意,將單一複雜的節點拆分為三個職責明確的 AI 任務鏈,就像是把一個什麼都做的通才,換成了一個各司其職的專業團隊。
每個節點現在都有了明確的職責,不僅讓 Prompt 設計更有針對性,也讓輸出的結果品質顯著提升了,讓我感到開心。
🎯 明天計劃
測試並最佳化新的任務鏈架構,進一步強化參與者的配對邏輯,並對每個任務進行獨立的期限解析,最後再針對調適過程中發現的問題進行調整。