最近在做Deepresearch以及刷到一個不錯的文章:context-engineering-guide ,這篇文章揭示了提示工程以及上下文過程在智能體應用開源流程中,包括Deepresearch,MCP在內的一些概念,起到了非常重要的作用!
Context Engineering與Prompt Engineering的關系與區別
在深入探討Context Engineering之前,我們需要理解它與Prompt Engineering的關系。傳統的Prompt Engineering主要關注如何設計和優化單次的提示指令,讓AI模型更好地理解用戶意圖并產生期望的輸出。這就像是學會如何向一個專家提出精確的問題,通過精心設計的問題描述、示例和格式要求來獲得高質量的回答。
而Context Engineering則是一個更加寬泛和系統性的概念,它不僅包含了Prompt Engineering的所有技巧,還擴展到了整個AI系統的上下文管理。如果說Prompt Engineering是"問話的藝術",那么Context Engineering就是"環境構建的科學"。它關注的是如何為AI系統提供完整的工作環境,包括背景知識、歷史記錄、工具調用、數據檢索等各個方面,讓AI在這個精心構建的上下文環境中更好地完成復雜任務。
什么是上下文工程?
幾年前,包括許多頂尖的人工智能研究人員在內,不少人聲稱Prompt Engineering將會消亡。然而事實證明,他們的預測完全錯誤。Prompt Engineering不僅沒有消失,反而變得比以往任何時候都更加重要,重要到正在被重新命名為Context Engineering。
Context Engineering是一個用來描述如何調整大型語言模型執行任務所需的指令和相關上下文的重要過程的術語。已經有很多業界專家對此進行了討論,包括Ankur Goyal、Walden Yan、Tobi Lutke和Andrej Karpathy等人都曾提及這個概念的重要性。
人們之所以懷疑Prompt Engineering是一項嚴肅技能,主要是因為許多人將其與"盲目提示"混淆了。盲目提示是指在ChatGPT這樣的LLM中使用簡短的任務描述,僅僅是簡單地向系統提問。而真正的Prompt Engineering需要更仔細地思考提示的上下文和結構,或許從一開始,它就應該叫做Context Engineering。
從開發者的角度來看,Context Engineering是一個迭代過程,用于優化提供給LLM的指令和上下文,以達到期望的結果。這包括建立正式的流程,如評估管道,用來衡量策略是否有效。
Context Engineering的核心定義
考慮到人工智能領域的快速發展,我們可以采用一個更寬泛的Context Engineering定義:設計和優化提供給大型語言模型和高級AI模型的指令及相關上下文的過程,以使其能夠有效地執行任務。 這不僅包括基于文本的LLM,也涵蓋了為日益普及的多模態模型優化上下文。
Context Engineering包括但不限于以下幾個方面:設計和管理提示鏈、調整指令和系統提示、管理提示中的動態元素(如用戶輸入、日期時間等)、搜索和準備相關知識(即RAG檢索增強生成)、查詢增強、工具定義和指令(對于智能體系統而言)、準備和優化少樣本示例、結構化輸入和輸出、短期記憶管理以及長期記憶檢索等。
換言之,Context Engineering的目標就是優化在LLM上下文窗口中提供的信息,同時過濾掉噪聲信息。這本身就是一門科學,因為它需要系統地衡量LLM的性能表現。
Context Engineering的實踐應用
系統提示的設計與優化
讓我們通過一個具體的例子來看Context Engineering在實際中的應用。筆者最近為一個個人使用的多智能體深度研究應用做了一些上下文工程工作。在這個應用中,Search Planner(搜索規劃師)智能體負責根據用戶查詢生成搜索計劃。
以下是為這個子智能體整理的系統提示:
你是一位專業的研究規劃師。你的任務是將復雜的研究查詢(由<user_query></user_query>分隔)分解為具體的搜索子任務,每個子任務關注不同的方面或來源類型。當前日期和時間是:{{ $now.toISO() }}對于每個子任務,請提供:
1. 子任務的唯一字符串ID(例如,'subtask_1', 'news_update')
2. 專注于主查詢某個方面的具體搜索查詢
3. 要搜索的來源類型(web, news, academic, specialized)
4. 時間段相關性(today, last week, recent, past_year, all_time)
5. 領域重點(如果適用)(technology, science, health等)
6. 優先級級別(1-最高到5-最低)所有字段(id, query, source_type, time_period, domain_focus, priority)對每個子任務都是必需的,除了time_period和domain_focus如果不適用可以為null。創建2個子任務,這些子任務一起提供對主題的全面覆蓋。重點關注不同的方面、觀點或信息來源。
在這個系統提示中,有很多部分都需要仔細考慮,為規劃智能體提供精確的上下文,使其能夠有效地執行任務。這不僅僅是設計一個簡單的提示或指令,而是需要反復試驗,并提供重要的上下文,以便模型能夠最佳地執行任務。
指令層面的上下文工程
指令是提供給系統的高層指示,精確告訴系統要完成什么任務。例如:“你是一位專業的研究規劃師。你的任務是將復雜的研究查詢分解為具體的搜索子任務,每個子任務關注不同的方面或來源類型。”
很多初學者甚至是經驗豐富的AI開發者可能就止步于此了。但從完整的提示來看,我們需要給系統提供大量額外的上下文,才能讓它按照我們的意愿工作。這正是Context Engineering的意義所在:它通過告知系統更多關于問題范圍和具體需求的細節,來引導系統的行為。
用戶輸入的結構化處理
用戶輸入雖然在系統提示中沒有直接顯示,但需要進行結構化處理。例如:
<user_query> What's the latest dev news from OpenAI? </user_query>
這里使用了分隔符,這是為了更好地結構化提示。這對于避免混淆非常重要,能夠清晰地界定用戶輸入是什么,以及希望系統生成什么內容。有時候,輸入的內容和希望模型輸出的信息是相關的,比如查詢是輸入,而子查詢是輸出。
結構化輸入與輸出的優化
除了高層指令和用戶輸入之外,還需要花相當大的精力來詳細描述智能體需要生成的內容結構。以下是提供給規劃智能體的詳細指令,以便它根據用戶查詢創建子任務:
對于每個子任務,請提供:
1. 子任務的唯一字符串ID(例如,'subtask_1', 'news_update')
2. 專注于主查詢某個方面的具體搜索查詢
3. 要搜索的來源類型(web, news, academic, specialized)
4. 時間段相關性(today, last week, recent, past_year, all_time)
5. 領域重點(如果適用)(technology, science, health等)
6. 優先級級別(1-最高到5-最低)所有字段(id, query, source_type, time_period, domain_focus, priority)對每個子任務都是必需的,除了time_period和domain_focus如果不適用可以為null。創建2個子任務,這些子任務一起提供對主題的全面覆蓋。重點關注不同的方面、觀點或信息來源。
仔細觀察上面的指令,筆者列出了希望規劃智能體生成所需信息的清單,并提供了一些提示和示例,以便更好地引導數據生成過程。這對于向智能體提供關于預期的額外上下文至關重要。例如,如果不告訴它優先級級別應該在1-5的范圍內,系統可能會傾向于使用1-10的范圍。
為了從規劃智能體那里獲得一致的輸出,還需要提供關于子任務格式和期望字段類型的信息作為上下文:
每個子任務將包含以下信息:
id: str
query: str
source_type: str # 例如,"web", "news", "academic", "specialized"
time_period: Optional[str] = None # 例如,"today", "last week", "recent", "past_year", "all_time"
domain_focus: Optional[str] = None # 例如,"technology", "science", "health"
priority: int # 1(最高)到5(最低)
這種結構化輸出的方法是Context Engineering中一個被許多AI開發者忽略的重要方面。這是一種非常強大的方法,尤其當智能體產生的輸出不穩定,而它們又需要按照特定的格式傳遞給工作流中的下一個組件時。
工具集成與動態上下文
在構建智能體系統時,工具的集成是Context Engineering的重要組成部分。例如,將當前日期和時間作為上下文傳入是非常重要的,這可以通過簡單的函數調用實現:
The current date and time is: {{ $now.toISO() }}
這樣的工具調用有助于增加動態性,即僅在查詢需要時獲取相關信息。這就是Context Engineering的意義所在——它迫使開發者對"向LLM傳遞什么樣的上下文"以及"何時傳遞"做出具體的決策。這很重要,因為它消除了應用程序中的假設和不準確性。
日期和時間對于系統而言是重要的上下文,否則它在處理需要了解當前日期和時間的查詢時往往表現不佳。例如,如果要求系統搜索上周發生的OpenAI最新開發者新聞,它可能會隨意猜測日期和時間,從而導致次優的查詢,最終搜索結果也不準確。
RAG與記憶管理
RAG(檢索增強生成)和記憶管理是Context Engineering中的高級技術。雖然在基礎版本中可能不需要使用短期記憶,但可以構建一個版本來緩存針對不同用戶查詢的子查詢。這有助于加速和優化工作流。如果用戶之前已經使用了類似的查詢,可以將這些結果存儲在向量數據庫中,并查詢這些結果,從而避免為已經生成并存在于向量數據庫中的計劃重新創建一組子查詢。
這是一種巧妙的Context Engineering應用,它使應用程序更具動態性、更經濟、效率更高。Context Engineering不僅僅是優化提示,更是根據設定的目標選擇合適的上下文。在如何維護向量數據庫以及如何將這些現有子任務拉入上下文方面,還有更多創意空間。富有創造性和新穎的Context Engineering才是真正的技術護城河。
狀態與歷史上下文管理
在復雜的智能體系統中,狀態和歷史上下文管理是一個重要組成部分。系統可能需要修訂全部或部分查詢、子任務,甚至是從網絡搜索API獲取的數據。這意味著系統將需要多次嘗試解決問題,并且需要訪問先前的狀態以及系統可能的所有歷史上下文。
對于實際應用而言,這意味著智能體需要訪問子任務的狀態、修訂情況、工作流中每個智能體過去的結果,以及幫助進行修訂階段所需的任何其他上下文。對于這種類型的上下文,傳遞什么取決于正在優化的目標。這里需要做出大量的決策。Context Engineering并不總是直接了當的,這個組件需要經過多次迭代才能達到最佳效果。
最后我們看一個Deep Research的智能體例子,下圖展示了如何從簡單指令擴展到包含時間context、輸出格式、字段定義的完整系統。Context engineer需要系統思維,精確定義每個組件,動態管理變化因素,持續優化效果。這已成為AI開發的關鍵技能。
圖片來源:https://x.com/ProgramerJohann/status/1942241296351105528/photo/1
高級Context Engineering技術
在Context Engineering中還有許多高級技術有待探索,包括上下文壓縮、上下文管理技術、上下文安全和有效性評估等。這些技術主要用于衡量上下文隨時間的有效性。上下文可能會被稀釋或變得低效,即充斥著過時和不相關的信息,這需要專門的評估工作流來捕獲這些問題。
上下文壓縮技術能夠在保持關鍵信息的同時減少上下文長度,這對于處理長文檔或大量歷史記錄特別重要。上下文管理技術則涉及如何動態地添加、刪除和更新上下文中的信息,以確保系統始終擁有最相關和最新的信息。
上下文安全是另一個重要方面,它涉及如何防止惡意或錯誤的上下文信息影響系統的行為。這包括對輸入的驗證、對上下文來源的審核以及對輸出的監控等。
Context Engineering的未來發展
Context Engineering將繼續演變為AI開發者和工程師的一項重要技能集合。除了手動進行Context Engineering,還有機會構建能夠自動化處理有效上下文工程的方法。目前已經有一些工具嘗試做到這一點,但這個領域還需要更多的進展。
自動化Context Engineering可能包括智能的上下文選擇、動態的上下文優化、基于性能反饋的上下文調整等。這些技術的發展將使Context Engineering更加高效和可擴展,同時降低開發者的工作負擔。
隨著AI模型能力的不斷增強和應用場景的日益復雜,Context Engineering的重要性只會越來越突出。它不僅是一個技術問題,也是一個設計問題,需要開發者具備深入的領域知識和豐富的實踐經驗。
結語
Context Engineering代表了從簡單的提示工程向全面的上下文管理的演進。它不僅包含了傳統Prompt Engineering的所有技巧,還擴展到了整個AI系統的環境構建和優化。通過系統性的上下文設計、結構化的輸入輸出管理、工具集成、記憶管理和狀態維護,Context Engineering為構建高效、可靠的AI應用提供了強大的技術支撐。
對于AI開發者而言,掌握Context Engineering技能已經變得至關重要。它不僅能夠顯著提升AI系統的性能和可靠性,還能夠為復雜的AI應用場景提供更好的解決方案。隨著AI技術的不斷發展,Context Engineering必將成為AI開發領域的核心競爭力之一。