復(fù)現(xiàn)高速施工駕駛輔助事故 問界/小米/理想等 誰會選擇撞卡車自斷A柱?
循環(huán)歌單 |【法修散打】| "聽完不甜給你揍我【雨姐】【TrackMaker】"
問個問題,AI回得牛頭不對馬嘴?別急著吐槽它“太蠢”,可能是它根本沒聽懂你是誰、想干啥。本文用淺顯易懂的方式,帶你認識一個冷門卻超關(guān)鍵的概念——ContextEngineering,也許是AI真的“讀懂你”的那把鑰匙。
在文章開始之前,想問大家一個問題,大模型有記憶嗎?
背景
安德烈·卡帕西(AndrejKarpathy)最近成功把Contextengineering帶火。
知名電商平臺Shopify的聯(lián)合創(chuàng)始人兼首席執(zhí)行官托比?盧特克(TobiLutke)在社交媒體上發(fā)了一個帖子:
比起“提示工程”(promptengineering),我確實更喜歡“上下文工程”(contextengineering)這個術(shù)語。它更好地描述了核心技能:提供完成任務(wù)所需全部上下文信息,使大語言模型(LLM)能夠合理解決問題的藝術(shù)。
硅谷AI大神安德烈·卡帕西(AndrejKarpathy)趕緊跟帖。
他將上下文工程稱為“一門精深的科學,也是一門巧妙的藝術(shù)?!?/p>
咱們先來說說為什么科學?
因為做好這件事涉及:任何說明與解釋、few-shot示例、RAG檢索、相關(guān)數(shù)據(jù)、工具、狀態(tài)、歷史記錄、信息壓縮等。信息太少或者格式不對,大語言模型就拿不到做出好回答的材料;信息太多或者不相關(guān),則會消耗更多token和算力等,讓成本變高、性能降低。
那為什么說是藝術(shù)呢?
怎么用這些方法讓模型最‘舒服’、效果最‘出彩’”。它需要開發(fā)者像藝術(shù)家一樣,用直覺、經(jīng)驗甚至創(chuàng)意去打磨——沒有標準答案,卻能做出千變?nèi)f化的精妙設(shè)計。
同時他還指出:“大多數(shù)AI智能體的失敗,不是模型的能力不足,而是上下文的失敗?!逼浜诵脑谟谠谇‘?shù)臅r機、以恰當格式提供恰當?shù)男畔ⅰ:w系統(tǒng)提示詞、用戶輸入、狀態(tài)歷史、長期記憶、檢索信息、可用工具和結(jié)構(gòu)化輸出等全方位、系統(tǒng)的工程。
介紹了背景,那Contextengineering到底是什么呢?
一、什么是上下文呢
大模型要做決策,決策制定正確與否直接決定著回復(fù)用戶的質(zhì)量。
那如何才能正確的做決策呢?
關(guān)鍵是要收集、歸納、整理好做決策需要的信息。
這所有必要的信息我們統(tǒng)稱為上下文(context)。
二、什么是“上下文工程”?
上下文工程,指的是:
如何組織、選擇、格式化、壓縮、排序你給模型的輸入內(nèi)容;
如何最大限度利用模型的“上下文窗口”,讓它理解任務(wù)背景、指令、知識和限制;
是提示詞工程(promptengineering)的進階版,更重視結(jié)構(gòu)化、多輪對話、動態(tài)補充知識。
舉個例子:智能投研助手
用戶問“這只股票為什么跌了?”
上下文工程要做的是:
整理:K線圖(圖片)、財務(wù)數(shù)據(jù)(表格)、相關(guān)新聞(文本)等
格式化:統(tǒng)一編碼成大模型能理解的格式
指令:告訴模型“你是金融分析專家,請結(jié)合數(shù)據(jù)判斷原因?!?/p>
三、上下文工程有哪些內(nèi)容組成呢?
GoogleDeepMind的高級AI關(guān)系工程師PhilippSchmid在他最新的一篇博客里也把上下文工程拆成多個組成模塊。
包括:
系統(tǒng)提示詞,這個是系統(tǒng)給模型一開始的指令,比如模型在給誰,在什么場景下,解決問題。相當于給模型做好一個人設(shè),LLM需要扮演什么角色、遵循哪些規(guī)則、輸出什么格式等等。舉個例子,你是一個知書達理的大學教授,具備完善的AI領(lǐng)域知識,不會泄露機密的AI小助手。請避免去談?wù)撜?,這些……敏感詞匯請不要說…我們需要給模型限制好一些行為準則;
用戶提示詞:用戶發(fā)出的具體的問題和任務(wù)(Prompt);
短期記憶:當前的聊天對話(用戶的提示詞和大語言模型的回答);
長期記憶:跨會話的用戶偏好、項目信息;
工具調(diào)用大語言模型可以調(diào)用的所有工具和函數(shù)等。比如讓AI去查日歷,發(fā)郵件模型會把整個的輸入輸出、函數(shù)調(diào)用寫在上下文下面,以便記得用戶到底做過哪些事情。這個又會占據(jù)成千上百個token;
檢索文檔的內(nèi)容(RAG),通過檢索知識庫獲得參考資料;
結(jié)構(gòu)化輸出:規(guī)定格式,比如Json、表格。
為了方便小伙伴們的理解,這里給大家舉個我生活中的小例子:
比如我發(fā)出請求說,幫我約小七老師這周日一起去健身,并發(fā)一個郵件提醒她。
仔細拆解這個請求,其實包含著兩個任務(wù),
第一個任務(wù)是去找到我和小七老師周日都有空閑的時間段。
第二個任務(wù)是去創(chuàng)建一個日程提醒并發(fā)送郵件給小七老師。
這就是復(fù)合任務(wù)解析。
那么AI會先向系統(tǒng)中已經(jīng)注冊的MCPserver去查詢它的能力列表。
比如是不是可以訪問日歷?是不是有權(quán)限去發(fā)郵件?是不是能獲取到小七老師的聯(lián)系人信息?這就是工具能力查詢。
這些能力的聲明和用戶的請求一并去交給大語言模型去處理。
基于給定的上下文,去判斷應(yīng)該怎么整合現(xiàn)有的工具去完成任務(wù)。
這就是基于上下文整合工具和數(shù)據(jù)。
不巧的是,小七老師要上課,周日沒空。模型會回復(fù)我,基于工具調(diào)用和查詢,發(fā)現(xiàn)周日小七老師日程是滿的,周六下午6點,你和小七老師都有空閑,需要幫你約周六下午6點嗎?
我說OK,那模型就會去調(diào)用Emailserver,把這個郵件幫我發(fā)出去。
那如果模型不了解我的上下文,我讓它幫我做這件事,它可能就OK我?guī)臀夷慵s好了,
那實際上,周日這天日程是滿的,根本就擠不出時間去健身。
這就是上下文缺失的后果。
所以說只有在模型充分了解用戶上下文的情況下,它做出的決策才有可能是正確的。
四、上下文窗口發(fā)展歷程
GPT-2的最大上下文窗口是2048tokens,大概是2K個Token,相當于1~1.5頁A4正常排版的文字內(nèi)容;
GPT-3:上下文窗口為4096tokens,大概是4K個Token,相當于可以容納一整篇新聞特寫/報告文章;
GPT-4:上下文128,000tokens,大概是128K個Token,可以容納一部中長篇小說的全部內(nèi)容。例如,J.K.羅琳的《哈利·波特與魔法石》英文版約77K單詞,完全能放入上下文中。
按照這個發(fā)展,是不是上下文窗口越大越好呢?當然不是,長時間運行任務(wù)和調(diào)用工具意味著Agent通常會消耗大量的Token。
五、上下文設(shè)計不當會導致以下幾個問題
問題一:上下文中毒
即幻覺進入上下文中,比如AI在調(diào)用工具時,帶回了錯誤的信息或者純碎的“幻覺”,那么這些幻覺信息會污染整個上下文,導致后續(xù)推理滿盤皆輸
問題二:上下文干擾
上下文太長,混雜了太多信息,會讓模型“注意力分散”,無法專注于重要內(nèi)容,就像考試時桌上放了一堆沒用的參考書;
問題三:語境混淆
一些沒用的信息可能影響模型判斷,比如你問模型一個問題,它卻被上下文中不相關(guān)的東西誤導了;
問題四:上下文沖突
比如上下文中如果出現(xiàn)前后矛盾的內(nèi)容(比如版本不一致的說法),模型可能不知道該相信哪一個,導致答復(fù)混亂或錯誤。
Anthropic也明確指出:Agent通常會參與跨越數(shù)百個回合的對話,需要謹慎的上下文管理策略。
基于以上挑戰(zhàn),我們該如何應(yīng)對呢?
六、上下文工程四類管理策略
我們將Agent上下文工程給予以下四類策略–寫入、篩選、壓縮、隔離。
針對每個策略我們展開講講吧~
1.寫入(WriteContext)
讓模型記住重要的信息
包含三類“記憶”方式:
Long-termmemories(長期記憶):跨多個對話保留,比如之前的知識、歷史任務(wù)等。
暫存器幫助智能體在給定的會話(或線程)內(nèi)解決任務(wù),但有時智能體會跨多個會話(session)。Reflexion(反射機制)引入了在智能體每次行動后進行反思,并復(fù)用這些自主生成的記憶的理念。生成式智能體(GenerativeAgents)會根據(jù)過往智能體反饋的集合,定期合成新記憶,模型能在更長的時間段內(nèi)保持對話一致性和信息引用。
Scratchpad(暫存器):當前會話中臨時記錄的信息,像是草稿紙。
當我們在進行數(shù)學演算的時候,我們會打草稿、理清思路和步驟。在開會時,會進行做筆記,方便記錄下會議紀要。智能體也是如此,通過暫存器(Scratchpads)記錄筆記也是智能體在執(zhí)行任務(wù)時保存信息的一種方法。它的理念是將信息保存在上下文窗口之外,以便智能體可以使用。這樣既可以保持上下文窗口的干凈整潔,又能讓AI擁有持續(xù)思考和學習的能力。
State(狀態(tài)):會話過程中的結(jié)構(gòu)化狀態(tài)信息,比如執(zhí)行結(jié)果、變量值等。
通俗來說:,就像我們平時做項目時,有:
歷史資料(長期記憶)、
臨時便條(便簽本)、
項目文檔(狀態(tài))——這些都可以寫進“記憶區(qū)”,供模型后續(xù)使用。
為了方便小伙伴理解,我把幾個名詞解釋了一下~Scratchpads
(暫存器):是智能體在處理任務(wù)過程中,臨時存儲信息的一種機制,文中介紹了它兩種常見實現(xiàn)形式,作用是輔助智能體在單次會話里完成任務(wù),就像人類做任務(wù)時,用便簽紙隨手記關(guān)鍵信息來推進工作。
session(會話/線程):指智能體與系統(tǒng)交互的一個連續(xù)過程,比如用戶使用智能客服咨詢問題,從開始咨詢到結(jié)束對話,就是一個會話,便簽本的信息一般在單次會話內(nèi)有效,輔助本次交互任務(wù)。
跨會話記憶:有些場景下,智能體需要把不同會話里的信息關(guān)聯(lián)、留存,像Reflexion讓智能體行動后反思,把經(jīng)驗變成可復(fù)用的記憶;GenerativeAgents則定期整合過往反饋生成新記憶,這樣智能體下次處理任務(wù)(可能跨會話)時,能調(diào)用這些歷史記憶,提升處理能力,類似人類積累經(jīng)驗,下次遇到相關(guān)事能借鑒之前做法。
2.篩選(SelectContext)
啥意思呢,就是從工具、“草稿本”、長期記憶、短期記憶、相關(guān)知識中檢索出最相關(guān)的部分,將這些精準的信息投喂給大模型,這可以避免大語言模型的信息過剩,讓模型可以聚焦在最關(guān)鍵的問題上。
選擇來源包括:
工具(relevanttools)
便簽本(scratchpad)
長期記憶(long-termmemory)
知識庫(relevantknowledge)
下圖是關(guān)于三種記憶類型,它把人類的記憶方式類比到AIAgent的“記憶系統(tǒng)”中
通俗來講:像是在“知識倉庫”里挑出對當前問題有幫助的資料,避免全部塞進去,節(jié)省空間,也減少干擾。
3.壓縮(CompressContext)
優(yōu)化內(nèi)容,讓模型讀更少的token,但還保留重點。
上文介紹了,OPENAI把上下文窗口做到了128K,即使這么大也仍然有上限。當對話歷史、調(diào)用工具或者檢索文檔過大時,就必須要刪繁區(qū)間,通過提取摘要、修剪等策略,智能的為上下文進行瘦身。在不丟失關(guān)鍵信息的情況下,把最核心、最關(guān)鍵的信息留在寶貴的上下文窗口內(nèi)。
比如ClaudeCode會在超出上下文窗口的95%后運行“自動壓縮”,并匯總用戶與代理交互的完整軌跡。這種跨代理軌跡的壓縮可以使用各種策略,例如遞歸或分層匯總。
兩種壓縮方式:
Summarize(總結(jié)):用總結(jié)法保留重點,比如把1000字內(nèi)容濃縮成200字。
Trim(裁剪):直接剪掉不相關(guān)的內(nèi)容。
通俗理解:就像你寫PPT,只放結(jié)論和關(guān)鍵點,不貼整篇論文
4.隔離(IsolateContext)
把上下文拆分或隔離開,避免相互干擾。
將一個大任務(wù)拆分成兩個或多個子任務(wù),每個子任務(wù)都有一組特定的工具、指令和各自的上下文窗口。這樣做,既利用并行計算加速,又通過隔離保證任務(wù)處理的獨立性和準確性,避免多個Agent之間互相干擾和影響。
三種隔離方式:
Partitioninstate(分區(qū)保存):把不同內(nèi)容放進不同的狀態(tài)文件夾中。
Holdinsandbox(沙盒保存):像是臨時容器,信息不外泄。
Partitionacrossmulti-agent(多智能體分區(qū)):讓多個AI分別處理不同部分,互不干擾。
通俗來講:像多個團隊各自處理自己項目的內(nèi)容,互不打擾,互相傳輸結(jié)果就可以。
總結(jié)
面對超長上下文,系統(tǒng)要像一個聰明的項目經(jīng)理一樣:
先記錄信息(寫)
再挑選有用的(選)
然后做濃縮壓縮(壓)
最后做好隔離管理(隔)
這樣,AI才不會“被信息淹沒”,能更高效地思考與行動~
小伙伴們,還記得開頭的問題嗎?
看完文章你認為AI是否有記憶呢?我的回答是沒有。
默認大模型不會主動記住過去的對話,一旦關(guān)閉頁面、或者開始一個新的對話窗口,它就會忘了你是誰。
有些人可能會說,不對呀,我昨天聊的事情,今天還可以接著聊呀?
那是因為我們有上下文窗口,它可以臨時“記住”一些內(nèi)容,且完全依賴于你當前這次對話的內(nèi)容。一旦超過“上下文長度限制,早期的對話就會“遺忘”。
小伙伴們,關(guān)于PromptEngineering和ContextEngineering你們怎么看呢?