解密Prompt系列31. LLM Agent之从经验中不断学习的智能体

prompt,llm,agent · 浏览次数 : 0

小编点评

一、引言 随着人工智能技术的发展,智能体在各种领域的应用越来越广泛,如游戏、物流、医疗等。为了让智能体能够更好地适应不同的环境和任务,研究者们提出了多种智能体模型,其中自主智能体因其能够感知环境、自主决策和行动的特点,受到了广泛关注。然而,自主智能体在实际应用中仍存在许多问题需要解决,如模型自主能力的进化、模型自主获取能力、任务完成率等问题。 本文主要关注自主智能体在垂直领域任务完成率方面的问题,并提出了一种新型的自主智能体结构——AutoGuide。AutoGuide通过对历史经验的对比和学习,能够在推理阶段为用户提供有效的建议,从而提高任务完成率。 二、模型自主能力进化 自主智能体在任务执行过程中会遇到各种问题,失败是成功之母,模型需要根据失败的任务流进行反思和探索,从而提高任务完成率。一种方法是采用强化学习算法,如Q-learning或SARSA等,让模型在模拟环境中进行大量实验,以不断提高任务完成率。然而,这种方法存在一定的局限性,如需要大量的实验资源和计算时间。因此,本节提出了一种基于深度学习的方案,通过在过去的经验中发现规律,让模型在trial and error中自主地进行学习。 论文提出的第一个方案是AppAgent。AppAgent是一个智能手机应用程序,它可以根据用户的操作和建议来进行自主学习,以提高任务完成率。AppAgent通过在Android应用程序上执行一系列任务,并观察模型的行为和反馈,来实现自我学习。具体实施过程如下: 1. 对于给定的安卓应用程序,首先将屏幕划分为多个区域,并使用多模态大模型对其进行标注。 2. 将标注后的页面和功能与Android应用程序的API接口进行映射,以确保模型能够正确地处理用户的操作。 3. 生成一组成套的APP操作指令,并设置相应的手机交互功能为动作标签。 4. 模型通过AppAgent平台执行一组完整的APP任务,并在每一步操作结束后对模型进行反思和评估。 5. 根据反思结果,模型会在下一轮操作中自主选择合适的函数进行控制,以提高任务执行的质量和效率。 三、模型自主获取能力 自主智能体要实现自主性,首先要具备一定的自主获取能力,即在没有任何先验知识的情况下,通过自身探索学习到所需的技能。对于大型语言模型而言,一种常见的方法是通过模拟人类教师的指导和反馈,在有限的样本资源下实现“教学相长”,即人类教师负责“教会”模型一定的知识和技能,而模型则负责应用所学知识解决实际问题,从而培养出真正的自主学习能力。 然而,在传统的基于技能迁移的主观经验学习方法中,尽管可以采用人工干预的方式向模型“传授”经验,但由于模型自身的泛化能力有限,其掌握的新知识通常仅在特定的示例或任务范围内有效。这是因为传统方法在培养模型的泛化能力方面存在根本性的缺陷。因此,本节提出了一种新的学习理论和方法,旨在突破传统方法的局限,使模型不仅能在“学以致用”的日常任务中锻炼自主学习能力,而且能够在更加复杂和多样化的外部环境中自主学习,从而真正成为能够适应不同任务需求的“自主智能体”。具体实施方案如下: 1. 设计“教学实验”,将任务模型和数据集进行拆分组合,让模型完全自主地探索解决某个任务,并通过自我评价来调整学习策略。在实验过程中,不再需要人为教师的直接指导,模型的学习过程和结果完全基于自身的探索。 2. 收集模型在执行过程中的表现,分析其对未知数据的利用情况以及泛化性能的提升。对于表现较好的模型,可以将其经验共享给其他相同任务的模型;对于表现不佳的模型,则可以引导其进行针对性训练或重新设计。这种自主获取能力不仅适用于模型的预习和复习阶段,还可以应用于模型在面对新颖任务时的学习和适应过程中。

正文

Agent智能体的工作流可以简单分成两种:一种是固定的静态工作流,一种是智能体自主决策的动态工作流

静态流程的Agent举几个例子,例如新闻热点追踪推送Agent,每日新论文摘要总结Agent,它们的优点是可控,稳定,可复现,缺点是一种流程基本只能固定适配一种场景,就像工厂的流水线。

而动态流程的Agent,也叫自主智能体,例如AutoGPT,BabyAgent,它们自主感知环境,基于观测进行决策,并做出行动,然后基于行动结果进行反思,并给出下一步行动。优点自然是'理论上'可以泛化到任意场景,不需要基于经验的预置工作流的抽象,但缺点就是不可控,不稳定,不能复现,且任务完成率有限,尤其是在非通用的垂直领域。

影响自主智能体在垂直领域任务完成率的有以下2个亟待解决的问题

  • 模型自主能力进化:失败是成功之母,模型该如何基于失败的任务流进行反思和探索,一步步提高自己的任务完成率呢?
  • 模型自主能力获得:最初模型如何掌握该领域的技能,之前的方案多数是依赖SFT,通过人工,或者人工+模型来构建领域样本来教会模型部分能力。说白了还是人手把手教模型。那这一步能否自主化让模型在trial and error里面自主进行学习呢?毕竟人类也是靠实验和探索一步步掌握新的技能的。

其实以上两个问题都可以通过Self-Reflection from past experience来解决,那问题就转变成了如何获得past-experience,past-experience如何转化成经验,如何在新的推理中使用这些经验。这一章会介绍三个模型自主探索学习和经验总结的方案分别是:AppAgent,Trial and Error和AutoGuide

APPAgent

APPAgent是腾讯实验室推出出的和Andriod手机自主交互的智能体,整体方案和上一章我们讲过的WebVoyager的方案类似,使用多模态大模型和SOM页面元素分割来识别每一步模型和页面的哪些元素进行交互。而自主学习的部分,论文基于模型的前期自主探索,来构建工具说明书,帮助模型了解每款APP的使用,从而提高推理阶段的任务完成率。这里论文在9个android app上进行了测试,一些测试任务如下

image

那如何使用模型来自主生成APP操作说明书呢?类比人类在使用一个新工具时通过Trial and Error来不断更新自己对工具的认知和使用方式,这里的模型探索也是如此。论文先生成了一组基于APP的任务指令,然后基于每个指令模型会对APP的使用进行自主探索,每一步模型的输入包括

  • 手机交互的4种功能的功能介绍:包括点击、键入、长按、左右滑动
  • 任务描述
  • 历史的交互行为的总结
  • 当前手机应用页面的截图

每一步模型的输出包括,如下图

  • Thought:完成任务下一步做啥
  • Action:使用以上哪个功能的Function Calling或者FINISH
  • Summary:加入最新的Action,对所有历史行为进行总结,作为下一步的输入

image

APP操作的具体prompt(省略细节)如下:

self_explore_task_template = """You are an agent that is trained to complete certain tasks on a smartphone. You will be 
given a screenshot of a smartphone app. The interactive UI elements on the screenshot are labeled with numeric tags 
starting from 1. 

You can call the following functions to interact with those labeled elements to control the smartphone:

1. tap(element: int)
功能介绍。。。

2. text(text_input: str)
功能介绍。。。

3. long_press(element: int)
功能介绍。。。

4. swipe(element: int, direction: str, dist: str)
功能介绍。。。

The task you need to complete is to <task_description>. Your past actions to proceed with this task are summarized as 
follows: <last_act>
Now, given the following labeled screenshot, you need to think and call the function needed to proceed with the task. 
Your output should include three parts in the given format:
Observation: <Describe what you observe in the image>
Thought: <To complete the given task, what is the next step I should do>
Action: <The function call with the correct parameters to proceed with the task. If you believe the task is completed or 
there is nothing to be done, you should output FINISH. You cannot output anything else except a function call or FINISH 
in this field.>
Summary: <Summarize your past actions along with your latest action in one or two sentences. Do not include the numeric 
tag in your summary>
You can only take one action at a time, so please directly call the function."""

然后基于以上模型自主探索生成的行为序列,我们可以记录每一步操作前后,收集页面的变化,并基于变化让大模型总结,该操作步骤究竟是干什么的,从而生成APP中每个按钮的交互说明书。以下是点击类操作的说明书prompt,如果一个按钮被使用多次,则模型会不断更新该按钮的说明文档。

tap_doc_template = """I will give you the screenshot of a mobile app before and after tapping the UI element labeled 
with the number <ui_element> on the screen. The numeric tag of each element is located at the center of the element. 
Tapping this UI element is a necessary part of proceeding with a larger task, which is to <task_desc>. Your task is to 
describe the functionality of the UI element concisely in one or two sentences. Notice that your description of the UI 
element should focus on the general function. For example, if the UI element is used to navigate to the chat window 
with John, your description should not include the name of the specific person. Just say: "Tapping this area will 
navigate the user to the chat window". Never include the numeric tag of the UI element in your description. You can use 
pronouns such as "the UI element" to refer to the element."""

这样基于前期的模型探索我们可以得到每个APP上各种按钮的一份操作说明书。然后在推理阶段,模型会同时使用当前手机界面的UI+前期生成的说明书+5种交互行为说明+历史操作,来生成下一步的交互操作。

论文验证了,前期自主探索形成的说明书,对模型的任务完成准确率有很大的提升,几乎可以逼近基于人工探索形成的说明书(Watching Demos),以及直接手工编写说明书(Manually Crafted)的水平。

image

STE:Simulated Trial and Error

上面APPAgent帮助模型自我学习如何进行前端交互,微软提出的STE是针对后端API交互,让模型通过前期的多轮API交互学习API调用,并通过In-Context-Learning或者SFT使用前期探索的结果帮助模型更好的使用API来完成任务。

image

这里STE使用了BmTools的API作为工具池,前期的工具探索阶段分成以下3个步骤

  1. Query生成:基于工具名称和工具描述,让模型生成一条能使用该API回答的问题。prompt指令如下
Your task is to answer the user's query as best you can. You have access to the following tools which you can use via API call to help with your response:

{api_descriptions}

Now you have the chance to explore the available APIs. You can do this by 1) synthesizing some natural user query that calling the API could help, and 2) trying to respond to the user query with the help of the APIs. Here, you can focus on queries that only require calling the API once.

Now, first input your synthesized user query. You should make the query natural - for example, try to avoid using the provided API descriptions or API names in the query, as the user does not know what APIs you have access to. Also try to make the query as specific as possible. Input just the user query alone; do NOT solve the query for now.

User Query:
  1. 工具调用推理:基于以上生成的Query+工具描述,模型使用ReACT范式来生成工具调用语句。把推理语句解析成API调用后,调用API并获取返回值,然后让模型基于返回进行反思。这一步可以最多重复4次,直到模型判断API调用结果可以回答用户提问,并且每次都会使用之前N-1次的推理结果和观测作为上文,也就是上图中的Short-Memory部分,来帮助模型从错误中进行迭代和优化。这里论文使用ChatGPT,prompt如下
Now, try to respond to the query using the available APIs.

The format you use the API is by specifying 1) Action: the API function name you'd like to call 2) Action Input: the input parameters of the API call in a json string format. The result of the API call will be returned starting with "Observation:". Remember that you should only perform a SINGLE action at a time, do NOT return a list of multiple actions.

Reminder:
1) the only values that should follow "Action:" are: {api_names}
2) use the following json string format for the API arguments:

Action Input:
{{
    "key_1": "value_1",
    ...
    "key_n": "value_n",
}}

Remember to ALWAYS use the following format:

Thought: you should always think about what to do next
Action: the API function name
Action Input: the input parameters of the API call in json string format
Observation: the return result of the API call. This is what I will provide you with; you do not need to repeat it in your response.
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the response to the user query

Begin! Remember that your response should never start with "Observation:" since that is what I will provide you with. Once you have enough information, please immediately use \nThought: I now know the final answer\nFinal Answer:

User Query (the same you just synthesized): {query}
  1. 扩展Query: 这里论文针对每个API会进行15次query生成和尝试,并且为了提高query的多样性,在生成新query时会加入历史已经生成的query和每个query模型是否成功调用工具完成。也就是上图Long-Term Memory的部分,判断query是否成功执行也是使用大模型prompt,这里使用了能力更强的GPT4。
Now you know a bit more about the API. You can synthesize another user query to explore the API a bit further and consolidate your understanding of the API, based on things that you discovered about this API. Again, just input the user query alone; do NOT solve the query for now.

User Query:

每个API会重复15次以上的步骤2和步骤3,并记录每一次尝试的路径,用于训练或者后续的In-Context-Learning。

这里我们只关注ICL的方案,因为泛化性更好,能更快拓展新工具和新场景。和上面APPAgent不同的,这里的ICL不是使用前期探索生成的工具说明书,而是直接使用模型调用工具的历史操作,类似于案例。 当用户有新的提问时,会基于query的Embedding(SentenceBert),召回前期探索阶段中最相似的15个query和最终模型的API调用结果作为推理上文,进行工具推理。

效果上论文对比了多个模型直接进行工具调用推理,使用前期探索的案例作为上文,和构建样本进行SFT的效果。小模型还是需要微调才能获得最高的任务完成率,但GPT4这类能力强的模型,只需要ICL就可以达到很好的任务完成率,以及不论是SFT还是ICL相比BaseLine都有很明显的效果提升。

image

AutoGuide

  • AutoGuide: Automated Generation and Selection of State-Aware Guidelines for Large Language Model Agents

对比AppAgent是把经验在APP按钮的操作级别进行总结形成工具说明书,推理时召回当前工具的说明书。STE是直接使用原始经验,推理时召回相关历史经验作为上文,而AutoGuide则是通过对比成功和失败的经验在每一步的状态级别进行总结,在推理时召回相关的状态和状态经验作为上文。通俗点说AppAgent是使用说明书,STE是操作案例集,AutoGuide是使用指南。

想要构建并使用指南,AutoGuide包含三个核心模块:状态总结模块(State Summarization),指南抽取模块(Guideline Extraction),和指南召回模块。论文针对不同的Agent场景设计了不同的状态总结和抽取prompt,这里还是用我们上一章刚提过的webagent中的WebArena数据集为例,分别说下两个模块

  1. State Summarization

状态总结模块是基于模型的规划链路(Thought+Action)来总结模型处于的状态。具体来说是基于同一个任务的成功和失败的两条行为链路,定位到两个链路首次出现不同行为的时间节点T,使用"<T"的链路行为作为输入,使用以下prompt进行状态总结。

image

举个例子,以下的任务中,两条行为链路是在Action1的时候出现了差异,则会使用Action1之前的观察和行为作为输入(current trajectory) 进行状态总结。这里得到的状态应该是"You are on the List of forum Page"

image

  1. Guideline Extraction

得到状态后则需要生成该状态下的行为指南,这里同样分别用到成功和失败的行为链路,以及前面的状态总结,作为输入来生成指南,具体prompt如下

image

同样是上面的例子,针对状态"You are on the List of forum Page",以上prompt得到的指南是
"if you want to navigate to a specific forum, you can click on the link that exactly matches the forum name you are looking for."

在不断基于state生成guideline的过程中,论文还会使用大模型prompt对相似的状态进行合并,最终得到的是一个字典{state:guidelines}。以下是webArena场景中,最终生成的状态指南示例

image

  1. Apply Guideline at Test

基于以上获取的状态和状态指南,在推理阶段,每一步执行会先使用State Summarization模块对当前状态进行总结,然后基于当前的状态去构建好的状态指南中先定位相似的状态,这里使用了和上面状态消重合并相同的大模型prompt,然后基于定位到的状态,获取所有的相关指南。如果指南数量太多,则使用下面的prompt对指南进行筛选,只保留Top-K。然后基于这Top-K指南进行下一步思考和行为的推理。

image

其他相关论文

以上三篇论文覆盖了当前自主学习的几个大的方向,这个领域还有一些其他相关的论文,思路有些相似,感兴趣的朋友可以自己看下

  • A Survey on Self-Evolution of Large Language Models
  • Investigate-Consolidate-Exploit: A General Strategy for Inter-Task Agent Self-Evolution
  • Empowering Large Language Model Agents through Action Learning
  • Trial and Error: Exploration-Based Trajectory Optimization for LLM Agents
  • OS-COPILOT: TOWARDS GENERALIST COMPUTER AGENTS WITH SELF-IMPROVEMENT
  • LLAMA RIDER: SPURRING LARGE LANGUAGE MODELS TO EXPLORE THE OPEN WORLD
  • PAST AS A GUIDE: LEVERAGING RETROSPECTIVE LEARNING FOR PYTHON CODE COMPLETION
  • ExpeL: LLM Agents Are Experiential Learners

想看更全的大模型相关论文梳理·微调及预训练数据和框架·AIGC应用,移步Github >> DecryPrompt

与解密Prompt系列31. LLM Agent之从经验中不断学习的智能体相似的内容:

解密Prompt系列31. LLM Agent之从经验中不断学习的智能体

模型想要完成自主能力进化和自主能力获得,需要通过Self-Reflection from Past Experience来实现。那如何获得经历,把经历转化成经验,并在推理中使用呢?本章介绍三种方案

解密prompt系列34. RLHF之训练另辟蹊径:循序渐进 & 青出于蓝

前几章我们讨论了RLHF的样本构建优化和训练策略优化,这一章我们讨论两种不同的RL训练方案,分别是基于过程训练,和使用弱Teacher来监督强Student 循序渐进:PRM & ORM 想要获得过程

解密Prompt系列33. LLM之图表理解任务-多模态篇

这一章我们聚焦多模态图表数据。先讨论下单纯使用prompt的情况下,图片和文字模态哪种表格模型理解的效果更好更好,再说下和表格相关的图表理解任务的微调方案

解密Prompt系列32. LLM之表格理解任务-文本模态

这一章我们聊聊大模型表格理解任务,在大模型时代主要出现在包含表格的RAG任务,以及表格操作数据抽取文本对比等任务中。这一章先聊单一的文本模态,我们分别介绍微调和基于Prompt的两种方案。

解密Prompt系列30. LLM Agent之互联网冲浪智能体

这一章介绍自主浏览操作网页的WebAgent和数据集:初级MiniWoB++,高级MIND2WEB,可交互WEBARENA,多模态WebVoyager,多轮对话WebLINX,复杂AutoWebGLM

解密Prompt系列29. LLM Agent之真实世界海量API解决方案:ToolLLM & AnyTool

很早之前我们就聊过ToolFormer,Gorilla这类API调用的Agent范式,这一章我们针对真实世界中工具调用的以下几个问题,介绍微调(ToolLLM)和prompt(AnyTool)两种方案。 真实世界的API数量庞大且多样:之前的多数工具调用论文,工具数量有限,工具相对简单具体,并且往往

解密Prompt系列17. LLM对齐方案再升级 WizardLM & BackTranslation & SELF-ALIGN

这一章介绍通过扩写,改写,以及回译等半监督样本挖掘方案对种子样本进行扩充,提高种子指令样本的多样性和复杂度,这里我们分别介绍Microsoft,Meta和IBM提出的三个方案。

解密Prompt系列16. LLM对齐经验之数据越少越好?LTD & LIMA & AlpaGasus

总结下指令微调、对齐样本筛选相关的方案包括LIMA,LTD等。论文都是以优化指令样本为核心,提出对齐阶段的数据质量优于数量,少量+多样+高质量的对齐数据,就能让你快速拥有效果杠杠的模型

解决 Xshell 无法使用 zsh 的 prompt style

为了更好的阅读体验,请点击这里 先学习一下 zsh 的配置吧~ 参考资料 从 0 开始:教你如何配置 zsh powerlevel10k 如何给 Xshell 配置呢 当我安装完 oh-my-zsh、powerlevel10k、fast-syntax-highlighting、以及若干(powerl

解锁LLMs的“思考”能力:Chain-of-Thought(CoT) 技术推动复杂推理的新发展

解锁LLMs的“思考”能力:Chain-of-Thought(CoT) 技术推动复杂推理的新发展 1.简介 Chain-of-Thought(CoT)是一种改进的Prompt技术,目的在于提升大模型LLMs在复杂推理任务上的表现,如算术推理(arithmetic reasoning)、常识推理(co