態(tài)經(jīng)濟(jì)模擬中的架構(gòu)設(shè)計(jì)與實(shí)現(xiàn))
1. 項(xiàng)目概述當(dāng)AI智能體走進(jìn)動(dòng)態(tài)經(jīng)濟(jì)沙盤最近在AI和模擬經(jīng)濟(jì)交叉的圈子里一個(gè)叫“EconAI”的概念討論度挺高。簡(jiǎn)單來(lái)說(shuō)它試圖用大語(yǔ)言模型驅(qū)動(dòng)的智能體在一個(gè)持續(xù)變化的經(jīng)濟(jì)環(huán)境里模擬具有“成長(zhǎng)性”和“記憶力”的決策者。這聽起來(lái)有點(diǎn)像把《模擬人生》里的角色丟進(jìn)一個(gè)動(dòng)態(tài)的宏觀經(jīng)濟(jì)模型里讓他們不僅要賺錢糊口還要學(xué)習(xí)、適應(yīng)甚至預(yù)測(cè)經(jīng)濟(jì)周期的波動(dòng)。傳統(tǒng)的經(jīng)濟(jì)模型或游戲AI角色的行為模式往往是靜態(tài)的或者基于一套預(yù)設(shè)的、有限的規(guī)則。比如一個(gè)模擬中的“消費(fèi)者”智能體其消費(fèi)傾向可能是固定的或者只對(duì)價(jià)格做出簡(jiǎn)單反應(yīng)。但現(xiàn)實(shí)中的經(jīng)濟(jì)參與者不是這樣的我們的決策深受過(guò)去經(jīng)驗(yàn)記憶、對(duì)未來(lái)的預(yù)期預(yù)測(cè)以及自身身份認(rèn)知人設(shè)的影響。一個(gè)經(jīng)歷了經(jīng)濟(jì)蕭條的人其儲(chǔ)蓄和投資行為會(huì)與一直生活在繁榮期的人截然不同。EconAI瞄準(zhǔn)的正是用LLM賦予智能體這種動(dòng)態(tài)演化的“人設(shè)”和持續(xù)積累的“記憶”能力讓它們?cè)谀M中更像真實(shí)的、會(huì)學(xué)習(xí)的個(gè)體。這項(xiàng)目適合誰(shuí)呢如果你是對(duì)AI智能體架構(gòu)、多智能體模擬、LLM應(yīng)用落地或者計(jì)算經(jīng)濟(jì)學(xué)感興趣的研究者、開發(fā)者或?qū)W生這里面的設(shè)計(jì)思路和實(shí)現(xiàn)挑戰(zhàn)會(huì)很有嚼頭。它不是一個(gè)開箱即用的產(chǎn)品更像一個(gè)前沿的實(shí)驗(yàn)框架探討如何將LLM的認(rèn)知能力與復(fù)雜系統(tǒng)仿真結(jié)合起來(lái)。接下來(lái)我會(huì)結(jié)合當(dāng)前Agent開發(fā)的熱點(diǎn)拆解EconAI可能的核心設(shè)計(jì)、實(shí)操難點(diǎn)以及我們?nèi)绾蝿?dòng)手搭建一個(gè)簡(jiǎn)化版本。2. 核心架構(gòu)設(shè)計(jì)記憶、人格與環(huán)境的三角博弈EconAI的吸引力在于它試圖協(xié)調(diào)三個(gè)動(dòng)態(tài)變化的復(fù)雜系統(tǒng)智能體的內(nèi)部狀態(tài)人格與記憶、智能體間的社會(huì)交互以及外部的經(jīng)濟(jì)環(huán)境。要讓這個(gè)系統(tǒng)運(yùn)轉(zhuǎn)起來(lái)而不是陷入混沌或僵化架構(gòu)設(shè)計(jì)上必須解決幾個(gè)核心問(wèn)題。2.1 動(dòng)態(tài)人格演化的實(shí)現(xiàn)機(jī)制“動(dòng)態(tài)人格”是讓智能體擺脫腳本的關(guān)鍵。這里的“人格”不是一個(gè)標(biāo)簽而是一套可量化、可調(diào)整的決策參數(shù)和偏好集合。例如可以包括風(fēng)險(xiǎn)厭惡系數(shù)、消費(fèi)傾向、學(xué)習(xí)能力、社交活躍度等。一個(gè)可行的實(shí)現(xiàn)機(jī)制是基于經(jīng)驗(yàn)反饋的參數(shù)微調(diào)。智能體初始人格由LLM根據(jù)一段簡(jiǎn)短的背景描述生成例如“你是一個(gè)初入職場(chǎng)、謹(jǐn)慎的年輕程序員”。LLM會(huì)輸出一組初始參數(shù)。之后每一次重大經(jīng)濟(jì)決策如是否進(jìn)行一筆高風(fēng)險(xiǎn)投資的結(jié)果都會(huì)成為一個(gè)反饋信號(hào)。系統(tǒng)需要設(shè)計(jì)一個(gè)人格更新函數(shù)。這個(gè)函數(shù)不直接讓LLM修改參數(shù)而是將決策結(jié)果盈利/虧損、環(huán)境狀態(tài)市場(chǎng)繁榮/衰退和智能體自身的感受由LLM總結(jié)作為輸入生成對(duì)人格參數(shù)的調(diào)整量。注意避免讓LLM直接輸出“我的風(fēng)險(xiǎn)厭惡系數(shù)從0.7調(diào)整為0.65”。這會(huì)導(dǎo)致不可控的漂移。更好的做法是讓LLM以文本形式總結(jié)本次經(jīng)驗(yàn)教訓(xùn)例如“這次冒險(xiǎn)投資成功讓我信心大增未來(lái)可能愿意承擔(dān)稍多一點(diǎn)風(fēng)險(xiǎn)”然后由一個(gè)確定的、可控的規(guī)則模塊將這段文本映射到一個(gè)小的參數(shù)增量如風(fēng)險(xiǎn)厭惡系數(shù)-0.05。2.2 記憶系統(tǒng)的分層與檢索設(shè)計(jì)記憶是人格演化的燃料。EconAI中的記憶不能是簡(jiǎn)單的聊天記錄堆砌必須是結(jié)構(gòu)化的、可高效檢索的。一個(gè)分層記憶架構(gòu)是必要的情景記憶存儲(chǔ)具體的交互事件和經(jīng)濟(jì)事件。“2023年Q3向智能體B借貸100元利率5%已按期歸還。” 這類記憶包含具體的時(shí)間、實(shí)體、動(dòng)作和結(jié)果。語(yǔ)義記憶存儲(chǔ)從經(jīng)驗(yàn)中歸納出的知識(shí)、信念和規(guī)則?!爸悄荏wB的信用良好?!?“經(jīng)濟(jì)衰退時(shí)消費(fèi)品價(jià)格會(huì)下跌但失業(yè)率會(huì)上升。” 這部分記憶通常由LLM對(duì)情景記憶進(jìn)行定期總結(jié)、提煉而成。核心偏好這部分更接近人格是相對(duì)穩(wěn)定的長(zhǎng)期特質(zhì)但也會(huì)緩慢變化?!拔覂A向于信任熟人。” “我重視長(zhǎng)期財(cái)務(wù)安全勝過(guò)短期消費(fèi)享受?!睓z索機(jī)制至關(guān)重要。當(dāng)智能體需要做決策時(shí)系統(tǒng)需要從海量記憶中快速找到最相關(guān)的信息。這通常結(jié)合向量檢索和元數(shù)據(jù)過(guò)濾。例如智能體面臨一個(gè)投資決策系統(tǒng)會(huì)用“投資”、“風(fēng)險(xiǎn)”、“科技股”等關(guān)鍵詞生成查詢向量從語(yǔ)義記憶中查找相關(guān)經(jīng)驗(yàn)。用時(shí)間過(guò)濾器優(yōu)先檢索近期的記憶經(jīng)濟(jì)環(huán)境可能已變化。用情感元數(shù)據(jù)正/負(fù)面結(jié)果加權(quán)檢索結(jié)果負(fù)面記憶可能被賦予更高權(quán)重?fù)p失厭惡。2.3 經(jīng)濟(jì)環(huán)境引擎的構(gòu)建要點(diǎn)經(jīng)濟(jì)環(huán)境是智能體活動(dòng)的舞臺(tái)它需要為智能體提供感知輸入并對(duì)其行動(dòng)給出反饋。一個(gè)簡(jiǎn)化的經(jīng)濟(jì)引擎至少需要包含市場(chǎng)商品/勞動(dòng)力/資產(chǎn)市場(chǎng)具備基本的供需模型和價(jià)格形成機(jī)制如拍賣、雙邊匹配。宏觀經(jīng)濟(jì)指標(biāo)發(fā)布通貨膨脹率、基準(zhǔn)利率、GDP增長(zhǎng)率等這些指標(biāo)應(yīng)能根據(jù)所有智能體的集體行為總消費(fèi)、總投資等動(dòng)態(tài)計(jì)算或按一定規(guī)則演變。隨機(jī)事件引入可控的外部沖擊如技術(shù)突破、政策變化、自然災(zāi)害等模擬經(jīng)濟(jì)環(huán)境的不確定性。環(huán)境引擎與智能體的接口需要標(biāo)準(zhǔn)化。每個(gè)仿真周期如一天、一周引擎向每個(gè)智能體廣播其可觀測(cè)的信息如市場(chǎng)價(jià)格、個(gè)人資產(chǎn)、宏觀經(jīng)濟(jì)新聞接收智能體的行動(dòng)指令如購(gòu)買X商品、提供Y服務(wù)、進(jìn)行Z投資然后計(jì)算所有行動(dòng)交互后的結(jié)果更新環(huán)境狀態(tài)并反饋給智能體。3. 智能體核心循環(huán)與決策過(guò)程拆解有了架構(gòu)我們看單個(gè)智能體在一個(gè)周期內(nèi)如何“思考”和“行動(dòng)”。這是一個(gè)典型的感知-思考-行動(dòng)循環(huán)但注入了LLM和記憶。3.1 感知階段信息收集與上下文構(gòu)建智能體并非全知全能。在每一步它只能從環(huán)境引擎獲取有限的信息例如個(gè)人狀態(tài)現(xiàn)金、庫(kù)存、負(fù)債、技能等級(jí)。市場(chǎng)信息有限幾種關(guān)注商品的價(jià)格、薪資水平。公共信息當(dāng)前的宏觀經(jīng)濟(jì)指標(biāo)頭條新聞。社交信息收到的交易請(qǐng)求、合作邀約等。系統(tǒng)需要將這些結(jié)構(gòu)化數(shù)據(jù)與從記憶庫(kù)中檢索出的相關(guān)記憶見2.2組合成一個(gè)豐富的、文本化的決策上下文。這個(gè)上下文是一段精心設(shè)計(jì)的提示詞它告訴LLM“這是你當(dāng)前的情況這是你過(guò)去的相關(guān)經(jīng)驗(yàn)現(xiàn)在你需要做一個(gè)決定?!?.2 認(rèn)知與決策階段LLM作為推理引擎這是最核心的環(huán)節(jié)。我們將構(gòu)建好的上下文提交給LLM如GPT-4、Claude 3或開源模型Llama 3要求它扮演該智能體輸出決策。提示詞設(shè)計(jì)需要極高的技巧角色鎖定明確告知LLM“你是[智能體名稱]擁有以下人格特質(zhì)...你的長(zhǎng)期目標(biāo)是...”。任務(wù)明確清晰列出本周期可執(zhí)行的動(dòng)作選項(xiàng)及其格式例如“動(dòng)作BUY [商品] [數(shù)量]”、“動(dòng)作PROPOSE_TRADE [對(duì)方] [出價(jià)]”。思維鏈要求強(qiáng)制要求LLM以“思考...”開頭先內(nèi)部推理引用相關(guān)記憶權(quán)衡利弊最后再輸出“動(dòng)作...”。這能提升決策的合理性也便于我們調(diào)試。輸出規(guī)范化嚴(yán)格限制輸出格式方便后續(xù)系統(tǒng)解析。例如一個(gè)提示詞片段可能是你是Alex一個(gè)風(fēng)險(xiǎn)厭惡型但渴望提升社會(huì)地位的零售商。你當(dāng)前的現(xiàn)金是1000元持有50單位谷物。過(guò)去三次經(jīng)濟(jì)衰退中谷物價(jià)格都先跌后漲來(lái)自你的語(yǔ)義記憶。昨天你剛和批發(fā)商Bob進(jìn)行了一次不愉快的議價(jià)他顯得很急躁來(lái)自情景記憶。 當(dāng)前市場(chǎng)谷物價(jià)格15元/單位木材價(jià)格30元/單位。宏觀經(jīng)濟(jì)新聞央行暗示可能加息。 請(qǐng)基于你的記憶、人格和目標(biāo)決定本周期的行動(dòng)。請(qǐng)先進(jìn)行思考再輸出最終動(dòng)作。 可選動(dòng)作格式BUY [商品] [數(shù)量], SELL [商品] [數(shù)量], NEGOTIATE [對(duì)方] [商品] [目標(biāo)價(jià)格], HOLD。 思考3.3 行動(dòng)執(zhí)行與記憶更新階段LLM輸出規(guī)范化的動(dòng)作后環(huán)境引擎會(huì)驗(yàn)證并執(zhí)行該動(dòng)作例如檢查現(xiàn)金是否足夠完成購(gòu)買計(jì)算結(jié)果更新資產(chǎn)、可能觸發(fā)市場(chǎng)波動(dòng)并將結(jié)果反饋給智能體。緊接著必須立即進(jìn)行記憶更新。這是一個(gè)關(guān)鍵步驟決定了智能體能否學(xué)習(xí)。系統(tǒng)需要自動(dòng)生成一條新的情景記憶“在時(shí)間T觀察到市場(chǎng)狀態(tài)S經(jīng)過(guò)思考T采取了行動(dòng)A導(dǎo)致了結(jié)果R成功/失敗獲利XX。” 然后可以將這條新記憶與近期記憶一起定期如每10個(gè)周期觸發(fā)一次LLM進(jìn)行記憶總結(jié)與提煉生成或更新語(yǔ)義記憶和核心偏好。例如如果智能體連續(xù)三次在價(jià)格低點(diǎn)買入谷物并在高點(diǎn)賣出成功LLM總結(jié)后可能會(huì)生成一條新的語(yǔ)義記憶“我似乎掌握了谷物價(jià)格季節(jié)性波動(dòng)的規(guī)律并在實(shí)踐中驗(yàn)證了低買高賣策略的有效性?!?同時(shí)其“風(fēng)險(xiǎn)厭惡”參數(shù)可能會(huì)略微下調(diào)“自信”參數(shù)可能會(huì)上升。4. 多智能體交互與社會(huì)網(wǎng)絡(luò)涌現(xiàn)單個(gè)智能體的學(xué)習(xí)固然有趣但EconAI的真正魅力在于多智能體互動(dòng)中涌現(xiàn)出的復(fù)雜社會(huì)經(jīng)濟(jì)現(xiàn)象。這涉及到智能體間的通信、信任建立、合作與競(jìng)爭(zhēng)。4.1 交互協(xié)議的設(shè)計(jì)智能體之間不能隨意“腦電波交流”。需要設(shè)計(jì)一套簡(jiǎn)潔有效的交互協(xié)議定義交互的類型、格式和規(guī)則。常見的交互類型包括交易一方發(fā)起包含具體條款商品、數(shù)量、價(jià)格的要約另一方可以接受、拒絕或還盤。借貸涉及本金、利率、期限和抵押物需要記錄在案并影響信用記憶。信息交換智能體可以有選擇地分享自己的市場(chǎng)觀點(diǎn)或私有信息可能是真也可能是假這需要設(shè)計(jì)信譽(yù)機(jī)制。合作形成例如多個(gè)智能體可以組成“公司”共同完成一個(gè)需要多種技能的生產(chǎn)項(xiàng)目。所有這些交互在系統(tǒng)層面都體現(xiàn)為結(jié)構(gòu)化消息的傳遞。LLM的角色是生成和理解這些消息的內(nèi)容。例如在談判中LLM需要根據(jù)當(dāng)前上下文和人格是強(qiáng)硬還是隨和生成一段討價(jià)還價(jià)的自然語(yǔ)言文本同時(shí)系統(tǒng)會(huì)將其核心條款解析為結(jié)構(gòu)化數(shù)據(jù)供引擎處理。4.2 信任與信譽(yù)模型的構(gòu)建在動(dòng)態(tài)環(huán)境中信任是降低交易成本的關(guān)鍵。一個(gè)簡(jiǎn)單的信譽(yù)模型可以為每個(gè)智能體維護(hù)一個(gè)“信譽(yù)分”其更新規(guī)則基于歷史交互成功履行合約如按時(shí)還款、交貨達(dá)標(biāo)增加雙方信譽(yù)分。違約嚴(yán)重降低違約方信譽(yù)分。信息真實(shí)性事后可驗(yàn)證的信息如果為真則增加提供者信譽(yù)如果為假則降低。LLM在決策時(shí)可以將對(duì)方的信譽(yù)分作為重要輸入。一個(gè)信譽(yù)極低的智能體可能根本收不到交易邀約或者只能以極高利率借款這模擬了現(xiàn)實(shí)中的信用懲罰。4.3 宏觀現(xiàn)象的涌現(xiàn)觀察當(dāng)數(shù)十上百個(gè)具備記憶和人格的智能體在一個(gè)動(dòng)態(tài)經(jīng)濟(jì)環(huán)境中長(zhǎng)期運(yùn)行一些有趣的宏觀現(xiàn)象可能會(huì)自發(fā)涌現(xiàn)市場(chǎng)周期智能體的一致樂(lè)觀導(dǎo)致過(guò)度投資和資產(chǎn)泡沫隨后泡沫破裂進(jìn)入衰退集體學(xué)習(xí)后又開始復(fù)蘇。社會(huì)分層由于初始條件、人格和運(yùn)氣差異部分智能體積累更多財(cái)富和資源形成階層。行業(yè)興衰智能體根據(jù)利潤(rùn)信號(hào)進(jìn)入或退出某個(gè)行業(yè)導(dǎo)致該行業(yè)產(chǎn)能和價(jià)格的周期性波動(dòng)。制度自發(fā)形成為了降低交易風(fēng)險(xiǎn)智能體們可能“約定俗成”某些規(guī)則或選舉出“仲裁者”這類似于原始制度的萌芽。觀察和量化這些涌現(xiàn)現(xiàn)象是EconAI項(xiàng)目最重要的研究?jī)r(jià)值所在。我們需要設(shè)計(jì)一系列觀測(cè)指標(biāo)和可視化工具來(lái)跟蹤財(cái)富基尼系數(shù)、行業(yè)集中度、平均價(jià)格波動(dòng)率等。5. 實(shí)操搭建從零構(gòu)建一個(gè)簡(jiǎn)化版EconAI理論聊了很多現(xiàn)在我們動(dòng)手搭建一個(gè)極度簡(jiǎn)化的版本以理解整個(gè)技術(shù)棧和流程。我們將使用Python作為主要語(yǔ)言。5.1 技術(shù)棧選型與環(huán)境準(zhǔn)備編程語(yǔ)言Python 3.10。生態(tài)豐富是AI和科學(xué)計(jì)算的首選。LLM接口OpenAI API (GPT-4) 或開源模型本地部署如使用ollama運(yùn)行Llama 3或vLLM部署Qwen系列。對(duì)于實(shí)驗(yàn)API更方便對(duì)于大規(guī)模模擬需考慮本地模型的成本和可控性。向量數(shù)據(jù)庫(kù)用于存儲(chǔ)和檢索記憶。輕量級(jí)可選ChromaDB或FAISS。ChromaDB易于集成適合原型。開發(fā)框架雖然有很多新興的Agent框架如LangChain, AutoGen但為了深入理解底層機(jī)制我建議初期不用重型框架而是用基礎(chǔ)庫(kù)自建核心循環(huán)。這能避免“黑箱”讓你清楚每一個(gè)環(huán)節(jié)。可以主要依賴requests(調(diào)用API)、numpy/pandas(數(shù)據(jù)處理)、logging(記錄) 等基礎(chǔ)庫(kù)。環(huán)境配置# 創(chuàng)建虛擬環(huán)境 python -m venv econai_env source econai_env/bin/activate # Linux/Mac # econai_env\Scripts\activate # Windows # 安裝核心庫(kù) pip install openai chromadb numpy pandas # 如果使用本地LLM例如ollama # pip install ollama5.2 基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)定義我們首先定義幾個(gè)核心的Python類來(lái)表征系統(tǒng)的基本元素。import uuid from datetime import datetime from typing import Dict, List, Any, Optional from pydantic import BaseModel class MemoryItem(BaseModel): 單條記憶項(xiàng) id: str type: str # episodic, semantic, preference content: str # 記憶的文本內(nèi)容 embedding: Optional[List[float]] None # 向量嵌入 metadata: Dict[str, Any] # 時(shí)間、關(guān)聯(lián)實(shí)體、情感標(biāo)簽等 importance: float 1.0 # 記憶重要性權(quán)重 class Agent: 智能體類 def __init__(self, name: str, persona_desc: str): self.id str(uuid.uuid4()) self.name name self.persona_desc persona_desc self.persona_params self._initialize_persona(persona_desc) # 人格參數(shù)字典 self.memory_store: List[MemoryItem] [] # 簡(jiǎn)化版實(shí)際應(yīng)接向量庫(kù) self.inventory: Dict[str, float] {cash: 1000.0} # 庫(kù)存/資產(chǎn) self.known_agents {} # 已知的其他智能體及信譽(yù) def _initialize_persona(self, desc: str) - Dict[str, float]: 調(diào)用LLM根據(jù)描述初始化人格參數(shù) # 這里簡(jiǎn)化處理實(shí)際需要調(diào)用LLM并解析輸出 # 示例返回一個(gè)參數(shù)字典 return { risk_aversion: 0.7, # 0-1, 越高越厭惡風(fēng)險(xiǎn) consumption_propensity: 0.6, # 消費(fèi)傾向 social_activity: 0.5, # 社交活躍度 learning_rate: 0.1, # 從經(jīng)驗(yàn)中學(xué)習(xí)的速度 } class Market: 單一商品市場(chǎng) def __init__(self, good_name: str): self.good_name good_name self.current_price 10.0 self.supply 100.0 self.demand 0.0 def update_price(self, net_transaction: float): 根據(jù)凈交易量更新價(jià)格非常簡(jiǎn)單的線性模型 # net_transaction: 正表示凈買入負(fù)表示凈賣出 price_adjustment net_transaction * 0.01 self.current_price max(0.1, self.current_price price_adjustment)5.3 核心決策循環(huán)的實(shí)現(xiàn)這是智能體的“大腦”部分。我們實(shí)現(xiàn)一個(gè)make_decision方法。import openai # 假設(shè)已設(shè)置 openai.api_key class Agent(Agent): # 續(xù)接上面的Agent類 def retrieve_relevant_memories(self, query: str, top_k: int 5) - List[MemoryItem]: 從記憶中檢索最相關(guān)的幾條簡(jiǎn)化版未實(shí)現(xiàn)真實(shí)向量檢索 # 在實(shí)際中這里應(yīng)使用向量數(shù)據(jù)庫(kù)查詢 # 此處僅返回最近幾條記憶作為演示 return self.memory_store[-top_k:] if self.memory_store else [] def construct_context(self, market_info: Dict, other_agents_info: List) - str: 構(gòu)建LLM決策上下文 # 1. 檢索相關(guān)記憶 query fmarket prices: {market_info}, my status: {self.inventory} relevant_mems self.retrieve_relevant_memories(query) memory_text \n.join([f- {m.content} for m in relevant_mems]) # 2. 構(gòu)建上下文提示詞 context f 你是一個(gè)經(jīng)濟(jì)模擬中的智能體名叫{self.name}。 你的核心人格特征是{self.persona_desc}。 你當(dāng)前的人格參數(shù)是{self.persona_params}。 【你當(dāng)前的資產(chǎn)與狀態(tài)】 {self.inventory} 【你相關(guān)的過(guò)往記憶】 {memory_text} 【當(dāng)前市場(chǎng)環(huán)境】 {market_info} 【可交互的其他智能體】 {other_agents_info} 【你可以執(zhí)行的動(dòng)作】 1. BUY [商品名稱] [數(shù)量] - 以市場(chǎng)價(jià)格購(gòu)買商品 2. SELL [商品名稱] [數(shù)量] - 以市場(chǎng)價(jià)格出售商品 3. HOLD - 什么也不做保持觀望 請(qǐng)仔細(xì)分析你的記憶、當(dāng)前狀況和人格做出最符合你角色和利益的決策。 首先以“思考”開頭詳細(xì)寫出你的推理過(guò)程引用你的記憶和人格特質(zhì)。 最后以“動(dòng)作”開頭輸出你的最終動(dòng)作嚴(yán)格遵循上述動(dòng)作格式。 return context def make_decision(self, market_info: Dict) - str: 調(diào)用LLM做出決策 context_prompt self.construct_context(market_info, []) try: response openai.ChatCompletion.create( modelgpt-3.5-turbo, # 實(shí)驗(yàn)可用gpt-3.5-turbo研究建議用gpt-4 messages[{role: user, content: context_prompt}], temperature0.7, # 控制創(chuàng)造性決策時(shí)可稍低如0.3-0.5 max_tokens500 ) full_response response.choices[0].message.content # 解析出動(dòng)作部分 lines full_response.split(\n) for line in lines: if line.startswith(動(dòng)作): return line.strip() return 動(dòng)作HOLD # 默認(rèn)動(dòng)作 except Exception as e: print(fLLM調(diào)用失敗: {e}) return 動(dòng)作HOLD5.4 記憶的存儲(chǔ)、檢索與總結(jié)實(shí)現(xiàn)記憶系統(tǒng)是智能體學(xué)習(xí)的核心。我們需要實(shí)現(xiàn)一個(gè)與向量數(shù)據(jù)庫(kù)交互的MemorySystem類。import chromadb from chromadb.config import Settings from sentence_transformers import SentenceTransformer # 用于生成向量 class MemorySystem: def __init__(self, agent_id: str): self.agent_id agent_id self.client chromadb.Client(Settings(chroma_db_implduckdbparquet, persist_directory./chroma_db)) # 獲取或創(chuàng)建該智能體的記憶集合 self.collection self.client.get_or_create_collection(namefagent_memories_{agent_id}) self.embedder SentenceTransformer(all-MiniLM-L6-v2) # 輕量級(jí)嵌入模型 def add_memory(self, memory_item: MemoryItem): 添加一條記憶到向量數(shù)據(jù)庫(kù) # 生成內(nèi)容向量 embedding self.embedder.encode(memory_item.content).tolist() memory_item.embedding embedding # 存儲(chǔ)到ChromaDB self.collection.add( documents[memory_item.content], metadatas[memory_item.metadata], embeddings[embedding], ids[memory_item.id] ) # 同時(shí)保留在本地列表供快速訪問(wèn)可選 # self.memory_store.append(memory_item) def retrieve_memories(self, query_text: str, n_results: int 5, memory_type: str None) - List[MemoryItem]: 根據(jù)查詢文本檢索相關(guān)記憶 query_embedding self.embedder.encode(query_text).tolist() # 構(gòu)建過(guò)濾條件 where_clause None if memory_type: where_clause {type: memory_type} results self.collection.query( query_embeddings[query_embedding], n_resultsn_results, wherewhere_clause ) retrieved_memories [] if results[documents]: for i in range(len(results[documents][0])): mem MemoryItem( idresults[ids][0][i], contentresults[documents][0][i], metadataresults[metadatas][0][i], typeresults[metadatas][0][i].get(type, episodic), embeddingresults[embeddings][0][i] if results[embeddings] else None ) retrieved_memories.append(mem) return retrieved_memories def summarize_memories(self, recent_memories: List[MemoryItem]) - Optional[str]: 定期調(diào)用LLM對(duì)近期記憶進(jìn)行總結(jié)生成語(yǔ)義記憶 if not recent_memories: return None memory_text \n.join([f- {m.content} for m in recent_memories[-10:]]) # 總結(jié)最近10條 prompt f 以下是智能體{self.agent_id}在過(guò)去一段時(shí)間內(nèi)的經(jīng)歷 {memory_text} 請(qǐng)從這些具體經(jīng)歷中總結(jié)出1-3條普遍性的經(jīng)驗(yàn)、教訓(xùn)或更新你對(duì)世界的認(rèn)知??偨Y(jié)應(yīng)簡(jiǎn)潔、抽象適用于指導(dǎo)未來(lái)行動(dòng)。 輸出格式為 總結(jié)1[你的總結(jié)] 總結(jié)2[你的總結(jié)] ... try: response openai.ChatCompletion.create( modelgpt-3.5-turbo, messages[{role: user, content: prompt}], temperature0.5, max_tokens300 ) summary response.choices[0].message.content # 將總結(jié)作為一條新的“語(yǔ)義記憶”存儲(chǔ) semantic_memory MemoryItem( idstr(uuid.uuid4()), typesemantic, contentsummary, metadata{summary_time: datetime.now().isoformat(), source_memories: [m.id for m in recent_memories]} ) self.add_memory(semantic_memory) return summary except Exception as e: print(f記憶總結(jié)失敗: {e}) return None6. 系統(tǒng)集成、運(yùn)行與觀測(cè)將各個(gè)模塊組合起來(lái)形成一個(gè)可以運(yùn)行的模擬世界。6.1 主模擬循環(huán)搭建import time import random class Simulation: def __init__(self, num_agents5): self.agents: List[Agent] [] self.markets: Dict[str, Market] {grain: Market(grain), lumber: Market(lumber)} self.current_step 0 self.data_log [] # 用于記錄每一步的宏觀數(shù)據(jù) # 初始化智能體 personas [ 一個(gè)保守的農(nóng)民重視糧食安全, 一個(gè)激進(jìn)的木材商人追求高利潤(rùn), 一個(gè)平衡的工匠注重穩(wěn)定收入, 一個(gè)年輕的投機(jī)者樂(lè)于冒險(xiǎn), 一個(gè)經(jīng)驗(yàn)豐富的倉(cāng)儲(chǔ)商善于把握時(shí)機(jī) ] for i, p in enumerate(personas[:num_agents]): agent Agent(namefAgent_{i}, persona_descp) agent.memory_system MemorySystem(agent.id) # 為每個(gè)智能體掛載記憶系統(tǒng) self.agents.append(agent) def run_step(self): 運(yùn)行一個(gè)模擬周期 self.current_step 1 print(f\n 模擬步數(shù) {self.current_step} ) # 1. 環(huán)境更新例如隨機(jī)事件 if random.random() 0.1: # 10%概率發(fā)生隨機(jī)事件 event random.choice([豐收, 干旱, 政策利好]) print(f隨機(jī)事件: {event}) # 這里可以調(diào)整市場(chǎng)參數(shù) if event 豐收: self.markets[grain].supply * 1.2 elif event 干旱: self.markets[grain].supply * 0.8 market_snapshot {name: market.current_price for name, market in self.markets.items()} # 2. 每個(gè)智能體決策并行動(dòng) total_buy_sell {good: 0.0 for good in self.markets} for agent in self.agents: # 獲取決策 action_str agent.make_decision(market_snapshot) print(f{agent.name}: {action_str}) # 解析并執(zhí)行動(dòng)作這里簡(jiǎn)化處理僅處理BUY/SELL try: if action_str.startswith(動(dòng)作BUY): _, good, qty action_str.replace(動(dòng)作BUY, ).strip().split() qty float(qty) good good.lower() cost self.markets[good].current_price * qty if agent.inventory[cash] cost: agent.inventory[cash] - cost agent.inventory[good] agent.inventory.get(good, 0) qty total_buy_sell[good] qty # 凈買入為正 # 記錄記憶 memory MemoryItem( idstr(uuid.uuid4()), typeepisodic, contentf在步驟{self.current_step}以{self.markets[good].current_price}的價(jià)格購(gòu)買了{(lán)qty}單位{good}。, metadata{step: self.current_step, action: BUY, good: good, quantity: qty, price: self.markets[good].current_price} ) agent.memory_system.add_memory(memory) elif action_str.startswith(動(dòng)作SELL): _, good, qty action_str.replace(動(dòng)作SELL, ).strip().split() qty float(qty) good good.lower() if agent.inventory.get(good, 0) qty: revenue self.markets[good].current_price * qty agent.inventory[cash] revenue agent.inventory[good] - qty total_buy_sell[good] - qty # 凈賣出為負(fù) # 記錄記憶... except Exception as e: print(f解析/執(zhí)行動(dòng)作失敗: {action_str}, 錯(cuò)誤: {e}) # 每隔一定步數(shù)觸發(fā)記憶總結(jié) if self.current_step % 5 0: recent_mems agent.memory_system.retrieve_memories(query_textrecent, n_results10) summary agent.memory_system.summarize_memories(recent_mems) if summary: print(f{agent.name} 的記憶總結(jié): {summary[:100]}...) # 3. 市場(chǎng)根據(jù)總交易量更新價(jià)格 for good, net in total_buy_sell.items(): self.markets[good].update_price(net) print(f{good}市場(chǎng): 凈交易量{net:.2f}, 新價(jià)格{self.markets[good].current_price:.2f}) # 4. 記錄宏觀數(shù)據(jù) step_data { step: self.current_step, grain_price: self.markets[grain].current_price, lumber_price: self.markets[lumber].current_price, total_cash: sum([a.inventory[cash] for a in self.agents]), # ... 其他指標(biāo) } self.data_log.append(step_data) def run(self, steps20): 運(yùn)行多步模擬 for _ in range(steps): self.run_step() time.sleep(0.5) # 方便觀察 # 運(yùn)行模擬 if __name__ __main__: sim Simulation(num_agents3) sim.run(steps10)6.2 可視化與結(jié)果分析模擬運(yùn)行后data_log里積累了時(shí)間序列數(shù)據(jù)。我們可以用matplotlib進(jìn)行簡(jiǎn)單的可視化觀察涌現(xiàn)現(xiàn)象。import pandas as pd import matplotlib.pyplot as plt # 假設(shè)simulation.data_log已經(jīng)存在 df pd.DataFrame(sim.data_log) fig, axes plt.subplots(2, 1, figsize(10, 8)) # 價(jià)格走勢(shì) axes[0].plot(df[step], df[grain_price], labelGrain Price, markero) axes[0].plot(df[step], df[lumber_price], labelLumber Price, markers) axes[0].set_xlabel(Simulation Step) axes[0].set_ylabel(Price) axes[0].set_title(Market Price Dynamics) axes[0].legend() axes[0].grid(True, linestyle--, alpha0.7) # 總現(xiàn)金量簡(jiǎn)單衡量經(jīng)濟(jì)活躍度 axes[1].plot(df[step], df[total_cash], labelTotal Cash in System, colorgreen, marker^) axes[1].set_xlabel(Simulation Step) axes[1].set_ylabel(Total Cash) axes[1].set_title(System Liquidity) axes[1].legend() axes[1].grid(True, linestyle--, alpha0.7) plt.tight_layout() plt.show()通過(guò)圖表你可以觀察價(jià)格是否出現(xiàn)波動(dòng)周期總現(xiàn)金量如何變化如果設(shè)計(jì)了生產(chǎn)消費(fèi)總現(xiàn)金可能不變但資產(chǎn)價(jià)值會(huì)變。更復(fù)雜的分析可以包括計(jì)算每個(gè)智能體的財(cái)富變化、交易網(wǎng)絡(luò)的演化等。7. 避坑指南與進(jìn)階優(yōu)化方向在實(shí)踐EconAI這類項(xiàng)目時(shí)你會(huì)遇到許多預(yù)料之中和預(yù)料之外的挑戰(zhàn)。以下是一些關(guān)鍵的注意事項(xiàng)和進(jìn)階思路。7.1 常見問(wèn)題與調(diào)試技巧LLM調(diào)用成本與延遲這是最大的實(shí)踐瓶頸。頻繁調(diào)用GPT-4 API進(jìn)行模擬成本會(huì)迅速攀升。技巧對(duì)于實(shí)驗(yàn)大量使用gpt-3.5-turbo。將多個(gè)智能體的決策請(qǐng)求批量處理如果它們的環(huán)境上下文獨(dú)立。設(shè)置合理的max_tokens和temperature以控制輸出長(zhǎng)度和穩(wěn)定性。考慮使用開源模型本地部署雖然初期設(shè)置復(fù)雜但長(zhǎng)期成本可控且隱私性好。智能體行為失控或趨同所有智能體可能做出相似的非理性決策或者行為完全脫離預(yù)設(shè)人格。調(diào)試首先詳細(xì)記錄每個(gè)智能體每個(gè)周期的完整提示詞和LLM響應(yīng)。這是調(diào)試的黃金標(biāo)準(zhǔn)。檢查提示詞是否清晰鎖定了角色人格參數(shù)是否被有效嵌入到上下文中temperature參數(shù)是否設(shè)置得當(dāng)太低導(dǎo)致死板太高導(dǎo)致隨機(jī)其次為決策引入少量隨機(jī)噪聲或個(gè)性化偏差防止趨同。記憶檢索不相關(guān)或效率低技巧優(yōu)化查詢生成。不要直接用原始觀察作為查詢而是讓LLM先根據(jù)當(dāng)前決策任務(wù)生成一個(gè)更聚焦的查詢問(wèn)題例如“根據(jù)當(dāng)前市場(chǎng)我是否應(yīng)該賣出谷物”再用這個(gè)問(wèn)題去檢索記憶。調(diào)整向量模型對(duì)于經(jīng)濟(jì)文本可以嘗試用經(jīng)濟(jì)新聞或報(bào)告微調(diào)過(guò)的嵌入模型。模擬運(yùn)行速度慢瓶頸分析主要瓶頸通常是LLM調(diào)用和向量檢索。對(duì)于向量檢索確保使用索引如FAISS的IVF索引。對(duì)于LLM如前所述考慮批量調(diào)用、緩存常見響應(yīng)、或使用更小的模型。經(jīng)濟(jì)系統(tǒng)失衡市場(chǎng)價(jià)格飛漲或暴跌至不合理范圍或者某個(gè)資源被單一智能體壟斷。對(duì)策在環(huán)境引擎中引入穩(wěn)定機(jī)制如價(jià)格限幅、基礎(chǔ)貨幣注入/回收、反壟斷規(guī)則模擬稅收或補(bǔ)貼。這并非“作弊”而是模擬現(xiàn)實(shí)中的宏觀調(diào)控。7.2 性能優(yōu)化與擴(kuò)展建議當(dāng)基礎(chǔ)版本跑通后你可以從以下方向深化分層決策與快速路徑不是每個(gè)決策都需要?jiǎng)隈{LLM??梢詾橹悄荏w設(shè)計(jì)一個(gè)快速?zèng)Q策系統(tǒng)對(duì)于常規(guī)、低風(fēng)險(xiǎn)決策如按習(xí)慣購(gòu)買日用品使用基于規(guī)則的快速響應(yīng)。只有遇到復(fù)雜、高風(fēng)險(xiǎn)或新情況時(shí)才觸發(fā)完整的LLM推理循環(huán)。這能大幅降低計(jì)算開銷。更復(fù)雜的環(huán)境與動(dòng)作空間引入生產(chǎn)將原材料加工為商品、研發(fā)提升生產(chǎn)效率、金融借貸、債券、政府稅收、公共品等模塊。動(dòng)作空間從簡(jiǎn)單的買賣擴(kuò)展到更復(fù)雜的合同簽訂、長(zhǎng)期投資等。情感與社交關(guān)系的建模在記憶中增加情感標(biāo)簽喜悅、憤怒、后悔并讓情感影響人格參數(shù)和決策。智能體之間可以建立“友誼”、“競(jìng)爭(zhēng)”或“信任”關(guān)系這些關(guān)系會(huì)影響信息分享的真實(shí)性和交易條件。離線學(xué)習(xí)與策略改進(jìn)讓智能體不僅從在線經(jīng)驗(yàn)中學(xué)習(xí)還能進(jìn)行“離線反思”。定期用一批歷史記憶訓(xùn)練一個(gè)輕量級(jí)的策略網(wǎng)絡(luò)一個(gè)小型神經(jīng)網(wǎng)絡(luò)讓它學(xué)習(xí)在什么狀態(tài)下采取什么動(dòng)作收益更高。這個(gè)策略網(wǎng)絡(luò)可以作為L(zhǎng)LM決策的輔助或快速?zèng)Q策模塊。引入外部數(shù)據(jù)讓經(jīng)濟(jì)環(huán)境接收真實(shí)世界的新聞?wù)蚪?jīng)濟(jì)數(shù)據(jù)作為輸入使模擬環(huán)境與真實(shí)世界產(chǎn)生弱關(guān)聯(lián)觀察智能體如何應(yīng)對(duì)“真實(shí)”的沖擊。EconAI是一個(gè)宏大的愿景我們構(gòu)建的只是一個(gè)極其簡(jiǎn)化的雛形。它的價(jià)值不在于預(yù)測(cè)真實(shí)經(jīng)濟(jì)而在于為我們提供一個(gè)可控的“數(shù)字實(shí)驗(yàn)室”去檢驗(yàn)關(guān)于人類經(jīng)濟(jì)行為、制度演化、復(fù)雜系統(tǒng)動(dòng)力學(xué)的各種理論和猜想。每一步深入的實(shí)現(xiàn)都會(huì)讓你對(duì)智能體、LLM以及社會(huì)經(jīng)濟(jì)系統(tǒng)的復(fù)雜性有更深刻的理解。從這個(gè)玩具系統(tǒng)出發(fā)你可以選擇任何一個(gè)感興趣的方向深挖下去比如優(yōu)化記憶架構(gòu)、設(shè)計(jì)更精巧的市場(chǎng)機(jī)制或是探索多智能體協(xié)作的涌現(xiàn)每一條路都充滿了挑戰(zhàn)和樂(lè)趣。