AI 智能體到底應該如何構建?分享 Github 上收獲 4k stars 的 12 條原則
1.AI Agent 是如何走到今天的
1.1 我的觀點僅供參考
無論您是智能體領域的新手,還是像我這樣固執的老兵,我都將試圖說服您摒棄對 AI Agent 的大部分固有認知,退一步,從第一性原理(first principles)出發重新思考它們。(如果你錯過了不久前 OpenAI 發布的內容,這里有個劇透預警:把更多智能體邏輯塞進 API 后面并非正解)
2.智能體本質上是軟件,讓我們簡要追溯其發展歷程
讓我們回溯智能體的發展脈絡。
2.1 60 年前
這個階段重點探討的是有向圖(DGs)及其無環版本 —— 有向無環圖(DAGs)。首先要指出的是...軟件本質上就是有向圖。這就是為什么我們過去常用流程圖表示程序的原因。
image.png
2.2 20 年前
約 20 年前,DAG 編排工具開始流行。我們開始談論 Airflow[1]、Prefect[2] 等經典工具,以及它們的前輩,還有 dagster[3]、inggest[4]、windmill[5] 等新秀。這些編排工具沿用了相同的圖模式,同時增加了可觀測性(observability)、模塊化(modularity)、重試機制(retries)、管理界面(administration)等功能優勢。
image.png
2.3 10-15 年前
當機器學習模型開始展現出實用價值時,我們開始看到融入 ML 模型的 DAG 工作流。一些典型的步驟可能包括“將此列中的文本匯總到一個新列中”或“按嚴重程度/情感對支持工單進行分類”。
image.png
但歸根結底,這些軟件在很大程度上還是確定性軟件(deterministic software)。
2.4 智能體技術帶來的根本性變革
我并非第一個提出此觀點[6]的人,但當我開始研究智能體時,最深刻的領悟是:你可以徹底摒棄 DAG 架構。無需軟件工程師針對每個步驟和邊界條件進行編碼,只需賦予智能體一個目標和一組狀態轉移規則:
image.png
讓 LLM 實時做出決策,找出路徑。
image.png
這樣做的好處是可以減少代碼編寫量。你只需為 LLM 定義圖的"邊",由其自主推導"節點"。借此,系統可具備錯誤自恢復能力,大幅減少代碼量,甚至可能發現 LLM 獨創的問題解決方案。
2.5 智能體(Agents)的核心運行機制是一個循環體系
換個角度看,這是一個包含 3 個步驟的循環體系:
1)LLM 通過結構化 JSON 輸出確定工作流的下一步("工具調用")
2)由確定性代碼執行工具調用
3)將工具運行結果追加至上下文窗口
4)不斷循環直至判定下一步為"完成"狀態
image.png
初始上下文僅是起始事件(可能是用戶消息、定時觸發任務或 webhook 等),然后我們要求 LLM 選擇下一步(工具)或判斷任務是否完成。
下面是一個多步驟示例:
image.png
而生成的“materialized” DAG 結構示例如下:
image.png
2.6 “循環往復,直至問題解決”模式的缺陷
該模式最顯著的弊端:
- 當上下文窗口過長時,智能體會迷失方向,他們陷入反復嘗試同一種錯誤方法的循環
- 字面意思就是這樣,僅此一項就足以使該方法失效
即使你沒有手動構建過智能體,在使用自動化編程工具時也應當遭遇過這種長上下文問題。系統往往在多次交互后陷入混亂,迫使您重啟對話。
我還想提出一個我經常聽到的觀點,你可能已深有體會:
即使模型支持的上下文窗口越來越大,精準、簡潔的提示詞始終能獲得更優的結果
與我交流過的多數開發者都放棄了"工具調用循環(tool calling loop)"方案,皆因發現超過 10-20 次交互后,LLM 便無法恢復任務狀態。即便智能體準確率達 90%,這仍與"可交付客戶使用"的標準相去甚遠。試想一個網頁應用若在 10% 的訪問中崩潰,會是一種怎樣的用戶體驗?
2.7 真正有效的方法 —— 微智能體(micro agents)
我在實際應用中觀察到一種比較常見的方法,使用智能體架構并將其嵌入到更宏觀的、更具確定性的有向無環圖(DAG)系統中。
image.png
您可能會問:"為什么在這種情況下還要使用智能體?"我們稍后會詳細解釋。簡而言之,讓語言模型管理限定范圍明確的任務集合,可以輕松整合實時的人類反饋,并將這些反饋轉化為工作流步驟,而不會陷入上下文錯誤循環(即后文所提到的 factor 1、factor 3、factor 7)。
2.8 現實生活中的微智能體案例
下面這個示例展示了如何使用確定性代碼運行微智能體,處理部署過程中的人工介入步驟:
image.png
- 人工將 PR 合并到 GitHub 主分支
- 使用確定性代碼將修改后的項目部署到預發布環境
- 使用確定性代碼運行預發布環境的端到端(e2e)測試
- 使用確定性代碼將初始上下文"將 SHA 4af9ec0 部署到生產環境"移交智能體進行生產環境的部署
- 智能體調用 deploy_frontend_to_prod(4af9ec0)
- 使用確定性代碼請求人工批準此操作
- 人工拒絕操作并反饋"能否先部署后端部分?"
- 智能體調用 deploy_backend_to_prod(4af9ec0)
- 使用確定性代碼請求人工批準此操作
- 人工批準進行操作
- 使用確定性代碼執行后端部分的部署
- 智能體調用 deploy_frontend_to_prod(4af9ec0)
- 使用確定性代碼請求人工批準此操作
- 人工批準進行操作
- 使用確定性代碼執行前端部分的部署
- 智能體判定任務成功完成,流程結束!
- 使用確定性代碼運行生產環境的端到端測試
- 確定性代碼任務完成后,若檢測到異常,則轉交回滾智能體進行故障審查,必要時執行版本回退
image.png
這個示例基于我們為管理 Humanlayer 的部署流程而部署的一個開源智能體(OSS agent),以下是我上周與它的真實對話記錄:
image.png
我們沒有讓這個智能體擁有過多的功能或復雜的職責。LLM 的核心價值在于解析人類的自然語言反饋,并提出更新的行動方案。我們盡可能避免讓它同時處理過多無關的任務或記憶冗長的歷史記錄,使 LLM 專注于 5-10 步的小型工作流。
這里有另一個更經典的客戶支持/ chatbot 示例[7]。
2.9 那么,智能體的本質究竟是什么?
prompt - 告訴 LLM 如何行動,以及它可以使用哪些“工具”。prompt 的輸出是一個 JSON 對象,用于描述工作流程中的下一步("工具調用"或"函數調用")。(factor 2)
switch 語句 - 根據 LLM 返回的 JSON 內容決定后續操作。(factor 8 的一部分)
累積的上下文 - 記錄已執行的操作步驟及其運行結果(factor 3)
for 循環 - 循環執行以下操作,直至大語言模型(LLM)返回終止信號(如標記為"Terminal"的工具調用或自然語言響應):將 switch 語句的執行結果加入上下文窗口,并讓 LLM 決定下一步動作。(factor 8)
image.png
以“deploybot”為例,我們通過自主掌控流程邏輯和上下文積累,獲得了以下優勢:
- 在 switch 語句和 for 循環中,我們可以隨時攔截控制流來暫停等待人工輸入,或等待長時間運行的任務完成
- 我們能將上下文窗口輕松序列化存儲,實現「斷點續傳」式的任務暫停與恢復
- 在 prompt 的設計中,我們可以優化任務指令的傳遞方式和“當前任務進度”的說明方式
3.factor 01:自然語言轉工具調用(Tool Calls)
智能體(agent)構建最常見的模式之一就是將自然語言轉換為結構化的工具調用。這是一種功能強大的模式,可以構建能夠推理任務并執行任務的智能體。
image.png
這種模式的核心原理,就是實現從自然語言到結構化指令的精準轉換:
請為 Terri 生成 750 美元的贊助支付鏈接,用于支付二月份 AI 創客大會的贊助費用。
最終輸出一個結構化對象,用于描述 Stripe API 的調用參數,例如:
image.png
注:實際場景中 Stripe API 的調用更為復雜。一個成熟的智能體需要先獲取客戶列表、產品目錄和價目表等數據,通過關聯 ID 構建有效請求參數 —— 當然,這些 ID 也可以直接預置在提示詞/上下文窗口中(本質上這兩種方式是相通的,下文將具體說明)。
后續可由確定性代碼接管該請求參數,并執行相應的業務邏輯。(更多細節將在 factor 3 中說明)
image.png
請注意:完整版的智能體在接收到 API 的調用結果后,會通過循環處理機制最終返回類似這樣的信息:
已成功為 Terri 創建 750 美元的支付鏈接,用于贊助二月份 AI 創客見面會。鏈接如下:https://buy.stripe.com/test_1234567890
但本節將跳過該環節,將其保留至后續章節實現 —— 開發者可根據實際需求決定是否集成該功能。
4.factor 02:自主掌控提示詞
不要直接套用框架自動生成的提示詞。
image.png
某些框架會提供這種‘黑箱式’方案:
image.png
這種方案能幫你快速套用頂尖的提示詞模板上手,但后期很難精準調整或實施逆向工程,難以確保模型接收的指令完全符合預期。
相反,你要像對待核心業務代碼一樣對待提示詞:
image.png
雖然上面這個示例是用 BAML 工具生成提示詞的,但其實你可以根據自己的需求選擇任何提示詞設計工具,甚至完全不需要借助工具,直接按照模板格式手動編寫提示詞也是可行的。
自主掌控提示詞的核心優勢:
- 完全的控制權:可以精準定制 AI Agent 所需的指令,徹底擺脫“黑箱操作”的束縛
- 可測試和可評估:像測試普通代碼一樣,為你的提示詞建立完整的測試評估體系
- 快速迭代:根據實際使用效果,隨時靈活調整優化提示詞
- 透明可控:清楚掌握 AI Agent 執行的具體指令內容,沒有隱藏邏輯
- 角色突破:利用那些支持自定義用戶/助手角色設定的 API 接口 —— 比如 OpenAI 已棄用的舊版 'completions' 非對話型 API,甚至可以實現一些特殊的模型引導技巧
請記住:提示詞(prompts)是連接你的業務邏輯與大語言模型的主要接口。
完全掌控提示詞,才能提供生產級 AI Agent 所需的靈活性和提示詞控制能力。
雖然沒人能斷言什么是最佳提示詞,但有一點很明確 —— 你需要的是能自由嘗試各種可能性。
5.factor 03:自主掌控上下文窗口
與大語言模型交互時,上下文傳遞不必拘泥于標準消息格式。
在智能體(agent)中,每次向 LLM 提供輸入的實質是:“這是目前情況,接下來該干嘛?”
一切皆上下文工程。大語言模型本質上是無狀態函數(stateless functions)[8],只負責將輸入轉化為輸出。想要獲得優質輸出,就必須提供優質輸入。
構建優質上下文需包含以下要素:
- 提示詞與指令:給模型的明確操作指引
- 外部數據源:檢索到的文檔或知識(例如使用 RAG 技術)
- 歷史狀態:過往的工具調用記錄、執行結果等操作痕跡
- 記憶系統:有關聯但獨立的對話/事件歷史記錄(Memory)
- 輸出結構化指令:規定模型返回數據的格式規范
image.png
本指南聚焦如何最大限度挖掘現有模型的潛力,以下內容不在討論范圍內:
- 調整模型參數(如 temperature、top_p、frequency_penalty、presence_penalty 等)
- 訓練自定義的生成模型(completion models)或嵌入模型
- 對現有模型進行微調
在此重申:雖然無法斷言最佳的上下文傳遞方式,但我知道你希望能夠靈活地嘗試各種方式。
4.1 標準上下文格式與自定義上下文格式
大多數 LLM 客戶端采用如下這種標準消息格式:
image.png
雖然這種格式適用于大多數場景,但若想極致壓榨現有 LLM 的性能,就必須以最高效的 token 利用率和注意力分配機制來傳遞上下文。
若希望突破基于消息的標準格式限制,您可以創建專為你個人的應用場景優化的上下文組織形式。例如,通過自定義數據結構將相關內容整合,根據實際需求打包或拆分到一個或多個用戶、系統、助手或工具消息中(具體組合視業務邏輯而定)。
以下示例演示了如何將完整的上下文信息封裝于單條用戶消息中:
image.png
雖然模型可能通過你提供的工具定義自動推導后續操作步驟,但我們仍建議在提示詞模板中明確聲明任務目標 —— 主動說明需求始終是更穩妥的做法。
4.2 code example
我們可以采用如下方式構建:
image.png
上下文窗口示例
下面是使用這種方法后上下文窗口的樣子:
初始的 Slack 請求:
image.png
列出 Git 標簽后:
image.png
錯誤發生與恢復后:
image.png
此時你的下一步可能是:
image.png
image.png
上文那些 XML 格式的內容僅是一個參考示例 —— 您可以根據實際業務需求,自定義最合適的數據結構。通過靈活嘗試不同的上下文組織形式、存儲內容和輸入大模型的內容,最終輸出質量會顯著提升。
自主控制上下文窗口的好處:
- 信息密度:以最適配 LLM 認知的方式組織信息
- 錯誤處理:采用有助于 LLM 自主恢復的格式記錄錯誤信息(已修復的錯誤和失敗調用可從上下文中移除)
- 安全性:主動過濾敏感數據,精準控制輸入內容
- 靈活性:根據使用情況持續優化調整上下文格式
- token 效率:優化上下文格式,提高 token 效率與模型理解能力
上下文可包含: 提示詞(prompts)、指令(instructions)、RAG 文檔(RAG documents)、交互歷史(history)、工具調用記錄(tool calls)、記憶(memory)
請記住,上下文窗口是你與 LLM 交互的主要界面,其結構設計與信息呈現方式將直接決定智能體的效能。
示例 - 信息密度優化(相同的語義信息,更少的 token 消耗量):
image.png
雖然無法預知最優方案,但必須確保系統具備無限試錯的可能性——任何可能的嘗試路徑都應向你開放。
6.factor 04:「工具」本質上只是 LLM 生成的結構化輸出
「工具」無需進行復雜設計。其本質是大語言模型生成的結構化輸出,用于觸發確定性代碼的執行。
image.png
以 CreateIssue 和 SearchIssues 這兩個工具為例,讓大模型(LLM)“調用工具”,本質上就是讓它輸出一個可解析的 JSON 對象,該對象對應我們要執行的具體工具操作。
這種模式很簡單:
1)LLM 生成結構化的 JSON 輸出
2)使用確定性代碼執行對應操作(如調用外部 API)
3)捕獲執行結果并反饋到上下文中
這種設計實現了 LLM 決策邏輯與應用程序執行邏輯的清晰分離 —— LLM 負責決定『做什么』,而你的代碼掌控『怎么做』。即便 LLM 調用了某個工具,具體執行方式也不必每次都嚴格對應單一函數。
如果你還記得前文提及的 switch 語句。
image.png
注:關于“plain prompting" vs. "tool calling" vs. "JSON mode”的性能權衡已有諸多討論。在此附上相關資源鏈接(參見《Prompting vs JSON Mode vs Function Calling vs Constrained Generation vs SAP》[9]、《When should I use function calling, structured outputs, or JSON mode?》[10]及《OpenAI JSON vs Function Calling》[11]),此處不展開論述。
所謂的"下一步操作"未必只是簡單地"運行一個純函數并返回結果"。當你把"工具調用"單純視為模型輸出的一段 JSON 指令(用于描述確定性代碼該執行什么)時,就能解鎖極大的靈活性。結合 factor 08 ,這種設計將帶來更強大的可能性。
7.factor 05:執行狀態與業務狀態的統一
即便在 AI 領域之外,許多基礎設施系統也試圖將“執行狀態”與“業務狀態”分離。對 AI 應用而言,這種分離可能涉及復雜的抽象機制來追蹤當前步驟、下一步驟、等待狀態、重試次數等。這種分離帶來的復雜性可能是值得的,但對你的使用場景而言可能是過度設計。
你可以自行決定什么最適合你的應用。但不要認為必須將這兩者分開管理。
更清晰的定義:
- 執行狀態(Execution state):當前步驟、下一步驟、等待狀態、重試次數等
- 業務狀態(Business state):智能體工作流中已發生的事件(如 OpenAI 消息列表、工具調用及結果列表等)
如果可能,盡量簡化 —— 盡可能將它們統一起來。
image.png
實際上,你可以通過工程化設計,直接從上下文窗口推斷所有執行狀態。多數情況下,執行狀態(當前步驟、等待狀態等)不過是已發生事件的元數據(metadata)。
當然,有些內容無法放入上下文窗口(如會話 ID、密碼上下文等),但你的目標應該是盡量減少這類例外。通過遵循 factor 3,你可以精準控制哪些信息真正輸入給 LLM。
該方法具有以下優勢:
- 簡潔性:所有狀態只有一個真實來源
- 序列化:工作流可輕松實現序列化/反序列化
- 調試便捷:完整的歷史記錄一目了然
- 擴展靈活:僅需新增事件類型即可擴展新的狀態
- 斷點續傳:通過加載工作流可從任意節點恢復執行
- 流程復刻(Forking):可以在任何時間點復制工作流子集至新上下文/狀態ID,實現在工作流的復刻(fork)
- 人機交互和可觀測性:工作流可輕松轉換為 Markdown 文檔或可視化 Web 界面
8.factor 06:通過簡單的 API 實現啟動/暫停/恢復
智能體的本質是程序,其生命周期管理應符合我們對常規程序的預期 —— 能夠便捷地啟動、查詢、恢復和終止。
image.png
需確保終端用戶、應用程序、業務管道及其他智能體均可通過輕量級 API 接口快速部署新智能體實例。
智能體及其編排的確定性代碼須具備長時操作自暫停能力。
需支持通過 Webhook 等外部觸發器實現智能體斷點續執,且無需深度對接智能體編排系統。
factor 6 與 factor 5 和 factor 8 存在較強的關聯,但可獨立實現。
需特別注意,多數現有的 AI 編排系統雖支持暫停恢復功能,但在『工具選定』與『工具執行』兩個狀態節點之間的臨界區間,多數系統無法保持狀態持久化能力(詳見 factor 7 和 factor 11 的技術解析)。
9.factor 07:通過工具調用實現人機協同
默認情況下,LLM API 在生成模型響應時,首先會面臨一個關鍵的、高風險的詞元選擇:是返回純文本內容,還是返回結構化數據?
image.png
系統將大量決策權重放在首個詞元的選擇上。例如在查詢“東京天氣”時,首個詞元可能是:
"東京"
而在 fetch_weather(獲取天氣)功能中,則可能是表示 JSON 對象開頭的特殊詞元。
|JSON>
更優方案是讓大語言模型始終輸出 JSON 結構化數據,然后通過自然語言詞元(如 request_human_input 或 done_for_now)來聲明意圖,而不是使用像 check_weather_in_city 這樣的"標準"工具。
需特別注意:此方案可能不會直接提升系統性能指標,但必須通過持續實驗驗證 —— 工程師應保留嘗試非常規手段的自由度,這是獲得最優解的必經之路。
image.png
后續,您可能會收到來自處理 Slack、電子郵件、短信或其他事件的系統的 webhook 通知。
image.png
上文整合了 factor 3、4、5、8 的方案特征。
若采用 factor 3 中的類 XML 格式,那么經過數次交互后,上下文窗口可能會是這樣的:
image.png
優勢亮點:
- 清晰的指令:針對不同人機交互場景的工具設計,可大幅提升大語言模型(LLM)輸出的精準度。
- 內循環與外循環機制:該機制使智能體工作流突破傳統 ChatGPT 式交互框架,支持逆向流程觸發 —— 控制流與上下文初始化可由智能體主動發起至用戶(例如:通過定時任務或事件自動激活的智能體服務)。
- 多用戶協同:依托結構化事件機制,可高效追蹤并協調多用戶輸入數據流。
- 多智能體協作:通過輕量級抽象層設計,快速擴展智能體間的請求與響應能力
- 持久化運行:結合 factor 6 的啟停控制能力,可構建高穩定、可觀測的多角色持久化工作流。
有關外循環智能體(Outer Loop Agents)的更多信息,請點擊此處[12]。
image.png
與 factor 11 完美結合 —— 隨時隨地觸發,滿足用戶需求。
10.factor 08:掌控你的控制流
如果你能掌握你的控制流,就可以實現更靈活、強大的功能。
image.png
根據具體應用場景構建專屬控制邏輯,精準匹配業務場景。當特定類型的工具調用需要中斷循環等待人工響應或長時任務(如訓練流水線)時,您可設計靈活的中斷機制。建議集成以下自定義功能:
- 工具調用結果的摘要與緩存
- 使用 LLM 對結構化輸出進行校驗、評估
- 上下文窗口壓縮或其他內存管理方案
- 全鏈路日志追蹤與性能監控
- 客戶端速率限制策略
- 持久化的休眠/暫停/事件等待機制
下方示例展示了三種典型的控制流模式:
- request_clarification:模型請求補充信息時,中斷當前循環流程,等待人工響應
- fetch_git_tags:當模型請求 Git 標簽列表時,系統會實時獲取標簽數據并更新上下文,直接將結果反饋給模型
- deploy_backend:模型發起后端部署請求時,因涉及高風險操作,中斷流程等待人工審核確認
image.png
這種模式允許你根據需要中斷和恢復智能體的工作流程,從而創建更自然的對話和工作流。
舉個例子,我對所有 AI 框架的首要功能需求就是:正在工作的智能體能夠中斷操作并在之后恢復運行,特別是在工具選擇和工具調用之間的時刻。
如果缺乏這種可恢復性/精細控制能力,就無法在工具調用執行前進行審核(review/approve),這意味著您被迫只能選擇以下方案:
1)在等待長時間任務完成時,將任務及其上下文狀態(變量、堆棧等)保留在內存中(類似while...sleep),如果進程中斷則必須從頭開始
2)限制智能體只能執行低風險、低影響的調用,如研究和摘要
3)允許智能體執行更重要、更有用的操作,然后只能祈禱它不會搞砸
您可能會注意到,這一點與 factor 5 及 factor 6 密切相關,但也可以獨立實現。
11.factor 09:將錯誤信息壓縮至上下文窗口
這一點雖然簡短,但值得一提。智能體的優勢之一在于“自我修復”——對于短任務,大語言模型(LLM)可能會調用某個失敗的工具。優秀的 LLM 通常能夠讀取錯誤信息或 Stack Trace 信息,并在后續工具調用中調整策略。
大多數框架已實現這一功能,但你也可以只做到這一點,而無需實現其他 11 個 factor。例如:
image.png
你可能需要為特定的工具調用實現一個錯誤計數器(errorCounter),將單個工具的重試次數限制在 ~ 3次以內,或者根據實際需求調整業務邏輯。
image.png
當連續錯誤次數達到某個閾值時,無論是模型自主決策還是通過預編程規則強制接管控制流,都可以選擇升級至人工處理。
優勢:
- 自我修復能力:大語言模型能夠解讀錯誤信息,并在后續工具調用中自動調整執行策略
- 持久運行機制:單一工具調用失敗不會導致系統中斷,智能體程序可持續執行任務
需要提醒的是,智能體過度依賴這種自我修復機制時,可能導致智能體在錯誤處理過程中無法有效突破現有邏輯框架,出現反復報錯的情況。
此時,factor 8 和 factor 3 就派上用場了 —— 你不必直接把原始錯誤丟回給系統,而是重構錯誤表達方式、從上下文窗口移除冗余的歷史記錄,避免干擾后續決策,或者采用其他有效的確定性策略(只要能確保智能體程序回歸正軌)。
防范陷入錯誤循環的最核心策略,是遵循 factor 10。
12.factor 10:小型化、功能聚焦的智能體
與其構建試圖包辦一切的大型智能體,不如開發專注于某一單一功能的小型智能體。智能體只是一個更大的、主要由確定性因素決定的系統中的基礎組件之一。
image.png
這里的關鍵之處在于大語言模型(LLM)的局限性:任務越龐大復雜,所需任務步驟就越多,就意味著需要更長的上下文窗口。隨著上下文增長,大語言模型更容易迷失方向或偏離重點。通過將智能體的功能限定在特定領域(3-10 個步驟,最多 20 個任務步驟),我們可以保持上下文窗口的可管理性,確保大語言模型的高效運行。
小型化、功能聚焦的智能體的優勢:
1)可管理的上下文:更小的上下文窗口意味著更優的大語言模型表現
2)職責明確:每個智能體都有清晰的功能邊界和設計目標
3)可靠性更高:在復雜的工作流程中迷失方向的可能性更低
4)更易于測試:更簡單地測試和驗證特定功能
5)調試優化:問題發生時更容易定位和修復
12.1 如果 LLM 變得更聰明了呢?
如果大語言模型的智能程度足夠高,能處理 100+ 步驟的工作流,我們還需要這種設計嗎?
tl;dr:需要。雖然智能體和大模型進步后可能自然而然地擁有處理更長上下文的能力,這意味著能處理更多更大的 DAG。但采用小型化、功能聚焦的架構設計,既能確保你在第一時間獲得可靠的結果,又為未來大模型的上下文窗口擴容時逐步擴展智能體范圍做好準備。(如果你重構過大型的確定性代碼庫,此刻應該會心一笑)
image.png
有意識地確定智能體的規模/范圍,并且只在能夠保證質量的情況下擴展,這是關鍵所在。正如 NotebookLM 開發團隊所言[13]:
"在 AI 開發中,那些最驚艷的突破時刻往往發生在我將將觸及模型能力邊界的時候"
無論這個能力邊界在哪里,如果你能找到邊界并始終如一地把握住它,你就能打造出驚艷的用戶體驗。這個領域有很多技術護城河可以構建,但一如既往,這需要嚴謹的工程實踐。
13.factor 11:智能體系統支持多入口觸發,且響應與觸發渠道保持一致
當您已落實 factor 6 和 factor 7 后,便可無縫集成本原則方案。
image.png
支持用戶通過 Slack、郵件、短信等任意渠道喚醒智能體,并確保響應始終在原對話流中完成。
優勢:
- 滿足用戶需求:打造擬人化的 AI 應用體驗,讓用戶感受如真人協作或至少達到數字同事般的自然交互
- 外循環智能體:支持非人工觸發(系統事件/定時任務/故障告警等),可自主運行5-90分鐘,關鍵決策節點自動請求人工介入(需審批/獲取反饋/請求協助)
- 高風險操作授權機制:通過快速人工復核機制,可授權智能體執行高風險操作(如外發郵件、生產數據更新等)。明確、標準化的管控體系既保障操作可追溯,又能提升智能體執行復雜任務的可靠性。
14.factor 12:將智能體設計為符合“無狀態歸約器”模式
image.png
image.png
文中多次強調“沒人知道什么是最佳實踐,但必須保留試錯自由”。你最近在 AI Agent 項目中做過哪些不符常規但有效的技術決策?
文中鏈接
[1]https://airflow.apache.org/
[2]https://www.prefect.io/
[3]https://dagster.io/
[4]https://www.inngest.com/
[5]https://www.windmill.dev/
[6]https://youtu.be/Dc99-zTMyMg?si=bcT0hIwWij2mR-40&t=73
[7]https://x.com/chainlit_io/status/1858613325921480922
[8]https://thedataexchange.media/baml-revolution-in-ai-engineering/
[9]https://www.boundaryml.com/blog/schema-aligned-parsing
[10]https://www.vellum.ai/blog/when-should-i-use-function-calling-structured-outputs-or-json-mode#:~:text=We+don%27t+recommend+using+JSON,always+use+Structured+Outputs+instead
[11]https://docs.llamaindex.ai/en/stable/examples/llm/openai_json_vs_function_calling/
[12]https://theouterloop.substack.com/p/openais-realtime-api-is-a-step-towards
[13]https://open.substack.com/pub/swyx/p/notebooklm?selectinotallow=08e1187c-cfee-4c63-93c9-71216640a5f8&utm_campaign=post-share-selection&utm_medium=web