使用 AI 時,我們已經熟悉一些提示原則:說清楚任務、提供必要背景、指定輸出格式,需要時再附上範例。

但當 AI 開始處理真實工作,光是把要求寫清楚,還有一些問題沒有解決。

請它回答產品問題,它需要找到適用的文件;請它修改程式,它需要讀取相關檔案與專案規則;請它接續一項長任務,它需要知道哪些步驟已經完成、哪些問題仍未解決。

這些資訊從哪裡取得?哪些應該現在提供,哪些等需要時再查?當文件更新、工具回傳結果、工作進度改變,下一輪又該帶入什麼?

上下文工程(Context Engineering)處理的,就是模型執行任務時,這些資訊如何被準備、組織與持續更新。

提示工程(Prompt Engineering)仍然是其中的重要部分。當任務從一次回答延伸到多個步驟,需要設計的範圍也隨之包含資料取得、工具介面、記憶與工作狀態。

模型每一輪收到的,不只有你的問題

一次模型呼叫,可能同時包含任務指令、對話紀錄、取回的文件、工具說明,以及前一步的執行結果。這些內容共同構成本輪上下文(Context)。

例如,客服 AI 收到「這筆訂單可以退貨嗎?」時,光有「請根據公司政策回答」這項指令仍然不足。它可能還需要:

  • 訂單日期
  • 商品類型
  • 適用地區
  • 對應版本的退貨政策

這裡有個重要區別:系統擁有的資料,與模型這一輪收到的資料,往往不是同一批。

訂單存在資料庫裡,仍需要查詢;政策放在知識庫裡,仍需要檢索;過去對話即使已經保存,也未必會完整帶入下一次呼叫。

因此,上下文工程要管理兩件事:

  1. 資訊如何保存。
  2. 每一步如何選出需要的內容。

它既適用於單次問答,也適用於多步驟的 AI 代理(AI Agent)。前者可能只需要妥善組合指令與資料;後者還需要隨著工作進展,反覆更新上下文。

本文討論的是模型執行任務時的資訊設計。模型訓練與微調(Fine-tuning),則屬於改變模型參數的另一種途徑。

上下文工程包含哪些技術?

上下文工程涵蓋多種技術。它們分別處理資訊的取得、組織、保存與使用,不需要每個系統全部採用。

設計工作 對應技術與方法 具體作用
設計指令與示例 提示模板、動態指令、少樣本提示、示例檢索 依任務提供規則,挑選適合的參考範例
取得外部知識 RAG、混合檢索、重排序、中繼資料過濾 找出相關內容,再依版本、日期或適用範圍篩選
管理對話與工作狀態 對話歷史選取、結構化狀態、檢查點 保存進度與已確認事項,決定哪些狀態要提供給下一輪模型
建立跨任務記憶 記憶擷取、持久化儲存、記憶檢索、更新與失效處理 保存值得延續的資訊,需要時取回,並處理過期或衝突內容
設計工具使用介面 工具呼叫、工具結構定義、動態工具選取、結果過濾與分頁 讓模型知道工具怎麼用,並取得足以支持下一步的結果
控制上下文容量 Token 預算、歷史裁剪、上下文壓縮、外部保存、按需讀取 控制每輪輸入量,保留必要資訊及回查途徑
隔離不同工作的上下文 子代理、獨立工作階段、狀態分區、執行環境隔離 讓不同工作分別處理細節,只交換需要的結果

其中有些是通用工程方法,名稱也可能因框架而異。這張表是理解範疇的地圖,不是一套統一標準。

這些方法經常一起使用。例如,檢索先找出候選文件,重排序挑選較相關的段落,Token 預算再限制本輪帶入的內容量。Token 是模型處理內容的計量單位,不直接等同於字數。

技術之間如何配合,取決於這一步要完成什麼判斷。

資料存在,為什麼還是答錯?

回到退貨問題。客服 AI 答錯,可能有幾種不同原因:

  • 必要的政策文件沒有被收錄。
  • 文件存在,但這次搜尋沒有找到。
  • 找到了相關文件,卻選到不適用的版本。
  • 取回內容正確,但整理時刪掉重要條件。
  • 條件已經完整提供,模型仍然理解錯誤。

這些問題需要不同的修正。補資料無法解決所有搜尋問題,改善搜尋也無法保證模型正確解讀。

例如,文件片段寫著「購買後三十天內可退貨」,但完整政策還包含商品類別與地區限制。若只保留這句話,模型就缺少判斷例外所需的資訊。

這時,中繼資料可以協助保留文件日期、版本與適用範圍;檢索時也能利用這些欄位過濾。若問題包含精確的商品代碼,混合檢索可以同時利用關鍵字比對與語意相似度;候選內容太多,再透過重排序縮小範圍。

排查時,可以沿著以下路徑逐段檢查:

系統擁有的資料 → 取回的資料 → 實際提供給模型的內容 → 最後回答

從系統資料、取回資料、模型上下文到最後答案的檢查流程

最先要確認的是:足以支持正確答案的證據,有沒有真正進入本輪輸入。

工具怎麼設計,也會改變模型看到的資訊

工具不只是讓 AI 多一項能力,也決定它如何取得新資訊。

模型通常透過工具的名稱、用途說明與參數定義,判斷何時呼叫。周邊系統執行工具後,再將結果提供給模型,成為下一步判斷的依據。

例如,找一位聯絡人時,工具若回傳整本通訊錄,模型就必須處理大量無關內容。若工具能依姓名搜尋,再回傳必要欄位,資訊就更貼近任務。

不過,精簡也不能只看字數。如果後續查詢需要聯絡人編號,就不能因為編號難讀而刪除。若工具只回傳部分結果,也應讓模型知道還有後續頁面。

工具介面需要說清楚三件事:

1. 什麼時候用

說明用途與適用情況。

2. 怎麼呼叫

定義必要參數、格式與限制。

3. 如何解讀結果

解釋內容代表什麼、是否完整,以及能否繼續查詢。

工具很多時,還可以依任務階段選擇提供哪些工具。查詢進度與提交修改是不同工作,模型不一定需要在每一輪都看到所有操作選項。

哪些先提供,哪些需要時再讀?

如果資料很少,而且確定會用到,直接提供通常最簡單。當資料量大,或需求會隨任務進展改變,就可以考慮按需讀取。

程式代理的工作很適合說明這個差別:專案規則可以預先提供;至於哪個檔案、哪段程式需要閱讀,再根據當下問題搜尋。

大型搜尋結果也可以保存在外部檔案,之後再讀取相關部分。原始資料仍然存在,但不必每一輪都完整帶入。

安排方式 適合的情況 主要代價
預先提供 資料少,而且確定會用到 不相關內容也可能持續占用上下文
按需讀取 資料多,下一步需求尚未確定 增加查詢時間,也可能漏查
混合使用 固定規則與動態資料並存 需要決定預載與查詢的界線

按需讀取的關鍵,是保留可找到資料的線索,例如檔案位置、文件名稱或查詢條件。只把內容移出去,卻沒有留下取回方法,後續工作就難以使用它。

長任務需要整理,也需要交接

隨著對話與工具呼叫增加,上下文會累積。較大的上下文視窗(Context Window)能容納更多內容,但不會自動消除版本衝突、重複資訊與過期決策。

這時,可以根據問題採取不同做法。

壓縮歷史,保留後續需要的判斷依據

假設程式代理嘗試過多個修正方案,下一輪可能需要的是目前採用的方案、選擇理由、未解問題與測試結果,而不是所有重複輸出。

若摘要只留下「採用方案 B」,卻刪掉方案 A 失敗的原因,後續仍可能重走同一條路。壓縮品質要看必要資訊是否保留,而不是只看縮短多少。

保存工作狀態,讓任務能夠接續

進度、完成項目與待辦事項,可以保存成結構化狀態;需要恢復工作時,再由檢查點載入。值得跨任務延續的偏好或知識,則可以另存為記憶,依需要取回。

這也說明了狀態與記憶的差異:前者常描述「這項工作現在進行到哪裡」,後者則可能在未來不同工作中仍然有用。

兩者都需要更新。過期目標或錯誤筆記一旦反覆被讀取,也可能持續影響後續判斷。

分開處理可以獨立完成的工作

研究任務可以由不同子代理各自探索,再交回必要結果。這能減少單一代理需要處理的細節,但也增加成本與交接風險。

若子任務高度相依,需要頻繁交換大量資訊,分開處理就未必划算。執行環境隔離也不會自動帶來上下文隔離;還要決定哪些結果應該回傳給模型。

怎麼知道上下文設計有沒有改善?

先選一組有明確判定依據的任務,保留問題、取回資料、模型輸入、工具結果與最後回答,再比較修改前後的差異。

以退貨問答為例,可以檢查:

  • 是否使用適用的政策版本?
  • 是否保留商品與地區限制?
  • 資料不足時,是否詢問或明確說明?
  • 是否能指出回答的依據?
  • 是否增加不必要的查詢、等待時間與用量?

比較時,盡量固定模型與其他設定,先改一項策略,才能更清楚地判斷效果。

例如,工具結果縮短後用量降低了,但模型無法再取得查證所需的編號,就不能只看成本下降便認定成功。上下文設計要同時評估任務成果與使用代價。

提示寫清楚之後,下一步要問什麼?

提示寫清楚之後,下一個值得檢查的問題就是:

模型這一步需要知道什麼,而系統實際提供了什麼?

沿著兩者之間的差異,才能決定應該補資料、改搜尋、調整工具,還是重新整理工作狀態。

參考資料

本文依公開文章與官方文件整理。通用情境經改寫,產品案例依來源描述,未自行進行成效實測。