资讯动态

LLM智能体如何从执行轨迹中自适应学习与生成新技能

发布时间:2026/8/24 18:21:52 来源:尧图企业网站定制
1. 项目概述从轨迹中自适应的智能体技能最近在折腾LLM智能体LLM Agents时我一直在思考一个问题我们费尽心思为智能体设计好一套技能Skills比如调用API、分析数据、操作文件但一旦任务场景稍有变化或者遇到训练数据里没见过的“新情况”智能体往往就“卡壳”了。这感觉就像给一个工人配了一套固定的扳手遇到新形状的螺丝就束手无策。有没有可能让智能体自己学会“锻造”新工具呢这正是“SkillAdaptor: Self-Adapting Skills for LLM Agents from Trajectories”这个项目试图回答的核心问题。简单来说它研究的是如何让大语言模型驱动的智能体通过观察自己或他人执行任务的历史轨迹Trajectories自动地、动态地生成或适配新的技能而无需人类每次都去手动编写代码或定义规则。这不仅仅是给智能体增加几个新功能而是赋予它一种“元学习”能力——学会如何学习新技能。从网络热词中频繁出现的“OpenClaw”来看社区对能够灵活集成、配置和管理各种AI模型与技能的智能体平台有着极高的热情。大家关心如何在Windows、Ubuntu、Docker等各种环境下部署如何接入Kimi、Minimax等不同模型以及如何解决部署中遇到的种种报错。这背后反映的深层需求是我们不再满足于单一、僵化的AI应用而是需要一个能自主进化、适应复杂多变现实任务的智能体系统。SkillAdaptor的理念恰好切中了这个痛点——它希望智能体不是被动执行预设技能而是能主动从经验中提炼和创造技能。2. 核心思路拆解轨迹学习与技能抽象SkillAdaptor的核心思想并不复杂但实现起来却充满挑战。它的工作流程可以概括为“观察-抽象-验证-固化”四个步骤其关键在于如何从看似杂乱无章的任务执行历史中提炼出可复用、可泛化的技能模式。2.1 什么是“轨迹”在智能体领域轨迹Trajectory指的是智能体为了完成一个任务所采取的一系列行动Actions、所处的状态States以及获得的反馈Rewards/Observations的完整记录。举个例子一个智能体要完成“查询北京明天天气并建议是否带伞”的任务它的轨迹可能包括行动调用搜索API关键词“北京 明日 天气预报”。状态接收到包含温度、降水概率的JSON数据。行动分析数据判断降水概率大于60%。行动生成最终回答“明天北京有雨建议带伞。”这一连串的状态行动新状态序列就是一条轨迹。单一轨迹可能只是解决了一个具体问题但当积累了成千上万条不同任务的轨迹后其中就隐藏着许多共性的“模式”。2.2 从轨迹到技能模式挖掘与抽象SkillAdaptor的核心算法需要在这些轨迹数据中“挖矿”。它主要做两件事模式识别通过序列分析或图算法找出频繁出现的、连贯的行动子序列。比如在大量轨迹中“调用搜索API - 解析JSON结果 - 提取关键字段”这个子序列可能反复出现。这就标识了一个潜在的技能雏形。技能抽象识别出模式后需要将其抽象成一个通用的、参数化的技能。例如将上述模式抽象为技能search_and_extract(query_template, output_schema)。其中query_template是搜索查询的模板output_schema定义了需要从结果中提取的数据结构。这样这个技能就不再局限于查询天气可以用于查询股票价格、新闻事件等任何需要搜索并结构化信息的需求。这个过程高度依赖轨迹数据的质量和多样性。如果轨迹都来自简单、重复的任务就难以抽象出强大的技能。因此如何设计任务让智能体探索或者如何利用人类演示、其他智能体的轨迹是项目前期需要重点考虑的问题。注意轨迹的收集本身可能就是一个“鸡生蛋蛋生鸡”的问题。最初智能体技能有限产生的轨迹可能很简单。一个实用的启动策略是先为智能体装备一些基础技能如HTTP请求、字符串处理让它去尝试完成一些稍复杂的任务收集这些“挣扎”的过程作为初始轨迹反而能暴露出技能组合的缺口。2.3 技能的自适应与组合生成新技能只是第一步更重要的是让智能体在面临新任务时能自动判断是否需要以及如何使用这些技能。这就涉及到技能检索与匹配当新任务到来时SkillAdaptor需要快速从技能库中检索出相关技能。这通常通过将任务描述和技能描述嵌入到同一个向量空间计算相似度来实现。技能参数绑定检索到技能后需要将任务中的具体信息绑定到技能的参数上。例如对于任务“查一下特斯拉的股价”需要将“特斯拉”绑定到search_and_extract技能的query_template参数中。这通常由LLM根据上下文自动完成。技能组合与规划复杂任务往往需要多个技能按顺序或并行执行。SkillAdaptor需要具备规划能力将大任务分解成子任务并为每个子任务分配合适的技能形成一个新的执行计划。这个计划本身未来也可能被抽象成更高阶的“元技能”。3. 关键技术实现与架构设计要实现上述思路我们需要一个具体的系统架构。虽然原项目论文可能提供了其实现细节但结合当前开源社区如OpenClaw所代表的趋势的最佳实践我们可以勾勒出一个可实现的SkillAdaptor系统核心模块。3.1 系统核心组件一个典型的SkillAdaptor架构可能包含以下组件轨迹记录器无缝集成到智能体执行循环中以非侵入式方式记录每一个步骤的状态、行动、观察和奖励。数据通常以结构化的日志或特定格式如JSONL存储。轨迹存储与管理库一个可查询的轨迹数据库。除了存储它还需要支持按任务类型、成功率、关键步骤等维度进行筛选和检索为后续分析提供数据基础。技能挖掘模块这是算法的核心。可以采用以下一种或多种技术序列模式挖掘算法如PrefixSpan用于发现频繁行动序列。聚类分析将相似的状态-行动对进行聚类每一类可能对应一种技能。基于LLM的抽象直接将轨迹片段和任务描述喂给大语言模型要求其总结出一个技能名称、描述和参数格式。这种方法利用了LLM强大的归纳和自然语言理解能力。技能库存储已抽象出的技能。每个技能条目应包括唯一ID、技能名称、自然语言描述、参数列表名称、类型、描述、可执行的代码或函数指针如Python函数以及元数据如创建来源、调用成功率、适用场景标签。技能适配器负责运行时的工作。接收新任务从技能库中检索并排序候选技能利用LLM将任务上下文绑定到技能参数最终生成可执行的代码或动作指令。验证与评估模块新技能生成后不能直接投入使用。需要在一个安全的环境如沙箱中用一组测试任务验证其正确性和泛化能力。同时需要监控技能在生产环境中的使用效果根据成功率等指标进行迭代优化或淘汰。3.2 基于LLM的实现策略考虑到当前技术潮流利用LLM本身作为技能挖掘和适配的主要引擎是一个高效的选择。具体可以分两步走第一步技能抽象离线过程# 伪代码示意利用LLM从轨迹片段中抽象技能 def abstract_skill_from_trajectory(trajectory_segment, task_description): prompt f 你是一个技能分析专家。下面是一个智能体完成某个任务的片段 任务目标{task_description} 执行轨迹{trajectory_segment} 请分析这段轨迹中智能体重复使用的、可泛化的操作模式并将其抽象为一个可复用的技能。 请按以下格式输出 技能名称[一个简洁的动词短语] 技能描述[描述该技能的功能和适用场景] 输入参数[参数1: 类型, 描述; 参数2: 类型, 描述; ...] 输出说明[技能执行后的产出描述] 代码模板Python[可选的代码框架用{{参数名}}占位] response llm.invoke(prompt) # 解析response结构化存储到技能库 return structured_skill第二步技能检索与调用在线过程当新任务new_task到来时将new_task的描述和技能库中所有技能的描述进行向量化计算余弦相似度召回Top-K个相关技能。将new_task和召回技能的详细信息构造提示词让LLM判断哪个技能最适用并填充具体参数。def adapt_and_call_skill(new_task, retrieved_skills): prompt f 任务{new_task} 以下是几个可能相关的技能 {retrieved_skills} 请选择最合适的一个技能并为其生成具体的调用参数。 输出格式 选择技能[技能名称] 参数绑定[参数1: 具体值; 参数2: 具体值; ...] decision llm.invoke(prompt) # 根据decision动态执行对应的技能函数 return execute_skill(decision.skill_name, decision.bound_parameters)3.3 与OpenClaw类平台的集成思考从网络热议的OpenClaw安装、部署、接入各种模型的问题可以看出一个成功的智能体平台需要极强的兼容性和可扩展性。SkillAdaptor可以作为这样一个平台的核心“大脑”模块。技能即插件在OpenClaw中每个SkillAdaptor挖掘出的技能都可以被封装成一个标准的插件或工具Tool遵循统一的接口规范如Function Calling格式。这样技能就能被平台上的任何智能体所见即所得地调用。模型无关性SkillAdaptor的挖掘和适配过程本身也可以被设计成模型无关的。它可以通过OpenClaw的网关Gateway统一调用后端不同的LLM如Qwen、Kimi、GPT等来完成抽象和决策从而利用不同模型的特长。轨迹共享生态平台可以建立一个公共的轨迹库或技能市场。用户贡献的智能体执行轨迹经过脱敏和清洗后可以被SkillAdaptor用来挖掘更通用、更强大的技能反哺整个社区。这解决了单一用户轨迹数据有限的问题。实操心得在实现技能挖掘时直接使用LLM进行抽象虽然方便但成本高且稳定性受提示词影响大。一个混合策略是先用传统的频繁模式挖掘算法从海量轨迹中快速筛出候选模式再只用LLM对这些高质量候选进行精炼和描述生成。这能大幅降低成本和提升效率。4. 实战演练构建一个简易的SkillAdaptor原型理论说得再多不如动手试一下。我们来搭建一个最小可行性的SkillAdaptor原型用于一个简单的场景一个网页研究智能体。场景设定智能体最初只会两个基础技能google_search(keywords)和extract_text_from_url(url)。我们让它去完成“了解量子计算最新进展”和“查找Python异步编程教程”等几个任务并记录轨迹。然后我们期望SkillAdaptor能从这些轨迹中自动发现“搜索并获取网页内容”这个组合技能。4.1 环境准备与基础技能定义首先准备Python环境安装必要库openai或其他LLM SDK、requests、beautifulsoup4。# skill_library.py import requests from bs4 import BeautifulSoup import json class BaseSkillLibrary: def __init__(self): self.skills { google_search: { function: self.google_search, description: 使用搜索引擎查询信息返回搜索结果列表。, parameters: [{name: keywords, type: str, description: 搜索关键词}] }, extract_text_from_url: { function: self.extract_text_from_url, description: 从给定的URL中提取主要文本内容。, parameters: [{name: url, type: str, description: 网页URL}] } } def google_search(self, keywords): # 模拟搜索实际应调用搜索引擎API print(f[模拟] 正在搜索: {keywords}) # 返回模拟结果 return [{title: f关于{keywords}的结果1, url: https://example.com/1}, {title: f关于{keywords}的结果2, url: https://example.com/2}] def extract_text_from_url(self, url): # 模拟抓取网页正文 print(f[模拟] 正在提取URL内容: {url}) # 实际实现可使用requestsBeautifulSoup # response requests.get(url) # soup BeautifulSoup(response.content, html.parser) # text soup.get_text() return f这是来自 {url} 的模拟文本内容包含相关信息。 def execute(self, skill_name, **kwargs): if skill_name in self.skills: return self.skills[skill_name][function](**kwargs) else: raise ValueError(f技能 {skill_name} 不存在。)4.2 轨迹记录与收集我们创建一个简单的智能体执行循环并记录轨迹。# trajectory_recorder.py import json import time class TrajectoryRecorder: def __init__(self, log_filetrajectories.jsonl): self.log_file log_file def record(self, task, action, observation, rewardNone): entry { timestamp: time.time(), task: task, action: action, # 例如{skill: google_search, params: {keywords: 量子计算}} observation: observation, # 技能执行结果 reward: reward } with open(self.log_file, a, encodingutf-8) as f: f.write(json.dumps(entry, ensure_asciiFalse) \n) # 模拟智能体执行任务 def run_agent_task(task_description, skill_lib, recorder): print(f\n 开始任务: {task_description} ) # 假设智能体“思考”后决定先搜索 action1 {skill: google_search, params: {keywords: task_description}} result1 skill_lib.execute(google_search, **action1[params]) recorder.record(task_description, action1, result1) print(f行动1: {action1}) print(f结果1: 获得{len(result1)}条搜索结果) # 假设智能体选择第一个结果点开看 if result1: selected_url result1[0][url] action2 {skill: extract_text_from_url, params: {url: selected_url}} result2 skill_lib.execute(extract_text_from_url, **action2[params]) recorder.record(task_description, action2, result2) print(f行动2: {action2}) print(f结果2: 获取到内容摘要) print( 任务结束 \n) if __name__ __main__: skill_lib BaseSkillLibrary() recorder TrajectoryRecorder() tasks [量子计算最新进展, Python异步编程教程, 机器学习入门指南] for task in tasks: run_agent_task(task, skill_lib, recorder)运行后我们会在trajectories.jsonl文件中得到几条轨迹记录。4.3 技能挖掘与抽象现在我们编写一个简单的技能挖掘模块。为了简化我们直接使用规则和LLM来模拟这个过程。# skill_miner.py import json from collections import defaultdict class SimpleSkillMiner: def __init__(self, trajectory_file, llm_client): self.trajectory_file trajectory_file self.llm llm_client self.action_sequences defaultdict(int) # 统计行动序列频率 def load_trajectories(self): trajectories [] with open(self.trajectory_file, r, encodingutf-8) as f: for line in f: trajectories.append(json.loads(line.strip())) return trajectories def mine_frequent_sequences(self, min_frequency2): 简单的序列模式挖掘统计连续两个行动的组合频率 trajectories self.load_trajectories() # 按任务分组轨迹 task_to_actions defaultdict(list) for t in trajectories: task_to_actions[t[task]].append(t[action]) for task, actions in task_to_actions.items(): # 提取行动序列这里简化只取技能名序列 seq [act[skill] for act in actions] if len(seq) 2: seq_tuple tuple(seq) # 例如 (google_search, extract_text_from_url) self.action_sequences[seq_tuple] 1 # 返回频繁序列 frequent_seqs [seq for seq, freq in self.action_sequences.items() if freq min_frequency] return frequent_seqs def abstract_skill_with_llm(self, action_sequence, example_trajectories): 利用LLM将频繁行动序列抽象成一个新技能 # 构建提示词 prompt f 你是一个AI智能体架构师。分析以下智能体执行模式并将其抽象成一个新的、可复用的复合技能。 频繁出现的行动序列{action_sequence} 示例轨迹任务上下文 {json.dumps(example_trajectories[:2], indent2, ensure_asciiFalse)} # 取前两个示例 请定义这个新技能 1. 技能名称英文简洁 2. 技能描述中文 3. 输入参数列表每个参数包含名称、类型、描述 4. 输出描述 5. 伪代码逻辑描述 # 调用LLM (此处为模拟) print(f\n[技能挖掘] 分析序列 {action_sequence}...) # simulated_llm_response self.llm.generate(prompt) # 为演示我们直接返回一个预设结果 simulated_response 1. 技能名称search_and_fetch_content 2. 技能描述根据查询主题自动进行网络搜索并获取最相关网页的正文内容。 3. 输入参数[{name: topic, type: str, description: 需要搜索和获取内容的主题}] 4. 输出描述返回从最相关网页中提取的文本内容。 5. 伪代码逻辑描述 - 步骤1使用google_search技能以topic为关键词进行搜索。 - 步骤2从搜索结果列表中选取第一个或最相关的一个URL。 - 步骤3使用extract_text_from_url技能获取该URL的正文内容。 - 步骤4返回获取到的文本内容。 return self._parse_llm_response(simulated_response) def _parse_llm_response(self, response): # 简单解析LLM返回的文本实际应用需要更鲁棒的解析 lines response.strip().split(\n) skill {} for line in lines: if 技能名称 in line: skill[name] line.split()[1].strip() elif 技能描述 in line: skill[description] line.split()[1].strip() # ... 解析其他字段 skill[input_params] [{name: topic, type: str, description: 需要搜索和获取内容的主题}] skill[logic] 调用google_search再调用extract_text_from_url。 return skill def run(self): frequent_seqs self.mine_frequent_sequences(min_frequency2) new_skills [] trajectories self.load_trajectories() for seq in frequent_seqs: # 找到包含该序列的示例轨迹 example_trajs self._find_example_trajectories(seq, trajectories) if example_trajs: new_skill self.abstract_skill_with_llm(seq, example_trajs) new_skill[source_sequence] seq new_skills.append(new_skill) print(f发现新技能: {new_skill[name]} - {new_skill[description]}) return new_skills def _find_example_trajectories(self, target_sequence, all_trajectories): # 简化返回前几条轨迹作为示例 return all_trajectories[:2] # 模拟运行 # miner SimpleSkillMiner(trajectories.jsonl, llm_clientNone) # discovered_skills miner.run()4.4 新技能的注册与使用挖掘出新技能后我们需要将其注册到技能库中并实现其逻辑。# 更新技能库添加复合技能 class EnhancedSkillLibrary(BaseSkillLibrary): def __init__(self): super().__init__() # 注册挖掘出的复合技能 self.register_skill(search_and_fetch_content, self.search_and_fetch_content_impl) def search_and_fetch_content_impl(self, topic): 新技能的实现 print(f[复合技能] 执行 search_and_fetch_content主题: {topic}) # 1. 调用基础技能搜索 search_results self.google_search(topic) if not search_results: return 未找到相关结果。 # 2. 调用基础技能提取内容取第一个结果 first_url search_results[0][url] content self.extract_text_from_url(first_url) # 可以在这里添加内容总结等更复杂的逻辑 return { topic: topic, source_url: first_url, fetched_content: content[:500] ... if len(content) 500 else content # 截断 } def register_skill(self, name, function, descriptionNone, parametersNone): self.skills[name] { function: function, description: description or f复合技能: {name}, parameters: parameters or [] } # 现在智能体可以直接调用这个高级技能了 if __name__ __main__: enhanced_lib EnhancedSkillLibrary() result enhanced_lib.execute(search_and_fetch_content, topic大语言模型应用案例) print(复合技能执行结果:, result)通过这个简单的原型我们演示了SkillAdaptor的核心流程记录轨迹 - 发现模式 - 抽象技能 - 注册使用。虽然我们的挖掘算法极其简单仅统计连续动作但展示了从数据到能力的完整闭环。5. 深入挑战与优化方向构建一个真正鲁棒、实用的SkillAdaptor系统远非上述原型那么简单。在实际操作中你会遇到一系列棘手的问题。5.1 轨迹的质量与多样性问题问题如果智能体初始能力很弱产生的轨迹可能质量低下比如总是失败或者多样性不足反复执行相似任务导致挖掘不出有价值的技能。解决思路课程学习与探索激励设计任务时采用由易到难的课程。同时在智能体决策中引入一定的随机性或内在探索激励如对未访问过的状态给予小奖励鼓励其尝试不同的行动序列生成更多样化的轨迹。引入人类演示或专家轨迹在冷启动阶段直接注入高质量的人类演示轨迹。这可以来自专家操作记录也可以来自其他高性能智能体的执行日志。这为技能挖掘提供了“优质种子”。轨迹过滤与加权不是所有轨迹都平等。可以根据任务成功率、累积奖励等指标对轨迹进行加权让高质量轨迹在技能挖掘中占有更高权重。5.2 技能抽象的泛化与过拟合问题从有限轨迹中抽象出的技能可能过度拟合了特定场景的细节无法泛化到新任务。例如从“查询北京天气”轨迹中抽象出的技能可能硬编码了“北京”这个城市参数。解决思路参数化与模板化在抽象过程中强制要求将具体的实体如“北京”替换为参数变量如{city}。LLM在总结时可以明确指示其识别并提取变量部分。基于语义的聚类在挖掘频繁序列前先对状态和行动进行语义层面的聚类。例如将“调用天气API城市北京”和“调用天气API城市上海”聚类为同一类“调用天气API”行动然后再进行序列挖掘这样得到的模式更通用。技能验证与测试建立一套技能测试集。新技能生成后必须在多种相关但不同的测试任务上验证其有效性只有通过一定阈值测试的技能才能加入技能库。5.3 技能冲突与组合爆炸问题技能库越来越大后可能出现功能相似或重叠的技能。面对新任务时如何快速、准确地检索出最合适的技能多个技能如何组合才能高效解决复杂任务解决思路技能向量化与分层检索为每个技能生成高质量的文本描述和向量表示。检索时先进行粗召回基于向量相似度再进行精排序利用LLM根据详细的任务上下文进行判断。可以为技能添加标签如“网络操作”、“数据处理”、“决策判断”实现分层过滤。技能组合规划将复杂任务分解为子任务的过程本身可以看作一个规划问题。可以采用基于LLM的思维链Chain-of-Thought或思维树Tree-of-Thoughts进行任务分解然后为每个子任务匹配技能。也可以训练一个专门的规划器模型。技能效用学习为每个技能维护一个效用模型记录其在历史任务中的成功率、执行效率等。在技能选择和组合时不仅考虑匹配度也考虑效用的期望值。5.4 安全性与可控性问题让智能体自动生成和执行技能可能带来风险。比如技能可能包含不安全的API调用删除文件、发送网络请求或者产生有害内容。解决思路技能沙箱与权限控制所有技能尤其是新挖掘或生成的技能必须在严格的沙箱环境中先进行验证。为技能定义权限等级如“文件读取”、“网络访问”、“无限制”并在执行时进行权限检查。人工审核与干预建立关键技能上线前的人工审核流程。对于高风险操作如涉及支付、数据修改可以设计“人在回路”机制需要人工确认后才能执行。价值观与安全对齐在利用LLM进行技能抽象和参数绑定的提示词中明确加入安全、伦理约束。例如要求其不得生成涉及隐私侵犯、违法操作等内容的技能。6. 进阶应用与未来展望SkillAdaptor的思想可以扩展到许多令人兴奋的方向不仅仅是改进单个智能体。多智能体协作与技能传播在一个多智能体系统中一个智能体学习到的高效技能可以通过SkillAdaptor机制抽象出来然后分享给其他智能体。这能极大加速群体智能的进化。想象一个开发团队每个AI程序员都有自己的编码习惯但当一个AI发现了一种处理某种bug的巧妙模式后这个“技能”可以立刻被标准化并共享给所有成员。跨领域技能迁移在一个领域如网页研究学到的“信息检索与整合”技能其模式可能经过调整后应用于另一个领域如学术文献调研。SkillAdaptor可以尝试识别技能背后更本质的“元模式”从而实现跨领域的技能迁移。终身学习与个性化智能体SkillAdaptor使智能体具备了持续学习的能力。随着用户使用智能体不断积累针对该用户特定习惯和需求的轨迹从而挖掘出高度个性化的技能。例如为经常分析金融数据的用户自动生成“提取某股票最近10个交易日收盘价并计算波动率”的专属技能。与工具学习融合SkillAdaptor和当前热门的工具学习Tool Learning是天然互补的。工具学习关注如何让LLM学会使用给定的工具而SkillAdaptor则进一步关注如何自动发现和创造新的工具技能。两者结合可以实现从“学会使用螺丝刀”到“发明更适合的螺丝刀”的飞跃。从OpenClaw等平台遇到的部署和集成问题来看社区急需的是一套稳定、易扩展、能连接各种模型和工具的智能体底座。将SkillAdaptor作为这类平台的内核可以让平台不仅是一个“连接器”更是一个“能力孵化器”。用户无需成为提示词工程师或开发者只需正常使用智能体平台就能在后台默默学习、优化、创造新技能让智能体越用越聪明真正适应千变万化的需求。这条路还很长轨迹的质量评估、技能抽象算法的效率与准确性、复杂技能的自动组合等都是需要深入研究的课题。但毫无疑问让智能体从执行者变为学习者是通向更通用、更强大人工智能的关键一步。每一次智能体在任务中的“挣扎”和“尝试”都不再是徒劳的失败而是进化所需的宝贵“经验”。

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

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

免费获取报价