1. Agent 基本介绍

1.1 什么是 Agent ?

Agent 是一种能够自主感知环境并根据感知结果采取行动的实体,它可以看成以感知序列为输入,以动作作为输出的一种函数。它可以以软件形式(如聊天机器人、推荐系统)存在,也可以是物理形态的机器(如自动驾驶汽车、机器人)。

不同于传统软件或机械被动模式,我们可以为 Agent 设定能力范围,让它能够自主发现问题、设定目标、构思策略、挑选方案、执行任务并进行检查更新。从被动到主动,Agent 的出现无疑带来了革新。因此,Agent 也被称作“具备自主智能的实体”,也就是现在常说的智能体。

在这里插入图片描述

Agent 的基本特性:

  • 自主性:能够在没有外部干预的情况下做出决策
  • 交互性:能够与环境交换信息
  • 适应性:根据环境变化调整自身行为
  • 目的性:所有行为都以实现特定目标为导向

1.2 Agent 的应用场景

Agent 技术的应用领域十分广泛,涵盖了从交通、医疗到教育、家居和娱乐等生活的方方面面,以下是 2 个生活中的实际例子:

(1)自动驾驶系统

  • 应用:自动驾驶汽车、出租车等
  • 目标:安全、快捷、守法、舒适和高效
  • 传感器:摄像头、雷达、定位系统等
  • 执行器:方向盘、油门、刹车、信号灯

(2)医疗诊断系统

  • 应用:医院诊断、病情监控
  • 目标:精准诊断、降低费用
  • 传感器:症状输入、患者自述
  • 执行器:检测、诊断、处方

2. Lagent 介绍

2.1 什么是 Lagent ?

Lagent 是一个轻量级开源智能体框架,旨在让用户可以高效地构建基于大语言模型的智能体。同时它也提供了一些典型工具以增强大语言模型的能力,比如 Arxiv 文献搜索工具Bing 地图工具Google 搜索谷歌学术交互式 IPython 解释器 等。

Lagent 目前已经支持了包括 AutoGPT、ReAct 等在内的多个经典智能体范式,其基本结构如下图所示:

在这里插入图片描述

2.2 常见工具调用能力范式

2.2.1 通用智能体范式

这种范式强调模型无需依赖特定的特殊标记(special token)来定义工具调用的参数边界。模型依靠其强大的指令跟随与推理能力,在指定的 system prompt 框架下,根据任务需求自动生成响应。这种方式让模型在推理过程中能更灵活地适应多种任务,不需要对 Tokenizer 进行特殊设计。

优势:

  • 灵活适应不同任务,无需设计和维护复杂的标记系统
  • 适合快速迭代,降低微调和部署的复杂性
  • 更易与多模态输入(如文本和图像)结合,扩展模型的通用性

劣势:

  • 由于没有明确标记,调用工具时的错误难以捕捉和纠正
  • 在复杂任务中,模型生成可能不够精准,导致工具调用的准确性下降

ReAct 和 ReWoo 就是这类范式的典型代表:

ReAct 将模型推理分为 Reason 和 Action 两个步骤,并让它们交替执行,直到得到最终结果:

  • Reason:生成分析步骤,解释当前任务的上下文或状态,帮助模型理解下一步行动的逻辑依据
  • Action:基于 Reason 的结果,生成具体的工具调用请求(如查询搜索引擎、调用 API、数据库检索等),将模型的推理转化为行动

ReWoo(Reason without Observation),是在 ReAct 范式基础上进行改进的 Agent 架构。相比于 ReAct 中的交替推理和行动,ReWoo 直接生成一次性使用的完整工具链,减少了不必要的 Token 消耗和执行时间。同时,由于工具调用的规划与执行解耦,这一范式在模型微调时不需要实际调用工具即可完成。ReWoo 将模型推理分成 Planner、Worker 和 Solver 三个阶段:

  • Planner 阶段:此阶段模型会将用户输入的问题或任务分解为多个逻辑上相关的计划。每个计划包含推理部分(Reason)以及工具调用和参数(Execution)。然后模型会按顺序列出一个需要执行的任务链 Task List 用于后续步骤
  • Worker 阶段:每个 Worker 根据 Task List 中的子任务,调用指定工具并返回结果。所有Worker之间通过共享状态保持任务执行的连续性
  • Solver 阶段:Worker 完成任务后,将所有结果同步到 Solver。Solver 会对这些结果进行整合,并生成最终的答案或解决方案返回给用户
2.2.2 模型特化智能体范式

在这种范式下,模型的工具调用必须通过特定的 special token 明确标记。如 InternLM2 使用 <|action_start|><|action_end|> 来定义调用边界。这些标记通常与模型的 Tokenizer 深度集成,确保在执行特定任务时,能够准确捕捉调用信息并执行。

优势:

  • 特定标记明确工具调用的起止点,提高了调用的准确性
  • 有助于模型在部署过程中避免误调用,增强系统的可控性
  • 提高对复杂调用链的支持,适合复杂任务的场景

劣势:

  • 需要对Tokenizer和模型架构进行定制,增加开发和维护成本
  • 调用流程固定,降低了模型的灵活性,难以适应快速变化的任务

3. 制作自己的 Lagent

3.1 环境配置

创建一个 30%A100 + Cuda 12.2 镜像的开发机,然后安装一下依赖:

# 创建环境
conda create -n lagent python=3.10 -y
# 激活环境
conda activate lagent
# 安装 torch
conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=12.1 -c pytorch -c nvidia -y
# 安装其他依赖包
pip install termcolor==2.4.0
pip install streamlit==1.39.0
pip install class_registry==2.1.2
pip install datasets==3.1.0

然后通过源码安装的方式安装 lagent:

# 创建目录以存放代码
mkdir -p /root/agent_camp4
cd /root/agent_camp4
git clone https://github.com/InternLM/lagent.git
cd lagent && git checkout e304e5d && pip install -e . && cd ..
pip install griffe==0.48.0

3.2 Arixv 工具的使用

正式开始之前需要去 书生·浦语 官网申请一个自己的 API Key,然后运行下面命令,在 /root/agent_camp4/lagent/examples 文件夹下创建一个 agent_api_web_demo.py 文件用于实现我们的 Web Demo:

conda activate lagent
cd /root/agent_camp4/lagent/examples
touch agent_api_web_demo.py

该说不说,一开始觉得这个 touch 命令很别扭,现在开始觉得真香了

创建完毕后在该文件中贴入 任务手册 中的代码,这里代码太长了就不放了,大家自行点击链接跳转吧。然后我们在终端运行下面这条命令,将自己的浦语 API Key 设置为环境变量方便在程序中隐式调用:

export token='your_token_here'

上面这些工作准备完后运行这行命令就能启动我们的 Web 服务了:

streamlit run agent_api_web_demo.py

在这里插入图片描述

这里任务手册里面说在等 server 启动成功后,还需要在本地的 PowerShell 中输入如下指令来进行端口映射:

ssh -CNg -L 8501:127.0.0.1:8501 root@ssh.intern-ai.org.cn -p <你的 SSH 端口号>

但是奇怪的是我没运行这条命令也能正常使用 Web 服务,感觉可能是 VSCode 自动帮我做好了。

正常来说应该可以看到如下页面:

在这里插入图片描述

页面的侧边栏有三个内容,分别是模型名称、API Base 地址和插件选择,这里如果采用浦语的 API,模型名称可以选择 internlm2.5-latest,默认指向最新发布的 InternLM2.5 系列模型,当前指向internlm2.5-20b-0719,窗口长度是32K,最大输出4096Tokens。如果采用硅基流动 API,模型名称需要更改为:internlm/internlm2_5-7b-chat 或者 internlm/internlm2_5-20b-chat。

现在我尝试让它帮忙搜索一下文献,在没有选择插件的情况下模型会表示自己没有这个能力:

在这里插入图片描述
但是选上插件后再问一样的问题模型就能给出答案了:

在这里插入图片描述

3.3 制作自己的天气查询 Agent

上面体验的 ArixvSearch 插件是 Lagent 框架自带的,但是现实中的很多场景下仅靠框架原生的插件是无法满足我们要求的,这就需要我们根据自己的需求设计专属于自己的 Agent 插件。这里我们尝试通过调用和风天气的 API 来设计一个实时天气查询的插件。

首先我们需要去 和风天气 API 文档 ,依次点击右上角控制台→ 项目管理 → 创建项目,项目名称随便填,订阅方式选择免费订阅,并在 “订阅方案” 中选择 “API KEY”。创建完成后点击创建凭据,找到你的 API Key 并复制保存,这里的 API KEY 不像浦语一样只展示一次,所以忘了保存也没事,你还可以在自己项目管理中查看自己的 API KEY:

在这里插入图片描述

不过有一说一,一开始创建项目推荐选 JWT 验证方式,说 API KEY 不安全,我当时还想着能有多不安全,其他大模型 API 不用的好好的,结果拿到 API KEY 之后发现这长度也太短了,难怪说不安全…

获取完 API KEY 之后,我们需要在 laegnt/actions 文件夹下创建一个天气查询的工具程序:

conda activate lagent
cd /root/agent_camp4/lagent/lagent/actions
touch weather_query.py

程序创建完成后在该文件中贴入 任务手册 中的代码。然后在终端设置我们的 API KEY 为环境变量:

export weather_token='your_token_here'

完成上述操作后,在 /root/agent_camp4/lagent/lagent/actions/__init__.py 中加入下面的代码,用以初始化 WeatherQuery 方法:

from .weather_query import WeatherQuery
__all__ = [
    'BaseAction', 'ActionExecutor', 'AsyncActionExecutor', 'InvalidAction',
    'FinishAction', 'NoAction', 'BINGMap', 'AsyncBINGMap', 'ArxivSearch',
    'AsyncArxivSearch', 'GoogleSearch', 'AsyncGoogleSearch', 'GoogleScholar',
    'AsyncGoogleScholar', 'IPythonInterpreter', 'AsyncIPythonInterpreter',
    'IPythonInteractive', 'AsyncIPythonInteractive',
    'IPythonInteractiveManager', 'PythonInterpreter', 'AsyncPythonInterpreter',
    'PPT', 'AsyncPPT', 'WebBrowser', 'AsyncWebBrowser', 'BaseParser',
    'JsonParser', 'TupleParser', 'tool_api', 'WeatherQuery' # 这里
]

接下来修改 Web Demo 脚本来集成自定义的 WeatherQuery 插件。打开 agent_api_web_demo.py, 修改内容如下:

在这里插入图片描述
这里修改的目的是将该我们创建的天气查询工具注册进大模型的插件列表中。再次运行 streamlit run agent_api_web_demo.py,启动 Web 程序,正常可以看到如下界面:

在这里插入图片描述
跟之前界面的区别就是,这里的插件选择处多了一个 WeatherQuery 插件用于实时查询天气。

在不选插件的情况下尝试问一下模型现在北京市海淀区的天气怎么样:

在这里插入图片描述
我原本以为模型会说不知道,没想到它直接开始瞎扯了,现在是11月底,居然告诉我现在海淀最高气温 30°。

在这里插入图片描述
选上插件再试一下:

在这里插入图片描述
在这里插入图片描述
这次结果比较准了,跟气象局查到的基本一致。

以上实验都是基于单个插件进行的,那如果同时选上两个插件,模型还能正常回答我们的问题吗?下面我们来试一下:

在这里插入图片描述
在这里插入图片描述

可以看到,模型对不同的任务/查询自动选择了不同的插件帮助其完成回复,这就说明,模型具备根据任务情况调用不同工具的能力。

4. Multi-Agents 博客写作系统的搭建

最后我们使用 Lagent 来构建一个多智能体系统 (Multi-Agent System),展示如何协调不同的智能代理完成内容生成和优化的任务。我们的多智能体系统由两个主要代理组成:

(1)内容生成代理:负责根据用户的主题提示生成一篇结构化、专业的文章或报告。

(2)批评优化代理:负责审阅生成的内容,指出不足,推荐合适的文献,使文章更加完善。

Multi-Agents博客写作系统的流程图如下:

在这里插入图片描述

首先,我们在 lagent 环境下创建一个 multi_agents_api_web_demo.py 文件:

conda activate lagent
cd /root/agent_camp4/lagent/examples
touch multi_agents_api_web_demo.py

然后再该文件中贴入 任务手册 中的代码,运行 streamlit run multi_agents_api_web_demo.py,启动 Web 服务。初始页面如下:

在这里插入图片描述

我们使用默认的主题:Self-Supervised Learning,观察模型的输出:

第一步:写作者根据用户输入生成初稿:

在这里插入图片描述
在这里插入图片描述

第二步:批评者对初稿进行评估,提供改进建议和文献推荐(通过关键词触发 Arxiv 文献搜索):

在这里插入图片描述
第三步:写作者根据批评意见对内容进行改进:

在这里插入图片描述
至此,书生大模型实训营第4期进阶岛第二关任务完成~

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐