ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

UFO 自我经验学习(Self-Experience Learning)完全指南:从任务轨迹到可复用经验的保存、检索与强化机制

UFO 自我经验学习(Self-Experience Learning)完全指南:从任务轨迹到可复用经验的保存、检索与强化机制 UFO 自我经验学习Self-Experience Learning完全指南从任务轨迹到可复用经验的保存、检索与强化机制【免费下载链接】UFOUFO³: Weaving the Digital Agent Galaxy项目地址: https://gitcode.com/GitHub_Trending/uf/UFO本文基于仓库文档 experience_learning.md 展开并深入 UFO 源码ufo/experience/、ufo/rag/、ufo/module/、ufo/agents/验证实现细节。通过本文你将掌握 UFO 如何把一次成功执行的 AppAgent 会话沉淀为经验库并在未来相似任务中自动检索复用从而持续提升任务执行的效率与准确率。一、什么是自我经验学习在 UFO 中AppAgent 负责在目标应用窗口内完成用户请求。默认情况下每一次成功执行都会在ufo/logs/task_name/目录留下完整的执行轨迹trajectory包括每一步的截图、观察、思考、动作与结果——但这些日志只是一次性资产下次遇到相似任务时 Agent 仍需从零开始推理。自我经验学习Learning from Self-Experience解决的正是这个问题当 UFO 成功完成一个任务后用户可以将其保存为经验。经验经过结构化提炼后存入经验数据库此后 AppAgent 遇到相似任务时会先检索这些历史经验将其作为示例few-shot examples注入提示词从而让计划生成更稳、更快、更准确。在仓库中的功能定位上它是知识底座Knowledge Substrate的一个分支与 从 Bing 搜索学习、从用户演示学习、从帮助文档学习 并列共同构成 UFO 的 RAG检索增强生成能力体系。二、工作机制总览UFO 在会话结束后弹出的保存经验询问用户确认后即触发经验总结与入库流程。整个闭环可以用下面的流程图概括关键组件一览组件源码位置职责ExperienceLogLoaderufo/experience/experience_parser.py读取并解析执行日志按子任务Subtask分组ExperienceSummarizerufo/experience/summarizer.py调用 LLM 把轨迹总结为结构化演示示例写入 YAML 与向量库ExperiencePrompterufo/prompter/experience_prompter.py构造轨迹总结提示词ExperienceRetrieverufo/rag/retriever.py基于 FAISS 从经验库检索相似经验Session.experience_saver()ufo/module/basic.py会话层入口串联总结与落盘三、工作流程逐步拆解第 1 步完成一个会话UFO 通过命令行启动并执行任务例如python -m ufo --task your_task_name -r your_request执行期间的截图与请求/响应日志保存在./ufo/logs/your_task_name/目录这些日志正是经验总结的原料。第 2 步询问用户是否保存经验会话运行结束后系统会询问是否保存本次会话。该交互由 ufo/module/interactor.py 中的experience_asker()实现终端会弹出Save Experience for Future Learning面板说明保存经验可带来相似任务执行更快、准确率随时间提升、个性化协助三大收益并以Confirm.ask(...)等待用户确认。第 3 步总结经验ExperienceSummarizer用户选择保存后Session.experience_saver()开始工作完整调用链为读取日志summarizer.read_logs(self.log_path)内部使用ExperienceLogLoader它通过ufo/trajectory/parser.py的Trajectory类加载 AppAgent 执行日志并依据日志中的Subtask字段调用group_by_subtask()把整段轨迹按子任务切分。值得注意的是切分时还会把每一步的截图CleanScreenshot等键用ufo.utils.encode_image编码成 base64供视觉模型在总结时参考。逐子任务总结get_summary_list(logs)对每个子任务分区调用get_summary()build_prompt()使用ExperiencePrompter构造系统提示词与用户内容轨迹 子任务描述get_completion(prompt_message, APPAGENT, use_backup_engineTrue)调用 LLM并启用备用引擎获得 JSON 响应从响应中抽取 10 个字段Observation、Thought、ControlLabel、ControlText、Function、Args、Status、Plan、Comment、Tips组织为summary[example]同时记录request即该子任务描述、Sub-task与app_list该子任务所属应用名列表。落盘持久化experience_saver()调用create_or_update_yaml()与create_or_update_vector_db()YAML 文件保存到EXPERIENCE_SAVED_PATH/experience.yaml每条经验以example{i}为键追加文件不存在时自动创建向量库把每条经验封装为 LangChainDocumentpage_content为请求文本metadata为完整摘要使用get_hugginface_embedding()生成嵌入并构建 FAISS 索引若库已存在则先load_local再merge_from合并最后save_local保存到EXPERIENCE_SAVED_PATH/experience_db。# ufo/module/basic.py 中 experience_saver 的核心片段 summarizer ExperienceSummarizer( ufo_config.app_agent.visual_mode, ufo_config.system.EXPERIENCE_PROMPT, ufo_config.system.APPAGENT_EXAMPLE_PROMPT, ufo_config.system.API_PROMPT, ) experience summarizer.read_logs(self.log_path) summaries, cost summarizer.get_summary_list(experience) experience_path ufo_config.system.EXPERIENCE_SAVED_PATH utils.create_folder(experience_path) summarizer.create_or_update_yaml(summaries, os.path.join(experience_path, experience.yaml)) summarizer.create_or_update_vector_db(summaries, os.path.join(experience_path, experience_db))ExperienceSummarizer的 API 签名如下详见 ufo/experience/summarizer.py方法说明build_prompt(log_partition)构建轨迹 → 总结的提示词消息列表get_summary(prompt_message)调用 LLM 获取单条经验总结返回(summary, cost)get_summary_list(logs)遍历所有子任务分区批量总结并累计成本read_logs(log_path)静态方法读取日志并返回子任务分区create_or_update_yaml(summaries, yaml_path)静态方法追加写入experience.yamlcreate_or_update_vector_db(summaries, db_path)静态方法创建/合并 FAISS 向量库第 4 步检索与复用未来 AppAgent 遇到新请求时会按以下路径复用经验加载检索器在AppAgent.context_provision()中见 ufo/agents/agent/app_agent.py当配置rag.experience True时会用RetrieverFactory.create_retriever(experience, db_path)构建ExperienceRetriever其中db_path EXPERIENCE_SAVED_PATH/experience_db底层即FAISS.load_local加载向量库。检索相关经验AppAgent.rag_experience_retrieve(request, experience_top_k)调用self.experience_retriever.retrieve(request, top_k, filter...)。一个值得注意的细节是检索时带入了filter仅保留app_list中包含当前应用名self._app_root_name忽略大小写比较的经验确保跨应用的经验不会串扰。注入提示词命中的文档会按request、Response即总结出的example结构、Sub-task、Tips组装成与 AppAgent 提示词示例 结构一致的经验示例最终由 Prompter 的examples_prompt_helper()拼入系统提示词指导 LLM 参照历史成功路径生成计划。四、配置指南4.1 经验 RAG 相关参数经验学习相关参数配置在 config/ufo/rag.yaml旧版 UFO 的config.yaml中同名配置项仍可通过迁移工具转换含义如下配置项说明类型默认值RAG_EXPERIENCE是否启用基于经验的检索增强学习BooleanFalseRAG_EXPERIENCE_RETRIEVED_TOPK每次检索返回的最相关经验条数上限Integer5EXPERIENCE_SAVED_PATH经验数据库保存路径YAML 与向量库均在其下Stringvectordb/experience/EXPERIENCE_PROMPT经验总结提示词模板路径Stringufo/prompts/experience/experience_summary.yaml实际配置文件中的完整写法# Experience RAG (config/ufo/rag.yaml) RAG_EXPERIENCE: False # Whether to use the experience RAG RAG_EXPERIENCE_RETRIEVED_TOPK: 5 # The topk for the experience retrieved documents EXPERIENCE_SAVED_PATH: vectordb/experience/ # The path to save experience仓库根目录下vectordb/experience/即默认的经验数据库目录默认为空等待第一次保存时创建。启用体验学习只需在 config/ufo/rag.yaml 中把RAG_EXPERIENCE设为True。更多 RAG 配置细节可参考 RAG 配置指南。4.2 保存策略save_experience除了用户手动确认这一交互式保存路径UFO 还提供了会话级的自动保存策略。会话结束后Session.run()见 ufo/module/sessions/session.py会读取系统配置save_experience支持四种取值默认always_not定义于 config/config_schemas.py取值行为always无条件保存每次会话结束都自动调用experience_saver()ask询问用户通过interactor.experience_asker()弹窗确认后再保存auto智能判断仅当本次任务评估结果complete yes时才保存避免把失败经验写入库always_not从不保存默认如果你希望 UFO越用越聪明推荐开启RAG_EXPERIENCE: True并将save_experience设为ask或autoauto模式能基于任务完成度自动过滤失败轨迹从源头保证经验库质量。4.3 配置兼容性说明RAG_EXPERIENCE、RAG_EXPERIENCE_RETRIEVED_TOPK、EXPERIENCE_SAVED_PATH三个键在新版配置体系中被映射为config.rag.experience、config.rag.experience_retrieved_topk、config.rag.experience_saved_path见 config/config_schemas.py 与 tests/config/test_attribute_access_validation.py旧版config.yaml可通过 ufo/tools/convert_config.py 自动迁移相关迁移规则见 配置迁移指南。五、经验总结提示词模板10 字段 JSON 规范经验之所以能被复用关键在于它被提炼成了与 AppAgent 原生演示示例同构的结构化格式。总结模板位于 ufo/prompts/experience/experience_summary.yaml分为system视觉模型与system_nonvisual非视觉模型两套加上user模板。LLM 需要输出恰好包含 10 个键的 JSON字段含义Observation对应用窗口初始截图的观察视觉或对轨迹的总结非视觉Thought完成请求的第一步动作背后的推理逻辑ControlLabel第一步要操作的控件标注标签无可执行控件时为空字符串ControlText控件的精确control_text同样可为空Function要在控件上调用的 API 函数名不带参数无合适函数为空Args函数参数的字典无参数或不适用时为{}Status动作后任务状态CONTINUE未完成或FINISH完成Plan完成请求的详细行动计划完成时输出FINISH多步用换行分隔Comment关于任务或动作流的补充说明可选Tips指导、风险规避、备选动作与所需知识每条以-开头并用换行分隔模板还在Important Notes中要求 LLM 严格输出 JSON否则可能导致系统崩溃并损坏用户计算机并提示先深呼吸、逐步思考以获得更稳定的输出。这与ExperiencePrompter._filter_log()的字段过滤设计相呼应——总结输入时日志会被裁剪为Subtask、Step、Observation、Thought、ControlLabel、ControlText、Function、Plan、Comment、Action、Application、Results、error等必要字段去除截图数据等噪声见 ufo/prompter/experience_prompter.py。六、检索侧源码细节相似度检索与按应用过滤经验检索由RetrieverFactory与ExperienceRetriever完成ufo/rag/retriever.pyRetrieverFactory.create_retriever(experience, db_path)是工厂模式的入口与offline帮助文档、onlineBing 搜索、demonstration用户演示三类检索器并列便于按配置统一构建ExperienceRetriever.get_indexer()通过FAISS.load_local(db_path, embedding, allow_dangerous_deserializationTrue)加载索引加载失败时仅记录 warning 并返回None随后retrieve()会因indexer为空返回空列表——因此即使经验库尚未构建启用配置也不会导致运行报错嵌入统一使用ufo.utils.get_hugginface_embedding()与保存侧保持一致保证查询向量与索引向量同构AppAgent.rag_experience_retrieve()在调用retrieve()时传入 FAISS 的filter回调用app_list元数据把检索范围限定在当前应用之内这是经验复用精准不串台的关键实现。七、实践建议与 FAQ首次启用需要什么只需修改 config/ufo/rag.yaml 将RAG_EXPERIENCE置为True并重启 UFO经验库会在第一次成功保存时自动创建于vectordb/experience/。经验库越来越大会怎样检索侧采用 top-k 相似度检索RAG_EXPERIENCE_RETRIEVED_TOPK默认5可根据应用复杂度适当调整由于检索已按app_list过滤库容量增长对每次检索的上下文注入量影响有限。如何避免保存失败经验将save_experience设为auto仅当任务评估为完成时才入库。经验与演示Demonstration的区别经验来自 Agent 自身的成功轨迹演示来自用户手把手示范二者可同时启用、互不冲突分别通过RAG_EXPERIENCE与RAG_DEMONSTRATION控制参见 ufo/README.md 中的 RAG 配置示例。常见问题仓库 FAQ 也给出了RAG_EXPERIENCE: true的实际启用样例可作为排错参考。八、小结自我经验学习让 UFO 从一次性执行器进化为持续学习者一次成功执行 → 结构化经验入库YAML FAISS 双形态→ 未来相似任务自动检索 → 注入提示词指导计划生成整个过程由 ufo/experience/summarizer.py、ufo/rag/retriever.py 与 ufo/module/basic.py 协作完成并可通过 config/ufo/rag.yaml 中的三个核心参数与save_experience策略灵活调节。配合仓库文档 RAG 配置指南 与 经验学习原文档即可在生产环境中构建一个随使用时间持续进化的 UFO 智能体。【免费下载链接】UFOUFO³: Weaving the Digital Agent Galaxy项目地址: https://gitcode.com/GitHub_Trending/uf/UFO创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表