2026年7月2日 周四晚上19:30,报名腾讯会议了解“如何构建自进化的动态知识库(Brain)”(限30人)
免费POC, 零成本试错
FDE知识库

FDE知识库

学习大模型的前沿技术与行业落地应用


收藏

从workflow到ReAct提升AI Agent智能化水平

发布日期:2025-05-13 21:54:00 浏览次数: 2301
作者:木昆子记录AI

微信搜一搜,关注“木昆子记录AI”

推荐语

探索AI Agent智能体的进化之路,从workflow模式到ReAct框架的突破。

核心内容:
1. AI Agent与传统workflow模式Agent的区别
2. 运维案例中LLM在workflow模式中的应用
3. ReAct框架对Agent智能化水平的提升作用

杨芳贤
53AI创始人/腾讯云(TVP)最具价值专家



本号之前文章中介绍了用dify工具实现的针对故障拍照进行智能检索的运维神器,这个案例中Agent是使用典型的workflow方式配置出来的,“先进行OCR,然后检索知识,最后生成答案”这个执行步骤是我们预先定义好的,包括网上很多Agent文章中描述大多也和我们这个案例类似,但这似乎和AI Agent的标准定义还是有差距,我们先随便找个大模型,问问AI Agent的标准定义大概如下:

AI Agent(智能体)是一种‌具备自主决策与执行能力‌的智能实体,能够通过感知环境、动态调整行为以实现预设目标。其本质是通过融合大语言模型(LLM)的推理能力和工具调用机制,将传统AI的被动响应升级为主动任务执行能力。

Agent这个标准定义,是包含了感知环境-思考决策-行动执行的闭环逻辑,也就是要符合ReAct框架(Reasoning+Action),以下说明workflow模式与ReAct框架Agent实现逻辑的不同。


使用workflow模式的Agent


我们先分析之前运维案例中的workflow,它们执行步骤和逻辑是在workflow中预设好的:

这不由得让人反思我们这类智能体的“智能”体现在哪里呢?答案是这些Agent中不仅仅有workflow,更关键是其中用到的LLM。

比如在这个运维案例中,是利用LLM的文字生成和整合能力,输出故障的最终解决方案,虽然前序知识检索环节有可能检索到故障对应的答案,但这些答案往往比较简略,还需要LLM根据Prompt指令“按【原因分析】、【影响范围】、【处置建议】结构化输出”,并且指定如果当前序环节没有检索到答案时,还需要LLM能自行分析并生成解决办法。

我们再看看笔者之前另外一个中考小助手案例中,利用的是LLM进行语义理解和意图识别,要区分用户输入的问题是在问某个学校的分数线,还是在问某个分数能上什么学校,还是其他问题等,然后在workflow中才能根据不同的意图,走不同分支的处理逻辑。

所以在我们大多数场景中,用workflow这种模式,再结合LLM的语义理解、意图识别、文字生成和整合能力就能够实现一个较好的Agent。

使用Function Call实现ReAct框架


以上workflow模式的Agent核心是执行逻辑是可预设的,但有些业务场景中业务执行逻辑是不确定的,是要依据前序环节的执行结果,动态决策下一步该怎么做,也就是对应ReAct框架的思考-行动-观察的闭环,如下图所示(源图来自https://react-lm.github.io/):

这个图很好地说明了右边ReAct框架相比原有模式的区别,每次要观察observe上一次行动action的结果,也就是将上次调用结果作为输入,再输入给LLM,一起去思考下一步该如何action。

ReAct框架‌(Reasoning + Acting)是一种结合推理与行动的多步骤高阶任务执行范式,而上图中LLM与外部工具/环境ENV交互action的‌基础能力,就是依靠Function Call作为底层支撑技术

Function Call‌是大型语言模型(LLM)通过‌语义理解与结构化输出调用外部工具的核心能力,其实现依赖以下关键环节:

  1. 如图所示整个过程包括:定义函数,生成函数描述Schema,将用户输入和函数描述一起输入调用LLM,解析LLM的输出,如果有输出函数名和参数则执行该函数,再将函数结果反馈给LLM,实现下一轮调用,直至输出最终结果。
    • 这个过程中,大家经常说的通过function call让LLM具备了调用外部工具的能力实际只是一种形象化的表达,真正函数调用或者说工具执行,还是在agent的代码里去实现的,这里LLM‌的作用主要是两点(也就是图中红色块内容):
    • 动态决策‌:根据上下文判断是否需要调用函数(例如回答天气查询时要反馈get_weather()函数)‌
    • 输出接口:通过JSON等格式输出函数名和对应参数,确保外部工具的可执行性‌
    • 为了更直观地理解这个过程,我让LLM生成一段Python样例代码,如下:
    • import openai
      import json
      from typing import get_type_hints
      # 示例函数定义
      def get_current_weather(location: str, unit: str = "celsius") -> str:
          """获取指定地区的当前天气情况"""
          # 这里模拟天气数据
          weather_data = {
              "beijing": {"celsius"22"fahrenheit"72},
              "new york": {"celsius"18"fahrenheit"64}
          }
          returnf"{location}天气:{weather_data.get(location.lower(), {}).get(unit, '未知')}°{unit}"
      def calculate(expression: str) -> float:
          """执行数学计算(支持加减乘除)"""
          try:
              returneval(expression.replace("^""**"))
          except:
              return"计算错误"
      # 生成函数描述JSON Schema
      def generate_function_schema(func):
          hints = get_type_hints(func)
          doc = func.__doc__.split("\n"if func.__doc__ else""
          
          return {
              "name": func.__name__,
              "description": doc,
              "parameters": {
                  "type""object",
                  "properties": {
                      param: {
                          "type""string"if hints.get(param) == strelse"number",
                          "description"f"{param}参数"
                      } for param inlist(hints.keys())[:-1]  # 排除返回类型
                  },
                  "required"list(get_type_hints(func).keys())[:-1]
              }
          }
      # 可用函数列表
      available_functions = {
          "get_current_weather": get_current_weather,
          "calculate": calculate
      }
      # 生成函数描述列表
      functions = [generate_function_schema(func) for func in available_functions.values()]
      # 与LLM交互的核心函数
      def run_conversation(user_query: str):
          # 第一次LLM调用(选择函数)
          response = openai.ChatCompletion.create(
              model="gpt-3.5-turbo-0613",  # 要选择支持函数调用的模型
              messages=[{"role""user""content": user_query}],
              functions=functions,   # 输入函数定义
              function_call="auto"
          )
          
          response_message = response["choices"]["message"]
          
          # 如果LLM选择调用函数,就会在输出response_message中,把要调用的函数和对应参数都输出
          if response_message.get("function_call"):
              function_name = response_message["function_call"]["name"]
              function_args = json.loads(response_message["function_call"]["arguments"])
              
              print(f"LLM选择调用函数: {function_name}")
              print(f"参数: {function_args}")
              
              # 执行对应函数
              if function_name in available_functions:
                  function_to_call = available_functions[function_name]
                  
                  # 参数类型转换
                  try:
                      args = {k: str(v) for k,v in function_args.items()}  # 统一转为字符串
                      if function_name == "calculate":
                          args["expression"] = args["expression"].replace(" """)
                      # 敲黑板 注意:实际执行函数还是本地代码,并不是LLM直接去调用哈 
                      result = function_to_call(**args)  
                      returnf"执行结果: {result}"
                  except Exception as e:
                      returnf"执行错误: {str(e)}"
              else:
                  return"未知函数调用"
          else:
              return"未触发函数调用"
      # 测试用例
      if __name__ == "__main__":
          test_cases = [
              "北京现在的气温是多少?",
              "帮我计算(3 + 5) * 2^3的值",
              "今天纽约的天气怎么样?用华氏度"
          ]
          
          for query in test_cases:
              print(f"\n用户问:{query}")
              print("->", run_conversation(query))
      1. 很多同学用Coze和元器来配置Agent时,可以直接写提示词来说明Agent的处理流程,可以指定插件挂载工具,有同学就问这种算什么模式?我们修改下之前那个中考小助手案例,这次我们不去配置工作流,而是按如下配置:

        笔者个人理解如果Prompt中把执行步骤描述得很清楚,就应该算是workflow模式,无非它是用文字来表达执行逻辑,同时利用LLM的function call能力,根据预定的执行逻辑调用预设好的插件。

        但如果Prompt只是描述目标,没有对执行步骤做详细描述,那应该可以说是ReAct模式,它通过右边的插件设置,将所有可以调用的工具/函数都提前注册进来,运行时和Prompt一起输入给LLM,由LLM自行规划处理路径,中间何时要调用外部插件,都是LLM自行决策的。

        无论怎么理解,只能说Coze的这个智能体已经很智能了。


    从Function Call到MCP


    搞清楚ReAct框架和Function Call的关系以后,我们再看看MCP(Model Context Protocol)大模型上下文协议,去年Anthropic推出的MCP概念,今年以来热度持续上升,尤其是OpenAI也宣布支持MCP以后,似乎一页之间万能手、通用agent等概念都有了落脚点。官网对MCP架构的介绍可以参考这个链接,主要架构图如下(https://modelcontextprotocol.io/introduction):

    其实笔者认为mcpfunction call本质上没有太大区别,只是把函数调用的规范做了统一,按统一规范由mcp client发给远程某个MCP Server再执行具体tool。为了更直观地对比在ReAct框架中MCP和function call区别,我们画个图来表示,如下:

    要实现mcp这种方式的工具调用,首先也是需要将函数/工具的描述信息schema先要输入给LLM,只不过functioncall是在本地生成函数描述的,而mcp则是远程从mcp server中自动拉取的工具描述,远程mcp server端有哪些工具的描述,是基于server端工具在开发时用注解的方式描述函数名、用途和参数信息来自动生成的。

    和上文介绍的function call机制一样,LLM本身也不会真的去调用mcp server里的工具,LLM是个语言模型,它的输入输出永远是一段文本,它只是识别需要调用哪个工具,并将要调用的工具名、参数以json格式结构化文本输出,然后是由LLM所在的Host去调用。

    这个Host有一个误区,网上看到的各种mcp文章,都是用Claude desktop、cursor或者dify、cherry studio这种工具来举例,很容易让人和mcp client这个概念混淆起来,实际这个host更常见的是Agent所在的代码,是通过在这个代码中引入mcp client包去发给远程mcp server去执行的。

    图片


    以上就是AI Agent从workflow固化流程到基于Function Call的ReAct框架,再从Function Call到统一标准的MCP的一个发展过程,但AI领域生态发展是飞速向前的。

    4.10日Google又发布了开源协议A2A(Agent-to-Agent),使得基于不同底层框架和供应商平台创建的 AI Agent 之间能够实现相互通信,实现多智能体之间的协作,也是Agent这个领域的最近最为火热的发展方向,但本质上如果你将MCP Server后面对接另外一个Agent,实际也能实现多智能体的协作,笔者推测A2A可能也就是对Host Agent中LLM通过mcp client调用mcp server端的另一个Agent的过程做了一个简化封装,当然有待后续实践后再进行详细分享。


    注:笔者在以往案例基础上结合实际项目经验,从应用AI和落地AI的视角出发,按照LM、RAG、Agent、Training这样的顺序梳理一套基础技术体系,对应投入和落地难度从小到大,本文是其中对Agent板块的部分总结,欢迎读者持续关注完整合集。


    —End—

    53AI,企业落地大模型首选服务商

    产品:场景落地咨询+大模型应用平台+行业解决方案

    承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

    联系我们

    售前咨询
    186 6662 7370
    预约演示
    185 8882 0121

    微信扫码

    添加专属顾问

    回到顶部

    加载中...

    扫码咨询

    扫码登录
    登录即表示您同意《53AI网站服务协议》
    服务协议

    欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。

    在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。

    一、 定义

    本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。

    会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。

    知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。

    二、 账号注册与登录

    登录方式:本网站支持以下登录方式,您可根据实际情况选择:

    微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。

    手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。

    账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。

    实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。

    未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。

    三、 服务内容与规范

    知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。

    服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。

    禁止行为:您在使用服务时不得实施以下行为:

    利用技术手段批量爬取、下载、转存知识库内容;

    将知识库内容用于商业目的或未经授权地向第三方传播;

    干扰本网站正常运行或侵犯其他用户合法权益;

    发布违法违规信息或从事违反公序良俗的活动。

    四、 知识产权声明

    权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。

    有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。

    侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。

    五、 个人信息保护

    我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。

    您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。

    您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。

    六、 免责声明

    内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。

    不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。

    第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。

    七、 违约责任

    如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。

    如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。

    八、 法律适用与争议解决

    本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。

    因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。

    九、 其他

    本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。

    本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。

    我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。


    已查阅