首页 / 文章

智能体解析:工具、系统提示与思维-行动循环

AI智能体运作原理初学者指南:聊天模型为何会遗忘、如何向大语言模型描述工具、系统提示词、ReAct机制、代码智能体与观察功能。

发布者:REACTAPP.TOP阅读约 8 分钟1803 词

来源: AI Agents, Explained: From Thoughts to Actions

现代人工智能智能体基于几项核心理念:工具、系统提示词,以及思考、行动和观察的循环过程。一旦这些要素相互配合,大多数智能体框架都会呈现出同一主题的不同变体。以下内容将从基础层面逐步阐述,首先介绍智能体究竟是什么。

智能体是什么

智能体是一种人工智能模型与其所处环境协同工作以完成特定任务的系统。它融合了推理、规划以及行动执行能力,通常借助外部工具来实现。大多数智能体由大型语言模型驱动,不过视觉语言模型也能承担相同功能。

你的聊天应用会忘记一切

有一个事实让很多人感到惊讶:当你与ChatGPT或类似助手聊天时,模型内部并不存在任何对话记录。它不会存储任何内容,也不会追踪任何正在进行的对话状态,更不会保留你发送的消息之间的任何信息。每次你按下发送键,迄今为止的所有交流内容都会被整合成一长段文本,模型则从开头开始读取这段文本。

想象一下这样的对话过程:

conversation = [
    {"role": "user", "content": "I need help with my order"},
    {"role": "assistant", "content": "Could you provide your order number?"},
    {"role": "user", "content": "It's ORDER-123"},
]

你所看到的以及开发人员在代码中处理的,是一份包含各轮对话及对应角色的有序列表。不过模型本身从未接收过这样的列表——在任何信息传达到它之前,这些对话内容都会被扁平化并合并成一段连续的文本,而模型一如既往的任务,就是根据之前的所有信息来预测下一个词元。

并不存在所谓的“记住此内容”的特殊步骤。当模型似乎记住了你的订单号时,那并非记忆功能在起作用,只是该数字仍存在于模型当时正在读取的文本中而已。

工具

工具是一种函数,理想情况下应具有明确的功能定位,并被传递给大语言模型。典型示例包括:

  • 搜索网络
  • 生成图像
  • 检索文档
  • 调用 API

一个优秀的工具能够扩展模型的功能,它需要包含以下部分:

  • 对该函数功能的文字描述
  • 一个可调用对象,即执行相应操作的代码
  • 带类型的参数
  • 可选的,带类型的输出结果
  • 工具实际上是如何被调用的

    关键在于,大语言模型无法直接操作任何外部工具。输入的是文本,输出也是文本,仅此而已。所谓模型“能够使用工具”,实际上是指它已经学会了用文字形式写出工具调用指令。如果询问巴黎的天气,模型不会去获取预报数据,而是会输出一条结构化的消息,指示应调用天气相关工具。

    代理层位于用户与模型之间。它负责捕获消息、运行工具、收集结果并将其添加到对话中,之后再将所有内容反馈给模型。借助这些额外的上下文,模型便能生成正常的回复。用户会感觉好像模型直接联系了天气服务,但实际上所有的协调工作都是由代理在幕后完成的。

    一个小示例

    为便于说明,以一个仅能执行单一功能——即计算两个整数乘积的计算器工具为例:

    def multiply(a:int, b:int):
      "Multiply two integers"
      return a * b
    

    将函数转换为工具

    Hugging Face的transformers库提供了一个@tool装饰器,用于封装普通的Python函数,以便智能体能够理解它。首先需要导入该库:

    from transformers import tool
    

    然后是装饰后的函数:

    @tool
    def multiply(a: int, b: int):
        """Multiply two integers."""
        return a * b
    

    在幕后,装饰器会收集元数据:

    • 函数的名称
    • 其描述
    • 参数名称
    • 参数类型
    • 返回类型

    这些元数据随后会被放入提示词中,用以告知模型如何正确使用该工具。

    查看工具

    经过装饰后,工具可以用文本描述自身:

    print(multiply.to_string())
    

    打印输出的内容包含类似以下的详细信息:

    Tool Name: multiply
    
    Description:
    Multiply two integers.Arguments:
    - a (int)
    - b (int)
    

    这种结构化的描述正是智能体展示给模型的内容。大语言模型会像处理其他文本一样阅读它,并判断该工具是否能帮助满足用户的请求。

    智能体工作流程

    智能体在重复的循环中运作:先思考(Thought),再执行动作(Action),最后进行观察(Observation)。

    1. 思考。智能体中的大语言模型部分决定下一步该做什么。
    2. 执行动作。智能体使用选定的参数调用工具。
    3. 观察。模型分析工具返回的结果。

    智能体会持续在思考、执行、观察的循环中运行,直到实现其目标。

    系统提示词

    系统提示词是一组在任何用户消息发送之前传递给模型的指令,它规定了整个对话中的行为规范、角色定位、约束条件以及目标。

    当用户输入内容时,模型看到的不仅仅是那段文字。它通常会接收到类似这样的信息:

    <System Prompt>
    
    You are a helpful programming assistant.
    Always explain concepts before showing code.
    If the user asks for unsafe code, refuse politely.
    
    <User>
    
    Explain binary search.
    

    系统提示的优先级高于用户的提示。假如系统提示要求始终用英语回答,而用户却要求用法语,则模型通常会遵循系统提示,除非应用程序特意允许用户请求覆盖该设置。

    智能体的系统提示还会进一步说明所使用的工具以及整个处理流程:

    You are an AI assistant that can answer user questions.
    
    You have access to the following tools:
    
    Tool: search_web
    Description:
    Searches the web for up-to-date information.
    
    Arguments:
    - query (string)
    
    Tool: calculator
    Description:
    Evaluates mathematical expressions.
    
    Arguments:
    - expression (string)
    
    If a user's question requires current information, use search_web.
    If a calculation is required, use calculator.
    Otherwise, answer directly.
    

    该系统消息中定义了三件事:

    • 智能体应如何行事
    • 它可以使用哪些工具,具体描述方式如前一节所示
    • 嵌入在模型指令中的“思考-行动-观察”循环

    这三个阶段都值得仔细研究。

    思考过程

    思考过程反映了智能体在完成任务时的内部推理与规划。常见的有两种风格:

    1. 思维链法(Chain-of-Thought,CoT)
    2. ReAct方法(推理加行动)

    思维链法是一种提示技巧,它能引导模型在给出最终答案之前逐步解决问题。这种推理过程仅存在于模型内部,因此适用于不需要外部工具的逻辑和数学问题。

    ReAct也是一种要求逐步思考的方法,但它会在推理步骤之间穿插工具调用等操作。

    这两种方法都能让大型语言模型逐步解决问题。二者的区别在于,CoT仅依赖于模型已有的知识,而ReAct则将推理与操作相结合。这使得模型能够使用外部工具、获取最新信息,并根据结果继续推理,更适用于需要与外部系统交互的动态现实任务。

    操作:从思考到行动

    操作是指智能体为与环境交互而采取的步骤。例如,客服人员可以调出客户数据、推荐相关帮助文章或将案例转交给人工处理。

    文本生成器通过一种名为“停止与解析”的简单模式来触发实际工具。模型本身从不执行任何操作,它只会生成描述应执行操作的结构化请求,再由代理代表模型去执行这些操作。

    在底层机制上,这与之前的流程相同。模型对任务进行推理,输出诸如调用天气API之类的操作指令,然后停止。代理检测到该操作后,运行相应的工具,并将结果作为观测值返回。模型获得这些信息后,要么继续推理,要么采取其他操作,最终给出回应。

    从历史上看,操作是通过函数调用或指定工具及其参数的 JSON 对象来表达的。这种方法虽然可行,但当工作流需要多次调用工具时就会显得笨拙。代码代理采取了另一种方式:它不使用 JSON 来描述操作,而是直接生成可执行的 Python 代码。这样一来,循环、条件判断、变量以及多次工具调用都可以共享同一段代码,从而在处理复杂任务时更具表达力且效率更高。

    传统的 JSON 格式如下所示:

    {
      "tool": "get_weather",
      "arguments": {"location": "Tokyo"}
    }
    

    代码代理会改写为可运行的代码片段:

    # The agent writes actual Python code as its action
    cities = ["Tokyo", "Paris", "New York", "London", "Sydney"]
    temps = [get_weather(city) for city in cities]
    avg_temp = sum(temps) / len(temps)
    print(f"Average temperature: {avg_temp}")
    

    观察结果:每个动作的反馈

    推理与行动仅是其中一半。在采取行动之后,智能体还需要理解其结果,而这正是观察结果的职责——即在动作执行完成后获得的反馈。它可能是网络搜索结果、API响应、Python程序的输出,甚至是错误信息。无论是什么,都会成为用于决定下一步行动的新信息。

    流程很简单:智能体生成一个动作,框架执行该动作,其输出作为观察结果被添加到对话中。大语言模型读取更新后的上下文并继续处理。当拥有足够信息时,它就会给出最终答案;否则,则会规划另一个动作。

    观察结果不一定是成功的。当调用失败,出现端点的404 Not Found错误或生成代码中的Python TypeError时,这些失败依然具有价值。错误信息会告诉智能体哪里出了问题,使其后续行动能够纠正方向,而非重复同样的错误。

    正是这种持续的循环让智能体具备适应性。它们不仅依赖预训练的知识,还会收集新事实、从结果中学习,并不断优化方法,直至完成任务。

    各要素的整合

    智能体看似是一种全新的范式,但实际上是由几项简单理念组合而成的。语言模型负责对问题进行推理,系统提示词决定其行为方式,工具使其功能超越文本范畴,动作让它与外部世界相连,而观察结果则提供反馈,帮助其实现适应。

    掌握这些基础要素,并意识到每个要素所蕴含的“魔法”其实很少,这是构建属于自己的智能体的第一步。编程助手、研究协作者以及自动化工作流都依赖于相同的“思考-行动-观察”循环。由此,接下来的自然步骤就是利用 Hugging Face 生态系统实现第一个智能体。