前言

从早先的AutoGen到最近“火”出圈的Manus,使得AI智能体慢慢被重视起来,一众大佬毕竟都看好智能体。这篇文章会先介绍AI智能体,然后基于ReAct方式进行测试AI Agent的工作原理,最后推荐几个常用的AI Agent开发工具或平台。

概念

Agent

翻译过来就是代理的意思,像是一个实体或者虚拟实体。比如作网络转发的Nginx代理,实现了网络请求与应用服务的代理;替公司办理业务的代理人,实现了办理业务和公司的代理,等等。
它可以感知环境、做出决策并进行行动。

AI Agent

AI-Agent.png

以大模型LLM为大脑驱动,具有自主理解感知规划记忆使用工具的能力,能自动化完成复杂任务的系统。
是应用于AI领域的Agent,被称为AI Agent或智能体。它是基于LLM大模型驱动的,除了能够感知环境、做出决策并行动外,还能给予大模型进行任务拆解,并进行反馈反思,实现与外界的交互。
在技术实现上,也可以理解成是一种设计模式,借助LLM实现与环境的互动、拆解任务、决策与执行。
应用场景包括与智能驾驶、智能家居、智能推荐、自动化办公(如借助网页爬取工具进行核心内容提取的Agent)、生活中点外卖等等。

AI Agent基本框架

AI Agent 的基本架构图(聚集内部处理和行为规划):
AI-Agent.png

其中包括了几个核心模块:

记忆

记忆包括了短期记忆和长期记忆,负责存储知识,由过去的交互或学习得到的内容。
短期记忆主要当前任务或会话的临时内容,以便推理的严谨性,具有实时性、动态性特点。
长期记忆主要靠外部工具,如知识库向量库进行存储,提供工具调用和检索能力,内容可以永久存储。

规划

大模型就像人类的大脑,通过提示词帮助我们理解和拆解复杂任务,规划成一个个可通过与外界交互的小任务。
事前规划:拆解复杂的目标和任务
事后反思:通过检测之前的任务和执行反馈进行反思与调整计划,不断完善。

工具

工具使用表示智能体能够借助外部能力来辅助完成任务,包括脚本调用、api请求、知识库检索等等,以此来获取到模型中缺失的部分。例如:查询日历、计算器、查询天气、网页爬取、绘画、文档处理、时间获取等等。

行动

智能体与外界交互的入口,根据规划的任务和步骤、工具,执行具体的操作。

ReAct实战

ReAct(Reason and Act):思维链 + 外部工具调用。实现AI Agent的一种方式,其它还有基于规则、目标等方式实现AI Agent。
ReAct思想会根据思维链推理把大模型拆分小问题,一步步解决问题,然后调用外部工具获取结果,并基于结果思考结果的正确性来调整任务,最终完成任务。

下面通过Python代码演示:
关于ReACt提示词可以访问 Langchain Hub>,搜索 react会有很多提示词供选择。

实战

样例:股票价格对比Agent。

1、定义提示词

# 定义提示词模板  
  
REACT_PROMPT = """  
{instructions}  
  
TOOLS:  
------  
  
You have access to the following tools:  
  
{tools}  
  
To use a tool, please use the following format:  
  

Thought: Do I need to use a tool? Yes
Action: the action to take, should be one of [{tool_names}]
Action Input: the input to the action

  
Then wait for Human will response to you the result of action by use Observation.  
... (this Thought/Action/Action Input/Observation can repeat N times)  
When you have a response to say to the Human, or if you do not need to use a tool, you MUST use the format:  
  

Thought: Do I need to use a tool? No
Final Answer: [your response here]

  
Begin!  
  
New input: {input}  
  
"""

{instructions}:表示大模型的人设
{tools}:定义的工具,填入工具的描述
{tool_names}:定义的工具的名字
{input}:用户输入的问题

2、定义工具
包括工具描述和实际调用函数两个部分

  
# 定义工具的模板  
tools = [  
    {  
        "name": "get_closing_price",  
  "description": "使用该工具获取指定股票的收盘价",  
  "parameters": {  
            "type": "object",  
  "properties": {  
                "name": {  
                    "type": "string",  
  "description": "股票名称",  
  }  
            },  
  "required": ["name"]  
        }  
    }  
]  
  
def get_closing_price(name):  
    print(f"正在获取 {name} 的收盘价...")  
    """  
  获取指定股票的收盘价  
 """  if name == "青岛啤酒":  
        return "12.3"  
  elif name == "贵州茅台":  
        return "123.5"  
  else:  
        return "未找到"

3、定义模型
定义模型交互client

  
# 模型  
import os  
from openai import OpenAI  

client = OpenAI(  
    api_key=os.getenv("QWEN_API_KEY"),  
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"  
)

4、定义Agent(核心)

# 代理  
  
import json  
from llm import client  
from prompt import REACT_PROMPT  
from tools import get_closing_price, tools  
import re  
  
# 发送消息  
def send_messages(messages):  
    response = client.chat.completions.create(  
        model="deepseek-v3",  
  messages=messages,  
  )  
    return response  
  
  
if __name__ == "__main__":  
    instructions = "你是一个股票助手,可以回答股票相关的问题"  
  
  query = "青岛啤酒和贵州茅台的收盘价哪个贵?"  
  
  prompt = REACT_PROMPT.format(instructions=instructions, tools=tools, tool_names="get_closing_price", input=query)  
  
    # 记录聊天记录  
  messages = [{"role": "user", "content": prompt}]  
  
    # 多轮对话,问答  
  while True:  
        response = send_messages(messages)  
        response_text = response.choices[0].message.content  
  
        print("大模型的回复:")  
        print(response_text)  
  
        final_answer_match = re.search(r'Final Answer:\s*(.*)', response_text)  
        if final_answer_match:  
            final_answer = final_answer_match.group(1)  
            print("最终答案:", final_answer)  
            break  
  
  messages.append(response.choices[0].message)  
  
        # 行动  
  action_match = re.search(r'Action:\s*(\w+)', response_text)  
        # 行动参数  
  action_input_match = re.search(r'Action Input:\s*({.*?}|".*?")', response_text, re.DOTALL)  
  
        if action_match and action_input_match:  
            tool_name = action_match.group(1)  
            params = json.loads(action_input_match.group(1))  
  
            if tool_name == "get_closing_price":  
                observation = get_closing_price(params['name'])  
                print("人类的回复:Observation:", observation)  
                messages.append({"role": "user", "content": f"Observation: {observation}"})

首先定义变量,并注入提示词模板,然后发给大模型。
通过while(true)实现和大模型进行多轮对话,直到回复“Final Answer”获取最终答案。

5、输出结果

大模型的回复:

Thought: Do I need to use a tool? Yes
Action: get_closing_price
Action Input: {"name": "青岛啤酒"}

正在获取 青岛啤酒 的收盘价…
人类的回复:Observation: 12.3
大模型的回复:

Thought: Do I need to use a tool? Yes
Action: get_closing_price
Action Input: {"name": "贵州茅台"}

正在获取 贵州茅台 的收盘价…
人类的回复:Observation: 123.5
大模型的回复:

Thought: Do I need to use a tool? No
Final Answer: 贵州茅台的收盘价(123.5)比青岛啤酒的收盘价(12.3)更贵。

最终答案: 贵州茅台的收盘价(123.5)比青岛啤酒的收盘价(12.3)更贵。

扩展

AI Agent 和 Function Calling的区别

Function Calling(函数调用):指大模型在执行任务时,能根据上下文或用户需求,主动调用外部函数或工具完成特定操作。注意并不是所有大模型都具有该能力。

不管AI Agent还是Function Calling,亦或是上篇介绍的RAG,都是因为大模型的局限性,无法执行查询实时数据等原因,而出现技术。

区别在于AI Agent可以控制让大模型自主思考,并决定何时及如何调用工具。例如撰写市场分析报告任务,自动抓取数据、分析内容、生成报告。是一个完整的智能系统。
Function Calling是由模型自行判断,调用特定功能,由模型根据用户输入或上下文决定是否调用函数。例如在回答数学问题时,可能调用内部计算函数得出答案。只是模型执行过程中的一个步骤。

常用的AI Agent开发平台

Coze:抖音开发的AI智能体平台,支持低代码构建前端应用。
Dify:开源的AI开发平台,目前支持Agent的Function Call模式。
AutoGen:一个开发Agent的开源框架,支持可视化页面。
Langchain:开源框架,可以简化开发过程,轻松构建AI应用和Agent。
文心智能体:百度推出的智能体平台。

总结

RAG扩展了大模型的能力,同样AI Agent的也是为了扩展大模型的能力,实现自主完成复杂任务,将来一定会成为我们工作生活的得力助手。