资讯动态

AI Agent技能检索增强:从单模型到团队协作的架构演进与实践

发布时间:2026/8/24 7:32:20 来源:尧图企业网站定制
1. 从“单打独斗”到“团队协作”为什么AI Agent需要技能检索增强最近和几个做AI应用的朋友聊天大家普遍有个感觉现在的大模型比如GPT-4、Claude 3单个拎出来能力确实强得离谱写代码、做分析、搞创作样样都行。但一旦你想让它帮你处理一个稍微复杂点的、需要多步骤协作的任务比如“帮我分析一下这个季度的销售数据生成一份PPT报告然后发邮件给相关团队”它可能就有点力不从心了。要么是步骤混乱要么是中间某个环节比如调用某个特定API生成图表的指令它理解不了或者干脆就忘了之前设定的目标。这其实就是当前AI Agent智能体面临的一个核心瓶颈能力与任务的错配。一个通用大模型就像是一个知识渊博但工具不全的“全才”而一个复杂的现实任务往往需要调用一系列专门的“工具”或“技能”。Skill Retrieval Augmentation技能检索增强简称SRA要解决的就是这个问题。它本质上是一种让AI Agent从“单打独斗”进化到“团队协作”的架构思想。不是让一个模型去学所有技能而是建立一个“技能库”当任务来临时Agent能像项目经理一样快速检索并调用最合适的“专家”技能来协同工作。这个概念最近火起来和“AI Agent”成为热词是同步的。大家不再满足于简单的问答而是希望AI能真正自主、连贯地完成工作流。从热搜词就能看出无论是“ai agent如何搭建”还是“ai agent skill编写”核心痛点都指向了如何让Agent具备可靠、可扩展的行动能力。SRA正是为此而生的一套方法论和工程实践。2. 拆解Skill Retrieval Augmentation核心组件与工作流要理解SRA不能只看概念得把它拆开看看里面到底有哪些齿轮在转动。一个典型的SRA增强型AI Agent系统通常包含以下几个核心组件它们协同工作构成了一个动态的技能调度中枢。2.1 技能库你的“专家团队”花名册技能库是SRA的基石。这里的“技能”远不止是代码函数。它可以是一个封装好的API调用如“发送邮件”、“查询数据库”一个提示词模板如“用SWOT分析法分析以下文本”一个微调的小模型如专门做财务数据清洗的模型甚至是一段可执行的脚本或工作流。关键在于每个技能都需要被“标准化”描述通常包含技能名称与描述清晰定义这个技能是干什么的。例如“generate_bar_chart: 根据提供的结构化数据生成一张柱状图的Base64编码图像。”输入/输出模式明确技能需要什么参数返回什么格式的结果。这通常用JSON Schema来定义确保机器可读。元数据与标签用于检索的关键。包括技能类别如“数据可视化”、“网络操作”、“文本处理”、适用场景、所需权限、消耗资源等。这部分信息越丰富检索就越精准。在工程实现上技能库可以是一个简单的JSON或YAML配置文件也可以是一个专门的向量数据库。我个人的经验是初期用文件管理足够直观但当技能数量超过几十个并且需要动态更新时一个支持向量检索的数据库如ChromaDB、Weaviate会带来质的提升因为它能支持基于技能描述的语义检索。2.2 检索器为任务寻找“最佳拍档”当Agent接收到一个用户任务如“分析销售数据并做PPT”后检索器就开始工作了。它的目标是从技能库中找到与当前任务最相关的一个或一组技能。这个过程不是简单的关键词匹配。一个高效的检索器通常采用混合检索策略语义检索将用户的任务描述和技能库中每个技能的描述通过嵌入模型如OpenAI的text-embedding-3-small转换成向量。然后计算任务向量与所有技能向量之间的余弦相似度找出语义上最接近的技能。这能解决“同一个意思不同说法”的问题。关键词/元数据过滤同时利用技能标签如“PPT”、“图表”进行快速过滤缩小范围提升效率。重排序初步检索出Top N个候选技能后可以用一个更精细的交叉编码器模型Cross-Encoder对“任务-技能”对进行打分重排选出最匹配的那个。这里有个实战细节检索的粒度。你是检索一个原子技能如“画柱状图”还是检索一个复合技能工作流模板如“数据分析报告生成流程”在项目初期建议从原子技能开始让Agent学习组合。随着模式固定可以将高频、稳定的组合沉淀为新的“复合技能”存入技能库让Agent直接调用这能显著提升复杂任务的执行效率和成功率。2.3 规划与执行引擎大脑与四肢的协调检索到技能后事情还没完。Agent需要规划如何调用这些技能。这就是规划与执行引擎的职责它通常由大模型如GPT-4驱动。任务分解与规划大模型根据用户意图和检索到的技能列表将复杂任务分解为一系列可执行的子步骤。例如“分析销售数据并做PPT”可能被分解为① 调用“数据查询”技能获取数据② 调用“数据清洗”技能处理数据③ 调用“图表生成”技能柱状图、折线图④ 调用“PPT内容生成”技能编排图文⑤ 调用“文件保存”技能。参数填充与技能调用规划好步骤后大模型需要为每个技能调用生成具体的输入参数。例如为“图表生成”技能填充data数据、chart_type图表类型、title标题等字段。然后执行引擎负责以安全、可控的方式调用这些技能可能是本地函数、HTTP API等。状态管理与循环执行是一个循环过程。每个技能执行后其结果会成为当前任务状态的一部分。大模型需要根据这个新状态决定下一步是继续执行下一个规划好的技能还是因为出现了意外情况如技能执行失败、结果不符合预期需要重新规划或检索新的技能。这个循环规划 - 执行 - 观察 - 再规划是Agentic AI智能体AI的核心特征而SRA为这个循环提供了可靠的“工具包”。3. 实战从零搭建一个具备SRA能力的简易AI Agent光说不练假把式。我们用一个具体的场景来串联上述概念构建一个“市场简报生成Agent”。它的功能是用户输入一个公司名Agent能自动获取该公司的最新新闻进行情感分析并生成一份包含关键信息和观点总结的简报。3.1 第一步定义与封装技能我们首先需要建立技能库。这里用Python字典列表模拟一个简单的技能库。skills_library [ { name: fetch_company_news, description: 根据给定的公司名称从新闻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: 根据提供的结构化信息如新闻列表及情感分析结果生成一份格式良好的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 第二步实现基于语义的检索器我们使用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): 根据查询语句检索最相关的技能。 # 将查询语句向量化 query_embedding embedder.encode(query, convert_to_tensorTrue) # 计算余弦相似度 # 注意这里将PyTorch tensor转换为numpy数组以便使用sklearn实际生产环境可优化 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 第三步构建规划与执行循环现在我们让一个大语言模型这里用OpenAI API模拟来扮演“大脑”的角色使用检索到的技能进行规划和执行。import openai import json # 假设已有技能的具体实现函数 def execute_fetch_company_news(company_name): # 模拟实现实际应调用新闻API return [ {title: 苹果发布新款iPad, summary: 苹果公司于昨日发布新款iPad Pro搭载M4芯片。, source: TechNews, date: 2024-05-10}, {title: 苹果财报超预期, summary: 苹果公司第二财季营收和利润均超过市场预期。, source: FinanceDaily, date: 2024-05-09} ] def execute_analyze_sentiment(text): # 模拟实现实际可调用NLP API或本地模型 # 简单模拟包含“超预期”、“强劲”等词则为积极 positive_words [超预期, 强劲, 增长, 利好, 创新] 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): # 模拟实现实际可用大模型生成 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 # 规划与执行函数 def plan_and_execute(user_query, retrieved_skills_list): 根据用户查询和检索到的技能规划并执行任务。 # 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. 请求大模型进行规划 system_prompt f你是一个任务规划AI。请根据用户请求和可用技能制定一个分步执行计划。 每一步计划应明确说明要调用哪个技能以及该技能需要的输入参数是什么。 输入参数的值应基于用户请求、上下文或上一步的输出进行推断或填充。 请以清晰的JSON列表格式输出你的计划每个元素包含“step”步骤序号、“skill_to_use”技能名称和“input_parameters”一个字典键值对为参数名和具体值。 可用技能 {skills_context} # 模拟大模型响应实际应调用API # 假设大模型返回了以下规划 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. 执行计划简化版实际需要处理动态参数绑定和循环 execution_context {} final_result None for step in plan: skill_name step[skill_to_use] # 这里需要将“input_parameters”中的占位符如“从第一步获取...”替换为实际值 # 这是一个复杂的逻辑涉及中间结果的传递和解析通常需要大模型或规则引擎辅助 # 此处为演示我们直接硬编码映射 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的工作闭环任务输入 - 语义检索技能 - 大模型规划 - 按序执行技能 - 输出结果。在实际系统中规划器大模型需要更强大的上下文理解能力以处理参数动态传递、条件判断if-else和循环等复杂逻辑。4. 避坑指南SRA实践中的五大常见陷阱与对策将SRA从概念落地到生产环境会遇到许多纸上谈兵时想不到的问题。下面是我在项目中踩过的一些坑以及对应的解决思路。4.1 技能描述模糊导致的检索失灵问题初期我们给技能写的描述很随意比如“处理数据”。结果当用户问“清理一下这份销售表格”时检索器可能匹配不到任何技能或者匹配到完全不相关的“数据处理”技能比如其实是加密数据。对策制定严格的技能描述规范。采用“角色-动作-对象-约束”公式例如不是“处理数据”而是“【数据工程师】使用【Pandas库】对【结构化的CSV表格数据】进行【缺失值填充、重复值删除和类型转换】操作”。丰富同义词和标签在描述或独立标签字段中加入技能可能被搜索到的各种说法。例如“generate_bar_chart”这个技能标签可以加上“作图”、“画柱状图”、“数据可视化”、“chart”。定期进行检索测试构造一批典型的用户任务语句人工检查Top3的检索结果是否合理根据结果反哺优化技能描述。4.2 技能组合的“蝴蝶效应”与状态管理混乱问题技能A的输出作为技能B的输入。如果A的输出格式稍微偏离预期比如多了一个字段或者JSON层级变了B就会执行失败。更复杂的是在多步执行中中间状态变量如何命名、存储、传递很容易变得混乱。对策强化接口契约和状态管理。强制执行输入/输出模式使用JSON Schema或Pydantic模型严格定义每个技能的接口。在执行前用验证器检查输入参数是否符合模式执行后检查输出是否符合声明。不符合则立即抛出结构化错误进入错误处理流程。设计清晰的任务状态对象维护一个全局的、结构化的“任务上下文”Task Context字典或对象。规定所有技能只能从其中读取指定键的值并将输出写入指定的新键。例如context[‘raw_news’],context[‘cleaned_data’]。这避免了随意命名导致的冲突。为复杂技能链编写集成测试模拟真实输入运行从技能检索到最终输出的完整流程确保数据流在各个技能间顺畅传递。4.3 大模型规划器的“幻觉”与不可控性问题你指望大模型能聪明地规划步骤但它有时会“幻觉”出不存在的技能或者为现有技能生成完全错误的参数。比如它可能规划调用一个“发送推送通知”的技能但你的技能库里根本没有。对策用约束和模板引导规划而非完全放任。检索后规划绝对不要让大模型在不知道技能库有什么的情况下自由规划。一定是先检索出最相关的N个技能然后将这N个技能的描述作为系统提示词的一部分明确告诉模型“你只能使用以下技能...”。提供规划示例在系统提示词中给出2-3个不同任务类型的规划示例Few-shot Learning。这能极大地提升规划格式的正确性和逻辑的合理性。后置校验与重试生成规划后可以增加一个校验步骤。例如用一个简单的规则检查规划的技能是否都在提供的列表中或者用另一个轻量级模型对规划的合理性打分。如果校验不通过则要求大模型重新规划。4.4 技能执行的性能与稳定性瓶颈问题某些技能可能是调用外部API网络延迟或失败率不可控。如果在一个包含10个技能的长链条中第9个技能调用超时整个任务就会失败前面8步的计算资源也浪费了。对策为SRA系统引入弹性设计。设置技能超时与重试机制为每个技能特别是外部调用配置独立的超时时间和重试策略如最多重试2次使用指数退避。实现检查点与回滚对于耗时长的任务链考虑在关键步骤后设置检查点保存中间状态。如果后续步骤失败可以回滚到上一个检查点而不是从头开始。对于非幂等的操作如发送邮件要格外小心通常这类技能应在最后执行或具备防重机制。并行执行优化分析技能间的依赖关系。对于彼此独立的技能可以尝试并行执行以缩短总耗时。规划器需要具备识别并行可能性的能力。4.5 技能库的持续演进与版本管理问题随着业务发展技能会不断新增、废弃或更新。直接修改技能库可能导致正在运行的老任务失败因为老任务规划时参考的是旧版技能描述。对策像管理代码一样管理技能库。技能版本化每个技能定义都带一个版本号如v1.0.0。当更新技能接口时创建新版本v1.1.0并在一段时间内同时维护新旧版本。任务与技能版本绑定当一个新的用户任务被创建并规划时记录下它所用到的所有技能及其版本号。执行时就使用对应版本的技能实现确保一致性。建立技能生命周期管理流程明确技能的创建、测试、上线、废弃流程。对于废弃的技能在检索器中将其标记为“已弃用”并建议替代技能逐步迁移旧任务。5. 进阶思考SRA如何塑造下一代AI Agent架构SRA不仅仅是一个技术组件它更代表了一种构建AI Agent的系统设计哲学。随着实践的深入你会发现它正在推动Agent架构向更清晰、更可扩展的方向演进。5.1 从“全能模型”到“操作系统应用生态”传统的思路是训练一个越来越大的、无所不能的模型。而SRA架构暗示了一条不同的路径一个相对稳定、负责核心推理与规划的“Agent操作系统”通常由大模型担任搭配一个可插拔、可无限扩展的“技能应用商店”。在这个比喻中操作系统提供基础能力语言理解、规划、决策、管理资源上下文、状态、调度任务。技能应用每个技能都是一个独立的“应用”有明确的输入输出接口实现单一功能。开发者可以专注于编写高质量、高可靠的技能而无需关心整体的Agent逻辑。应用商店技能库提供技能的注册、发现、检索和版本管理。这种架构分离了“智能”和“能力”使得两者可以独立迭代。你可以不断优化规划器的智商也可以不断丰富技能库的“武器”而不必每次升级都动全身。5.2 技能的可发现性与组合创新一个设计良好的SRA系统其技能库会成为一个组织的“核心能力资产”。当技能足够多、描述足够好时会催生出意想不到的“组合式创新”。例如你可能有这些独立的技能fetch_weather获取天气、check_calendar查日历、generate_poem写诗、send_sms发短信。通过SRA一个用户请求“明天早上如果下雨就发条诗意一点的提醒短信给我女朋友”Agent可以自动检索并组合出[check_calendar] - [fetch_weather] - [generate_poem] - [send_sms]的工作流。这要求技能设计遵循“高内聚、低耦合”的原则并且有极佳的可发现性检索效率。未来我们或许会看到技能描述标准化协议的出现以及跨组织、跨平台的技能共享市场。5.3 对评估与调试范式的改变在SRA架构下评估一个Agent的好坏不再是单纯看它的最终输出答案有多准确而是需要一套新的评估体系技能检索准确率给定一个任务检索器返回的技能列表是否包含了所有必要技能排序是否合理规划合理性生成的规划步骤在逻辑上是否可行是否符合业务约束技能执行成功率每个被调用的技能其自身执行的成败率如何端到端任务完成度最终用户目标被满足的比例。调试也变得更具模块化。如果任务失败你可以沿着“检索 - 规划 - 执行”的链路逐层排查是没检索到关键技能是规划逻辑有误还是某个技能本身有bug这种清晰的职责分离大大降低了复杂Agent系统的维护成本。从我自己的项目经验来看引入SRA概念后最直观的感受是开发节奏变快了系统也更稳健了。以前添加一个新功能可能需要修改核心的Agent提示词风险很高。现在我们只需要按照规范开发一个新技能注册到技能库Agent在遇到相关任务时就能自动调用它。这就像为团队引入了一位善于调配资源、知人善任的项目经理让每个“专家”技能都能在合适的位置发挥价值共同完成那些单个模型难以企及的复杂目标。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价