当前主流的大模型AI产品主要落地于三种应用形态分别是聊天机器人、人工智能助手以及人工智能代理重点说明了这些应用形态背后所采用的技术栈存在明显的差异。首先对于聊天机器人而言若仅需做通用领域的知识问答则依赖的是在线大模型/开源大模型的原生能力我们需要做的是以产品的架构去构建大模型的接入方式。若需对私有数据进行问答通常会引入检索增强生成Retrieval-Augmented Generation, RAG技术以实现对特定数据源的有效访问和信息整合。在开发的技术选型的过程中真正容易引起混淆的是人工智能助手与人工智能代理这两类应用。表面上这两者常常因称呼上的类似而被误解为同一类应用产品但实质上它们基于完全不同的底层架构。这种差异关键在于它们处理任务和交互方式的根本设计理念影响了它们在实际应用中的功能和效能。首先人工智能助手的核心功能在于辅助用户完成一些通常需要人工参与的既定任务其主要作用是替代人工执行特定操作。这一过程依赖于Function Calling技术——大模型调用特定函数的能力这些函数可以是内置的也可以是用户自定义的。在执行任务时大模型会通过分析问题来决定何时以及如何调用这些函数从而增强其处理特定任务的能力。例如在我们上节课实现的电商智能客服案例中通过给大模型配置查询商品数据库和优惠政策这两个工具Tools所构造出来的智能客服能够准确理解并回应用户的具体需求。这种Function_call的机制使得大模型可以有效利用外部工具或内部功能从而提升其执行复杂任务的能力。在处理这类问题时我们主要依赖于大模型的原生意图识别能力以及单个、多个或并行函数的调用功能。然而问题也很明显的显现出来了就是当用户的单次请求中包含多个意图时。例如用户询问“你家卖健身手套吗现在有什么优惠” 理想的处理流程应如下1. 首先调用一个工具查询数据库后台确认是否有该商品。如果没有直接回复用户。2. 如果商品存在根据第一个工具的查询结果再调用第二个工具查询该商品的优惠信息并计算后回复给用满意度。但很明显无论我们怎么努力都会发现这不是单纯的Function Calling能够实现的复杂需求。所以才来到了AI Agent的应用领域 - 人工智能代理。我们可以通过一些简化的比喻来理解Function calling和AI Agent这两个概念想象你正在使用刚刚购买的华为手机当你想要拍照时你会打开相机应用。这个相机应用就是一个人工智能助手它提供了拍照的功能。你通过点击相机图标来调用这个功能然后就可以拍照、编辑照片等。在这个比喻中相机应用就是预定义的函数而打开相机应用并使用其功能的技术就是Function Calling。而对于人工智能代理想象一个机器人管家。这个机器人能够理解你的指令比如“请打扫客厅”并且能够执行这个任务。机器人管家就是一个AI Agent它能够自主地感知环境比如识别哪些地方是客厅做出决策比如决定打扫的顺序和方法并执行任务比如使用吸尘器打扫。在这个比喻中机器人管家是一个能够自主行动和做出复杂决策的实体而其背后支撑其做这一系列复杂任务的技术就是AI Agent。总结来说Function Calling就像是调用一个具体的功能或工具来帮助你完成特定的任务而AI Agent则更像是一个能够独立思考和行动的个体它可以在没有人类直接指导的情况下完成一系列复杂的任务。所以能够很明显的感觉出以 AI Agent 为底层架构的应用其核心是要具备自主决策 高效执行的能力。1. 从提示工程到代理工程正如上面所说我们一直使用的提示工程似乎都在指导着大模型去完成单一轮次的特定需求。而现在想让大模型做一个能够独立思考的个体此时我们要思考的是构建 AI Agent 的目的是什么它有具体的工作或角色定位吗有没有支持目标的行动或者支持行动的目标那么就非常有必要开始从提示工程过渡到更广泛的东西即代理工程。通过建立适当的框架、方法和心理模型来有效地设计整个流程。而这个阶段所提到的AI Agent 的心理模型指的是在围绕代理工程的思维过程。核心思想相对简单如下图所示如上图所示整个框架强调了从赋予AI代理任务到技术实现之间的递进关系每一层都为下一层提供支持和基础。从AI代理被赋予特定的工作Job(s)开始进而必须执行的操作Action(s)以完成这些工作再到执行这些操作所需的特定能力Capabilities及其所需的熟练程度Required Level of Proficiency。为了达到这些能力的熟练程度代理需要依赖于各种技术和技巧Technologies and Techniques而这些技术和技巧又必须通过精确的编排Orchestration来实现有效整合。整个过程形成了一个系统其中每个部分都是实现AI代理高效运作的关键。设计人工智能代理做重要的是清楚地概述代理应该做什么。代理需要完成的主要工作、任务或目标是什么这可以被视为一个高级目标也可以分解为具体的工作和任务。比如这样一个场景当“我”萌生了去北京旅游的想法时按照常规的出游思路我需要进行以下前期准备和计划想法1: 首先我需要了解北京的热门景点并制定一个旅游行程。行动1: 我会在小红书上搜索相关的旅游攻略。观察1: 根据攻略我制定了一个为期三天的旅游计划。接下来我需要考虑如何到达北京这意味着我得订购机票。想法2: 我需要预订飞往北京的机票。行动2: 我现在使用携程APP来订购机票。观察2: 机票已经订好我已经能够到达北京了。既然计划在那里停留三天我还需要解决住宿的问题。想法3: 接下来我要预订酒店以确保北京行的住宿安排。行动3: 我在飞猪APP上搜索并预订了北京的酒店。观察3: 酒店预订已确认。结论: 现在所有的准备工作都已完成我可以放心出发了。在上述北京旅游的规划过程中初始输入仅为一条意图“我想去北京旅游”。接下来的所有步骤包括在小红书上查找旅游信息、通过携程APP订票、以及使用飞猪APP预订酒店都是一系列的思考和行动过程。提示工程是一种非常经济有效的方法我们已经习惯于利用它来增强大语言模型LLM处理复杂任务的能力。那么对于上述过程如果也想让大模型通过提示工程的这种方式去自主完成其实并不复杂这里我们先给出提示示例prompt You run in a loop of Thought, Action, Observation, Answer. At the end of the loop you output an Answer Use Thought to describe your thoughts about the question you have been asked. Use Action to run one of the actions available to you. Observation will be the result of running those actions. Answer will be the result of analysing the Observation Your available actions are: xiaohongshu: e.g. xiaohongshu: Beijing travel tips Runs a search through the Xiaohongshu API and returns travel tips and recommendations for Beijing. ctrip: e.g. ctrip: flights to Beijing Runs a search through the Ctrip API to find available flights to Beijing. Always use the Xiaohongshu and Ctrip APIs if you have the opportunity to do so. Example session: Question: Im planning a trip to Beijing, what should I do first? Thought: I should find out about the attractions and tips for visiting Beijing on Xiaohongshu. Action: xiaohongshu: Beijing travel tips Observation: The search returns a list of popular travel tips and must-visit attractions in Beijing. Answer: Start by researching Beijings must-visit attractions and travel tips on Xiaohongshu. Then, look for available flights on Ctrip and consider accommodation options.很惊喜的是这样的提示方法确实可以让大模型在接收到输入以后自动的进入决策分析过程。比如我们直接使用ChatGPT使用 Few-Shot 提示方法来进行尝试所谓的代理工程一种最简单的理解是更加复杂的提示工程。从提示工程到代理工程的过渡体现在不再只是提供单一的任务描述而是明确界定代理所需承担的具体职责详尽概述完成这些任务所需采取的操作并清楚指定执行这些操作所必须具备的能力形成一个高级的认知模型。而这种复杂提示行之有效的原因还是起源于 ReAct 的思想框架。2. ReAct Agent 基本理论ReAct Agent 也称为 ReAct是一个用于提示大语言模型的框架它首次在 2022 年 10 月的论文[《ReActSynergizing Reasoning and Acting in Language Models》](https://arxiv.org/pdf/2210.03629)中引入并于2023 年 3 月修订。该框架的开发是为了协同大语言模型中的推理和行动使它们更加强大、通用和可解释。通过交叉推理和行动ReAct 使智能体能够动态地在产生想法和特定于任务的行动之间交替。ReAct 框架有两个过程由 Reason 和 Act 结合而来。从本质上讲这种方法的灵感来自于人类如何通过和谐地结合思维和行动来执行任务就像我们上面“我想去北京旅游”这个真实示例一样。首先第一部分 Reason它基于一种推理技术——[思想链CoT](https://arxiv.org/pdf/2201.11903) CoT是一种提示工程通过将输入分解为多个逻辑思维步骤帮助大语言模型执行推理并解决复杂问题。这使得大模型能够按顺序规划和解决任务的每个部分从而更准确地获得最终结果具体包括- 分解问题当面对复杂的任务时CoT 方法不是通过单个步骤解决它而是将任务分解为更小的步骤每个步骤解决不同方面的问题。- 顺序思维思维链中的每一步都建立在上一步的结果之上。这样模型就能从头到尾构造出一条逻辑推理链。比如一家商店以 100 元的价格出售产品。如果商店降价20%然后加价10%产品的最终价格是多少- 步骤 1 — 计算降价20%后的价格如果原价是100元商店降价20%我们计算降价后的价格 10 x (1–0.2) 80.- 步骤 2 — 计算上涨 10% 后的价格降价后产品价格为 80 元。现在商店涨价10%80 x (1 0.1) 88.- 结论先降价后加价后产品最终售价为88元。但是在 CoT 提示工程的限定下大模型仍然会产生幻觉。因为经过长期的使用大家发现在推理的中间阶段会产生不正确的答案或上下游的传播错误所以Google DeepMind 团队开发了 ReAct 的技术来弥补这一点。ReAct 采用的是思想-行动-观察循环的思路其中代理根据先前的观察进行推理以决定行动。这个迭代过程使其能够根据其行动的结果来调整和完善其方法。在这个过程中Question指的是用户请求的任务或需要解决的问题Thought用来确定要采取的行动并向大模型展示如何创建/维护/调整行动计划Action Input是用来让大模型与外部环境例如搜索引擎、维基百科的实时交互包括具有预定义范围的API。而Observation阶段会观察执行操作结果的输出重复此过程直至任务完成。由ReAct思想抽象出来的代理工程其基本示例如下所示prompt You run in a loop of Thought, Action, Observation, Answer. At the end of the loop you output an Answer Use Thought to describe your thoughts about the question you have been asked. Use Action to run one of the actions available to you. Observation will be the result of running those actions. Answer will be the result of analysing the Observation Your available actions are: calculate: e.g. calculate: 4 * 7 / 3 Runs a calculation and returns the number - uses Python so be sure to use floating point syntax if necessary wikipedia: e.g. wikipedia: Django Returns a summary from searching Wikipedia Always look things up on Wikipedia if you have the opportunity to do so. Example session: Question: What is the capital of France? Thought: I should look up France on Wikipedia Action: wikipedia: France You should then call the appropriate action and determine the answer from the result You then output: Answer: The capital of France is Paris 如上示例所示在ReAct框架下的代理工程描述中明确的是代理的任务和执行过程。面对不同的场景其实我们只需要改变的是1. 代理的身份设定 2. 代理完成任务所需要的工具。代理的身份通常通过system角色来定义而所需的工具及其应用则是上一节课中我们重点讨论的Function Calling中关于外部工具的定义和使用方法。。只不过在代理框架下这些工具的应用方法需要进行适当的调整以适应不同的需求。接下来我们就进入到代码实战环节实际的操作一下如何用Python复现ReAct框架实现自主代理的逻辑。