作的架構演進與實踐)
1. 從“單打獨斗”到“團隊協(xié)作”為什么AI Agent需要技能檢索增強最近和幾個做AI應用的朋友聊天大家普遍有個感覺現(xiàn)在的大模型比如GPT-4、Claude 3單個拎出來能力確實強得離譜寫代碼、做分析、搞創(chuàng)作樣樣都行。但一旦你想讓它幫你處理一個稍微復雜點的、需要多步驟協(xié)作的任務比如“幫我分析一下這個季度的銷售數(shù)據(jù)生成一份PPT報告然后發(fā)郵件給相關團隊”它可能就有點力不從心了。要么是步驟混亂要么是中間某個環(huán)節(jié)比如調用某個特定API生成圖表的指令它理解不了或者干脆就忘了之前設定的目標。這其實就是當前AI Agent智能體面臨的一個核心瓶頸能力與任務的錯配。一個通用大模型就像是一個知識淵博但工具不全的“全才”而一個復雜的現(xiàn)實任務往往需要調用一系列專門的“工具”或“技能”。Skill Retrieval Augmentation技能檢索增強簡稱SRA要解決的就是這個問題。它本質上是一種讓AI Agent從“單打獨斗”進化到“團隊協(xié)作”的架構思想。不是讓一個模型去學所有技能而是建立一個“技能庫”當任務來臨時Agent能像項目經(jīng)理一樣快速檢索并調用最合適的“專家”技能來協(xié)同工作。這個概念最近火起來和“AI Agent”成為熱詞是同步的。大家不再滿足于簡單的問答而是希望AI能真正自主、連貫地完成工作流。從熱搜詞就能看出無論是“ai agent如何搭建”還是“ai agent skill編寫”核心痛點都指向了如何讓Agent具備可靠、可擴展的行動能力。SRA正是為此而生的一套方法論和工程實踐。2. 拆解Skill Retrieval Augmentation核心組件與工作流要理解SRA不能只看概念得把它拆開看看里面到底有哪些齒輪在轉動。一個典型的SRA增強型AI Agent系統(tǒng)通常包含以下幾個核心組件它們協(xié)同工作構成了一個動態(tài)的技能調度中樞。2.1 技能庫你的“專家團隊”花名冊技能庫是SRA的基石。這里的“技能”遠不止是代碼函數(shù)。它可以是一個封裝好的API調用如“發(fā)送郵件”、“查詢數(shù)據(jù)庫”一個提示詞模板如“用SWOT分析法分析以下文本”一個微調的小模型如專門做財務數(shù)據(jù)清洗的模型甚至是一段可執(zhí)行的腳本或工作流。關鍵在于每個技能都需要被“標準化”描述通常包含技能名稱與描述清晰定義這個技能是干什么的。例如“generate_bar_chart: 根據(jù)提供的結構化數(shù)據(jù)生成一張柱狀圖的Base64編碼圖像?!陛斎?輸出模式明確技能需要什么參數(shù)返回什么格式的結果。這通常用JSON Schema來定義確保機器可讀。元數(shù)據(jù)與標簽用于檢索的關鍵。包括技能類別如“數(shù)據(jù)可視化”、“網(wǎng)絡操作”、“文本處理”、適用場景、所需權限、消耗資源等。這部分信息越豐富檢索就越精準。在工程實現(xiàn)上技能庫可以是一個簡單的JSON或YAML配置文件也可以是一個專門的向量數(shù)據(jù)庫。我個人的經(jīng)驗是初期用文件管理足夠直觀但當技能數(shù)量超過幾十個并且需要動態(tài)更新時一個支持向量檢索的數(shù)據(jù)庫如ChromaDB、Weaviate會帶來質的提升因為它能支持基于技能描述的語義檢索。2.2 檢索器為任務尋找“最佳拍檔”當Agent接收到一個用戶任務如“分析銷售數(shù)據(jù)并做PPT”后檢索器就開始工作了。它的目標是從技能庫中找到與當前任務最相關的一個或一組技能。這個過程不是簡單的關鍵詞匹配。一個高效的檢索器通常采用混合檢索策略語義檢索將用戶的任務描述和技能庫中每個技能的描述通過嵌入模型如OpenAI的text-embedding-3-small轉換成向量。然后計算任務向量與所有技能向量之間的余弦相似度找出語義上最接近的技能。這能解決“同一個意思不同說法”的問題。關鍵詞/元數(shù)據(jù)過濾同時利用技能標簽如“PPT”、“圖表”進行快速過濾縮小范圍提升效率。重排序初步檢索出Top N個候選技能后可以用一個更精細的交叉編碼器模型Cross-Encoder對“任務-技能”對進行打分重排選出最匹配的那個。這里有個實戰(zhàn)細節(jié)檢索的粒度。你是檢索一個原子技能如“畫柱狀圖”還是檢索一個復合技能工作流模板如“數(shù)據(jù)分析報告生成流程”在項目初期建議從原子技能開始讓Agent學習組合。隨著模式固定可以將高頻、穩(wěn)定的組合沉淀為新的“復合技能”存入技能庫讓Agent直接調用這能顯著提升復雜任務的執(zhí)行效率和成功率。2.3 規(guī)劃與執(zhí)行引擎大腦與四肢的協(xié)調檢索到技能后事情還沒完。Agent需要規(guī)劃如何調用這些技能。這就是規(guī)劃與執(zhí)行引擎的職責它通常由大模型如GPT-4驅動。任務分解與規(guī)劃大模型根據(jù)用戶意圖和檢索到的技能列表將復雜任務分解為一系列可執(zhí)行的子步驟。例如“分析銷售數(shù)據(jù)并做PPT”可能被分解為① 調用“數(shù)據(jù)查詢”技能獲取數(shù)據(jù)② 調用“數(shù)據(jù)清洗”技能處理數(shù)據(jù)③ 調用“圖表生成”技能柱狀圖、折線圖④ 調用“PPT內容生成”技能編排圖文⑤ 調用“文件保存”技能。參數(shù)填充與技能調用規(guī)劃好步驟后大模型需要為每個技能調用生成具體的輸入?yún)?shù)。例如為“圖表生成”技能填充data數(shù)據(jù)、chart_type圖表類型、title標題等字段。然后執(zhí)行引擎負責以安全、可控的方式調用這些技能可能是本地函數(shù)、HTTP API等。狀態(tài)管理與循環(huán)執(zhí)行是一個循環(huán)過程。每個技能執(zhí)行后其結果會成為當前任務狀態(tài)的一部分。大模型需要根據(jù)這個新狀態(tài)決定下一步是繼續(xù)執(zhí)行下一個規(guī)劃好的技能還是因為出現(xiàn)了意外情況如技能執(zhí)行失敗、結果不符合預期需要重新規(guī)劃或檢索新的技能。這個循環(huán)規(guī)劃 - 執(zhí)行 - 觀察 - 再規(guī)劃是Agentic AI智能體AI的核心特征而SRA為這個循環(huán)提供了可靠的“工具包”。3. 實戰(zhàn)從零搭建一個具備SRA能力的簡易AI Agent光說不練假把式。我們用一個具體的場景來串聯(lián)上述概念構建一個“市場簡報生成Agent”。它的功能是用戶輸入一個公司名Agent能自動獲取該公司的最新新聞進行情感分析并生成一份包含關鍵信息和觀點總結的簡報。3.1 第一步定義與封裝技能我們首先需要建立技能庫。這里用Python字典列表模擬一個簡單的技能庫。skills_library [ { name: fetch_company_news, description: 根據(jù)給定的公司名稱從新聞API獲取最近一周的相關新聞標題和摘要。, input_schema: { type: object, properties: { company_name: {type: string, description: 目標公司名稱} }, required: [company_name] }, output_schema: { type: array, items: { type: object, properties: { title: {type: string}, summary: {type: string}, source: {type: string}, date: {type: string} } } }, tags: [data_acquisition, news, web] }, { name: analyze_sentiment, description: 對一段文本進行情感分析判斷其情感傾向積極、消極、中性并給出置信度。, input_schema: { type: object, properties: { text: {type: string, description: 待分析的文本內容} }, required: [text] }, output_schema: { type: object, properties: { sentiment: {type: string, enum: [positive, negative, neutral]}, confidence: {type: number} } }, tags: [nlp, analysis, text_processing] }, { name: generate_brief_report, description: 根據(jù)提供的結構化信息如新聞列表及情感分析結果生成一份格式良好的Markdown格式簡報。, input_schema: { type: object, properties: { company_name: {type: string}, news_items: { type: array, items: { type: object, properties: { title: {type: string}, summary: {type: string}, sentiment: {type: string} } } } }, required: [company_name, news_items] }, output_schema: { type: string, description: 生成的簡報內容Markdown格式。 }, tags: [generation, summarization, reporting] } ]注意在實際項目中技能描述description的質量至關重要。它需要精確、無歧義并且包含可能用于檢索的同義詞。例如“fetch_company_news”的描述里可以加上“獲取資訊、收集信息”等詞提高檢索命中率。3.2 第二步實現(xiàn)基于語義的檢索器我們使用Sentence Transformers庫來構建一個簡單的語義檢索器。首先將所有技能的描述文本向量化并存儲。from sentence_transformers import SentenceTransformer import numpy as np from sklearn.metrics.pairwise import cosine_similarity # 加載嵌入模型 embedder SentenceTransformer(all-MiniLM-L6-v2) # 輕量且效果不錯的模型 # 準備技能文本將名稱、描述、標簽拼接起來用于檢索 skill_texts [] for skill in skills_library: text f{skill[name]}. {skill[description]} Tags: {, .join(skill[tags])} skill_texts.append(text) # 生成技能向量庫 skill_embeddings embedder.encode(skill_texts, convert_to_tensorTrue) def retrieve_skills(query, top_k3): 根據(jù)查詢語句檢索最相關的技能。 # 將查詢語句向量化 query_embedding embedder.encode(query, convert_to_tensorTrue) # 計算余弦相似度 # 注意這里將PyTorch tensor轉換為numpy數(shù)組以便使用sklearn實際生產(chǎn)環(huán)境可優(yōu)化 cos_scores cosine_similarity(query_embedding.cpu().numpy().reshape(1, -1), skill_embeddings.cpu().numpy())[0] # 獲取相似度最高的top_k個索引 top_results np.argsort(cos_scores)[::-1][:top_k] retrieved_skills [] for idx in top_results: retrieved_skills.append({ skill: skills_library[idx], score: cos_scores[idx] }) return retrieved_skills # 測試檢索 user_task 幫我看看蘋果公司最近有什么新聞并分析一下輿論情況。 retrieved retrieve_skills(user_task) print(檢索到的技能) for r in retrieved: print(f- {r[skill][name]} (得分: {r[score]:.3f}))運行上述代碼你應該能看到fetch_company_news、analyze_sentiment和generate_brief_report這三個技能被檢索出來并且排序與任務匹配度相關。這就是SRA的核心魔法讓任務自己找到它需要的工具。3.3 第三步構建規(guī)劃與執(zhí)行循環(huán)現(xiàn)在我們讓一個大語言模型這里用OpenAI API模擬來扮演“大腦”的角色使用檢索到的技能進行規(guī)劃和執(zhí)行。import openai import json # 假設已有技能的具體實現(xiàn)函數(shù) def execute_fetch_company_news(company_name): # 模擬實現(xiàn)實際應調用新聞API return [ {title: 蘋果發(fā)布新款iPad, summary: 蘋果公司于昨日發(fā)布新款iPad Pro搭載M4芯片。, source: TechNews, date: 2024-05-10}, {title: 蘋果財報超預期, summary: 蘋果公司第二財季營收和利潤均超過市場預期。, source: FinanceDaily, date: 2024-05-09} ] def execute_analyze_sentiment(text): # 模擬實現(xiàn)實際可調用NLP API或本地模型 # 簡單模擬包含“超預期”、“強勁”等詞則為積極 positive_words [超預期, 強勁, 增長, 利好, 創(chuàng)新] if any(word in text for word in positive_words): return {sentiment: positive, confidence: 0.85} else: return {sentiment: neutral, confidence: 0.7} def execute_generate_brief_report(company_name, news_items): # 模擬實現(xiàn)實際可用大模型生成 report f# {company_name} 市場簡報\n\n for item in news_items: report f## {item[title]}\n report f- 摘要{item[summary]}\n report f- 情感傾向{item.get(sentiment, N/A)}\n\n return report # 規(guī)劃與執(zhí)行函數(shù) def plan_and_execute(user_query, retrieved_skills_list): 根據(jù)用戶查詢和檢索到的技能規(guī)劃并執(zhí)行任務。 # 1. 構建技能上下文供大模型了解可用工具 skills_context 你可用的技能工具如下\n for skill_info in retrieved_skills_list: s skill_info[skill] skills_context f- 技能名{s[name]}\n 描述{s[description]}\n 輸入要求{json.dumps(s[input_schema], ensure_asciiFalse)}\n\n # 2. 請求大模型進行規(guī)劃 system_prompt f你是一個任務規(guī)劃AI。請根據(jù)用戶請求和可用技能制定一個分步執(zhí)行計劃。 每一步計劃應明確說明要調用哪個技能以及該技能需要的輸入?yún)?shù)是什么。 輸入?yún)?shù)的值應基于用戶請求、上下文或上一步的輸出進行推斷或填充。 請以清晰的JSON列表格式輸出你的計劃每個元素包含“step”步驟序號、“skill_to_use”技能名稱和“input_parameters”一個字典鍵值對為參數(shù)名和具體值。 可用技能 {skills_context} # 模擬大模型響應實際應調用API # 假設大模型返回了以下規(guī)劃 plan [ { step: 1, skill_to_use: fetch_company_news, input_parameters: {company_name: 蘋果公司} }, { step: 2, skill_to_use: analyze_sentiment, input_parameters: {text: 從第一步獲取的每一條新聞的摘要文本} }, { step: 3, skill_to_use: generate_brief_report, input_parameters: { company_name: 蘋果公司, news_items: 將第一步的新聞與第二步的情感分析結果合并后的列表 } } ] # 3. 執(zhí)行計劃簡化版實際需要處理動態(tài)參數(shù)綁定和循環(huán) execution_context {} final_result None for step in plan: skill_name step[skill_to_use] # 這里需要將“input_parameters”中的占位符如“從第一步獲取...”替換為實際值 # 這是一個復雜的邏輯涉及中間結果的傳遞和解析通常需要大模型或規(guī)則引擎輔助 # 此處為演示我們直接硬編碼映射 if skill_name fetch_company_news: result execute_fetch_company_news(**step[input_parameters]) execution_context[news] result elif skill_name analyze_sentiment: # 模擬對上一步的每條新聞做情感分析 analyzed_news [] for item in execution_context[news]: sentiment_result execute_analyze_sentiment(item[summary]) item[sentiment] sentiment_result[sentiment] analyzed_news.append(item) execution_context[analyzed_news] analyzed_news elif skill_name generate_brief_report: result execute_generate_brief_report(company_name蘋果公司, news_itemsexecution_context[analyzed_news]) final_result result return final_result # 運行整個流程 brief_report plan_and_execute(user_task, retrieved) print(生成的簡報\n) print(brief_report)這個示例雖然簡化但清晰地展示了SRA增強型Agent的工作閉環(huán)任務輸入 - 語義檢索技能 - 大模型規(guī)劃 - 按序執(zhí)行技能 - 輸出結果。在實際系統(tǒng)中規(guī)劃器大模型需要更強大的上下文理解能力以處理參數(shù)動態(tài)傳遞、條件判斷if-else和循環(huán)等復雜邏輯。4. 避坑指南SRA實踐中的五大常見陷阱與對策將SRA從概念落地到生產(chǎn)環(huán)境會遇到許多紙上談兵時想不到的問題。下面是我在項目中踩過的一些坑以及對應的解決思路。4.1 技能描述模糊導致的檢索失靈問題初期我們給技能寫的描述很隨意比如“處理數(shù)據(jù)”。結果當用戶問“清理一下這份銷售表格”時檢索器可能匹配不到任何技能或者匹配到完全不相關的“數(shù)據(jù)處理”技能比如其實是加密數(shù)據(jù)。對策制定嚴格的技能描述規(guī)范。采用“角色-動作-對象-約束”公式例如不是“處理數(shù)據(jù)”而是“【數(shù)據(jù)工程師】使用【Pandas庫】對【結構化的CSV表格數(shù)據(jù)】進行【缺失值填充、重復值刪除和類型轉換】操作”。豐富同義詞和標簽在描述或獨立標簽字段中加入技能可能被搜索到的各種說法。例如“generate_bar_chart”這個技能標簽可以加上“作圖”、“畫柱狀圖”、“數(shù)據(jù)可視化”、“chart”。定期進行檢索測試構造一批典型的用戶任務語句人工檢查Top3的檢索結果是否合理根據(jù)結果反哺優(yōu)化技能描述。4.2 技能組合的“蝴蝶效應”與狀態(tài)管理混亂問題技能A的輸出作為技能B的輸入。如果A的輸出格式稍微偏離預期比如多了一個字段或者JSON層級變了B就會執(zhí)行失敗。更復雜的是在多步執(zhí)行中中間狀態(tài)變量如何命名、存儲、傳遞很容易變得混亂。對策強化接口契約和狀態(tài)管理。強制執(zhí)行輸入/輸出模式使用JSON Schema或Pydantic模型嚴格定義每個技能的接口。在執(zhí)行前用驗證器檢查輸入?yún)?shù)是否符合模式執(zhí)行后檢查輸出是否符合聲明。不符合則立即拋出結構化錯誤進入錯誤處理流程。設計清晰的任務狀態(tài)對象維護一個全局的、結構化的“任務上下文”Task Context字典或對象。規(guī)定所有技能只能從其中讀取指定鍵的值并將輸出寫入指定的新鍵。例如context[‘raw_news’],context[‘cleaned_data’]。這避免了隨意命名導致的沖突。為復雜技能鏈編寫集成測試模擬真實輸入運行從技能檢索到最終輸出的完整流程確保數(shù)據(jù)流在各個技能間順暢傳遞。4.3 大模型規(guī)劃器的“幻覺”與不可控性問題你指望大模型能聰明地規(guī)劃步驟但它有時會“幻覺”出不存在的技能或者為現(xiàn)有技能生成完全錯誤的參數(shù)。比如它可能規(guī)劃調用一個“發(fā)送推送通知”的技能但你的技能庫里根本沒有。對策用約束和模板引導規(guī)劃而非完全放任。檢索后規(guī)劃絕對不要讓大模型在不知道技能庫有什么的情況下自由規(guī)劃。一定是先檢索出最相關的N個技能然后將這N個技能的描述作為系統(tǒng)提示詞的一部分明確告訴模型“你只能使用以下技能...”。提供規(guī)劃示例在系統(tǒng)提示詞中給出2-3個不同任務類型的規(guī)劃示例Few-shot Learning。這能極大地提升規(guī)劃格式的正確性和邏輯的合理性。后置校驗與重試生成規(guī)劃后可以增加一個校驗步驟。例如用一個簡單的規(guī)則檢查規(guī)劃的技能是否都在提供的列表中或者用另一個輕量級模型對規(guī)劃的合理性打分。如果校驗不通過則要求大模型重新規(guī)劃。4.4 技能執(zhí)行的性能與穩(wěn)定性瓶頸問題某些技能可能是調用外部API網(wǎng)絡延遲或失敗率不可控。如果在一個包含10個技能的長鏈條中第9個技能調用超時整個任務就會失敗前面8步的計算資源也浪費了。對策為SRA系統(tǒng)引入彈性設計。設置技能超時與重試機制為每個技能特別是外部調用配置獨立的超時時間和重試策略如最多重試2次使用指數(shù)退避。實現(xiàn)檢查點與回滾對于耗時長的任務鏈考慮在關鍵步驟后設置檢查點保存中間狀態(tài)。如果后續(xù)步驟失敗可以回滾到上一個檢查點而不是從頭開始。對于非冪等的操作如發(fā)送郵件要格外小心通常這類技能應在最后執(zhí)行或具備防重機制。并行執(zhí)行優(yōu)化分析技能間的依賴關系。對于彼此獨立的技能可以嘗試并行執(zhí)行以縮短總耗時。規(guī)劃器需要具備識別并行可能性的能力。4.5 技能庫的持續(xù)演進與版本管理問題隨著業(yè)務發(fā)展技能會不斷新增、廢棄或更新。直接修改技能庫可能導致正在運行的老任務失敗因為老任務規(guī)劃時參考的是舊版技能描述。對策像管理代碼一樣管理技能庫。技能版本化每個技能定義都帶一個版本號如v1.0.0。當更新技能接口時創(chuàng)建新版本v1.1.0并在一段時間內同時維護新舊版本。任務與技能版本綁定當一個新的用戶任務被創(chuàng)建并規(guī)劃時記錄下它所用到的所有技能及其版本號。執(zhí)行時就使用對應版本的技能實現(xiàn)確保一致性。建立技能生命周期管理流程明確技能的創(chuàng)建、測試、上線、廢棄流程。對于廢棄的技能在檢索器中將其標記為“已棄用”并建議替代技能逐步遷移舊任務。5. 進階思考SRA如何塑造下一代AI Agent架構SRA不僅僅是一個技術組件它更代表了一種構建AI Agent的系統(tǒng)設計哲學。隨著實踐的深入你會發(fā)現(xiàn)它正在推動Agent架構向更清晰、更可擴展的方向演進。5.1 從“全能模型”到“操作系統(tǒng)應用生態(tài)”傳統(tǒng)的思路是訓練一個越來越大的、無所不能的模型。而SRA架構暗示了一條不同的路徑一個相對穩(wěn)定、負責核心推理與規(guī)劃的“Agent操作系統(tǒng)”通常由大模型擔任搭配一個可插拔、可無限擴展的“技能應用商店”。在這個比喻中操作系統(tǒng)提供基礎能力語言理解、規(guī)劃、決策、管理資源上下文、狀態(tài)、調度任務。技能應用每個技能都是一個獨立的“應用”有明確的輸入輸出接口實現(xiàn)單一功能。開發(fā)者可以專注于編寫高質量、高可靠的技能而無需關心整體的Agent邏輯。應用商店技能庫提供技能的注冊、發(fā)現(xiàn)、檢索和版本管理。這種架構分離了“智能”和“能力”使得兩者可以獨立迭代。你可以不斷優(yōu)化規(guī)劃器的智商也可以不斷豐富技能庫的“武器”而不必每次升級都動全身。5.2 技能的可發(fā)現(xiàn)性與組合創(chuàng)新一個設計良好的SRA系統(tǒng)其技能庫會成為一個組織的“核心能力資產(chǎn)”。當技能足夠多、描述足夠好時會催生出意想不到的“組合式創(chuàng)新”。例如你可能有這些獨立的技能fetch_weather獲取天氣、check_calendar查日歷、generate_poem寫詩、send_sms發(fā)短信。通過SRA一個用戶請求“明天早上如果下雨就發(fā)條詩意一點的提醒短信給我女朋友”Agent可以自動檢索并組合出[check_calendar] - [fetch_weather] - [generate_poem] - [send_sms]的工作流。這要求技能設計遵循“高內聚、低耦合”的原則并且有極佳的可發(fā)現(xiàn)性檢索效率。未來我們或許會看到技能描述標準化協(xié)議的出現(xiàn)以及跨組織、跨平臺的技能共享市場。5.3 對評估與調試范式的改變在SRA架構下評估一個Agent的好壞不再是單純看它的最終輸出答案有多準確而是需要一套新的評估體系技能檢索準確率給定一個任務檢索器返回的技能列表是否包含了所有必要技能排序是否合理規(guī)劃合理性生成的規(guī)劃步驟在邏輯上是否可行是否符合業(yè)務約束技能執(zhí)行成功率每個被調用的技能其自身執(zhí)行的成敗率如何端到端任務完成度最終用戶目標被滿足的比例。調試也變得更具模塊化。如果任務失敗你可以沿著“檢索 - 規(guī)劃 - 執(zhí)行”的鏈路逐層排查是沒檢索到關鍵技能是規(guī)劃邏輯有誤還是某個技能本身有bug這種清晰的職責分離大大降低了復雜Agent系統(tǒng)的維護成本。從我自己的項目經(jīng)驗來看引入SRA概念后最直觀的感受是開發(fā)節(jié)奏變快了系統(tǒng)也更穩(wěn)健了。以前添加一個新功能可能需要修改核心的Agent提示詞風險很高?,F(xiàn)在我們只需要按照規(guī)范開發(fā)一個新技能注冊到技能庫Agent在遇到相關任務時就能自動調用它。這就像為團隊引入了一位善于調配資源、知人善任的項目經(jīng)理讓每個“專家”技能都能在合適的位置發(fā)揮價值共同完成那些單個模型難以企及的復雜目標。