{ "text": "如果你有在關注 AI\n這一兩年最炙手可熱的工作\n一定是 AI Engineer,AI Builder\n大型語言模型越強,這群人越吃香\n他們有能力幫公司打造內部工具\n優化運營流程\n也已經有一堆人自己動手把想法做成產品\n成立了自己的公司\n而這種人,現在每間公司都在搶\n想學 AI 的人很多\n但大多數人都不知道從哪裡下手\n市面上的資源不是太破碎,就是太過艱澀\n看完還是不知道自己學到了什麼\n或者下一步該往哪走\n史丹佛大學有一堂課叫做 Beyond LLM\n我認為這是目前最接近那個答案的東西\n從大型語言模型的本質講起\n一路帶到 Prompt Engineering\nRAG,Fine-Tuning\nAgentic Workflow\n還有 Multi-Agent 的框架\n這堂課時長兩小時\n今天我就用一支影片的時間把核心整理給你\n你看完之後\n會對 AI 在商業領域上的應用有一套完整的認知框架\n知道這些技術怎麼組合在一起\n也能規劃自己接下來的學習路線\n那我們廢話不多說,直接開始\n首先我們要先知道大型語言模型的限制是什麼\nLLM 要變強有兩條路\n第一條是橫軸\n就是換更強的 base model\n比方說從 GPT-4 升級到 GPT-5\n但橫軸是 OpenAI 跟 Anthropic 在做的\n一般人沒有那個能力\n也沒有那個金錢去訓練自己的大型語言模型\n你能施力的地方是縱軸\n也就是在現有的 LLM 上面疊各種工程技術\n又叫做 Augmenting LLM\n也就是想辦法提升這些 base model 的能力\n而這整堂課,包括這支影片\n講的都是縱軸的事情\n如果你只會使用 base model\n在商業場景上一定會撞牆\n舉個例子,ChatGPT 剛出來的時候\n沒有連網功能,沒辦法調用工具\n充其量就是一個很聰明的問答機器人\n沒辦法實際幫你做完一件事\nStanford 的教授整理了 base model 幾個常見的限制\n第一是缺乏 domain knowledge\n比方說有一組學生在做自動化農業設備\n要用相機判斷作物有沒有生病\n這種農業病害的 dataset 市面上根本找不到\n換句話說你的公司資料,內部文件,產品規格\nbase model 都不知道\n它也沒辦法根據這些資料幫你解決問題\n第二是資訊落後\n模型不可能每幾個月重訓一次\n新詞,新事件,新公司它通通不認識\n年輕人在用的網路流行用語\n模型大多也聽不懂\n第三個,控制很難\nLLM 是機率性輸出\n同樣的 prompt 兩次跑可能結果不一樣\n在 ChatGPT 上聊天當然 OK\n但你想想 production 環境\n使用者問退費\nAI 一下說可以一下說不行,公司就麻煩了\n教授說,就連 OpenAI 跟 xAI 這種資金最多\n人才最齊的團隊\n都還沒辦法把 LLM 完全控制好\n更何況一般公司\n第四個,當 context 太長\n模型的表現會顯著退步\n現在主流模型的 context window\n已經拉到 100 萬 token\n差不多十幾本書的長度\n但在這麼大的 context 裡\n還是會出現 lost in the middle 的現象\n簡單講\n你把一個 Gary 午餐吃了一顆蘋果這樣的小細節\n藏進公司過去一年的會議記錄裡\n再問模型 Gary 午餐吃了什麼\n雖然這個狀況現在已經顯著改善\n但 LLM 有時候還是會答不出來\n想做 AI 產品\n光換更強的 base model 不夠\n你需要在縱軸上施力\n接下來這支影片的前半段會告訴你\n強化單一 LLM 的三個工具和觀念\n也就是 Prompt Engineering\nFine-Tuning,還有 RAG\n影片後半段會進到系統設計\n介紹 Agentic Workflow 跟 evaluation 評估方法\n然後用一個客服 agent 的 case study\n把這些東西串起來\n最後也會帶到很多人感興趣的 Multi-Agent\n那我們直接從 Prompt Engineering 開始講\nStanford 的教授說他不認為 prompt engineer 會是一個職業\n因為提示詞工程應該是每個工程師都該會的基本技能\n你不會靠 prompt engineering 當飯吃\n但這個技能會讓你在職涯裡用一輩子\n就像九九乘法表一樣是基本功\n我之前有做過一部影片\n專門在講 prompt engineering\n有興趣的朋友可以去看看\n關於 prompt engineering\n有一個很有意思的研究我想分享給你\n頂級管理顧問公司 BCG 做過一個實驗\n他們把一群顧問分成三組\n第一組沒有 AI\n第二組可以使用 ChatGPT\n第三組則是可以使用 ChatGPT 以外\n還有接受撰寫提示詞的訓練\n最後研究的結果發現三件事\n第一個叫 The Jagged Frontier,鋸齒邊界\n意思是 AI 不是在所有任務上都表現得好\n有些任務搭配 AI 顯著加分\n但有些任務 AI 反而扯後腿\n第二個發現叫 Falling asleep at the wheel\n翻成中文就是在方向盤前打瞌睡\n當你不知道任務剛好是 AI 不擅長的\n卻太信任它把產出直接送出\n結果比沒用 AI 還慘\n也就是說,你要知道 AI 的邊界在哪\n才不會在它弱的地方踩雷\n第三個現象最有趣\n他們發現使用 AI 的方式分成兩種\n分別是 Centaurs 跟 Cyborgs\nCentaur 是半人馬,也就是分工委派型\n丟一個長 prompt 給 AI 叫它做整份簡報\n自己去做別的事\nCyborg 是生化人,是高頻來回型\n跟模型一句一句對話協作\nStanford 的教授說\n學生的使用習慣會比較像 cyborg\n而企業在自動化 workflow 時比較像 centaur\n那你應該用哪一種?關鍵是看任務性質\n重複性高,流程清楚的任務\n用 centaur 模式委派出去就好\n需要判斷,需要創意,需要來回校正的任務\ncyborg 模式才能逼出 AI 的最佳輸出\n兩者沒有好壞之分,實務上兩種都會用\n重點是要有意識地切換\n接著進到實作\n通常一個好 prompt 要有三個東西\n給誰看,產出格式,重點是什麼\n請幫我總結這篇文章是一個很爛的提示詞\n因為什麼資訊都沒給\n但如果你寫的是請將這份再生能源論文\n整理成 5 個重點摘要\n並且聚焦在其背後的政策意涵上\n模型立刻知道對象是政策制定者\n長度是 5 個點,重點放在政策意涵上\n你的產出品質會立刻提升\n但教授說,prompt engineering 裡最常用\n最重要的一個技巧不是這些,是 Prompt Chaining\n注意,chaining 跟 Chain of Thought 不一樣\nChain of Thought 是叫模型 step by step 思考\nChaining 則是把一個複雜的 prompt 拆成多個獨立的 prompt\n前一個的 output 餵給下一個\n有用過 n8n 的朋友應該知道我在說什麼\n舉個例。你要做客戶投訴回信\n單一 prompt 寫法是讀這封投訴信\n寫一封專業的回應\n這就是一個黑盒子\n最後的產出如果有問題\n你也不會知道該調整哪裡\n但如果使用 prompt chaining\n拆成三個 prompt\n第一個抽出客戶在抱怨什麼\n第二個用抽出來的問題起草大綱\n第三個用大綱寫完整回信\n每一步都可以獨立測試,獨立 debug\nChaining 不只讓模型表現更好\n也讓你得到 observability\n能觀察 LLM 在做什麼,哪個流程出了問題\n講完 Prompt Engineering,下一個是 Fine-Tuning\nStanford 教授對 fine-tuning 的立場很簡單\n能不做就不做,原因有四個\n第一,要大量的優質數據\n如果你想要自己 fine-tune 模型\n就要有大量高品質的,標注好的資料\n要做到這件事情的成本對一般人來說太高了\n第二,容易 overfit\n模型容易在你那個特定任務上變很強\n但通用問題反而答不出來\n就會失去 base model 原本的廣度\n第三,時效性差,這應該是最傷的點\n你花兩個月 fine-tune 完一個模型上線\n下個月新一代 base model 就出來\n直接打贏你 fine-tune 的版本\n第四,通常用 prompt engineering 也可以達到一樣的效果\n而且成本低很多\n你想換新 base model\n原本的 prompt 大多都是 portable 的\n但 fine-tuning 的模型不行\n當然,針對少數情境\nfine-tune 還是值得做的\n比方說法律,科學那種需要重複高精度輸出的領域\n或者 base model 在某個 domain 上表現吃力\n這些情況下,fine-tune 都會有幫助\n但對大多數的人來說\n其實不會有太大的效益\n所以,如果你想要把特定的 domain knowledge 塞進模型\n單純的提示詞工程可能塞不下\nfine-tuning 的成本效益又對不起來\n那實作端應該怎麼辦呢?\nStanford 教授給出的答案是 RAG\nRAG 是 AI 工程師面試最常考的題目之一\n面試官常常會請你用 5 歲小孩聽得懂的方式解釋什麼是 RAG\n你做 AI Builder 也好,做 AI 工程師也好\n這個是你一定要知道的事情\nRAG 解的痛點有幾個\ncontext window 太小,長 context 抓不準\n資訊有時效性,或者模型會產生幻覺\nRAG 的做法很單純\n我用藥物副作用這個需要高度準確的醫療場景來說明\n通常 RAG 的做法是這樣的\n先把所有的資料,文件用 embedding 模型\n把這些資訊轉成向量,存進向量資料庫\n英文叫做 vector database\n所謂向量,就是把一段文字的語意轉換成一串數字\n語意相近的文字\n轉出來的數字陣列在數學空間裡距離也會比較近\n所以當使用者問藥物 A 的副作用\n我們不是在做關鍵字比對\n而是在找語意最接近的文件片段\n就算文件裡寫的是不良反應而不是副作用\n一樣能找到\n使用者的問題也用同個 embedding 模型轉成向量\n再用距離 metric 從 vector database 裡\n找出最相近的 documents\n最後把這些 documents 加上 system prompt\n加上 user query,組合成餵給 LLM 的最終 prompt\nPrompt template 大概長這樣\n根據以下 documents 回答使用者的問題\n如果 documents 裡沒有答案,就說『我不知道』\n這樣設計是為了把模型鎖在你提供的資料範圍內\n避免它自由發揮,憑空捏造\n當然,你還可以要求模型回答時附上這個答案來自第幾頁\n第幾章,第幾行加超連結\n這樣使用者可以自行回溯資料源進行驗證\n但是單純這樣做有時候不夠\n比方說一種藥的相關文件可能足足有 50 頁\n整份直接轉成向量,那很多細節遺失其中\n所以通常會搭配 chunking\n最基本的 chunking 是把文件切成固定大小的片段\n每段各自轉成向量\n更進階的做法是多層次存儲\n同時保留整篇,每章,每段的向量\nretrieval 時可以先找到相關的章節\n再往下鑽到精確的段落\n這樣在大文件裡的命中率會更高\n還有一個最近比較多人在討論的話題\n有人說,像現在已經有模型支援超長的 context window\n等這個技術成熟,算力夠便宜\nbase model 直接讀完整個資料庫\nRAG 就沒用了\n但 Stanford 的教授認為這樣的說法理論上對\n實務上錯\n因為實際上你還是會遇到很多問題\n比方說 Latency,你想想看\n每次問問題,模型都要把整個 Google Drive 重讀一次\n沒人等得了\n就像搜尋引擎也是靠預先建好的索引來快速定位資料\n不可能每次 query 都把整個網路重新爬過一遍\n所以 RAG 除了準確度以外\n還有檢索效率,可即時更新這類的優勢\n而這些優勢在可預見的未來都還是有其存在的價值\n好,到這邊我們講完了影片的第一部分\n從 base LLM 的限制出發\n我們看了 Prompt Engineering\nFine-Tuning 還有 RAG\n這三個工具本質上都是在強化單一個 LLM 的能力\n但單一個 LLM 再強,還是有它做不到的事\n所以接下來進入第二部分 AI 系統設計\n我們會講 Agentic Workflow\nEvaluation 還有 Multi-Agent\n這些東西讓你能把 AI 從一個會回答問題的模型\n變成一套真正可以運作,實際產出價值的系統\n看到這邊,如果你覺得這支影片對你有幫助\n想請你幫我按個讚,點個追蹤\n這是我持續創作下去的動力\n那我們直接進 Part 2\n先講一下 agentic workflow 這個命名\n這個詞來自吳恩達\n如果你不認識他\n吳恩達是 Coursera 的共同創辦人\nGoogle Brain 的創始負責人\n前百度首席科學家\n是在 AI 領域講話有一定份量的男人\n吳恩達用 agentic workflow 這個詞\n是因為 AI Agent 已經被用到爛掉了\n有人寫了一個很長的 prompt,叫 agent\n有人做了複雜的 multi-agent 系統\n也叫 agent\n這個詞什麼都能套,反而什麼都說不清楚\n所以他用 agentic workflow 來精確描述一件事\n把一堆提示詞,外部工具,還有各種元件\n組合進一個有結構的工作流程裡,成為一套系統\n這就叫做 agentic workflow\n還記得我們前面講的 RAG 嗎?\nRAG 主要做一件事\n給 LLM 外部資料當參考\n但 agent 把 RAG 當作工具之一\n外加 tool calls,memory,多步驟決策\n所以能做到 RAG 單獨做不到的事\n舉個例子,使用者說我想退這筆訂單\nRAG 只能丟政策文件給你\nagent 則是用 RAG retrieve 政策\n主動問訂單編號,用 tool 查訂單\n確認退費\n告訴你 3 到 5 個工作天會處理\nRAG 是工具,Agent 是使用 RAG 這個工具的系統\n要打造 agentic workflow\n你的工程心態要先翻轉過來\n因為傳統 software 跟 agentic AI software\n在四個面向都很不一樣\n首先是資料\n傳統軟體吃結構化資料\nJSON,資料庫,表單,格式固定,邊界清楚\nAgentic 系統吃的是自由文本\n圖片,音訊,沒有固定格式\n第二個是邏輯\n傳統 software 是 deterministic\n同樣的 input,永遠給你同樣的 output\n可預測,可重現\nAgentic 系統是 fuzzy 的\n意思是同樣的 input\n不同時間跑可能給你不同的 output\n因為 LLM 本身有隨機性\n加上它會根據 context 做判斷\n沒有一個固定答案\n第三個是架構心態,這個最重要\n傳統工程師的思維是寫 microservices\n寫 monolith\n你精確控制每一步執行路徑\nAgentic 系統的思維是 think like a manager\n你給 AI 一個目標和限制,讓它自己決定怎麼完成\n你管的是方向和邊界,不是每一行程式碼\n第四個是測試\n傳統測試是確定性的,跑一百次結果一樣\nAgentic 測試是迭代探索式的\n因為系統本身是非確定性的\n加上它對 context 非常敏感\n你沒辦法窮舉所有情況\n知道這四件事之後\n第一個落地原則就跟著來了\n能 deterministic 解的問題,就 deterministic 解\n剩下 fuzzy 的部分,加上護欄\n教授舉自己的例子\n他們做 skills assessment\n選擇題,配對題,拖拉題用 deterministic 算分\n因為這些有標準答案,對就是對,錯就是錯\n但語音題,語音加 coding 的混合題型\n沒有標準答案,沒辦法 deterministic 評分\n只能讓 LLM 去判斷\n這就是 fuzzy scoring\n也就是沒有標準答案的評分\n你請 LLM 聽一段語音回答\n它要判斷這個人有沒有真的理解這個概念\n表達是否清晰,邏輯有沒有跑掉\n這些不是對或錯,是一個程度的判斷\nLLM 會給你一個分數\n但這個分數是它覺得合理的答案,不是算出來的\nFuzzy 的問題是它一定會犯錯\nLLM 可能誤判一個正確答案\n或是對模稜兩可的回答給出偏低的分數\n在考試評分這種高風險的場景,這不可接受\n所以他們設計了一個 Appeal feature\n受測者可以對 agent 的判分提出申訴\n由真人介入審查並糾正\n這就是護欄的具體形式\n不是試圖讓 AI 零錯誤\n而是在它出錯的時候有人接得住\n好,原則講完了\n要實際打造一個 agent,你需要哪些東西?\n教授用訂機票去巴黎當範例\n整理出三個核心要素\n第一個是 Prompts\n前面講的提示詞工程,在 agent 裡就是這一塊\n你怎麼告訴 AI 它的角色是什麼\n它能做什麼,不能做什麼\n第二個是 Context Management\n也就是怎麼管理 agent 在每一個當下看得到的資訊\n這包含幾件事\nMemory,對話歷史\n也可能有 RAG 撈回來的資料\n通通都要塞進有限的 context window 裡\n你要決定什麼重要,什麼可以丟,什麼要壓縮\nContext Management 本質上只做一件事\n那就是把對的資訊在對的時間提供給你的 agent\nMemory 本身又分兩層\nWorking memory 是高頻,要快的\n比方說使用者的名字,這次的目的地是巴黎\nArchival memory 是低頻,可以慢一點的\n比方說使用者過去五年的訂房紀錄\n需要的時候再去撈\n第三個是 Tools\n也就是 agent 能呼叫的外部能力\n通常分成兩種\n一種是做事的\n比方說 Flight Search,Hotel Booking,Payment\n一種是查資料的\n比方說去 CRM 撈客戶資料\n去資料庫查訂單紀錄\n另外,課堂上教授把 agent 的自主性分為三層\n最低是 hardcoded steps\n步驟全寫死,先識別用戶的意圖\n再 lookup history,最後呼叫 API,照順序走\n安全,可預測,但很僵硬\n遇到預期外的情況就卡住\n第二層是 hardcoded tools\n但讓 agent 自己決定執行步驟\n你給它一組工具,告訴它你是 travel agent\n這些是你能用的工具,怎麼用你決定\n掌控工具範圍,但給 agent 空間判斷怎麼組合\n這是目前最常見的 production setup\n也是教授推薦的起點\n第三層是 fully autonomous\nagent 自己決定步驟,甚至自己創工具\n給它 code editor,給它 web search\n叫它自己寫 code 解決問題\n能力最強,但風險也最高\n你沒辦法完全預測它會做什麼\n如果 agent 判斷錯誤,自己訂了 100 張機票\n你就完蛋了\n還有一個關鍵概念是 MCP\nModel Context Protocol\n傳統做法是你要替每一個 API 單獨寫串接邏輯\n教 LLM 這個 API 怎麼用\n那個 API 要傳什麼參數\nMCP 的做法是在中間放一個協議層\nagent 不需要認識每一個 API\n它只需要跟 MCP server 溝通\nMCP 負責幫它跟後面的服務打交道\n你可以把 MCP 想成一個通用插頭\n以前每個國家的插座規格不一樣\n你要帶一堆轉接頭\n有了 MCP,插一個就全通了\nStanford 教授還有提到對 MCP 一個更大的想像\n那就是 agent-to-agent communication\n你可以把別人做好的 agent 當作一種工具\n讓你自己的 agent 去呼叫它\n就像現在 agent 呼叫 API 一樣\n這是 multi-agent 系統的基礎\n我們等一下會講到\n不管是單一 agent 還是 multi-agent\n上線之前都要先回答同一個問題\n怎麼知道它真的有用?答案是 eval\n也是 production agentic 系統的命脈\n教授在課堂上給了一個完整的 eval 框架\n是三個維度交叉\n第一個維度是 End-to-End 還有 Component-based\nEnd-to-end 是看整體\n使用者用完給幾分,滿不滿意\nComponent-based 是拆開每一步看\n比方說\n這個 tool 老是忘記更新 email\n送 email 那一步格式不對\n光看整體你知道哪裡壞,但不知道為什麼壞\n光看 component 你可能修了細節但整體體驗還是差\n實務上兩個都要做\n第二個維度是 Objective 還有 Subjective\n也就是客觀和主觀的評價方式\nObjective 是可以自動驗證的\n使用者說 order ID 是 X\nLLM 寫進 DB 變成 Y\n這種東西你可以寫個 Python script 自動對齊\n因為對就是對,錯就是錯\nSubjective 是沒有標準答案的\n語氣好不好,回答夠不夠有同理心\n這種要靠人工評分\n或是用另一個額外的 LLM 當作評審\n這個等等我會細講\n第三個維度是 Quantitative 還有 Qualitative\nQuantitative 是數字\n改地址成功率幾趴,每個環節的延遲多久\nQualitative 是感覺\n在哪裡幻覺,語氣哪裡不對\n使用者哪一步卡住\n這個要人工一筆一筆看,沒有捷徑\n剛剛提到的用 LLM 當作評審\n又稱 LLM-as-Judge\n這是做 subjective eval 常用的做法\n設計上有四種主流玩法\n第一種是 Pair-wise comparison\n給 judge 兩個答案,問它哪個比較好\n第二種是 Single-answer grading\n直接打一到五分\n第三種是 Reference-guided pair-wise\n多給一個標準答案做對比,讓評分更有依據\n第四種是 Rubric-based\n你自己定義評分標準\n比方說五分等於一百字以內,含三個重點\n第一句是 overview\n零分等於答非所問,冗長失焦\n這四種可以混用\n比方說 rubric-based 加上 few-shot examples\n讓評審更知道你要什麼\n怎麼實際跑一個 subjective eval?\n課堂上教授用 travel agent 的禮貌度評估當例子\n共拆成四個步驟\n第一步是 error analysis\n從一千個使用者裡抽二十個對話,人工讀\n你可能就會發現 LLM 講話超短\n有點機車,沒同理心\n這步不能省,你要先知道問題長什麼樣\n才能設計出對的 eval\n第二步是設計 eval\n用 LLM-as-Judge 加上自己寫的禮貌度 rubric\n把你在第一步發現的問題翻譯成評分標準\n第三步是 A/B test 模型\n固定 prompt,把底層模型從 GPT 換成 Opus 或者其他模型\n然後跑同一批對話,judge 評分\n看哪個模型禮貌度最高\n第四步是 A-B test prompt\n固定模型\n把 act like a travel agent 改成\nact like a helpful travel agent\n看一個詞的差距影響有多大\n核心原則只有一個\n先人工掃出問題,再設計自動化 eval\n而且模型跟 prompt 這兩個變因一次只動一個\n不然不知道是哪個改動造成了差異\n講完 eval,教授給了一個完整的 case study\n把前面所有東西串起來\n題目很簡單\n我們要做一個客服 AI agent\n使用者可能會說\n『我要改 A127 訂單的地址,因為我搬家到建國南路了』\n這樣的 AI 客服 agent 你會怎麼做?\n這題目有兩層\n表面看是怎麼改地址\n本質是怎麼做一個會自己處理客服請求的 agent\n課堂上一個學生回答說\n我會先去客服旁邊坐一到兩天\n看他們實際怎麼處理這種請求\n他們日常的工作流是什麼\n教授很喜歡這個答案\n因為你要先理解人怎麼做這件事\n才知道怎麼讓 AI 做\n而這就是做 agentic workflow 的第一步\n叫做 task decomposition\n也就是把大任務拆解成小任務\n讓 LLM 可以逐個擊破\n觀察之後,你會發現客服處理一個改地址請求\n其實走了五步\n第一步,抽出關鍵資訊\n包含客戶的 intent 是什麼\norder ID 是哪個,新地址是什麼\n第二步,去資料庫查客戶紀錄\n第三步,查公司政策\n像是這筆訂單能不能改地址?是不是已經出貨了?\n第四步,根據前面收集到的資訊起草回信\n第五步,送出 email\n每一步都明確,這就是 task decomposition\n有了拆解,下一步是決定每一步用什麼工具\n第一步抽資訊\n單純用 LLM 的一次 API 呼叫通常就能解決\n第二步查和改 Database\n要 custom tool 或 MCP server\n第三步政策檢查,用 RAG\n因為政策文件會更新,也需要有效率的檢索\n不能讓客戶等太久\n第四步是根據前幾步搜集到的資訊\n開始撰寫 email\n第五步送 email\n用 agent 能夠使用的 email 寄送工具\n做這些判斷的方式很簡單\n先問自己哪些步驟是 fuzzy\n哪些是 deterministic\n再決定每一步是用 LLM one-shot\nRAG,tool,還是其他工具\n這就是 AI Builder 真實在做的工作\n知道每個工具,每種技術的能力和限制\n然後炒出一盤你需要的菜\n最後是 build evals\n把前面講的三個維度全部用上\nEnd-to-end 看最終回覆正確性\n語氣,使用者滿意度\nComponent-based 拆開看每一步\n抽資訊的準度,API 錯誤率,政策遵守率\nObjective 的部分可以自動驗證\n抽出來的 order ID 是否正確\n有沒有違反退費政策\nSubjective 的部分要靠人工加 LLM-as-Judge\n比方說回信是否有禮貌,有沒有同理心\nQuantitative 看改地址成功率\nlatency,退費正確率\nQualitative 看哪裡有幻覺\n哪裡語氣不一致\n使用者在哪一步感到困惑\n到這邊,一個完整的 AI 客服 agent\n從零到上線的工程流程就出來了\n其實總共就是三個步驟\n先把大任務拆解成小任務\n再設計工作流程\n最後建立評估系統,確保產出穩定\n這堂課的最後一個主題是 Multi-Agent\n前面一個 agent 已經能拆步驟\ncall tool,做 RAG,寫信\n看起來夠用了\n但 multi-agent 還是有它存在的理由\n主要原因是平行處理\n有些事沒理由排隊跑\n訂機票的時候,找航班,找飯店,查天氣\n這三件事完全可以同時進行\n如果只有一個 agent,就只能一件一件做\nMulti-agent 就是把這幾件可以平行的事\n拆給三個 specialized agent 同時跑\n速度直接拉起來\n次要原因是 reusability,也就是可復用性\n公司裡的 design agent 可以給行銷團隊用\n也可以給產品團隊用\n不過,multi-agent 聽起來很厲害\n但做產品的時候要先問自己真的有需要嗎?\n如果一個 agent 就能解決的任務\n硬上 multi-agent 反而增加複雜度\n所以還是老話一句,工程設計能簡單就簡單\n不要 over design\n教授用智慧家庭當 brainstorm 範例\n一個完整的智慧家庭 multi-agent 系統可能有溫度控制\n燈光,保全,娛樂,通知\n還有能源管理這些 agent\n加上一個 Orchestrator 統籌\n互動模式有兩種\n第一種是 Hierarchical\n使用者只跟 orchestrator 講話\n由它派工給下面的 agent,指揮鏈清楚\n第二種是 Flat\nagent 之間直接互通,沒有中間人\n教授建議智慧家庭以 hierarchical 為主\n因為從使用者的角度\n你不想同時跟五個 agent 講話\n你只想跟一個 assistant 說我要出門了\n它就會自己去協調燈光,保全,溫控\n但在後台,某些 agent 之間可以有彼此之間水平溝通的連線方式\n比方說溫度控制的 agent 跟能源管理的 agent 直接互通\n省掉每次都要過 orchestrator 的溝通成本\n當你讓 agent 之間互相溝通\n本質上就是 MCP protocol\n你把 agent 當作 tool\n就跟把 API 當作 tool 一樣\n這個心態一旦想通,設計就清楚了\n每個 agent 對外暴露一組 tool-like 介面\n其他 agent 像呼叫工具一樣呼叫這個 agent\n這樣子做結構乾淨,容易 debug\n也支援平行處理\nMulti-agent 聽起來複雜\n但其實只是把你已經懂的東西,多疊一層\n好,那我們最後整理一下這堂課的重點\n這支影片我們從基礎模型的限制開始講起\n並帶到能夠加強模型表現的技巧和技術\n首先是 Prompt Engineering\n強化 LLM 輸出,成本最低\n重點放在 chaining 跟 testing\n第二層是 Fine-Tuning\n除非你在處理法律,科學那種需要重複高精度的 domain\n或者興趣使然\n否則別沒事找事去調模型\n第三層是 RAG\n幫模型補足知識的標準解法\n做 AI 產品基本上一定會碰到\n最後是 Agentic Workflow\n從強化單一 LLM 進到系統設計\n重點是思維上的心態轉變\n從過往的 deterministic engineering\n到現在的 fuzzy engineering\n以及應對 fuzzy engineering 的 evaluation 系統\n還有在實戰上要如何從拆解任務開始\n打造自己的 agentic workflow\n第五層是 Multi-Agent\n把每個 agent 都當成工具\n彼此協作來提升處理速度跟復用性\n教授在兩個小時內跑完產業上常見的實作技巧\n每個技術的存在理由跟適用情境都交代清楚\n有了這樣的認知,你就不會盲目跟風\n看到別人在做 multi-agent 就跟著做\n看到別人講 fine-tuning 覺得很帥就去玩自己的模型\n所以你的下一步是什麼?\n我給你的建議是,從實作中學習\n看看你的生活上或者工作上有什麼痛點\n從痛點出發去思考解決方法\n在這個過程中你就會發現自己需要學會哪些技術\n就能夠很有效率的去規劃自己的學習路線\n我把這支影片整理成了一篇深度文章\n附帶 4 組 prompts\n幫你想清楚自己的 workflow 怎麼拆\n現有架構有沒有 over-engineering\n幫你建立 eval 系統\n以及該不該上 multi-agent\n有興趣的朋友可以在資訊欄找到連結\n那今天這支影片差不多就講到這邊\n如果你喜歡這樣的內容\n想請你幫我點個讚\n也在底下留言告訴我你們想看什麼樣的內容\n那我們下次見", "segments": [ { "start": 0.0, "end": 1.22, "text": "如果你有在關注 AI" }, { "start": 1.34, "end": 3.319, "text": "這一兩年最炙手可熱的工作" }, { "start": 3.319, "end": 5.76, "text": "一定是 AI Engineer,AI Builder" }, { "start": 5.76, "end": 7.779999999999999, "text": "大型語言模型越強,這群人越吃香" }, { "start": 7.96, "end": 10.039, "text": "他們有能力幫公司打造內部工具" }, { "start": 10.039, "end": 11.059999999999999, "text": "優化運營流程" }, { "start": 11.06, "end": 13.72, "text": "也已經有一堆人自己動手把想法做成產品" }, { "start": 13.72, "end": 14.92, "text": "成立了自己的公司" }, { "start": 15.1, "end": 17.7, "text": "而這種人,現在每間公司都在搶" }, { "start": 17.899, "end": 19.18, "text": "想學 AI 的人很多" }, { "start": 19.18, "end": 21.18, "text": "但大多數人都不知道從哪裡下手" }, { "start": 21.34, "end": 24.479, "text": "市面上的資源不是太破碎,就是太過艱澀" }, { "start": 24.7, "end": 26.639, "text": "看完還是不知道自己學到了什麼" }, { "start": 26.639, "end": 27.979, "text": "或者下一步該往哪走" }, { "start": 28.659, "end": 31.86, "text": "史丹佛大學有一堂課叫做 Beyond LLM" }, { "start": 31.979, "end": 34.86, "text": "我認為這是目前最接近那個答案的東西" }, { "start": 34.86, "end": 36.88, "text": "從大型語言模型的本質講起" }, { "start": 36.88, "end": 38.220000000000006, "text": "一路帶到 Prompt Engineering" }, { "start": 38.439, "end": 39.779, "text": "RAG,Fine-Tuning" }, { "start": 39.779, "end": 40.86000000000001, "text": "Agentic Workflow" }, { "start": 40.86, "end": 42.278999999999996, "text": "還有 Multi-Agent 的框架" }, { "start": 42.619, "end": 43.979, "text": "這堂課時長兩小時" }, { "start": 44.22, "end": 47.439, "text": "今天我就用一支影片的時間把核心整理給你" }, { "start": 47.439, "end": 48.18, "text": "你看完之後" }, { "start": 48.18, "end": 51.599, "text": "會對 AI 在商業領域上的應用有一套完整的認知框架" }, { "start": 51.759, "end": 53.619, "text": "知道這些技術怎麼組合在一起" }, { "start": 53.659, "end": 55.979, "text": "也能規劃自己接下來的學習路線" }, { "start": 56.319, "end": 58.619, "text": "那我們廢話不多說,直接開始" }, { "start": 58.779, "end": 62.040000000000006, "text": "首先我們要先知道大型語言模型的限制是什麼" }, { "start": 62.04, "end": 64.12, "text": "LLM 要變強有兩條路" }, { "start": 64.12, "end": 65.26, "text": "第一條是橫軸" }, { "start": 65.559, "end": 67.459, "text": "就是換更強的 base model" }, { "start": 67.459, "end": 69.86, "text": "比方說從 GPT-4 升級到 GPT-5" }, { "start": 70.04, "end": 73.239, "text": "但橫軸是 OpenAI 跟 Anthropic 在做的" }, { "start": 73.239, "end": 74.44, "text": "一般人沒有那個能力" }, { "start": 74.44, "end": 77.44, "text": "也沒有那個金錢去訓練自己的大型語言模型" }, { "start": 78.019, "end": 80.05900000000001, "text": "你能施力的地方是縱軸" }, { "start": 80.12, "end": 83.36, "text": "也就是在現有的 LLM 上面疊各種工程技術" }, { "start": 83.459, "end": 85.38900000000001, "text": "又叫做 Augmenting LLM" }, { "start": 85.559, "end": 88.51899999999999, "text": "也就是想辦法提升這些 base model 的能力" }, { "start": 88.519, "end": 90.68, "text": "而這整堂課,包括這支影片" }, { "start": 90.68, "end": 92.5, "text": "講的都是縱軸的事情" }, { "start": 92.94, "end": 94.419, "text": "如果你只會使用 base model" }, { "start": 94.58, "end": 96.8, "text": "在商業場景上一定會撞牆" }, { "start": 96.8, "end": 99.3, "text": "舉個例子,ChatGPT 剛出來的時候" }, { "start": 99.3, "end": 101.61999999999999, "text": "沒有連網功能,沒辦法調用工具" }, { "start": 101.839, "end": 104.139, "text": "充其量就是一個很聰明的問答機器人" }, { "start": 104.139, "end": 106.25999999999999, "text": "沒辦法實際幫你做完一件事" }, { "start": 106.559, "end": 109.51899999999999, "text": "Stanford 的教授整理了 base model 幾個常見的限制" }, { "start": 109.66, "end": 111.58, "text": "第一是缺乏 domain knowledge" }, { "start": 111.919, "end": 114.66, "text": "比方說有一組學生在做自動化農業設備" }, { "start": 114.66, "end": 117.08, "text": "要用相機判斷作物有沒有生病" }, { "start": 117.139, "end": 119.67999999999999, "text": "這種農業病害的 dataset 市面上根本找不到" }, { "start": 119.86, "end": 123.419, "text": "換句話說你的公司資料,內部文件,產品規格" }, { "start": 123.82, "end": 124.639, "text": "base model 都不知道" }, { "start": 124.699, "end": 127.459, "text": "它也沒辦法根據這些資料幫你解決問題" }, { "start": 127.76, "end": 129.22, "text": "第二是資訊落後" }, { "start": 129.539, "end": 131.45999999999998, "text": "模型不可能每幾個月重訓一次" }, { "start": 131.46, "end": 134.479, "text": "新詞,新事件,新公司它通通不認識" }, { "start": 134.58, "end": 136.32000000000002, "text": "年輕人在用的網路流行用語" }, { "start": 136.32, "end": 137.45999999999998, "text": "模型大多也聽不懂" }, { "start": 138.36, "end": 140.179, "text": "第三個,控制很難" }, { "start": 140.5, "end": 142.02, "text": "LLM 是機率性輸出" }, { "start": 142.02, "end": 144.619, "text": "同樣的 prompt 兩次跑可能結果不一樣" }, { "start": 144.619, "end": 146.259, "text": "在 ChatGPT 上聊天當然 OK" }, { "start": 146.279, "end": 147.97899999999998, "text": "但你想想 production 環境" }, { "start": 148.02, "end": 149.10000000000002, "text": "使用者問退費" }, { "start": 149.199, "end": 152.619, "text": "AI 一下說可以一下說不行,公司就麻煩了" }, { "start": 152.619, "end": 156.039, "text": "教授說,就連 OpenAI 跟 xAI 這種資金最多" }, { "start": 156.179, "end": 157.139, "text": "人才最齊的團隊" }, { "start": 157.139, "end": 159.75900000000001, "text": "都還沒辦法把 LLM 完全控制好" }, { "start": 159.759, "end": 161.059, "text": "更何況一般公司" }, { "start": 161.44, "end": 163.52, "text": "第四個,當 context 太長" }, { "start": 163.6, "end": 165.5, "text": "模型的表現會顯著退步" }, { "start": 165.82, "end": 167.47899999999998, "text": "現在主流模型的 context window" }, { "start": 167.479, "end": 168.96, "text": "已經拉到 100 萬 token" }, { "start": 168.96, "end": 170.52, "text": "差不多十幾本書的長度" }, { "start": 170.52, "end": 172.139, "text": "但在這麼大的 context 裡" }, { "start": 172.139, "end": 174.25900000000001, "text": "還是會出現 lost in the middle 的現象" }, { "start": 174.259, "end": 174.91899999999998, "text": "簡單講" }, { "start": 174.979, "end": 177.88000000000002, "text": "你把一個 Gary 午餐吃了一顆蘋果這樣的小細節" }, { "start": 177.899, "end": 180.44, "text": "藏進公司過去一年的會議記錄裡" }, { "start": 180.44, "end": 182.52, "text": "再問模型 Gary 午餐吃了什麼" }, { "start": 182.52, "end": 184.559, "text": "雖然這個狀況現在已經顯著改善" }, { "start": 185.08, "end": 187.53900000000002, "text": "但 LLM 有時候還是會答不出來" }, { "start": 187.539, "end": 188.899, "text": "想做 AI 產品" }, { "start": 188.899, "end": 190.52, "text": "光換更強的 base model 不夠" }, { "start": 190.66, "end": 193.119, "text": "你需要在縱軸上施力" }, { "start": 193.119, "end": 195.88, "text": "接下來這支影片的前半段會告訴你" }, { "start": 195.88, "end": 198.19899999999998, "text": "強化單一 LLM 的三個工具和觀念" }, { "start": 198.199, "end": 199.74, "text": "也就是 Prompt Engineering" }, { "start": 199.94, "end": 201.539, "text": "Fine-Tuning,還有 RAG" }, { "start": 201.679, "end": 203.46, "text": "影片後半段會進到系統設計" }, { "start": 203.66, "end": 206.32, "text": "介紹 Agentic Workflow 跟 evaluation 評估方法" }, { "start": 206.38, "end": 208.32, "text": "然後用一個客服 agent 的 case study" }, { "start": 208.32, "end": 209.44, "text": "把這些東西串起來" }, { "start": 209.58, "end": 211.839, "text": "最後也會帶到很多人感興趣的 Multi-Agent" }, { "start": 212.66, "end": 214.79999999999998, "text": "那我們直接從 Prompt Engineering 開始講" }, { "start": 214.94, "end": 218.1, "text": "Stanford 的教授說他不認為 prompt engineer 會是一個職業" }, { "start": 218.419, "end": 222.16000000000003, "text": "因為提示詞工程應該是每個工程師都該會的基本技能" }, { "start": 222.259, "end": 224.38899999999998, "text": "你不會靠 prompt engineering 當飯吃" }, { "start": 224.479, "end": 226.72000000000003, "text": "但這個技能會讓你在職涯裡用一輩子" }, { "start": 226.72, "end": 229.279, "text": "就像九九乘法表一樣是基本功" }, { "start": 229.279, "end": 230.69899999999998, "text": "我之前有做過一部影片" }, { "start": 230.699, "end": 232.05900000000003, "text": "專門在講 prompt engineering" }, { "start": 232.139, "end": 233.74, "text": "有興趣的朋友可以去看看" }, { "start": 233.82, "end": 235.01999999999998, "text": "關於 prompt engineering" }, { "start": 235.059, "end": 237.779, "text": "有一個很有意思的研究我想分享給你" }, { "start": 237.779, "end": 240.5, "text": "頂級管理顧問公司 BCG 做過一個實驗" }, { "start": 240.58, "end": 242.58, "text": "他們把一群顧問分成三組" }, { "start": 242.679, "end": 243.66, "text": "第一組沒有 AI" }, { "start": 243.72, "end": 245.259, "text": "第二組可以使用 ChatGPT" }, { "start": 245.339, "end": 247.619, "text": "第三組則是可以使用 ChatGPT 以外" }, { "start": 247.699, "end": 249.75900000000001, "text": "還有接受撰寫提示詞的訓練" }, { "start": 250.02, "end": 252.139, "text": "最後研究的結果發現三件事" }, { "start": 252.6, "end": 255.47899999999998, "text": "第一個叫 The Jagged Frontier,鋸齒邊界" }, { "start": 255.479, "end": 259.32, "text": "意思是 AI 不是在所有任務上都表現得好" }, { "start": 259.32, "end": 261.55899999999997, "text": "有些任務搭配 AI 顯著加分" }, { "start": 261.559, "end": 263.959, "text": "但有些任務 AI 反而扯後腿" }, { "start": 264.399, "end": 266.72, "text": "第二個發現叫 Falling asleep at the wheel" }, { "start": 266.779, "end": 269.459, "text": "翻成中文就是在方向盤前打瞌睡" }, { "start": 269.54, "end": 272.339, "text": "當你不知道任務剛好是 AI 不擅長的" }, { "start": 272.339, "end": 274.48, "text": "卻太信任它把產出直接送出" }, { "start": 274.48, "end": 276.22, "text": "結果比沒用 AI 還慘" }, { "start": 276.22, "end": 279.079, "text": "也就是說,你要知道 AI 的邊界在哪" }, { "start": 279.079, "end": 280.899, "text": "才不會在它弱的地方踩雷" }, { "start": 281.619, "end": 282.92, "text": "第三個現象最有趣" }, { "start": 282.92, "end": 285.119, "text": "他們發現使用 AI 的方式分成兩種" }, { "start": 285.119, "end": 287.22, "text": "分別是 Centaurs 跟 Cyborgs" }, { "start": 287.519, "end": 290.299, "text": "Centaur 是半人馬,也就是分工委派型" }, { "start": 290.32, "end": 293.839, "text": "丟一個長 prompt 給 AI 叫它做整份簡報" }, { "start": 293.859, "end": 295.019, "text": "自己去做別的事" }, { "start": 295.26, "end": 297.669, "text": "Cyborg 是生化人,是高頻來回型" }, { "start": 297.859, "end": 299.7, "text": "跟模型一句一句對話協作" }, { "start": 299.92, "end": 301.35900000000004, "text": "Stanford 的教授說" }, { "start": 301.359, "end": 303.59999999999997, "text": "學生的使用習慣會比較像 cyborg" }, { "start": 303.6, "end": 306.22, "text": "而企業在自動化 workflow 時比較像 centaur" }, { "start": 306.559, "end": 310.0, "text": "那你應該用哪一種?關鍵是看任務性質" }, { "start": 310.0, "end": 312.48, "text": "重複性高,流程清楚的任務" }, { "start": 312.48, "end": 314.339, "text": "用 centaur 模式委派出去就好" }, { "start": 314.339, "end": 318.279, "text": "需要判斷,需要創意,需要來回校正的任務" }, { "start": 318.479, "end": 321.88, "text": "cyborg 模式才能逼出 AI 的最佳輸出" }, { "start": 321.88, "end": 325.04, "text": "兩者沒有好壞之分,實務上兩種都會用" }, { "start": 325.04, "end": 326.779, "text": "重點是要有意識地切換" }, { "start": 326.98, "end": 328.29900000000004, "text": "接著進到實作" }, { "start": 328.5, "end": 330.6, "text": "通常一個好 prompt 要有三個東西" }, { "start": 330.64, "end": 333.38, "text": "給誰看,產出格式,重點是什麼" }, { "start": 333.72, "end": 336.48, "text": "請幫我總結這篇文章是一個很爛的提示詞" }, { "start": 336.6, "end": 337.94, "text": "因為什麼資訊都沒給" }, { "start": 338.299, "end": 341.38, "text": "但如果你寫的是請將這份再生能源論文" }, { "start": 341.38, "end": 342.71999999999997, "text": "整理成 5 個重點摘要" }, { "start": 342.72, "end": 345.899, "text": "並且聚焦在其背後的政策意涵上" }, { "start": 345.899, "end": 348.339, "text": "模型立刻知道對象是政策制定者" }, { "start": 348.339, "end": 351.359, "text": "長度是 5 個點,重點放在政策意涵上" }, { "start": 351.359, "end": 353.959, "text": "你的產出品質會立刻提升" }, { "start": 353.959, "end": 356.779, "text": "但教授說,prompt engineering 裡最常用" }, { "start": 356.779, "end": 360.359, "text": "最重要的一個技巧不是這些,是 Prompt Chaining" }, { "start": 360.36, "end": 363.0, "text": "注意,chaining 跟 Chain of Thought 不一樣" }, { "start": 363.22, "end": 366.16, "text": "Chain of Thought 是叫模型 step by step 思考" }, { "start": 366.3, "end": 369.66, "text": "Chaining 則是把一個複雜的 prompt 拆成多個獨立的 prompt" }, { "start": 369.739, "end": 371.57899999999995, "text": "前一個的 output 餵給下一個" }, { "start": 371.579, "end": 374.6, "text": "有用過 n8n 的朋友應該知道我在說什麼" }, { "start": 374.6, "end": 377.279, "text": "舉個例。你要做客戶投訴回信" }, { "start": 377.399, "end": 380.399, "text": "單一 prompt 寫法是讀這封投訴信" }, { "start": 380.399, "end": 382.339, "text": "寫一封專業的回應" }, { "start": 382.339, "end": 383.5, "text": "這就是一個黑盒子" }, { "start": 383.6, "end": 385.16, "text": "最後的產出如果有問題" }, { "start": 385.16, "end": 387.54, "text": "你也不會知道該調整哪裡" }, { "start": 387.54, "end": 389.0, "text": "但如果使用 prompt chaining" }, { "start": 389.0, "end": 390.339, "text": "拆成三個 prompt" }, { "start": 390.459, "end": 392.119, "text": "第一個抽出客戶在抱怨什麼" }, { "start": 392.399, "end": 394.459, "text": "第二個用抽出來的問題起草大綱" }, { "start": 394.88, "end": 397.05899999999997, "text": "第三個用大綱寫完整回信" }, { "start": 397.059, "end": 400.059, "text": "每一步都可以獨立測試,獨立 debug" }, { "start": 400.059, "end": 402.76000000000005, "text": "Chaining 不只讓模型表現更好" }, { "start": 402.76, "end": 404.11899999999997, "text": "也讓你得到 observability" }, { "start": 404.26, "end": 407.359, "text": "能觀察 LLM 在做什麼,哪個流程出了問題" }, { "start": 407.559, "end": 410.839, "text": "講完 Prompt Engineering,下一個是 Fine-Tuning" }, { "start": 410.839, "end": 413.559, "text": "Stanford 教授對 fine-tuning 的立場很簡單" }, { "start": 413.559, "end": 416.66, "text": "能不做就不做,原因有四個" }, { "start": 416.66, "end": 418.339, "text": "第一,要大量的優質數據" }, { "start": 418.339, "end": 420.059, "text": "如果你想要自己 fine-tune 模型" }, { "start": 420.14, "end": 422.65999999999997, "text": "就要有大量高品質的,標注好的資料" }, { "start": 422.72, "end": 426.66, "text": "要做到這件事情的成本對一般人來說太高了" }, { "start": 426.66, "end": 428.42, "text": "第二,容易 overfit" }, { "start": 428.42, "end": 431.279, "text": "模型容易在你那個特定任務上變很強" }, { "start": 431.359, "end": 433.019, "text": "但通用問題反而答不出來" }, { "start": 433.359, "end": 435.55899999999997, "text": "就會失去 base model 原本的廣度" }, { "start": 436.2, "end": 439.5, "text": "第三,時效性差,這應該是最傷的點" }, { "start": 439.519, "end": 441.859, "text": "你花兩個月 fine-tune 完一個模型上線" }, { "start": 441.859, "end": 443.65999999999997, "text": "下個月新一代 base model 就出來" }, { "start": 443.739, "end": 446.0, "text": "直接打贏你 fine-tune 的版本" }, { "start": 446.079, "end": 449.1, "text": "第四,通常用 prompt engineering 也可以達到一樣的效果" }, { "start": 449.1, "end": 450.17900000000003, "text": "而且成本低很多" }, { "start": 450.54, "end": 451.76000000000005, "text": "你想換新 base model" }, { "start": 451.76, "end": 454.2, "text": "原本的 prompt 大多都是 portable 的" }, { "start": 454.2, "end": 455.679, "text": "但 fine-tuning 的模型不行" }, { "start": 456.559, "end": 458.26000000000005, "text": "當然,針對少數情境" }, { "start": 458.86, "end": 460.54, "text": "fine-tune 還是值得做的" }, { "start": 460.54, "end": 464.17900000000003, "text": "比方說法律,科學那種需要重複高精度輸出的領域" }, { "start": 464.32, "end": 466.839, "text": "或者 base model 在某個 domain 上表現吃力" }, { "start": 467.04, "end": 469.0, "text": "這些情況下,fine-tune 都會有幫助" }, { "start": 469.019, "end": 470.5, "text": "但對大多數的人來說" }, { "start": 470.6, "end": 472.459, "text": "其實不會有太大的效益" }, { "start": 472.64, "end": 475.579, "text": "所以,如果你想要把特定的 domain knowledge 塞進模型" }, { "start": 475.679, "end": 478.14, "text": "單純的提示詞工程可能塞不下" }, { "start": 478.273, "end": 480.20000000000005, "text": "fine-tuning 的成本效益又對不起來" }, { "start": 480.339, "end": 482.2, "text": "那實作端應該怎麼辦呢?" }, { "start": 482.2, "end": 483.88, "text": "Stanford 教授給出的答案是 RAG" }, { "start": 484.64, "end": 488.53999999999996, "text": "RAG 是 AI 工程師面試最常考的題目之一" }, { "start": 488.54, "end": 492.846, "text": "面試官常常會請你用 5 歲小孩聽得懂的方式解釋什麼是 RAG" }, { "start": 493.1, "end": 495.6, "text": "你做 AI Builder 也好,做 AI 工程師也好" }, { "start": 495.6, "end": 497.76000000000005, "text": "這個是你一定要知道的事情" }, { "start": 497.76, "end": 499.339, "text": "RAG 解的痛點有幾個" }, { "start": 499.486, "end": 502.2, "text": "context window 太小,長 context 抓不準" }, { "start": 502.42, "end": 505.2, "text": "資訊有時效性,或者模型會產生幻覺" }, { "start": 505.679, "end": 506.91999999999996, "text": "RAG 的做法很單純" }, { "start": 507.399, "end": 511.519, "text": "我用藥物副作用這個需要高度準確的醫療場景來說明" }, { "start": 511.519, "end": 513.039, "text": "通常 RAG 的做法是這樣的" }, { "start": 513.039, "end": 516.0, "text": "先把所有的資料,文件用 embedding 模型" }, { "start": 516.0, "end": 518.84, "text": "把這些資訊轉成向量,存進向量資料庫" }, { "start": 518.84, "end": 521.0590000000001, "text": "英文叫做 vector database" }, { "start": 521.059, "end": 525.3589999999999, "text": "所謂向量,就是把一段文字的語意轉換成一串數字" }, { "start": 525.359, "end": 526.599, "text": "語意相近的文字" }, { "start": 526.599, "end": 530.5590000000001, "text": "轉出來的數字陣列在數學空間裡距離也會比較近" }, { "start": 530.599, "end": 533.0200000000001, "text": "所以當使用者問藥物 A 的副作用" }, { "start": 533.219, "end": 535.0390000000001, "text": "我們不是在做關鍵字比對" }, { "start": 535.039, "end": 538.28, "text": "而是在找語意最接近的文件片段" }, { "start": 538.28, "end": 541.539, "text": "就算文件裡寫的是不良反應而不是副作用" }, { "start": 541.539, "end": 542.3199999999999, "text": "一樣能找到" }, { "start": 542.32, "end": 545.6400000000001, "text": "使用者的問題也用同個 embedding 模型轉成向量" }, { "start": 545.739, "end": 548.419, "text": "再用距離 metric 從 vector database 裡" }, { "start": 548.419, "end": 549.7189999999999, "text": "找出最相近的 documents" }, { "start": 550.059, "end": 551.9789999999999, "text": "最後把這些 documents 加上 system prompt" }, { "start": 552.28, "end": 555.92, "text": "加上 user query,組合成餵給 LLM 的最終 prompt" }, { "start": 556.5, "end": 557.74, "text": "Prompt template 大概長這樣" }, { "start": 558.34, "end": 561.38, "text": "根據以下 documents 回答使用者的問題" }, { "start": 561.38, "end": 563.419, "text": "如果 documents 裡沒有答案,就說『我不知道』" }, { "start": 563.9, "end": 567.52, "text": "這樣設計是為了把模型鎖在你提供的資料範圍內" }, { "start": 567.52, "end": 569.239, "text": "避免它自由發揮,憑空捏造" }, { "start": 569.84, "end": 573.82, "text": "當然,你還可以要求模型回答時附上這個答案來自第幾頁" }, { "start": 574.14, "end": 576.2189999999999, "text": "第幾章,第幾行加超連結" }, { "start": 576.32, "end": 579.0590000000001, "text": "這樣使用者可以自行回溯資料源進行驗證" }, { "start": 579.799, "end": 581.5, "text": "但是單純這樣做有時候不夠" }, { "start": 581.5, "end": 585.239, "text": "比方說一種藥的相關文件可能足足有 50 頁" }, { "start": 585.479, "end": 589.479, "text": "整份直接轉成向量,那很多細節遺失其中" }, { "start": 589.64, "end": 591.14, "text": "所以通常會搭配 chunking" }, { "start": 591.4, "end": 594.78, "text": "最基本的 chunking 是把文件切成固定大小的片段" }, { "start": 594.78, "end": 596.7189999999999, "text": "每段各自轉成向量" }, { "start": 596.719, "end": 598.4000000000001, "text": "更進階的做法是多層次存儲" }, { "start": 598.4, "end": 601.52, "text": "同時保留整篇,每章,每段的向量" }, { "start": 601.773, "end": 603.7, "text": "retrieval 時可以先找到相關的章節" }, { "start": 603.78, "end": 605.5, "text": "再往下鑽到精確的段落" }, { "start": 605.64, "end": 607.859, "text": "這樣在大文件裡的命中率會更高" }, { "start": 608.219, "end": 610.88, "text": "還有一個最近比較多人在討論的話題" }, { "start": 610.88, "end": 614.359, "text": "有人說,像現在已經有模型支援超長的 context window" }, { "start": 614.52, "end": 616.84, "text": "等這個技術成熟,算力夠便宜" }, { "start": 617.146, "end": 618.919, "text": "base model 直接讀完整個資料庫" }, { "start": 618.96, "end": 620.5, "text": "RAG 就沒用了" }, { "start": 620.5, "end": 623.76, "text": "但 Stanford 的教授認為這樣的說法理論上對" }, { "start": 623.76, "end": 625.039, "text": "實務上錯" }, { "start": 625.46, "end": 627.619, "text": "因為實際上你還是會遇到很多問題" }, { "start": 627.619, "end": 629.96, "text": "比方說 Latency,你想想看" }, { "start": 629.96, "end": 633.6790000000001, "text": "每次問問題,模型都要把整個 Google Drive 重讀一次" }, { "start": 633.679, "end": 635.0, "text": "沒人等得了" }, { "start": 635.0, "end": 638.479, "text": "就像搜尋引擎也是靠預先建好的索引來快速定位資料" }, { "start": 638.559, "end": 641.5, "text": "不可能每次 query 都把整個網路重新爬過一遍" }, { "start": 641.719, "end": 643.38, "text": "所以 RAG 除了準確度以外" }, { "start": 643.38, "end": 646.34, "text": "還有檢索效率,可即時更新這類的優勢" }, { "start": 646.34, "end": 649.84, "text": "而這些優勢在可預見的未來都還是有其存在的價值" }, { "start": 650.2, "end": 652.6400000000001, "text": "好,到這邊我們講完了影片的第一部分" }, { "start": 653.02, "end": 654.84, "text": "從 base LLM 的限制出發" }, { "start": 654.84, "end": 655.94, "text": "我們看了 Prompt Engineering" }, { "start": 656.14, "end": 656.9399999999999, "text": "Fine-Tuning 還有 RAG" }, { "start": 656.94, "end": 660.359, "text": "這三個工具本質上都是在強化單一個 LLM 的能力" }, { "start": 660.539, "end": 663.8199999999999, "text": "但單一個 LLM 再強,還是有它做不到的事" }, { "start": 663.82, "end": 666.479, "text": "所以接下來進入第二部分 AI 系統設計" }, { "start": 666.76, "end": 668.179, "text": "我們會講 Agentic Workflow" }, { "start": 668.32, "end": 669.7600000000001, "text": "Evaluation 還有 Multi-Agent" }, { "start": 669.919, "end": 673.359, "text": "這些東西讓你能把 AI 從一個會回答問題的模型" }, { "start": 673.4, "end": 676.88, "text": "變成一套真正可以運作,實際產出價值的系統" }, { "start": 677.239, "end": 680.02, "text": "看到這邊,如果你覺得這支影片對你有幫助" }, { "start": 680.02, "end": 681.739, "text": "想請你幫我按個讚,點個追蹤" }, { "start": 681.84, "end": 683.539, "text": "這是我持續創作下去的動力" }, { "start": 683.739, "end": 684.9, "text": "那我們直接進 Part 2" }, { "start": 685.52, "end": 687.679, "text": "先講一下 agentic workflow 這個命名" }, { "start": 687.859, "end": 689.539, "text": "這個詞來自吳恩達" }, { "start": 689.539, "end": 690.679, "text": "如果你不認識他" }, { "start": 690.679, "end": 692.76, "text": "吳恩達是 Coursera 的共同創辦人" }, { "start": 692.76, "end": 694.4, "text": "Google Brain 的創始負責人" }, { "start": 694.4, "end": 695.739, "text": "前百度首席科學家" }, { "start": 695.739, "end": 698.099, "text": "是在 AI 領域講話有一定份量的男人" }, { "start": 698.44, "end": 700.5, "text": "吳恩達用 agentic workflow 這個詞" }, { "start": 700.64, "end": 703.8199999999999, "text": "是因為 AI Agent 已經被用到爛掉了" }, { "start": 703.82, "end": 705.7600000000001, "text": "有人寫了一個很長的 prompt,叫 agent" }, { "start": 706.08, "end": 707.88, "text": "有人做了複雜的 multi-agent 系統" }, { "start": 708.0, "end": 708.859, "text": "也叫 agent" }, { "start": 709.179, "end": 712.38, "text": "這個詞什麼都能套,反而什麼都說不清楚" }, { "start": 712.38, "end": 716.219, "text": "所以他用 agentic workflow 來精確描述一件事" }, { "start": 716.219, "end": 719.08, "text": "把一堆提示詞,外部工具,還有各種元件" }, { "start": 719.299, "end": 722.84, "text": "組合進一個有結構的工作流程裡,成為一套系統" }, { "start": 722.919, "end": 724.679, "text": "這就叫做 agentic workflow" }, { "start": 725.299, "end": 727.119, "text": "還記得我們前面講的 RAG 嗎?" }, { "start": 727.32, "end": 728.5590000000001, "text": "RAG 主要做一件事" }, { "start": 728.559, "end": 730.8589999999999, "text": "給 LLM 外部資料當參考" }, { "start": 730.859, "end": 733.26, "text": "但 agent 把 RAG 當作工具之一" }, { "start": 733.26, "end": 735.679, "text": "外加 tool calls,memory,多步驟決策" }, { "start": 735.739, "end": 738.34, "text": "所以能做到 RAG 單獨做不到的事" }, { "start": 738.34, "end": 741.34, "text": "舉個例子,使用者說我想退這筆訂單" }, { "start": 741.34, "end": 743.88, "text": "RAG 只能丟政策文件給你" }, { "start": 744.026, "end": 745.5799999999999, "text": "agent 則是用 RAG retrieve 政策" }, { "start": 745.619, "end": 748.2, "text": "主動問訂單編號,用 tool 查訂單" }, { "start": 748.2, "end": 749.32, "text": "確認退費" }, { "start": 749.32, "end": 751.239, "text": "告訴你 3 到 5 個工作天會處理" }, { "start": 751.5, "end": 754.919, "text": "RAG 是工具,Agent 是使用 RAG 這個工具的系統" }, { "start": 755.08, "end": 756.6790000000001, "text": "要打造 agentic workflow" }, { "start": 756.9, "end": 759.179, "text": "你的工程心態要先翻轉過來" }, { "start": 759.219, "end": 762.0590000000001, "text": "因為傳統 software 跟 agentic AI software" }, { "start": 762.08, "end": 764.119, "text": "在四個面向都很不一樣" }, { "start": 764.419, "end": 765.299, "text": "首先是資料" }, { "start": 765.599, "end": 767.359, "text": "傳統軟體吃結構化資料" }, { "start": 767.38, "end": 770.193, "text": "JSON,資料庫,表單,格式固定,邊界清楚" }, { "start": 770.299, "end": 772.799, "text": "Agentic 系統吃的是自由文本" }, { "start": 773.059, "end": 775.26, "text": "圖片,音訊,沒有固定格式" }, { "start": 776.059, "end": 777.1999999999999, "text": "第二個是邏輯" }, { "start": 777.479, "end": 779.38, "text": "傳統 software 是 deterministic" }, { "start": 779.719, "end": 783.0200000000001, "text": "同樣的 input,永遠給你同樣的 output" }, { "start": 783.08, "end": 784.9000000000001, "text": "可預測,可重現" }, { "start": 785.26, "end": 787.34, "text": "Agentic 系統是 fuzzy 的" }, { "start": 787.34, "end": 788.58, "text": "意思是同樣的 input" }, { "start": 788.799, "end": 791.14, "text": "不同時間跑可能給你不同的 output" }, { "start": 791.14, "end": 793.28, "text": "因為 LLM 本身有隨機性" }, { "start": 793.28, "end": 795.619, "text": "加上它會根據 context 做判斷" }, { "start": 795.679, "end": 796.9, "text": "沒有一個固定答案" }, { "start": 797.5, "end": 800.099, "text": "第三個是架構心態,這個最重要" }, { "start": 800.179, "end": 802.5989999999999, "text": "傳統工程師的思維是寫 microservices" }, { "start": 802.599, "end": 803.2990000000001, "text": "寫 monolith" }, { "start": 803.44, "end": 806.32, "text": "你精確控制每一步執行路徑" }, { "start": 806.32, "end": 808.619, "text": "Agentic 系統的思維是 think like a manager" }, { "start": 808.719, "end": 812.2, "text": "你給 AI 一個目標和限制,讓它自己決定怎麼完成" }, { "start": 812.34, "end": 816.159, "text": "你管的是方向和邊界,不是每一行程式碼" }, { "start": 816.159, "end": 817.419, "text": "第四個是測試" }, { "start": 817.419, "end": 820.299, "text": "傳統測試是確定性的,跑一百次結果一樣" }, { "start": 820.599, "end": 822.96, "text": "Agentic 測試是迭代探索式的" }, { "start": 822.96, "end": 825.219, "text": "因為系統本身是非確定性的" }, { "start": 825.219, "end": 826.719, "text": "加上它對 context 非常敏感" }, { "start": 826.719, "end": 828.2800000000001, "text": "你沒辦法窮舉所有情況" }, { "start": 828.28, "end": 829.8399999999999, "text": "知道這四件事之後" }, { "start": 829.84, "end": 831.659, "text": "第一個落地原則就跟著來了" }, { "start": 831.7, "end": 834.7, "text": "能 deterministic 解的問題,就 deterministic 解" }, { "start": 834.88, "end": 837.28, "text": "剩下 fuzzy 的部分,加上護欄" }, { "start": 838.073, "end": 839.4789999999999, "text": "教授舉自己的例子" }, { "start": 839.479, "end": 841.0590000000001, "text": "他們做 skills assessment" }, { "start": 841.08, "end": 844.5, "text": "選擇題,配對題,拖拉題用 deterministic 算分" }, { "start": 844.599, "end": 847.4000000000001, "text": "因為這些有標準答案,對就是對,錯就是錯" }, { "start": 847.52, "end": 850.0799999999999, "text": "但語音題,語音加 coding 的混合題型" }, { "start": 850.08, "end": 852.64, "text": "沒有標準答案,沒辦法 deterministic 評分" }, { "start": 852.64, "end": 854.08, "text": "只能讓 LLM 去判斷" }, { "start": 854.559, "end": 855.9, "text": "這就是 fuzzy scoring" }, { "start": 855.9, "end": 857.76, "text": "也就是沒有標準答案的評分" }, { "start": 857.76, "end": 860.02, "text": "你請 LLM 聽一段語音回答" }, { "start": 860.2, "end": 862.359, "text": "它要判斷這個人有沒有真的理解這個概念" }, { "start": 862.359, "end": 864.9000000000001, "text": "表達是否清晰,邏輯有沒有跑掉" }, { "start": 864.9, "end": 867.799, "text": "這些不是對或錯,是一個程度的判斷" }, { "start": 868.0, "end": 869.799, "text": "LLM 會給你一個分數" }, { "start": 869.799, "end": 874.119, "text": "但這個分數是它覺得合理的答案,不是算出來的" }, { "start": 874.2, "end": 876.0390000000001, "text": "Fuzzy 的問題是它一定會犯錯" }, { "start": 876.039, "end": 878.119, "text": "LLM 可能誤判一個正確答案" }, { "start": 878.119, "end": 881.159, "text": "或是對模稜兩可的回答給出偏低的分數" }, { "start": 881.159, "end": 884.4399999999999, "text": "在考試評分這種高風險的場景,這不可接受" }, { "start": 884.7, "end": 886.7, "text": "所以他們設計了一個 Appeal feature" }, { "start": 886.7, "end": 889.4000000000001, "text": "受測者可以對 agent 的判分提出申訴" }, { "start": 889.619, "end": 892.02, "text": "由真人介入審查並糾正" }, { "start": 892.02, "end": 893.52, "text": "這就是護欄的具體形式" }, { "start": 893.539, "end": 895.5, "text": "不是試圖讓 AI 零錯誤" }, { "start": 895.5, "end": 897.96, "text": "而是在它出錯的時候有人接得住" }, { "start": 898.299, "end": 900.02, "text": "好,原則講完了" }, { "start": 900.26, "end": 902.739, "text": "要實際打造一個 agent,你需要哪些東西?" }, { "start": 902.979, "end": 905.099, "text": "教授用訂機票去巴黎當範例" }, { "start": 905.119, "end": 906.84, "text": "整理出三個核心要素" }, { "start": 907.419, "end": 908.72, "text": "第一個是 Prompts" }, { "start": 908.88, "end": 911.859, "text": "前面講的提示詞工程,在 agent 裡就是這一塊" }, { "start": 911.96, "end": 913.979, "text": "你怎麼告訴 AI 它的角色是什麼" }, { "start": 914.089, "end": 915.34, "text": "它能做什麼,不能做什麼" }, { "start": 915.94, "end": 917.7600000000001, "text": "第二個是 Context Management" }, { "start": 917.76, "end": 921.28, "text": "也就是怎麼管理 agent 在每一個當下看得到的資訊" }, { "start": 921.559, "end": 922.9599999999999, "text": "這包含幾件事" }, { "start": 923.12, "end": 924.2, "text": "Memory,對話歷史" }, { "start": 924.2, "end": 926.0390000000001, "text": "也可能有 RAG 撈回來的資料" }, { "start": 926.059, "end": 928.4, "text": "通通都要塞進有限的 context window 裡" }, { "start": 928.4, "end": 931.5, "text": "你要決定什麼重要,什麼可以丟,什麼要壓縮" }, { "start": 932.093, "end": 934.3199999999999, "text": "Context Management 本質上只做一件事" }, { "start": 934.32, "end": 938.1590000000001, "text": "那就是把對的資訊在對的時間提供給你的 agent" }, { "start": 938.5, "end": 939.86, "text": "Memory 本身又分兩層" }, { "start": 940.14, "end": 942.5, "text": "Working memory 是高頻,要快的" }, { "start": 942.5, "end": 945.64, "text": "比方說使用者的名字,這次的目的地是巴黎" }, { "start": 945.973, "end": 949.4599999999999, "text": "Archival memory 是低頻,可以慢一點的" }, { "start": 949.46, "end": 952.359, "text": "比方說使用者過去五年的訂房紀錄" }, { "start": 952.4, "end": 953.76, "text": "需要的時候再去撈" }, { "start": 954.419, "end": 955.76, "text": "第三個是 Tools" }, { "start": 955.76, "end": 958.2, "text": "也就是 agent 能呼叫的外部能力" }, { "start": 958.419, "end": 959.659, "text": "通常分成兩種" }, { "start": 959.659, "end": 960.739, "text": "一種是做事的" }, { "start": 960.739, "end": 962.84, "text": "比方說 Flight Search,Hotel Booking,Payment" }, { "start": 962.88, "end": 964.2, "text": "一種是查資料的" }, { "start": 964.2, "end": 965.6790000000001, "text": "比方說去 CRM 撈客戶資料" }, { "start": 965.76, "end": 967.46, "text": "去資料庫查訂單紀錄" }, { "start": 967.94, "end": 971.5390000000001, "text": "另外,課堂上教授把 agent 的自主性分為三層" }, { "start": 971.739, "end": 973.44, "text": "最低是 hardcoded steps" }, { "start": 973.44, "end": 976.119, "text": "步驟全寫死,先識別用戶的意圖" }, { "start": 976.119, "end": 979.859, "text": "再 lookup history,最後呼叫 API,照順序走" }, { "start": 979.82, "end": 982.2, "text": "安全,可預測,但很僵硬" }, { "start": 982.2, "end": 983.859, "text": "遇到預期外的情況就卡住" }, { "start": 984.32, "end": 985.88, "text": "第二層是 hardcoded tools" }, { "start": 985.88, "end": 987.799, "text": "但讓 agent 自己決定執行步驟" }, { "start": 988.2, "end": 991.88, "text": "你給它一組工具,告訴它你是 travel agent" }, { "start": 991.88, "end": 994.52, "text": "這些是你能用的工具,怎麼用你決定" }, { "start": 994.7, "end": 998.479, "text": "掌控工具範圍,但給 agent 空間判斷怎麼組合" }, { "start": 998.619, "end": 1000.88, "text": "這是目前最常見的 production setup" }, { "start": 1000.9, "end": 1002.4399999999999, "text": "也是教授推薦的起點" }, { "start": 1002.9, "end": 1004.7189999999999, "text": "第三層是 fully autonomous" }, { "start": 1004.719, "end": 1008.239, "text": "agent 自己決定步驟,甚至自己創工具" }, { "start": 1008.239, "end": 1010.099, "text": "給它 code editor,給它 web search" }, { "start": 1010.099, "end": 1011.979, "text": "叫它自己寫 code 解決問題" }, { "start": 1012.239, "end": 1014.84, "text": "能力最強,但風險也最高" }, { "start": 1014.96, "end": 1017.119, "text": "你沒辦法完全預測它會做什麼" }, { "start": 1017.119, "end": 1019.859, "text": "如果 agent 判斷錯誤,自己訂了 100 張機票" }, { "start": 1019.9, "end": 1021.6999999999999, "text": "你就完蛋了" }, { "start": 1021.7, "end": 1023.659, "text": "還有一個關鍵概念是 MCP" }, { "start": 1023.679, "end": 1025.18, "text": "Model Context Protocol" }, { "start": 1025.5, "end": 1028.719, "text": "傳統做法是你要替每一個 API 單獨寫串接邏輯" }, { "start": 1028.719, "end": 1030.26, "text": "教 LLM 這個 API 怎麼用" }, { "start": 1030.26, "end": 1031.54, "text": "那個 API 要傳什麼參數" }, { "start": 1031.54, "end": 1034.8999999999999, "text": "MCP 的做法是在中間放一個協議層" }, { "start": 1035.06, "end": 1037.1599999999999, "text": "agent 不需要認識每一個 API" }, { "start": 1037.333, "end": 1039.3590000000002, "text": "它只需要跟 MCP server 溝通" }, { "start": 1039.5, "end": 1042.479, "text": "MCP 負責幫它跟後面的服務打交道" }, { "start": 1042.479, "end": 1044.579, "text": "你可以把 MCP 想成一個通用插頭" }, { "start": 1044.78, "end": 1046.8799999999999, "text": "以前每個國家的插座規格不一樣" }, { "start": 1046.88, "end": 1048.3390000000002, "text": "你要帶一堆轉接頭" }, { "start": 1048.339, "end": 1051.119, "text": "有了 MCP,插一個就全通了" }, { "start": 1051.119, "end": 1053.9589999999998, "text": "Stanford 教授還有提到對 MCP 一個更大的想像" }, { "start": 1053.959, "end": 1056.14, "text": "那就是 agent-to-agent communication" }, { "start": 1056.56, "end": 1058.9389999999999, "text": "你可以把別人做好的 agent 當作一種工具" }, { "start": 1058.979, "end": 1060.559, "text": "讓你自己的 agent 去呼叫它" }, { "start": 1060.719, "end": 1062.959, "text": "就像現在 agent 呼叫 API 一樣" }, { "start": 1062.959, "end": 1064.52, "text": "這是 multi-agent 系統的基礎" }, { "start": 1064.52, "end": 1066.04, "text": "我們等一下會講到" }, { "start": 1066.04, "end": 1067.819, "text": "不管是單一 agent 還是 multi-agent" }, { "start": 1067.819, "end": 1069.6399999999999, "text": "上線之前都要先回答同一個問題" }, { "start": 1069.739, "end": 1072.1190000000001, "text": "怎麼知道它真的有用?答案是 eval" }, { "start": 1072.339, "end": 1074.1799999999998, "text": "也是 production agentic 系統的命脈" }, { "start": 1074.52, "end": 1076.939, "text": "教授在課堂上給了一個完整的 eval 框架" }, { "start": 1076.939, "end": 1078.479, "text": "是三個維度交叉" }, { "start": 1078.88, "end": 1081.959, "text": "第一個維度是 End-to-End 還有 Component-based" }, { "start": 1082.079, "end": 1084.02, "text": "End-to-end 是看整體" }, { "start": 1084.16, "end": 1087.4, "text": "使用者用完給幾分,滿不滿意" }, { "start": 1087.986, "end": 1089.5, "text": "Component-based 是拆開每一步看" }, { "start": 1089.5, "end": 1090.16, "text": "比方說" }, { "start": 1090.16, "end": 1091.78, "text": "這個 tool 老是忘記更新 email" }, { "start": 1091.78, "end": 1093.3799999999999, "text": "送 email 那一步格式不對" }, { "start": 1093.5, "end": 1096.339, "text": "光看整體你知道哪裡壞,但不知道為什麼壞" }, { "start": 1096.339, "end": 1099.9589999999998, "text": "光看 component 你可能修了細節但整體體驗還是差" }, { "start": 1100.199, "end": 1101.959, "text": "實務上兩個都要做" }, { "start": 1102.119, "end": 1105.04, "text": "第二個維度是 Objective 還有 Subjective" }, { "start": 1105.04, "end": 1108.18, "text": "也就是客觀和主觀的評價方式" }, { "start": 1108.433, "end": 1110.099, "text": "Objective 是可以自動驗證的" }, { "start": 1110.099, "end": 1111.4109999999998, "text": "使用者說 order ID 是 X" }, { "start": 1111.757, "end": 1113.41, "text": "LLM 寫進 DB 變成 Y" }, { "start": 1113.739, "end": 1116.42, "text": "這種東西你可以寫個 Python script 自動對齊" }, { "start": 1116.64, "end": 1118.699, "text": "因為對就是對,錯就是錯" }, { "start": 1118.993, "end": 1120.9589999999998, "text": "Subjective 是沒有標準答案的" }, { "start": 1120.959, "end": 1123.38, "text": "語氣好不好,回答夠不夠有同理心" }, { "start": 1123.38, "end": 1124.719, "text": "這種要靠人工評分" }, { "start": 1124.719, "end": 1127.64, "text": "或是用另一個額外的 LLM 當作評審" }, { "start": 1127.64, "end": 1129.0200000000002, "text": "這個等等我會細講" }, { "start": 1129.459, "end": 1132.1190000000001, "text": "第三個維度是 Quantitative 還有 Qualitative" }, { "start": 1132.719, "end": 1134.1190000000001, "text": "Quantitative 是數字" }, { "start": 1134.119, "end": 1137.78, "text": "改地址成功率幾趴,每個環節的延遲多久" }, { "start": 1138.546, "end": 1139.68, "text": "Qualitative 是感覺" }, { "start": 1139.78, "end": 1142.079, "text": "在哪裡幻覺,語氣哪裡不對" }, { "start": 1142.18, "end": 1143.8590000000002, "text": "使用者哪一步卡住" }, { "start": 1143.859, "end": 1146.4589999999998, "text": "這個要人工一筆一筆看,沒有捷徑" }, { "start": 1146.459, "end": 1148.699, "text": "剛剛提到的用 LLM 當作評審" }, { "start": 1148.699, "end": 1150.3390000000002, "text": "又稱 LLM-as-Judge" }, { "start": 1150.459, "end": 1153.0, "text": "這是做 subjective eval 常用的做法" }, { "start": 1153.06, "end": 1155.1599999999999, "text": "設計上有四種主流玩法" }, { "start": 1155.16, "end": 1157.199, "text": "第一種是 Pair-wise comparison" }, { "start": 1157.199, "end": 1160.14, "text": "給 judge 兩個答案,問它哪個比較好" }, { "start": 1160.14, "end": 1161.88, "text": "第二種是 Single-answer grading" }, { "start": 1162.079, "end": 1163.78, "text": "直接打一到五分" }, { "start": 1163.78, "end": 1165.8, "text": "第三種是 Reference-guided pair-wise" }, { "start": 1165.819, "end": 1168.959, "text": "多給一個標準答案做對比,讓評分更有依據" }, { "start": 1169.3, "end": 1170.78, "text": "第四種是 Rubric-based" }, { "start": 1170.8, "end": 1172.619, "text": "你自己定義評分標準" }, { "start": 1172.619, "end": 1175.1599999999999, "text": "比方說五分等於一百字以內,含三個重點" }, { "start": 1175.16, "end": 1176.3190000000002, "text": "第一句是 overview" }, { "start": 1176.599, "end": 1178.5459999999998, "text": "零分等於答非所問,冗長失焦" }, { "start": 1178.939, "end": 1180.3590000000002, "text": "這四種可以混用" }, { "start": 1180.359, "end": 1182.76, "text": "比方說 rubric-based 加上 few-shot examples" }, { "start": 1182.819, "end": 1185.1599999999999, "text": "讓評審更知道你要什麼" }, { "start": 1185.16, "end": 1187.02, "text": "怎麼實際跑一個 subjective eval?" }, { "start": 1187.04, "end": 1190.6399999999999, "text": "課堂上教授用 travel agent 的禮貌度評估當例子" }, { "start": 1190.64, "end": 1192.14, "text": "共拆成四個步驟" }, { "start": 1192.239, "end": 1194.0, "text": "第一步是 error analysis" }, { "start": 1194.319, "end": 1197.859, "text": "從一千個使用者裡抽二十個對話,人工讀" }, { "start": 1198.16, "end": 1200.3190000000002, "text": "你可能就會發現 LLM 講話超短" }, { "start": 1200.319, "end": 1201.8799999999999, "text": "有點機車,沒同理心" }, { "start": 1202.26, "end": 1204.959, "text": "這步不能省,你要先知道問題長什麼樣" }, { "start": 1204.959, "end": 1206.5, "text": "才能設計出對的 eval" }, { "start": 1207.079, "end": 1208.599, "text": "第二步是設計 eval" }, { "start": 1208.619, "end": 1211.859, "text": "用 LLM-as-Judge 加上自己寫的禮貌度 rubric" }, { "start": 1211.88, "end": 1215.479, "text": "把你在第一步發現的問題翻譯成評分標準" }, { "start": 1215.739, "end": 1217.8, "text": "第三步是 A/B test 模型" }, { "start": 1217.8, "end": 1221.579, "text": "固定 prompt,把底層模型從 GPT 換成 Opus 或者其他模型" }, { "start": 1221.66, "end": 1223.8390000000002, "text": "然後跑同一批對話,judge 評分" }, { "start": 1223.959, "end": 1226.04, "text": "看哪個模型禮貌度最高" }, { "start": 1226.18, "end": 1227.819, "text": "第四步是 A-B test prompt" }, { "start": 1228.06, "end": 1228.9589999999998, "text": "固定模型" }, { "start": 1229.119, "end": 1231.52, "text": "把 act like a travel agent 改成" }, { "start": 1231.52, "end": 1233.42, "text": "act like a helpful travel agent" }, { "start": 1233.42, "end": 1236.5, "text": "看一個詞的差距影響有多大" }, { "start": 1236.5, "end": 1237.76, "text": "核心原則只有一個" }, { "start": 1237.859, "end": 1241.119, "text": "先人工掃出問題,再設計自動化 eval" }, { "start": 1241.119, "end": 1243.52, "text": "而且模型跟 prompt 這兩個變因一次只動一個" }, { "start": 1243.579, "end": 1245.959, "text": "不然不知道是哪個改動造成了差異" }, { "start": 1246.099, "end": 1248.839, "text": "講完 eval,教授給了一個完整的 case study" }, { "start": 1248.839, "end": 1250.1599999999999, "text": "把前面所有東西串起來" }, { "start": 1250.479, "end": 1251.339, "text": "題目很簡單" }, { "start": 1251.359, "end": 1253.1799999999998, "text": "我們要做一個客服 AI agent" }, { "start": 1253.66, "end": 1254.739, "text": "使用者可能會說" }, { "start": 1254.839, "end": 1259.479, "text": "『我要改 A127 訂單的地址,因為我搬家到建國南路了』" }, { "start": 1259.479, "end": 1261.38, "text": "這樣的 AI 客服 agent 你會怎麼做?" }, { "start": 1262.119, "end": 1263.119, "text": "這題目有兩層" }, { "start": 1263.119, "end": 1264.6989999999998, "text": "表面看是怎麼改地址" }, { "start": 1264.719, "end": 1268.839, "text": "本質是怎麼做一個會自己處理客服請求的 agent" }, { "start": 1268.839, "end": 1270.839, "text": "課堂上一個學生回答說" }, { "start": 1270.839, "end": 1272.8999999999999, "text": "我會先去客服旁邊坐一到兩天" }, { "start": 1272.979, "end": 1275.02, "text": "看他們實際怎麼處理這種請求" }, { "start": 1275.26, "end": 1277.04, "text": "他們日常的工作流是什麼" }, { "start": 1277.5, "end": 1278.92, "text": "教授很喜歡這個答案" }, { "start": 1278.92, "end": 1281.04, "text": "因為你要先理解人怎麼做這件事" }, { "start": 1281.04, "end": 1282.8, "text": "才知道怎麼讓 AI 做" }, { "start": 1282.8, "end": 1284.76, "text": "而這就是做 agentic workflow 的第一步" }, { "start": 1284.88, "end": 1286.5200000000002, "text": "叫做 task decomposition" }, { "start": 1286.819, "end": 1289.099, "text": "也就是把大任務拆解成小任務" }, { "start": 1289.099, "end": 1291.239, "text": "讓 LLM 可以逐個擊破" }, { "start": 1291.439, "end": 1295.0790000000002, "text": "觀察之後,你會發現客服處理一個改地址請求" }, { "start": 1295.18, "end": 1296.16, "text": "其實走了五步" }, { "start": 1296.439, "end": 1298.5790000000002, "text": "第一步,抽出關鍵資訊" }, { "start": 1298.699, "end": 1300.9, "text": "包含客戶的 intent 是什麼" }, { "start": 1301.04, "end": 1303.319, "text": "order ID 是哪個,新地址是什麼" }, { "start": 1303.479, "end": 1306.4, "text": "第二步,去資料庫查客戶紀錄" }, { "start": 1306.64, "end": 1308.5, "text": "第三步,查公司政策" }, { "start": 1308.5, "end": 1312.04, "text": "像是這筆訂單能不能改地址?是不是已經出貨了?" }, { "start": 1312.04, "end": 1315.4389999999999, "text": "第四步,根據前面收集到的資訊起草回信" }, { "start": 1315.439, "end": 1317.3190000000002, "text": "第五步,送出 email" }, { "start": 1317.319, "end": 1320.02, "text": "每一步都明確,這就是 task decomposition" }, { "start": 1320.4, "end": 1323.4, "text": "有了拆解,下一步是決定每一步用什麼工具" }, { "start": 1323.739, "end": 1324.9, "text": "第一步抽資訊" }, { "start": 1325.0, "end": 1328.64, "text": "單純用 LLM 的一次 API 呼叫通常就能解決" }, { "start": 1328.76, "end": 1330.219, "text": "第二步查和改 Database" }, { "start": 1330.219, "end": 1332.16, "text": "要 custom tool 或 MCP server" }, { "start": 1332.54, "end": 1334.653, "text": "第三步政策檢查,用 RAG" }, { "start": 1334.8, "end": 1337.54, "text": "因為政策文件會更新,也需要有效率的檢索" }, { "start": 1337.54, "end": 1339.06, "text": "不能讓客戶等太久" }, { "start": 1339.099, "end": 1341.9389999999999, "text": "第四步是根據前幾步搜集到的資訊" }, { "start": 1341.939, "end": 1342.78, "text": "開始撰寫 email" }, { "start": 1343.16, "end": 1344.76, "text": "第五步送 email" }, { "start": 1344.76, "end": 1347.699, "text": "用 agent 能夠使用的 email 寄送工具" }, { "start": 1348.239, "end": 1350.0, "text": "做這些判斷的方式很簡單" }, { "start": 1350.0, "end": 1352.02, "text": "先問自己哪些步驟是 fuzzy" }, { "start": 1352.16, "end": 1353.52, "text": "哪些是 deterministic" }, { "start": 1353.599, "end": 1356.099, "text": "再決定每一步是用 LLM one-shot" }, { "start": 1356.42, "end": 1358.16, "text": "RAG,tool,還是其他工具" }, { "start": 1358.319, "end": 1360.5, "text": "這就是 AI Builder 真實在做的工作" }, { "start": 1360.619, "end": 1363.5, "text": "知道每個工具,每種技術的能力和限制" }, { "start": 1363.8, "end": 1365.479, "text": "然後炒出一盤你需要的菜" }, { "start": 1365.819, "end": 1367.579, "text": "最後是 build evals" }, { "start": 1367.579, "end": 1369.859, "text": "把前面講的三個維度全部用上" }, { "start": 1369.859, "end": 1372.2189999999998, "text": "End-to-end 看最終回覆正確性" }, { "start": 1372.219, "end": 1373.939, "text": "語氣,使用者滿意度" }, { "start": 1374.38, "end": 1376.0990000000002, "text": "Component-based 拆開看每一步" }, { "start": 1376.199, "end": 1379.38, "text": "抽資訊的準度,API 錯誤率,政策遵守率" }, { "start": 1379.873, "end": 1381.78, "text": "Objective 的部分可以自動驗證" }, { "start": 1381.8, "end": 1383.6989999999998, "text": "抽出來的 order ID 是否正確" }, { "start": 1383.699, "end": 1385.219, "text": "有沒有違反退費政策" }, { "start": 1385.766, "end": 1388.6190000000001, "text": "Subjective 的部分要靠人工加 LLM-as-Judge" }, { "start": 1388.619, "end": 1391.079, "text": "比方說回信是否有禮貌,有沒有同理心" }, { "start": 1391.846, "end": 1394.16, "text": "Quantitative 看改地址成功率" }, { "start": 1394.319, "end": 1396.92, "text": "latency,退費正確率" }, { "start": 1397.173, "end": 1398.8, "text": "Qualitative 看哪裡有幻覺" }, { "start": 1398.8, "end": 1400.219, "text": "哪裡語氣不一致" }, { "start": 1400.219, "end": 1402.219, "text": "使用者在哪一步感到困惑" }, { "start": 1402.52, "end": 1404.619, "text": "到這邊,一個完整的 AI 客服 agent" }, { "start": 1404.619, "end": 1406.6989999999998, "text": "從零到上線的工程流程就出來了" }, { "start": 1406.88, "end": 1408.2600000000002, "text": "其實總共就是三個步驟" }, { "start": 1408.26, "end": 1410.199, "text": "先把大任務拆解成小任務" }, { "start": 1410.219, "end": 1411.54, "text": "再設計工作流程" }, { "start": 1411.619, "end": 1414.1989999999998, "text": "最後建立評估系統,確保產出穩定" }, { "start": 1414.459, "end": 1416.153, "text": "這堂課的最後一個主題是 Multi-Agent" }, { "start": 1416.178, "end": 1418.5400000000002, "text": "前面一個 agent 已經能拆步驟" }, { "start": 1418.599, "end": 1420.819, "text": "call tool,做 RAG,寫信" }, { "start": 1420.859, "end": 1422.4199999999998, "text": "看起來夠用了" }, { "start": 1422.42, "end": 1424.719, "text": "但 multi-agent 還是有它存在的理由" }, { "start": 1424.939, "end": 1426.8000000000002, "text": "主要原因是平行處理" }, { "start": 1426.8, "end": 1428.359, "text": "有些事沒理由排隊跑" }, { "start": 1428.619, "end": 1432.099, "text": "訂機票的時候,找航班,找飯店,查天氣" }, { "start": 1432.099, "end": 1434.1989999999998, "text": "這三件事完全可以同時進行" }, { "start": 1434.3, "end": 1436.6599999999999, "text": "如果只有一個 agent,就只能一件一件做" }, { "start": 1437.099, "end": 1439.8, "text": "Multi-agent 就是把這幾件可以平行的事" }, { "start": 1439.8, "end": 1442.3999999999999, "text": "拆給三個 specialized agent 同時跑" }, { "start": 1442.4, "end": 1443.6190000000001, "text": "速度直接拉起來" }, { "start": 1444.02, "end": 1447.76, "text": "次要原因是 reusability,也就是可復用性" }, { "start": 1447.76, "end": 1450.719, "text": "公司裡的 design agent 可以給行銷團隊用" }, { "start": 1450.719, "end": 1452.88, "text": "也可以給產品團隊用" }, { "start": 1452.9, "end": 1455.199, "text": "不過,multi-agent 聽起來很厲害" }, { "start": 1455.319, "end": 1458.76, "text": "但做產品的時候要先問自己真的有需要嗎?" }, { "start": 1458.76, "end": 1460.54, "text": "如果一個 agent 就能解決的任務" }, { "start": 1460.54, "end": 1462.78, "text": "硬上 multi-agent 反而增加複雜度" }, { "start": 1463.06, "end": 1466.1599999999999, "text": "所以還是老話一句,工程設計能簡單就簡單" }, { "start": 1466.16, "end": 1467.52, "text": "不要 over design" }, { "start": 1467.68, "end": 1470.14, "text": "教授用智慧家庭當 brainstorm 範例" }, { "start": 1470.239, "end": 1473.78, "text": "一個完整的智慧家庭 multi-agent 系統可能有溫度控制" }, { "start": 1473.78, "end": 1476.06, "text": "燈光,保全,娛樂,通知" }, { "start": 1476.06, "end": 1477.579, "text": "還有能源管理這些 agent" }, { "start": 1477.58, "end": 1479.4199999999998, "text": "加上一個 Orchestrator 統籌" }, { "start": 1479.56, "end": 1481.48, "text": "互動模式有兩種" }, { "start": 1481.48, "end": 1482.5, "text": "第一種是 Hierarchical" }, { "start": 1482.5, "end": 1483.96, "text": "使用者只跟 orchestrator 講話" }, { "start": 1483.96, "end": 1486.82, "text": "由它派工給下面的 agent,指揮鏈清楚" }, { "start": 1487.16, "end": 1488.4, "text": "第二種是 Flat" }, { "start": 1488.46, "end": 1491.52, "text": "agent 之間直接互通,沒有中間人" }, { "start": 1491.52, "end": 1494.08, "text": "教授建議智慧家庭以 hierarchical 為主" }, { "start": 1494.319, "end": 1495.8, "text": "因為從使用者的角度" }, { "start": 1495.8, "end": 1497.76, "text": "你不想同時跟五個 agent 講話" }, { "start": 1497.78, "end": 1500.54, "text": "你只想跟一個 assistant 說我要出門了" }, { "start": 1500.58, "end": 1503.34, "text": "它就會自己去協調燈光,保全,溫控" }, { "start": 1503.739, "end": 1509.54, "text": "但在後台,某些 agent 之間可以有彼此之間水平溝通的連線方式" }, { "start": 1509.54, "end": 1513.099, "text": "比方說溫度控制的 agent 跟能源管理的 agent 直接互通" }, { "start": 1513.14, "end": 1515.959, "text": "省掉每次都要過 orchestrator 的溝通成本" }, { "start": 1516.52, "end": 1518.479, "text": "當你讓 agent 之間互相溝通" }, { "start": 1518.479, "end": 1520.4, "text": "本質上就是 MCP protocol" }, { "start": 1520.719, "end": 1521.979, "text": "你把 agent 當作 tool" }, { "start": 1521.979, "end": 1523.52, "text": "就跟把 API 當作 tool 一樣" }, { "start": 1524.099, "end": 1527.0, "text": "這個心態一旦想通,設計就清楚了" }, { "start": 1527.0, "end": 1528.839, "text": "每個 agent 對外暴露一組 tool-like 介面" }, { "start": 1528.979, "end": 1531.52, "text": "其他 agent 像呼叫工具一樣呼叫這個 agent" }, { "start": 1531.52, "end": 1533.479, "text": "這樣子做結構乾淨,容易 debug" }, { "start": 1533.579, "end": 1534.839, "text": "也支援平行處理" }, { "start": 1535.199, "end": 1536.459, "text": "Multi-agent 聽起來複雜" }, { "start": 1536.459, "end": 1539.1190000000001, "text": "但其實只是把你已經懂的東西,多疊一層" }, { "start": 1539.52, "end": 1542.26, "text": "好,那我們最後整理一下這堂課的重點" }, { "start": 1542.479, "end": 1545.28, "text": "這支影片我們從基礎模型的限制開始講起" }, { "start": 1545.28, "end": 1547.819, "text": "並帶到能夠加強模型表現的技巧和技術" }, { "start": 1547.979, "end": 1549.26, "text": "首先是 Prompt Engineering" }, { "start": 1549.359, "end": 1551.54, "text": "強化 LLM 輸出,成本最低" }, { "start": 1551.619, "end": 1553.1799999999998, "text": "重點放在 chaining 跟 testing" }, { "start": 1553.599, "end": 1554.839, "text": "第二層是 Fine-Tuning" }, { "start": 1554.839, "end": 1558.9389999999999, "text": "除非你在處理法律,科學那種需要重複高精度的 domain" }, { "start": 1558.939, "end": 1559.88, "text": "或者興趣使然" }, { "start": 1559.959, "end": 1562.459, "text": "否則別沒事找事去調模型" }, { "start": 1562.459, "end": 1563.579, "text": "第三層是 RAG" }, { "start": 1563.579, "end": 1566.1399999999999, "text": "幫模型補足知識的標準解法" }, { "start": 1566.18, "end": 1568.8590000000002, "text": "做 AI 產品基本上一定會碰到" }, { "start": 1568.859, "end": 1570.26, "text": "最後是 Agentic Workflow" }, { "start": 1570.26, "end": 1573.02, "text": "從強化單一 LLM 進到系統設計" }, { "start": 1573.06, "end": 1575.1599999999999, "text": "重點是思維上的心態轉變" }, { "start": 1575.28, "end": 1577.339, "text": "從過往的 deterministic engineering" }, { "start": 1577.339, "end": 1578.9199999999998, "text": "到現在的 fuzzy engineering" }, { "start": 1579.18, "end": 1582.26, "text": "以及應對 fuzzy engineering 的 evaluation 系統" }, { "start": 1582.26, "end": 1585.339, "text": "還有在實戰上要如何從拆解任務開始" }, { "start": 1585.339, "end": 1586.839, "text": "打造自己的 agentic workflow" }, { "start": 1587.26, "end": 1588.36, "text": "第五層是 Multi-Agent" }, { "start": 1588.38, "end": 1590.3000000000002, "text": "把每個 agent 都當成工具" }, { "start": 1590.38, "end": 1593.459, "text": "彼此協作來提升處理速度跟復用性" }, { "start": 1593.54, "end": 1596.42, "text": "教授在兩個小時內跑完產業上常見的實作技巧" }, { "start": 1596.459, "end": 1599.28, "text": "每個技術的存在理由跟適用情境都交代清楚" }, { "start": 1599.579, "end": 1602.06, "text": "有了這樣的認知,你就不會盲目跟風" }, { "start": 1602.199, "end": 1604.02, "text": "看到別人在做 multi-agent 就跟著做" }, { "start": 1604.02, "end": 1607.16, "text": "看到別人講 fine-tuning 覺得很帥就去玩自己的模型" }, { "start": 1607.3, "end": 1608.599, "text": "所以你的下一步是什麼?" }, { "start": 1608.819, "end": 1611.199, "text": "我給你的建議是,從實作中學習" }, { "start": 1611.199, "end": 1614.02, "text": "看看你的生活上或者工作上有什麼痛點" }, { "start": 1614.099, "end": 1616.619, "text": "從痛點出發去思考解決方法" }, { "start": 1616.619, "end": 1620.1799999999998, "text": "在這個過程中你就會發現自己需要學會哪些技術" }, { "start": 1620.18, "end": 1622.979, "text": "就能夠很有效率的去規劃自己的學習路線" }, { "start": 1623.617, "end": 1625.657, "text": "我把這支影片整理成了一篇深度文章" }, { "start": 1625.677, "end": 1626.7569999999998, "text": "附帶 4 組 prompts" }, { "start": 1626.757, "end": 1628.6570000000002, "text": "幫你想清楚自己的 workflow 怎麼拆" }, { "start": 1628.717, "end": 1630.557, "text": "現有架構有沒有 over-engineering" }, { "start": 1630.557, "end": 1632.037, "text": "幫你建立 eval 系統" }, { "start": 1632.037, "end": 1633.517, "text": "以及該不該上 multi-agent" }, { "start": 1633.597, "end": 1635.617, "text": "有興趣的朋友可以在資訊欄找到連結" }, { "start": 1635.836, "end": 1637.796, "text": "那今天這支影片差不多就講到這邊" }, { "start": 1637.836, "end": 1639.076, "text": "如果你喜歡這樣的內容" }, { "start": 1639.076, "end": 1640.196, "text": "想請你幫我點個讚" }, { "start": 1640.196, "end": 1642.7369999999999, "text": "也在底下留言告訴我你們想看什麼樣的內容" }, { "start": 1642.936, "end": 1643.857, "text": "那我們下次見" } ], "source": "official_subtitle", "language": "zh-TW" }