ai-agents-for-beginners

AI 代理的上下文工程

上下文工程

(點擊上方圖片以觀看本課程影片)

了解你正在為之打造 AI 代理的應用複雜性,對於製作一個可靠的代理來說至關重要。我們需要建構能有效管理資訊以應對複雜需求的 AI 代理,而這超越了單純的提示工程。

在本課程中,我們將探討什麼是上下文工程以及它在建立 AI 代理中的角色。

介紹

本課程將涵蓋:

什麼是上下文工程,以及它與提示工程的不同之處。

有效上下文工程的策略,包括如何撰寫、選擇、壓縮及隔離資訊。

常見的上下文錯誤,會破壞你的 AI 代理,以及如何修正它們。

學習目標

完成本課程後,你將能了解如何:

定義上下文工程並區分它與提示工程的差異。

識別大型語言模型(LLM)應用中上下文的關鍵組成部分

應用撰寫、選擇、壓縮和隔離上下文的策略來提升代理表現。

辨識常見的上下文失敗如污染、分心、混淆及衝突,並實施緩解技術。

什麼是上下文工程?

對於 AI 代理來說,上下文驅動著代理規劃採取特定行動。上下文工程是確保 AI 代理擁有完成任務下一步所需正確資訊的做法。由於上下文視窗大小有限,作為代理建構者,我們需要建立系統和流程來管理在上下文視窗中新增、移除和凝縮資訊。

提示工程 vs 上下文工程

提示工程專注於一組靜態指令,用一套規則有效地引導 AI 代理。上下文工程則是管理包括初始提示在內的動態資訊集合,確保 AI 代理隨時間擁有所需的資訊。上下文工程的核心理念是使這個過程可重複且可靠。

上下文的類型

上下文類型

必須記得,上下文不只是單一事物。AI 代理所需的資訊可能來自多種不同來源,我們需要確保代理能存取這些來源:

AI 代理可能需要管理的上下文類型包括:

指令: 像是代理的「規則」——提示、系統訊息、少量示例(展示 AI 如何做某事),以及可使用工具的說明。這是提示工程與上下文工程結合的重點。

知識: 涵蓋事實、從資料庫檢索的資訊,或代理積累的長期記憶。這包括在代理需要存取不同知識庫與資料庫時,整合檢索增強生成(RAG)系統。

工具: 外部函式、API 與 MCP 伺服器的定義,代理可調用它們,以及運用後得到的回饋(結果)。

對話歷史: 與使用者持續的對話。隨著時間推移,這些對話越來越長且複雜,佔據上下文視窗空間。

使用者偏好: 隨時間了解的使用者喜好或不喜好資訊。可被存儲並在做關鍵決策時調用以協助使用者。

有效上下文工程的策略

規劃策略

上下文工程最佳實踐

良好的上下文工程起始於良好的規劃。這裡有一個方法幫助你開始思考如何應用上下文工程概念:

  1. 定義清晰結果 - AI 代理將被指派的任務結果應明確定義。回答問題:「當 AI 代理完成任務後,世界會是什麼模樣?」換句話說,使用者與 AI 代理互動後,應得到什麼樣的變化、資訊或回應。
  2. 繪製上下文地圖 - 一旦定義完 AI 代理的結果,就需要回答:「完成此任務 AI 代理需要哪些資訊?」這樣你才能開始繪製該資訊的上下文位置圖。
  3. 建立上下文管線 - 知道了資訊位置後,需要回答:「代理如何獲取這些資訊?」這可透過多種方式實現,包括 RAG、使用 MCP 伺服器及其他工具。

實務策略

規劃很重要,但當資訊開始流入代理的上下文視窗時,我們需要實際策略來管理它:

管理上下文

雖然部分資訊會自動添加到上下文視窗中,上下文工程則是更積極地管理這些資訊,以下是幾項策略:

  1. 代理便箋 讓 AI 代理在單一會話期間記錄與當前任務及使用者互動相關的重要資訊。這應存在上下文視窗外的檔案或執行時物件中,代理可在會話期間需要時檢索。

  2. 記憶 便箋適用於單次會話之外的信息管理。記憶允許代理跨會話儲存與檢索相關資訊,包括未來的摘要、使用者偏好與改進反饋。

  3. 壓縮上下文 當上下文視窗擴大接近限制時,可以使用摘要和修剪技術,包括只保留最相關資訊或刪除較舊的訊息。

  4. 多代理系統 開發多代理系統是一種上下文工程,因為每個代理都有自己的上下文視窗。如何共享並傳遞這些上下文給不同的代理,是構建這些系統時需要規劃的事項。

  5. 沙盒環境 如果代理需要執行一些程式碼或處理大量文件資訊,這會消耗大量 tokens 來處理結果。代替全部存放在上下文視窗中,代理可使用沙盒環境執行程式碼,並僅閱讀結果及其他相關資訊。

  6. 執行時狀態物件 透過建立資訊容器來管理代理在需要存取特定資訊時的情境。對於複雜任務,代理可逐步保存每個子任務的結果,讓上下文僅與該子任務保持連結。

檢查上下文

應用其中策略後,值得檢查下一次模型呼叫實際接收了什麼。有效的除錯問題是:

代理是否載入了過多上下文、錯誤的上下文,或遺漏了所需上下文?

你不必記錄原始提示、工具輸出或記憶內容即可回答此問題。在生產環境中,建議保留輕量上下文檢查記錄,涵蓋計數、ID、雜湊及政策標籤:

目標不是保留更多上下文,而是留下足夠證據,讓開發者判別使用了何種上下文策略,以及它是否以預期方式改變了下一次模型呼叫。

上下文工程範例

假設我們希望 AI 代理 「幫我預訂去巴黎的旅程。」

• 單純只用提示工程的簡單代理可能只會回應:「好的,你想什麼時候去巴黎?」 只處理使用者當下提出的直接問題。

• 採用上下文工程策略的代理會做更多事情。在回應前,它的系統可能會:

  ◦ 檢查你的行事曆以確認可用日期(即時數據檢索)。

 ◦ 回想過去的旅行偏好(從長期記憶)如你偏好的航空公司、預算,或是否偏好直飛航班。

 ◦ 辨識可用的訂票工具,包括航班和飯店預訂等。

常見上下文失敗

上下文污染

定義: 當幻覺(由 LLM 生成的錯誤資訊)或誤差進入上下文並反覆被引用,使代理追求不可能的目標或產生荒謬策略。

對策: 實施上下文驗證隔離。在將資訊添加至長期記憶前先驗證。若檢測到潛在污染,從新開上下文線程防止錯誤資訊擴散。

旅遊訂票例子: 你的代理幻覺有一條 從小型地方機場到遙遠國際城市的直飛航班,但該機場實際並無國際航班。此不存在航班細節被存入上下文。後續你要求預訂時,代理持續嘗試尋找此不可能路線的票導致連續錯誤。

解決方案: 在將航班細節加入代理工作上下文前,先用即時 API 驗證航班存在性與航線。若驗證不通過,錯誤資訊被「隔離」且不再使用。

上下文分心

定義: 當上下文太大,模型過度關注累積的歷史而非訓練中學到的資訊,導致重複或無用行為。模型甚至可能在上下文視窗未滿前就開始出錯。

對策: 使用上下文摘要。定期將累積資訊壓縮成較短摘要,保留重要細節,刪除冗餘歷史,幫助「重置」焦點。

旅遊訂票例子: 你已經討論了許多夢想旅行目的地很長時間,包含兩年前的背包旅行詳述。當你請代理 「幫我找下個月的廉價機票」,代理卻陷入舊有不相關細節,不斷問你的背包裝備或過去行程,忽視當下的請求。

解決方案: 當對話歷數或上下文過大時,代理應摘要最近且相關的對話部分—著重於當前的旅行日期和目的地—將凝縮後的摘要用於下一次 LLM 呼叫,丟棄不相關的歷史聊天。

上下文混淆

定義: 太多可用工具的多餘上下文,使模型產生錯誤回應或呼叫無關工具。較小型模型尤易受影響。

對策: 使用 RAG 技術實施工具負載管理。將工具描述存入向量資料庫,僅選擇該任務最相關的工具。研究顯示限制工具數量在 30 以下較合適。

旅遊訂票例子: 你的代理可調用數十種工具:book_flightbook_hotelrent_carfind_tourscurrency_converterweather_forecastrestaurant_reservations 等。你問:「在巴黎最方便的出行方式是什麼?」代理因工具過多混淆,嘗試在巴黎境內呼叫 book_flight,或即使你偏好公共交通仍呼叫 rent_car,因工具描述可能重疊或無法辨識最適合的工具。

解決方案: 對工具描述使用 RAG。當你詢問巴黎交通方案時,系統會動態檢索並僅呈現最相關的工具如 rent_carpublic_transport_info 給 LLM,提供更聚焦的工具集。

上下文衝突

定義: 上下文中存在矛盾資訊,導致推理不一致或產出錯誤最終回應。通常發生於資訊分階段到達,早期錯誤假設仍留存上下文中。

對策: 實施上下文修剪卸載。修剪即隨新訊息移除過時或衝突資訊;卸載則給模型一個獨立「便簽」工作區,處理資訊而不干擾主上下文。

旅遊訂票範例: 你最初告訴你的代理人,「我想搭經濟艙。」 在對話的後期,你改變主意說,「其實,這次旅行改搭商務艙。」 如果兩個指示都保留在上下文中,代理人可能會收到矛盾的搜尋結果,或不確定要優先考慮哪個偏好。

解決方案: 實施上下文修剪。當新指示與舊指示衝突時,較舊的指示會被移除或在上下文中被明確覆蓋。或者,代理人可以使用草稿板來調和矛盾的偏好後再做決定,確保只有最終、一致的指示指導其行動。

想了解更多上下文工程的問題嗎?

加入Microsoft Foundry Discord,與其他學習者交流,參加辦公時間並獲得你的 AI 代理人問題解答。

上一課

Agentic Protocols

下一課

Memory for AI Agents


免責聲明: 此文件已使用 AI 翻譯服務 Co-op Translator 進行翻譯。雖然我們努力追求準確性,但請注意自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應視為權威來源。對於關鍵資訊,建議採用專業人工翻譯。我們不對因使用此翻譯所產生的任何誤解或誤譯承擔責任。