設(shè)計(jì):從ReAct模式到約束引導(dǎo)容錯(cuò)實(shí)踐)
1. 項(xiàng)目概述當(dāng)智能體開始“學(xué)步”最近無論是技術(shù)社區(qū)還是行業(yè)討論“智能體”這個(gè)詞的熱度都高得有點(diǎn)燙手。但如果你仔細(xì)觀察會(huì)發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象大家談?wù)摰慕裹c(diǎn)正從年初那種“無所不能”的宏大敘事悄然轉(zhuǎn)向更具體、更接地氣的落地嘗試。這感覺就像一個(gè)被寄予厚望的“天才少年”終于要離開實(shí)驗(yàn)室的溫床開始嘗試在真實(shí)、復(fù)雜、甚至有點(diǎn)混亂的現(xiàn)實(shí)世界里“跌跌撞撞”地學(xué)步了。這個(gè)“Agent 跌跌撞撞進(jìn)入世界”的過程恰恰是當(dāng)前AI應(yīng)用從概念走向?qū)嵺`最核心、也最富挑戰(zhàn)性的階段。所謂“智能體”簡(jiǎn)單說就是一個(gè)能感知環(huán)境、自主決策并執(zhí)行任務(wù)來達(dá)成目標(biāo)的AI程序。它不再是過去那種你問一句、它答一句的聊天機(jī)器人而更像一個(gè)擁有“大腦”和“手腳”的虛擬助手。這個(gè)“大腦”通常由一個(gè)大語言模型驅(qū)動(dòng)負(fù)責(zé)理解、規(guī)劃和決策而“手腳”則是一系列工具比如調(diào)用搜索引擎、操作軟件、讀寫文件、調(diào)用API等。理想很豐滿你只需要告訴它一個(gè)目標(biāo)比如“幫我分析一下上個(gè)月的銷售數(shù)據(jù)寫份報(bào)告并給市場(chǎng)部發(fā)個(gè)郵件”它就能自己分解任務(wù)、調(diào)用工具、一步步完成。但現(xiàn)實(shí)是當(dāng)這個(gè)智能體真正開始執(zhí)行時(shí)你會(huì)發(fā)現(xiàn)它走得并不穩(wěn)常?!八印薄?guī)劃出錯(cuò)、工具調(diào)用失敗、陷入死循環(huán)、或者給出令人啼笑皆非的結(jié)果。這背后的核心矛盾在于實(shí)驗(yàn)室里訓(xùn)練出的“大腦”大模型對(duì)真實(shí)世界的復(fù)雜性和不確定性認(rèn)知嚴(yán)重不足。它就像一個(gè)理論知識(shí)滿分但毫無社會(huì)經(jīng)驗(yàn)的學(xué)生突然被扔進(jìn)一個(gè)充滿潛規(guī)則、模糊邊界和意外事件的職場(chǎng)。我們正在做的就是為這個(gè)“學(xué)生”設(shè)計(jì)一套行之有效的“崗前培訓(xùn)”和“工作手冊(cè)”讓它能真正開始干活哪怕一開始走得搖搖晃晃。這篇文章我就結(jié)合自己最近在幾個(gè)實(shí)際項(xiàng)目中折騰智能體的經(jīng)歷拆解一下它“進(jìn)入世界”時(shí)遇到的那些坎以及我們是怎么連扶帶拽試圖讓它走穩(wěn)一點(diǎn)的。2. 智能體架構(gòu)的核心矛盾與設(shè)計(jì)思路2.1 理想與現(xiàn)實(shí)的鴻溝為什么智能體會(huì)“跌撞”要理解智能體為何步履蹣跚得先看看它的標(biāo)準(zhǔn)工作流通常被稱為“ReAct”模式思考-行動(dòng)-觀察。思考根據(jù)目標(biāo)和當(dāng)前狀態(tài)決定下一步做什么。行動(dòng)選擇并調(diào)用一個(gè)合適的工具如搜索、計(jì)算、寫文件。觀察獲取工具執(zhí)行的結(jié)果或環(huán)境反饋。循環(huán)直到任務(wù)完成或失敗。這個(gè)流程在紙面上完美無缺。但問題出在每一個(gè)環(huán)節(jié)思考的幻覺與短視大模型基于概率生成它的“思考”可能基于不存在的知識(shí)幻覺或者只看到眼前一步缺乏全局規(guī)劃。比如你讓它“訂一張明天北京飛上海最便宜的機(jī)票”它可能直接調(diào)用搜索工具搜“北京到上海機(jī)票”卻忘了需要先獲取當(dāng)前日期、比較多個(gè)航司、考慮時(shí)間偏好等前置步驟。行動(dòng)的“手腳不協(xié)調(diào)”工具調(diào)用有嚴(yán)格的格式要求函數(shù)名、參數(shù)。模型可能生成錯(cuò)誤的函數(shù)名或者參數(shù)類型不匹配該傳數(shù)字卻傳了字符串。更常見的是它無法理解工具的“能力邊界”。比如你給了它一個(gè)“發(fā)送郵件”的工具它可能試圖用這個(gè)工具去“保存文件到數(shù)據(jù)庫”。觀察的“信息過載與缺失”工具返回的結(jié)果可能很長(zhǎng)、很雜亂比如一個(gè)完整的網(wǎng)頁搜索結(jié)果。模型需要從中精準(zhǔn)提取關(guān)鍵信息但如果信息太多或格式不固定它很容易“看花眼”提取錯(cuò)誤。反之如果返回信息太少比如一個(gè)API只返回“成功”或錯(cuò)誤碼模型又無法獲得足夠的狀態(tài)更新來指導(dǎo)下一步。這些問題的根源在于大模型是一個(gè)在靜態(tài)文本上訓(xùn)練出的“世界模型”它對(duì)動(dòng)態(tài)的、有狀態(tài)的、具身的交互過程缺乏本質(zhì)理解。我們?cè)O(shè)計(jì)的智能體架構(gòu)本質(zhì)上是在這個(gè)大模型“大腦”外面搭建一套“輔助神經(jīng)系統(tǒng)”和“行為規(guī)范”來彌補(bǔ)這些缺陷。2.2 架構(gòu)設(shè)計(jì)的核心思路約束、引導(dǎo)與容錯(cuò)基于上述問題一個(gè)魯棒的智能體架構(gòu)不能只依賴大模型本身必須引入強(qiáng)有力的外部框架。我們的設(shè)計(jì)思路圍繞三個(gè)關(guān)鍵詞展開約束明確告訴智能體“什么能做什么不能做”。這是通過工具清單和嚴(yán)格的輸入輸出模式來實(shí)現(xiàn)的。每個(gè)工具都必須有清晰、無歧義的名稱、功能描述和參數(shù)格式。在每次模型“思考”時(shí)我們只把當(dāng)前可用的、相關(guān)的工具描述喂給它而不是一股腦全塞進(jìn)去。這就像給一個(gè)新手一本清晰的《操作手冊(cè)》而不是扔給他一整座圖書館。引導(dǎo)在智能體可能“迷路”的地方提前設(shè)置路標(biāo)。這主要通過提示工程和規(guī)劃模板實(shí)現(xiàn)。系統(tǒng)提示詞是關(guān)鍵中的關(guān)鍵。它不再是簡(jiǎn)單的“你是一個(gè)助手”而是一份詳細(xì)的《崗位說明書》。里面需要明確你的角色是什么你的核心目標(biāo)是什么你必須遵循的工作流程是什么例如“你必須先拆解用戶目標(biāo)為子任務(wù)為每個(gè)子任務(wù)選擇工具執(zhí)行后總結(jié)結(jié)果再繼續(xù)下一步?!庇心男﹪?yán)格的禁忌例如“絕對(duì)不允許在未驗(yàn)證信息真實(shí)性前給出結(jié)論?!薄安荒苓B續(xù)調(diào)用同一個(gè)工具超過3次而不檢查結(jié)果?!币?guī)劃模板對(duì)于復(fù)雜任務(wù)我們不再讓模型自由發(fā)揮而是提供任務(wù)拆解的模板。比如對(duì)于數(shù)據(jù)分析任務(wù)模板可能是“步驟1確認(rèn)數(shù)據(jù)源和字段。步驟2進(jìn)行數(shù)據(jù)清洗處理缺失值、異常值。步驟3按維度A和B進(jìn)行聚合計(jì)算。步驟4生成可視化圖表描述。步驟5總結(jié)核心發(fā)現(xiàn)?!蹦P驮谶@個(gè)框架內(nèi)填充具體內(nèi)容大大降低了規(guī)劃出錯(cuò)的概率。容錯(cuò)預(yù)設(shè)智能體一定會(huì)犯錯(cuò)并準(zhǔn)備好“安全網(wǎng)”。這包括超時(shí)與循環(huán)檢測(cè)監(jiān)控智能體的執(zhí)行步驟。如果它在一個(gè)簡(jiǎn)單步驟上循環(huán)超過5次或者在規(guī)劃階段耗時(shí)過長(zhǎng)就強(qiáng)制中斷并拋出一個(gè)明確的錯(cuò)誤提示用戶或上層系統(tǒng)進(jìn)行干預(yù)。結(jié)果驗(yàn)證與重試在關(guān)鍵步驟后加入一個(gè)“驗(yàn)證”環(huán)節(jié)。例如調(diào)用搜索工具后讓模型自己判斷獲取的信息是否足夠、是否相關(guān)。如果不夠可以自動(dòng)調(diào)整搜索詞重試一次。優(yōu)雅降級(jí)當(dāng)復(fù)雜路徑走不通時(shí)設(shè)計(jì)備選方案。比如如果自動(dòng)生成圖表失敗則降級(jí)為用文字描述數(shù)據(jù)趨勢(shì)。這套“約束-引導(dǎo)-容錯(cuò)”的思路是我們所有智能體項(xiàng)目的設(shè)計(jì)基石。它承認(rèn)了當(dāng)前大模型的局限性不追求一步到位的“全能”而是追求在有限場(chǎng)景下的“可靠可用”。3. 從零搭建一個(gè)基礎(chǔ)智能體的實(shí)操要點(diǎn)理論說再多不如動(dòng)手搭一個(gè)。下面我以一個(gè)相對(duì)通用的“信息查詢與報(bào)告生成”智能體為例拆解從環(huán)境準(zhǔn)備到核心環(huán)節(jié)實(shí)現(xiàn)的全過程。這個(gè)智能體的目標(biāo)是用戶輸入一個(gè)查詢主題如“量子計(jì)算最新進(jìn)展”它能自動(dòng)搜索信息、整理摘要并生成一份結(jié)構(gòu)清晰的Markdown格式報(bào)告。3.1 環(huán)境與工具鏈選型工欲善其事必先利其器。選型的核心原則是成熟、可控、易于調(diào)試。大模型服務(wù)OpenAI GPT-4或Claude 3系列是當(dāng)前首選。它們的推理能力、指令遵循和工具調(diào)用格式支持最為成熟。國(guó)內(nèi)可選擇DeepSeek、通義千問等。關(guān)鍵點(diǎn)優(yōu)先使用最新的、推理能力強(qiáng)的模型即使貴一點(diǎn)。因?yàn)橹悄荏w的核心成本是“試錯(cuò)”帶來的無效token消耗一個(gè)更強(qiáng)的“大腦”能顯著減少規(guī)劃錯(cuò)誤和循環(huán)長(zhǎng)期來看更劃算。開發(fā)框架LangChain或LlamaIndex。兩者都提供了構(gòu)建智能體所需的核心抽象Agent、Tools、Memory。LangChain生態(tài)更豐富工具更多LlamaIndex在數(shù)據(jù)檢索方面更專精。對(duì)于入門和大多數(shù)應(yīng)用LangChain的文檔和社區(qū)支持更好。我們這里以LangChain為例。關(guān)鍵工具準(zhǔn)備搜索工具SerpAPI谷歌/必應(yīng)搜索API或 Tavily Search API專為AI優(yōu)化的搜索。嚴(yán)禁使用任何未經(jīng)授權(quán)的網(wǎng)絡(luò)爬蟲或違反服務(wù)條款的方式獲取信息。代碼執(zhí)行如果報(bào)告需要簡(jiǎn)單計(jì)算或圖表可以集成一個(gè)安全的代碼執(zhí)行工具如Python REPL工具但必須放在沙箱環(huán)境中嚴(yán)格限制權(quán)限。文件讀寫本地文件系統(tǒng)工具用于保存最終報(bào)告。開發(fā)環(huán)境Python 3.9使用虛擬環(huán)境管理依賴。必備庫langchain,langchain-openai,python-dotenv管理API密鑰。注意API密鑰等敏感信息務(wù)必通過環(huán)境變量.env文件管理切勿硬編碼在代碼中。3.2 核心環(huán)節(jié)一定義工具與系統(tǒng)提示詞這是決定智能體行為模式的“憲法”必須精心設(shè)計(jì)。1. 工具定義在LangChain中一個(gè)工具通常由一個(gè)函數(shù)和其描述組成。描述至關(guān)重要它是模型選擇工具的唯一依據(jù)。from langchain.tools import Tool import requests import os def search_web(query: str) - str: 執(zhí)行一次網(wǎng)絡(luò)搜索獲取關(guān)于某個(gè)主題的最新信息。輸入應(yīng)為一個(gè)明確的搜索查詢字符串。 # 這里以Tavily Search為例 api_key os.getenv(TAVILY_API_KEY) params {api_key: api_key, query: query, max_results: 5} response requests.post(https://api.tavily.com/search, jsonparams) if response.status_code 200: results response.json().get(results, []) # 將結(jié)果格式化為清晰的文本便于模型閱讀 formatted_results [] for r in results: formatted_results.append(f標(biāo)題: {r.get(title)}\n鏈接: {r.get(url)}\n內(nèi)容摘要: {r.get(content)}\n---) return \n.join(formatted_results) else: return f搜索失敗狀態(tài)碼{response.status_code} # 將函數(shù)包裝成Tool對(duì)象 search_tool Tool( nameWebSearch, funcsearch_web, description當(dāng)用戶需要獲取最新的、未知的或?qū)崟r(shí)信息時(shí)使用此工具。輸入必須是一個(gè)具體的搜索查詢?cè)~。 ) # 可以繼續(xù)定義其他工具如 save_to_file, calculate 等2. 系統(tǒng)提示詞工程這是智能體的“靈魂”。一個(gè)好的提示詞要明確角色、目標(biāo)、規(guī)則和流程。from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder system_prompt 你是一個(gè)專業(yè)的研究助理和信息整理專家。你的任務(wù)是幫助用戶查詢信息并生成高質(zhì)量的報(bào)告。 你必須嚴(yán)格遵守以下工作流程 1. **理解與澄清**首先準(zhǔn)確理解用戶的請(qǐng)求。如果有任何模糊之處必須詢問澄清不要猜測(cè)。 2. **規(guī)劃與搜索**將復(fù)雜請(qǐng)求拆解為幾個(gè)具體的搜索查詢。然后使用WebSearch工具依次執(zhí)行這些搜索以獲取全面信息。 3. **分析與綜合**仔細(xì)閱讀所有搜索結(jié)果。提取關(guān)鍵事實(shí)、數(shù)據(jù)、觀點(diǎn)和趨勢(shì)。區(qū)分不同來源的信息注意它們之間的一致性或矛盾。 4. **結(jié)構(gòu)化報(bào)告**將分析結(jié)果組織成一份結(jié)構(gòu)清晰的Markdown報(bào)告。報(bào)告必須包含 - 標(biāo)題 - 概述簡(jiǎn)要總結(jié)核心發(fā)現(xiàn) - 主要內(nèi)容分小節(jié)論述使用二級(jí)標(biāo)題## - 關(guān)鍵要點(diǎn)用列表形式列出 - 信息來源列出參考的鏈接 5. **保存輸出**使用save_to_file工具將最終報(bào)告保存到指定位置。 重要規(guī)則 - 絕對(duì)禁止捏造信息。所有事實(shí)和數(shù)據(jù)必須來源于搜索工具。 - 一次只執(zhí)行一個(gè)搜索查詢確保查詢?cè)~具體、明確。 - 在生成最終報(bào)告前必須完成所有必要的信息搜索。 - 報(bào)告語言需專業(yè)、客觀、簡(jiǎn)潔。 # 構(gòu)建提示詞模板 prompt_template ChatPromptTemplate.from_messages([ (system, system_prompt), MessagesPlaceholder(variable_namechat_history), # 用于多輪對(duì)話記憶 (human, {input}), MessagesPlaceholder(variable_nameagent_scratchpad), # LangChain用于存放Agent思考過程的地方 ])實(shí)操心得工具描述要具體“輸入必須是一個(gè)具體的搜索查詢?cè)~”比“用于搜索”有效得多。規(guī)則要可執(zhí)行“一次只執(zhí)行一個(gè)搜索查詢”這樣的規(guī)則能有效防止模型生成復(fù)雜混亂的查詢。流程要傻瓜化把模型當(dāng)成一個(gè)需要手把手教的新員工步驟越清晰它犯錯(cuò)的概率越低。3.3 核心環(huán)節(jié)二組裝智能體與執(zhí)行循環(huán)有了工具和提示詞就可以用LangChain的框架把它們組裝起來。from langchain_openai import ChatOpenAI from langchain.agents import AgentExecutor, create_openai_tools_agent from langchain.memory import ConversationBufferMemory # 1. 初始化大模型 llm ChatOpenAI(modelgpt-4-turbo-preview, temperature0) # temperature設(shè)為0減少隨機(jī)性 # 2. 準(zhǔn)備工具列表 tools [search_tool] # 這里可以加入更多工具如 save_to_file # 3. 創(chuàng)建Agent agent create_openai_tools_agent(llm, tools, prompt_template) # 4. 創(chuàng)建Agent執(zhí)行器并注入記憶 memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue) agent_executor AgentExecutor( agentagent, toolstools, memorymemory, verboseTrue, # 開啟詳細(xì)日志便于調(diào)試 handle_parsing_errorsTrue, # 處理模型輸出解析錯(cuò)誤 max_iterations10, # 防止無限循環(huán) early_stopping_methodgenerate # 達(dá)到最大迭代次數(shù)時(shí)讓模型生成一個(gè)最終回復(fù) ) # 5. 執(zhí)行任務(wù) result agent_executor.invoke({input: 請(qǐng)幫我調(diào)研一下2024年人工智能在醫(yī)療影像診斷領(lǐng)域的最新進(jìn)展并生成一份摘要報(bào)告。}) print(result[output])當(dāng)verboseTrue時(shí)你會(huì)在控制臺(tái)看到智能體完整的“思考-行動(dòng)-觀察”過程這是調(diào)試和理解其行為的最佳方式。4. 智能體“學(xué)步”路上的典型問題與調(diào)試實(shí)錄即使按照上述最佳實(shí)踐搭建智能體在實(shí)際運(yùn)行中依然會(huì)狀況百出。下面是我在項(xiàng)目中遇到的幾個(gè)經(jīng)典“坑”及其排查解決思路。4.1 問題一工具調(diào)用格式錯(cuò)誤現(xiàn)象智能體在應(yīng)該調(diào)用工具時(shí)卻輸出了自然語言比如“我現(xiàn)在應(yīng)該去搜索一下量子計(jì)算的最新論文?!?或者調(diào)用工具時(shí)參數(shù)格式完全錯(cuò)誤。根因分析提示詞指令不清晰系統(tǒng)提示詞中沒有強(qiáng)約束輸出格式。OpenAI的Tool Calling功能要求模型輸出特定的JSON結(jié)構(gòu)如果提示詞混亂模型可能“忘記”這個(gè)格式。工具描述模糊工具的描述沒有明確說明輸入格式模型不知道該如何構(gòu)造參數(shù)。模型溫度Temperature過高temperature參數(shù)控制隨機(jī)性設(shè)為0能保證最大程度的確定性更適合工具調(diào)用場(chǎng)景。解決方案強(qiáng)化格式指令在系統(tǒng)提示詞的開頭或結(jié)尾明確加入“你必須使用提供的工具。當(dāng)使用工具時(shí)請(qǐng)嚴(yán)格按照工具要求的格式輸出不要輸出任何其他解釋性文字?!笔褂肔angChain的create_openai_tools_agent這個(gè)高階函數(shù)已經(jīng)為我們處理了與OpenAI工具調(diào)用格式的對(duì)接比手動(dòng)構(gòu)建Agent更穩(wěn)定。檢查并簡(jiǎn)化工具描述確保description字段用最簡(jiǎn)單的話說明“何時(shí)用”和“輸入是什么”。設(shè)置handle_parsing_errorsTrue在AgentExecutor中開啟這個(gè)選項(xiàng)當(dāng)解析失敗時(shí)它會(huì)將錯(cuò)誤信息反饋給模型讓其重試這是一個(gè)有效的容錯(cuò)機(jī)制。4.2 問題二陷入無效循環(huán)或原地打轉(zhuǎn)現(xiàn)象智能體反復(fù)執(zhí)行相同或相似的操作無法推進(jìn)任務(wù)。例如連續(xù)搜索同一個(gè)關(guān)鍵詞5次或者一直在“規(guī)劃”步驟空轉(zhuǎn)。根因分析觀察結(jié)果未能觸發(fā)狀態(tài)更新工具返回的結(jié)果信息量不足或格式混亂模型無法從中提取有效信息來判斷下一步該做什么于是默認(rèn)重復(fù)上一步。目標(biāo)分解粒度不當(dāng)任務(wù)過于復(fù)雜模型缺乏拆解能力導(dǎo)致卡在第一步。缺乏終止條件模型不知道“做到什么程度算完成”。解決方案優(yōu)化工具返回格式確保工具返回的是結(jié)構(gòu)化、干凈、關(guān)鍵信息突出的文本。例如搜索工具返回時(shí)將標(biāo)題、鏈接、摘要清晰分開比返回原始HTML或雜亂JSON有效得多。引入子任務(wù)列表和狀態(tài)跟蹤在提示詞中要求模型顯式地維護(hù)一個(gè)任務(wù)列表。例如“當(dāng)前任務(wù)1. [進(jìn)行中] 搜索‘AI醫(yī)療影像 2024’ 2. [待開始] 分析搜索結(jié)果并提取關(guān)鍵點(diǎn) 3. [待開始] 撰寫報(bào)告概述?!?每完成一步就更新狀態(tài)。這為模型提供了清晰的上下文。設(shè)定明確的成功標(biāo)準(zhǔn)和迭代限制在系統(tǒng)提示詞中寫明“當(dāng)你認(rèn)為已經(jīng)收集到足夠的信息來撰寫一份全面的報(bào)告時(shí)就停止搜索進(jìn)入報(bào)告撰寫階段?!?同時(shí)務(wù)必在AgentExecutor中設(shè)置max_iterations如10-15這是防止無限循環(huán)的最后防線。4.3 問題三幻覺與信息處理錯(cuò)誤現(xiàn)象報(bào)告中出現(xiàn)搜索結(jié)果中不存在的信息或者嚴(yán)重曲解了搜索到的內(nèi)容。根因分析模型固有的幻覺傾向大模型傾向于生成“合理”而非“真實(shí)”的內(nèi)容。信息過載與提取失敗工具返回信息太多模型“注意力”分散抓錯(cuò)了重點(diǎn)。缺乏驗(yàn)證機(jī)制模型生成內(nèi)容后沒有交叉驗(yàn)證或事實(shí)核對(duì)的步驟。解決方案在提示詞中強(qiáng)化“基于事實(shí)”的指令使用嚴(yán)厲的語氣如“報(bào)告中的所有陳述、數(shù)據(jù)和引用必須嚴(yán)格來源于你通過工具獲取的信息。禁止添加任何你記憶中或想象的內(nèi)容?!?可以要求模型在報(bào)告中為每個(gè)關(guān)鍵點(diǎn)標(biāo)注來源索引。分步處理減少單次輸入不要一次性讓模型處理所有搜索結(jié)果??梢栽O(shè)計(jì)兩個(gè)智能體協(xié)作一個(gè)“研究員”負(fù)責(zé)搜索和提取關(guān)鍵片段另一個(gè)“撰稿人”負(fù)責(zé)根據(jù)這些片段撰寫報(bào)告。這樣每個(gè)步驟的輸入都更聚焦。實(shí)施后驗(yàn)驗(yàn)證如果條件允許在報(bào)告生成后增加一個(gè)“驗(yàn)證”步驟。例如將報(bào)告中的核心事實(shí)提取出來反向搜索進(jìn)行確認(rèn)。雖然這增加了復(fù)雜度但對(duì)于高可靠性要求的場(chǎng)景是值得的。4.4 問題四效率低下與成本失控現(xiàn)象完成一個(gè)簡(jiǎn)單任務(wù)消耗了極多的token運(yùn)行時(shí)間很長(zhǎng)。根因分析冗長(zhǎng)的內(nèi)部思考模型在agent_scratchpad中寫了大量不必要的推理過程。過多的工具調(diào)用每次工具調(diào)用都有輸入和輸出的token消耗。重復(fù)嘗試因錯(cuò)誤導(dǎo)致的重復(fù)執(zhí)行。優(yōu)化策略提示模型“簡(jiǎn)潔思考”在系統(tǒng)提示詞中加入“在內(nèi)部推理時(shí)請(qǐng)盡量簡(jiǎn)潔專注于關(guān)鍵決策點(diǎn)?!笔褂酶咝У哪P蛯?duì)于工具調(diào)用等任務(wù)gpt-3.5-turbo在成本上更有優(yōu)勢(shì)且性能足夠??梢詫pt-4僅用于最復(fù)雜的規(guī)劃或總結(jié)環(huán)節(jié)。設(shè)計(jì)更高效的工具比如一個(gè)能同時(shí)進(jìn)行多項(xiàng)搜索并匯總的工具比多次調(diào)用單一搜索工具更省token。實(shí)施緩存對(duì)于相同的查詢使用緩存機(jī)制避免重復(fù)調(diào)用昂貴的搜索API或模型。5. 讓智能體走得更穩(wěn)進(jìn)階策略與模式當(dāng)基礎(chǔ)智能體能跑起來后我們可以引入更高級(jí)的模式來提升其能力和可靠性。5.1 分層規(guī)劃與執(zhí)行對(duì)于復(fù)雜任務(wù)讓一個(gè)智能體從頭管到尾是不現(xiàn)實(shí)的??梢圆捎谩爸笓]官-工作者”模式。頂層規(guī)劃器一個(gè)智能體負(fù)責(zé)接收用戶指令并將其分解成一個(gè)詳細(xì)的、線性的子任務(wù)列表。它不執(zhí)行具體操作。子任務(wù)執(zhí)行器另一個(gè)或一組智能體每個(gè)專門負(fù)責(zé)某一類子任務(wù)如搜索、分析、寫作。它們從規(guī)劃器領(lǐng)取任務(wù)執(zhí)行后返回結(jié)果。協(xié)調(diào)器管理任務(wù)隊(duì)列和結(jié)果匯總確保規(guī)劃得以順序執(zhí)行。這種模式解耦了規(guī)劃與執(zhí)行讓每個(gè)智能體更專注也更容易調(diào)試和優(yōu)化。例如規(guī)劃器可以用更強(qiáng)的模型如GPT-4而執(zhí)行器用更經(jīng)濟(jì)的模型如GPT-3.5。5.2 動(dòng)態(tài)工具檢索當(dāng)工具數(shù)量很多時(shí)比如有幾十個(gè)API每次把全部工具描述都塞給模型會(huì)干擾其判斷也浪費(fèi)token。可以引入一個(gè)“工具檢索”環(huán)節(jié)根據(jù)用戶當(dāng)前查詢和對(duì)話歷史從一個(gè)工具向量數(shù)據(jù)庫中檢索出最相關(guān)的幾個(gè)工具再提供給模型選擇。這大大提升了工具選擇的準(zhǔn)確性。5.3 人類在環(huán)與檢查點(diǎn)對(duì)于關(guān)鍵任務(wù)完全自動(dòng)化風(fēng)險(xiǎn)太高??梢栽诹鞒讨性O(shè)置“檢查點(diǎn)”讓人類介入審核。審批式智能體完成規(guī)劃后將計(jì)劃展示給用戶確認(rèn)再開始執(zhí)行。修正式智能體執(zhí)行到某個(gè)階段如完成信息收集將中間結(jié)果提交給用戶審核用戶可以提供反饋或修正方向。異常處理當(dāng)智能體多次嘗試失敗或觸發(fā)某些規(guī)則如涉及敏感話題時(shí)自動(dòng)暫停并通知人類處理。這種模式平衡了效率與可控性是當(dāng)前許多企業(yè)級(jí)應(yīng)用采用的方案。5.4 記憶與長(zhǎng)期學(xué)習(xí)為了讓智能體在多次交互中變得更“聰明”需要為它賦予記憶。短期記憶如ConversationBufferMemory記住當(dāng)前會(huì)話的歷史使其能理解上下文。長(zhǎng)期記憶將重要的交互結(jié)果、用戶偏好、成功的工作流程保存到向量數(shù)據(jù)庫。當(dāng)遇到類似任務(wù)時(shí)智能體可以先檢索相關(guān)記憶作為參考。這相當(dāng)于為智能體建立了一個(gè)“經(jīng)驗(yàn)庫”。6. 寫在最后擁抱“跌撞”聚焦場(chǎng)景折騰智能體的這大半年我最大的體會(huì)是放棄對(duì)“通用人工智能”的幻想擁抱當(dāng)下“跌跌撞撞”但切實(shí)有用的專用智能體。我們不是在造一個(gè)科幻電影里的全能機(jī)器人而是在為一個(gè)非常具體的業(yè)務(wù)場(chǎng)景比如“自動(dòng)處理客服工單”、“智能分析周報(bào)數(shù)據(jù)”、“輔助編寫產(chǎn)品文檔”設(shè)計(jì)一個(gè)能部分自動(dòng)化、大幅提升效率的專用工具。這個(gè)過程必然充滿調(diào)試和挫敗。智能體今天可能完美地生成了一份報(bào)告明天就可能因?yàn)橐粋€(gè)語義微妙的查詢而陷入死循環(huán)。但這正是價(jià)值所在——每一次“跌撞”都讓我們更清晰地看到當(dāng)前技術(shù)的邊界以及為了突破這個(gè)邊界我們需要在提示詞、工具設(shè)計(jì)、流程管控上做哪些精細(xì)的打磨。所以如果你也想開始嘗試我的建議是從一個(gè)極小、極具體的場(chǎng)景開始。不要一上來就想著做一個(gè)“萬能助理”。先做一個(gè)“會(huì)議紀(jì)要整理器”或者“競(jìng)品信息監(jiān)控器”。把這個(gè)小場(chǎng)景打透解決好其中的規(guī)劃、工具調(diào)用、錯(cuò)誤處理問題。當(dāng)你手里有了幾個(gè)這樣穩(wěn)定運(yùn)行的小智能體后你對(duì)如何讓AI“進(jìn)入世界”的理解會(huì)比讀任何文章都深刻。這條路沒有捷徑就是一次次地調(diào)試、觀察、改進(jìn)陪著這個(gè)數(shù)字生命一起從跌跌撞撞到逐漸走穩(wěn)。