大语言模型(LLM),例如GPT、Claude、Palm和Llama等,在自然语言理解和生成方面展示了非凡的能力。这些模型已被广泛应用于各种应用中,包括聊天机器人、虚拟助手和内容生成系统。LLM有潜力彻底改变人类与机器的互动方式,提供更自然、更直观的体验。特别是那些利用大型语言模型(LLM)或其他人工智能技术的Agent,被视为具有规划任务、观察周围环境并相应执行适当行动的自主实体。几个现有的框架,包括Langchain、Semantic Kernel、Transformers Agent、Agents、AutoGen和JARVIS,已努力利用LLM进行面向任务的对话。这些框架使用户能够通过发出自然语言请求并接收回应来与LLM驱动的Agent进行交互。然而,这些框架存在限制,限制了它们在处理特定领域场景和数据分析任务时的有效性。

 

前言

    复杂Agent。现在各种应用方案都要蹭一下Agent的热度,其中大部分的实现仅是简单Agent,甚至是通过LLM prompt或RAG的方案实现的。这里期望实现的Agent能力要明显强于基座LLM的直接调用和各种工具的简单组合。复杂Agent的单次运行中可能涉及【至少】数十次、数百次的LLM API调用。在这个标准下,包括New Bing Chat在内的所有RAG方案都还不够“复杂”。 

 

    规划能力。从原理上来说,LLM的训练目标只是记住训练集中的经验,甚至只是其中共性的部分,而非所有细节。从LLM的模型结构上来说,也没有任何更适合于规划的结构设计。什么样的方式才算是规划呢?这里举个例子:最简单的规划问题抽象是应用数学中的各种规划问题(运筹问题),例如线性规划、混合整数线性规划、非线性规划。解决规划问题有几个要求:1.给出的方案是可行的。对于序列规划问题来说,从起点到终点的每步都要是可行的。2.将问题拆分为几个子问题时,应确保能从子问题的求解结果完整的得到原问题的解决方案。3.解决方案的成本是合适的,最好能有某种最优性或近似最优性,至少也得是成本可接受得。LLM与目前基于LLM的复杂Agent能够满足这些要求么?基本不行。

 

    AutoGPT、ChatDEV、AutoGEN 和 MetaGPT 是今年发布的一些Multi-Agent框架库。大多数现有框架的一个主要限制是缺乏处理丰富数据结构的原生支持。基于LLM的Agent经常需要处理复杂的数据结构,如嵌套列表、字典或数据框架,用于数据分析应用和许多其他商业场景。然而,许多现有框架在有效处理这些结构方面存在困难,特别是在将信息在聊天轮次之间或不同插件之间传输时。在这种情况下,这些框架要么将数据持久化到磁盘,要么将复杂结构编码为字符串或JSON对象作为提示。尽管这些方法是可行的,但它们可能导致不切实际和增加错误率,特别是在处理大型数据集时。 

 

    现有方法的另一个限制是缺乏配置以融入领域知识。虽然这些框架提供了提示工程的工具和示例,但它们未能提供一种系统化的方式将特定领域知识嵌入到规划和代码生成过程中。因此,这种限制使得在特定领域要求下控制规划和代码生成过程变得具有挑战性。 

 

    许多现有框架中遇到的另一个问题是它们的不灵活性,这阻碍了满足用户多样化需求的能力。虽然插件可以解决常见需求,但在处理特定查询时可能会不足。为每个特定查询编写单独的插件是不切实际的。在这些情况下,Agent能够编写自定义代码来执行用户查询变得必要。因此,有必要提出一种解决方案,无缝地将插件执行与自定义代码执行结合起来,以解决这个问题。 

 

    微软最近推出了TaskWeaver,是AutoGen的升级版本,用户仅用几条命令就将可以将想法转化为代码。TaskWeaver不仅仅是一个工具,更是一个复杂的系统,能够解释命令,将它们转换为代码,并精确地执行任务。 

 

    在这篇文章中,我们将讨论什么是 TaskWeaver,TaskWeaver 的特点是什么,Autogen 和 TaskWeaver 之间的区别,以及如何使用 TaskWeaver 创建一个超级 AI Agent,最后分析TaskWeaver的设计考量。

 

认识 TaskWeaver

    TaskWeaver 是一个以代码为先的Agent框架,用于无缝规划和执行Agent任务。这个创新框架通过编码片段解释用户请求,并有效地协调各种以函数形式存在的插件来执行各种任务。

 

图片

 

    本质上,TaskWeaver 是一个以代码为先的Agent框架。这意味着它接受用户以代码片段形式提供的请求,并协调各种插件来执行这些任务。想象一下拥有一个虚拟助手,它不仅理解你的请求,还通过将你的指令转换为代码来执行操作。这对于希望简化工作流程并将其项目提升到新水平的开发者来说,是一个重大的飞跃。

 

TaskWeaver的特性

1. 丰富的数据结构 - TaskWeaver 允许您在 Python 中使用丰富的数据结构,例如 DataFrame,而不必使用文本字符串。

 

2. 定制算法 - TaskWeaver允许您将自己的算法封装到插件中(以Python函数的形式),并编排它们以实现复杂的任务。

 

3. 融入特定领域的知识 - TaskWeaver 的设计目的是轻松融入特定领域的知识,例如执行流程的知识,以提高 AI copilot的可靠性。 

 

4. 有状态对话 - TaskWeaver 旨在支持有状态对话。它可以记住对话的上下文并利用它来改善用户体验。 

 

5. 代码验证 - TaskWeaver 旨在在执行之前验证生成的代码。它可以检测生成的代码中的潜在问题并提供修复建议。 

 

6. 易于使用 - TaskWeaver 的设计宗旨是易于使用。用户可以根据示例插件轻松创建自己的插件。TaskWeaver 提供开箱体验,允许用户在安装后立即运行服务。 

 

7. 易于调试 - TaskWeaver 被设计为易于调试。有详细的日志来帮助用户了解调用LLM、代码生成和执行过程中发生的情况。 

 

8. 安全考虑 - TaskWeaver 支持基本的会话管理,以将不同用户的数据分开。代码执行被分成不同的进程,以免相互干扰。 

 

9. 轻松扩展 - TaskWeaver 旨在轻松扩展以完成更复杂的任务。您可以创建多个AI copilot来扮演不同的角色,并协调他们来完成复杂的任务。

 

TaskWeaver的WorkFlow

    TaskWeaver的工作流程涉及几个关键组件和过程,以下是工作流程的概览。它由三个关键组件组成:规划器(Planner)、代码生成器(CG)和代码执行器(CE)。代码生成器和代码执行器由代码解释器(CI)组成。

图片

 

规划器

    规划器组件作为TaskWeaver系统的入口点和控制器。它接收用户查询,并将它们分解为多个子任务。这些子任务形成一个初始计划,该计划是基于大型语言模型的知识生成的,或通过特定领域的示例增强的。规划器随后通过考虑子任务之间的依赖关系来完善初始计划。TaskWeaver在处理用户请求时纳入了双层规划过程。第一层由规划器生成一个高层次的计划,概述完成请求所需的步骤。随后,在每一轮中,代码生成器必须制定一个计划,就思维链和生成的代码而言,来执行指定的步骤。

 

通信

    规划器与每个组件进行双向通信,发送查询并接收响应。这种通信对于协调TaskWeaver内的能力以完成任务并向用户报告至关重要。  

 

轮次

    TaskWeaver中的一轮始于接收用户请求,并在响应用户后结束。随后,TaskWeaver等待用户的下一个输入。通常,一个会话包含多个轮次。 

 

Post

    在一轮中,规划器、代码生成组件和代码执行组件之间可能会交换几条消息,每条消息称为一个Post。Post包含文本消息,例如规划器向代码生成组件的请求生成代码,也可能包括其他相关信息,如生成的代码和执行日志。 

 

状态

    它在整个对话中保留了重要信息,称为会话的状态(或上下文)。状态包括用户与TaskWeaver之间的聊天历史、模型的内部思考和计划、生成的代码、执行结果等。会话状态作为LLM的短期记忆,指导它做出适当的决策。

 

AutoGen VS TaskWeaver

  1. Autogen是一个基于模板的方法,通过自然语言输入生成代码的框架。它使用一组预定义的模板根据用户输入生成代码。 

     

  2. Autogen旨在高度可定制,允许开发人员定义他们自己的模板并自定义代码生成过程。

     

  3. TaskWeaver是一个以代码为先的框架,用于构建基于LLM(大型语言模型)的自主Agent。它将用户请求转换为可执行代码,并将用户定义的插件视为可调用函数。

     

  4. TaskWeaver提供丰富的数据结构、灵活的插件使用、动态插件选择支持,并利用LLM编码能力处理复杂逻辑。它还通过示例结合了特定领域的知识,并确保生成代码的安全执行。

     

    可以看出,Autogen是一个基于模板的代码生成框架,而TaskWeaver是一个以代码为先的框架,用于构建智能会话Agent。

 

TaskWeaver 使用案例

    假设用户想要分析存储在SQL数据库中的数据集。他们会执行一些基本的数据处理任务,比如过滤、排序和聚合数据,然后可视化结果。 

 

 用户输入:用户向TaskWeaver会话Agent发送自然语言请求,例如“我想分析过去一年的销售数据。” 

 

任务分解:TaskWeaver的规划器组件将用户请求分解为多个子任务,如“从SQL数据库检索数据”,“根据特定条件过滤数据”,“按特定列排序数据”,“按特定列聚合数据”和“可视化结果”。 

 

插件选择:它根据用户的请求和可用插件列表选择适当的插件来执行每个子任务。例如,它可能使用SQL插件从数据库检索数据,使用Pandas插件过滤和排序数据,使用matplotlib插件可视化结果。

 

代码生成:它使用选定的插件和用户的输入为每个子任务生成代码。例如,它可能生成SQL代码来检索数据,pandas代码来过滤和排序数据,以及matplotlib代码来可视化结果。 

 

代码执行:TaskWeaver执行每个子任务生成的代码,并将结果存储在其内部状态中。 

 

响应生成:它根据执行代码的结果向用户生成自然语言响应。例如,它可能说“这是过去一年的销售数据,按地区过滤并按日期排序。每个地区的总销售额如下:地区A - 100,000元,地区B - 150,000元,地区C - 75,000元。您想看看按地区的销售条形图吗?” 

 

迭代交互:用户和TaskWeaver之间的对话是迭代的,用户提供反馈,TaskWeaver相应地调整其计划和代码。这只是TaskWeaver可以用来创建智能会话Agent的一个例子。该框架高度灵活,可以定制以处理广泛的任务和场景。

 

如何使用 TaskWeaver创建 Super AI Agent

    TaskWeaver允许用户利用各种AI模型的优势,同时克服其局限性,将多个AI模型组合在一起以创建超级AI Agent。 

 

利用大型语言模型的知识和推理能力

    大型语言模型如Claude拥有广泛的文本知识和出色的推理能力。TaskWeaver可以利用这些长处,同时通过组合其它模型来规避其局限性,比如对特定领域知识的欠缺。 

 

整合视觉系统获得图像理解能力

    TaskWeaver可以将大型语言模型与视觉AI系统(例如视觉问答模型)结合,增强对图像的理解和分析能力。这大大扩展了其处理信息的类型。

 

利用知识图谱补充具体的实体知识

    知识图谱包含各个实体(人物、地点等)之间关系的结构化表示。TaskWeaver可以整合知识图谱为语言模型“注入”更多具体的实体级知识。这弥补了语言模型对事实知识的匮乏。

 

应用交互式学习不断进步

    TaskWeaver具有强大的交互式学习和记忆访问能力。它可以在完成任务过程中获取新信息,并记住以供将来使用。这使其可以不断进步,处理更广泛的问题。 

 

利用执行引擎联系现实世界

    TaskWeaver可以通过执行引擎访问外部数据源,或在现实世界执行任务(例如控制机器人)。这大大扩展了其能力,使其成为一个全面的智能Agent。 

 

总之,通过组合各种AI模型的优势,弥补单个模型的不足,TaskWeaver作为一个超级AI Agent,能够完成很多单个模型无法完成的复杂任务。它代表了AI的未来发展方向。

 

TaskWeaver的设计考量

以代码为先的分析体验

    Python已成为数据分析的事实标准语言,TaskWeaver利用这一点,将用户请求转换为在专用进程上运行的Python程序。用户可以向TaskWeaver发出自然语言请求,以操纵Python进程的状态,TaskWeaver利用了numpy、pandas、sklearn等流行库。与依赖文本或文件表达的其他框架不同,TaskWeaver使用了像pandas DataFrame这样的原生数据结构。这使得从数据库提取数据、运行机器学习算法(例如,异常检测、分类或聚类)、汇总结果和可视化分析成果等任务变得容易。

 

受限代码生成 

    TaskWeaver涉及在代码执行前进行代码验证,以确保生成的代码符合预定义的规则,不违反任何安全要求。这是通过使用可配置的规则实现的,这些规则可以定制以适应不同场景。通过这样做,用户可以确保代码不导入任何禁止的包或调用任何不安全的函数。这种验证过程不仅解决了安全问题,还支持了仅插件模式功能,其中只能调用插件函数,所有其他生成的代码都被拒绝。

 

有状态的代码执行 

    当用户进行临时的数据分析请求时,通常涉及多次迭代。因此,TaskWeaver需要在整个会话中保持代码执行的状态。这类似于在Jupyter Notebook中使用Python编程,用户在一系列单元格中输入代码片段,程序的内部状态顺序地进行。然而,在TaskWeaver中,用户使用自然语言而不是编程语言。TaskWeaver将每个用户请求转换为每轮的一个或多个代码片段,具体取决于计划。 

 

智能计划分解 

    规划器将用户请求分解为代码解释器可以简化和执行的子任务。我们识别了不同子任务之间的三种依赖关系:顺序、交互和无依赖。子任务B顺序依赖于子任务A意味着B必须在A完成后运行。交互依赖在执行顺序上与顺序依赖相同。除此之外,它意味着在两个子任务之间需要人类或LLM的干预。例如,用户指示TaskWeaver读取一个文件并遵循其内容中的指令。规划器将请求分解为2个步骤:(1)读取文件内容;(2)遵循指令。LLM需要先完成第一步阅读内容,然后再进行第二步。第三种依赖类型是无依赖,意味着它们之间没有依赖关系,可以并行进行。根据这个定义,两个步骤中的一个顺序依赖于另一个的情况可以合并为代码生成的一个步骤,因为不需要干预。在TaskWeaver中,规划器涉及两阶段规划,我们强制它重新考虑子任务的生成计划,以合并有顺序依赖的子任务。这可以防止模型将请求分解为过于细粒度的步骤,从而导致执行过程过长并产生不必要的成本(多次调用LLM)。 

 

自我反思 

    TaskWeaver设计有能力在规划和代码生成阶段纠正错误。当它检测到前面步骤的结果与预期结果不符时,规划器具有重新评估和修改其计划的能力,探索替代方法。此外,代码解释器(CI)配备了评估代码执行结果的能力。如果代码执行过程中遇到异常或代码未通过验证,CI可以启动代码的重新生成,从而试图纠正代码。这个迭代过程确保TaskWeaver保持了对任务执行的强大和适应性方法,提高了框架的可靠性和效率。 

 

可扩展插件使用 

    在TaskWeaver中,插件是用于处理过于复杂或需要特定领域知识的任务的专业Python函数,从而减少了所需插件的数量,因为TaskWeaver已经可以处理通用的Python代码生成。此外,TaskWeaver具有动态插件选择功能。这意味着在收到用户请求后,只从可用插件池中选择与该请求相关的插件。这种方法确保TaskWeaver使用最合适的工具来处理手头的任务,而不会使提示过载不必要的功能。

 

融入领域知识

    融入领域知识的一种方法是自定义插件,然而对于特定领域的任务,LLM生成正确调用插件的代码或制定良好计划可能具有挑战性。为了解决这个问题,我们在TaskWeaver中引入了一个接口,允许用户指导系统处理这些困难任务。TaskWeaver使用户能够配置示例来教授LLM如何响应特定请求。例如,包含逐步思考和请求/响应部分的对话历史可以用作示例。在TaskWeaver中有两种类型的示例:一种用于规划,另一种用于代码生成。通过使用示例,TaskWeaver可以融入特定领域的知识,提高LLM为困难任务生成准确计划和代码的能力。 

 

安全性 

    执行自由生成的代码可能引入安全风险。例如,恶意用户可能要求TaskWeaver打开包含安全密钥的文件,删除系统文件或终止进程。减轻安全风险的典型方法是在对LLM的提示中包含某些语句,这在TaskWeaver中得到了实现。为了防止这些恶意行为,TaskWeaver为每个会话分配一个单独的工作进程,每个工作进程独立于其他进程,并在特殊的操作系统用户下运行。因此,工作进程无法访问超出操作系统用户范围的文件或其他进程,从而防止任何恶意行为。工作进程通过进程间接口进行通信。将来计划支持在沙箱中运行每个工作进程,以进一步增强系统的安全性。 

 

易于使用 

    现有的大型语言模型(LLM)框架,如Langchain,使构建概念验证演示变得容易。然而,由于这些框架提供了大量组件(就像一大盒乐高积木一样),因此构建一个可靠的系统可能会耗费大量时间。TaskWeaver的主要目标之一是使其易于使用。通常,用户只需定制插件即可开始使用。对于更复杂的任务,用户可以定制代码生成和规划的示例。为了帮助用户,TaskWeaver包含了各种工具,如将Python函数转换为插件的工具,以及将现有对话保存为示例的工具。这些工具使用户更容易定制系统。TaskWeaver的另一个关键特性是其支持多租户开放式箱体。该系统实现了一个会话管理器,用于隔离不同用户的会话,使得同时服务多个用户变得容易。这使得该系统可以作为一种服务被使用,支持广泛的用例。

 

LLM调用成本 

    LLM的成本可能相当高,TaskWeaver通过允许不同模块配置不同的LLM模型来解决这个问题。例如,GPT3.5与GPT4相比要便宜得多。因此,对于简单任务,我们可能使用更便宜的模型来降低总成本。其次,我们仔细分析了TaskWeaver中的过程,并制定了一套规则,在特定条件下可以不使用LLM,降低大模型调用成本。

 

写在最后

    本文展示了TaskWeaver的设计和实现,强调了它对复杂数据结构、灵活插件使用和智能任务规划的支持。还展示了TaskWeaver利用LLM的编码能力实现复杂逻辑和通过示例融入特定领域知识的能力。此外,生成代码的安全执行和为开发者提供易于使用的界面也是TaskWeaver的优势。 

    总的来说,TaskWeaver提供了一个强大而灵活的解决方案,用于构建智能Agent。随着LLM的不断发展和改进,规划策略的优化,各种插件的丰富,TaskWeaver可以促进更高级和复杂的应用,构建 Super AI Agent。

 

 

参考资料:

1. TaskWeaver + Planner + Plugin = Super AI Agent

https://quickaitutorial.com/how-taskweaver-can-be-used-to-create-a-super-ai-agent/

2. TaskWeaver: A Code-First Agent Framework https://arxiv.org/pdf/2311.17541.pdf

3. 谈复杂Agent策略框架的设计 https://mp.weixin.qq.com/s/9I5wxWRxU7V0LdhhopxaiA