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