四期书生大模型实战营(【进阶岛】- 第2关 | Lagent 自定义你的 Agent 智能体)

1. 任务介绍

Lagent:从零搭建你的 Multi-Agent

记录复现过程并截图

1.1. 基础任务(完成此任务即完成闯关)

  • 使用 Lagent 复现文档中 “制作一个属于自己的Agent” 和 “Multi-Agents博客写作系统的搭建”两部分内容,记录复现过程并截图。

1.2. 闯关材料提交(完成任务并且提交材料视为闯关成功)

2. 基础任务(完成此任务即完成闯关)“制作一个属于自己的Agent” 和 “Multi-Agents博客写作系统的搭建”

  • 使用 Lagent 复现文档中 “制作一个属于自己的Agent” 和 “Multi-Agents博客写作系统的搭建”两部分内容,记录复现过程并截图。

2.1. 动手实践(“制作一个属于自己的Agent”)

2.1.1. 环境配置

  1. 开发机选择 30% A100,镜像选择为 Cuda12.2-conda。
    在这里插入图片描述
  2. 首先来为 Lagent 配置一个可用的环境。
# 创建环境
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

在这里插入图片描述

在这里插入图片描述
3. 等待安装完成~
在这里插入图片描述
接下来,我们通过源码安装的方式安装 lagent。

在这里插入图片描述

2.1.2. Lagent框架中Agent的使用

在这里插入图片描述

硅基API
在这里插入图片描述
在这里插入图片描述

谱语API

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
现在将ArxivSearch插件选择上,再次输入指令“帮我搜索一下最新版本的MindSearch论文”,可以看到,通过调用外部工具,大模型成功理解了我们的任务,得到了我们需要的文献:

在这里插入图片描述

2.1.3. 制作一个属于自己的Agent

在完成了上面的内容后,可能就会同学好奇了,那么我应该如何基于Lagent框架实现一个自己的工具,赋予LLM额外的能力?
本节将会以实时天气查询为例子,通过调用和风天气API,介绍如何自定义一个自己的Agent。

Lagent 框架的工具部分文档可以在此处查看:Lagent 工具文档
使用 Lagent 自定义工具主要分为以下3步:
(1)继承 BaseAction 类

(2)实现简单工具的 run 方法;或者实现工具包内每个子工具的功能

(3)简单工具的 run 方法可选被 tool_api 装饰;工具包内每个子工具的功能都需要被 tool_api 装饰

首先,为了使用和风天气的 API 服务,你需要获取一个 API Key。请按以下步骤操作:

(1)访问 和风天气 API 文档(需要注册账号)。

(2)点击页面右上角的“控制台”。

(3)在控制台中,点击左侧的“项目管理”,然后点击右上角“创建项目”。

(4)输入项目名称(可以使用“Lagent”),选择免费订阅,并在凭据设置中创建新的凭据。

(5)创建后,回到“项目管理”页面,找到你的 API Key 并复制保存。

1. 使用和风天气的 API 服务

(1)访问 和风天气 API 文档(需要注册账号)
在这里插入图片描述
(2)点击页面右上角的“控制台”。
在这里插入图片描述

(3)在控制台中,点击左侧的“项目管理”,然后点击右上角“创建项目”。
在这里插入图片描述
在这里插入图片描述

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

(5)创建后,回到“项目管理”页面,找到你的 API Key 并复制保存。

2. 创建一个天气查询的工具程序

接着,我们需要在laegnt/actions文件夹下面创建一个天气查询的工具程序。

在这里插入图片描述

可以看到左侧的插件栏多了天气查询插件,我们首先输入命令“帮我查询一下南京现在的天气”,可以看到模型无法知道现在的实时天气情况。
在这里插入图片描述

现在,我们将2个插件同时勾选上,用以说明模型具备识别调用不同工具的能力,什么任务对应什么工具来解决。

这次我们查询一下南京(随便什么城市都行的☀️)的天气,输入命令“帮我查询一下南京现在的天气”。 现在,大模型通过天气查询的API准确地完成了这个任务:

在这里插入图片描述

如果我们再次询问,让其搜索文献,可以看到,模型具备了根据任务情况调用不同工具的能力。
在这里插入图片描述

2.2. “Multi-Agents博客写作系统的搭建”

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

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

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

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

在这里插入图片描述

  1. 首先,创建一个新的 Python 文件 multi_agents_api_web_demo.py,并进入 lagent 环境:
    在这里插入图片描述

  2. 运行streamlit run multi_agents_api_web_demo.py,启动Web服务

运行streamlit run multi_agents_api_web_demo.py,启动Web服务
输入话题,比如Semi-Supervised Learning:

可以看到,Multi-Agents博客写作系统正在按照下面的3步骤,生成、批评和完善内容。

Step 1:写作者根据用户输入生成初稿。

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

Step 3:写作者根据批评意见对内容进行改进。

输入一个感兴趣的话题:

在这里插入图片描述

2.3. Agent部署到 Hugging Face

  • 将你的Agent部署到 Hugging Face 或 ModelScope 平台,应用名包含 Lagent 关键词(优秀学员必做)

2.3.1.“创空间”Create new Space进行创建

  • Huggingface

首先访问以下链接,进入Spaces。在右上角点击Create new Space进行创建:
https://huggingface.co/spaces
在这里插入图片描述
或者选择New Space创建一个新的“创空间”
在这里插入图片描述

  • ModelScope
    在这里插入图片描述

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

2.3.2. 创建页面

  • Huggingface

在创建页面中,输入项目名为WeatherSearch_Agent_Lagent,并选择streamlit 应用进行创建
在这里插入图片描述

创建成功后会自动跳转到一个默认的HTML页面。创建好项目后,回到我们的CodeSpace,接着clone项目。

在这里插入图片描述

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

2.3.3 准备requirements.txt 文件

pip freeze > requirements.txt 是一个用于生成当前 Python 环境中已安装包及其版本的命令,输出会写入文件 requirements.txt 中。以下是相关说明:

pip freeze > requirements.txt 是一个用于生成当前 Python 环境中已安装包及其版本的命令,输出会写入文件 requirements.txt 中。以下是相关说明:

作用

  • 生成依赖列表:该命令列出当前环境中的所有已安装包及其精确版本号。
  • 用于项目环境重现:通过生成的 requirements.txt 文件,可以在另一环境中使用以下命令安装相同的依赖:
    pip install -r requirements.txt
    

使用步骤

1. 生成 requirements.txt

运行以下命令:

pip freeze > requirements.txt
2. 检查生成内容

生成的文件内容可能类似以下:

numpy==1.23.5
pandas==1.5.3
requests==2.28.1
Brotli @ file:///croot/brotli-split_1714483155106/work
certifi @ file:///croot/certifi_1734473278428/work/certifi

这表示环境中安装了 numpypandasrequests,并指定了其版本。

1.检查本地路径的意义
@ file://... 表示包是通过本地构建或从本地路径安装的,可能是在某些特殊场景下(如离线安装或 CI/CD 环境)产生的。
这些路径可能无法在其他环境中使用,因为它们是绝对路径,指向原环境中的构建源。
2. 解决方法
方法 1:替换为标准版本号
如果目标环境可以从 PyPI 下载这些包,可以将其路径替换为标准版本号。
例如,将以下内容:

Brotli @ file:///croot/brotli-split_1714483155106/work
certifi @ file:///croot/certifi_1734473278428/work/certifi

替换为:

Brotli==1.0.9  # 确认所需版本号
certifi==2023.11.0  # 确认所需版本号

方法 2:重新从 PyPI 安装
如果可以访问网络,使用以下命令重新安装,并生成干净的 requirements.txt:

pip install Brotli certifi
pip freeze > requirements.txt

方法 3:先不管它了。。。(直接删掉不管版本号)

requirements.txt其他(重现环境)requirements.txt 文件分发或拷贝到目标机器上,然后运行: bash pip install -r requirements.txt
这将安装所有列出的依赖。

注意事项

  1. 虚拟环境

    • 推荐在虚拟环境中运行,以避免全局依赖混乱。
    • 创建虚拟环境:
      python -m venv myenv
      source myenv/bin/activate  # Linux/macOS
      myenv\Scripts\activate     # Windows
      
  2. 剔除不必要的包

    • 如果当前环境中有许多无关的依赖(例如开发过程中安装的工具包),可手动清理或使用工具生成精简版本(如 pipreqs)。
  3. 指定 Python 版本

    • 如果项目对 Python 版本有要求,可以在 requirements.txt 中注明:
      python_version >= 3.8
      

自用 requirements.txt

accelerate==1.2.1
addict==2.4.0
aiofiles==23.2.1
aiohappyeyeballs==2.4.4
aiohttp==3.11.11
aiosignal==1.3.2
annotated-types==0.7.0
anyio==4.7.0
async-timeout==5.0.1
attrs==24.3.0
Brotli
certifi
charset-normalizer
click==8.1.8
dill==0.3.8
distro==1.9.0
einops==0.8.0
exceptiongroup==1.2.2
fastapi==0.115.6
ffmpy==0.5.0
filelock 
fire==0.7.0
frozenlist==1.5.0
fsspec==2024.3.1
gmpy2 
gradio==5.9.1
gradio_client==1.5.2
grpcio==1.67.1
h11==0.14.0
httpcore==1.0.7
httpx==0.28.1
huggingface-hub==0.27.0
idna 
Jinja2 
jiter==0.8.2
lmdeploy==0.5.3
markdown-it-py==3.0.0
MarkupSafe 
mdurl==0.1.2
mkl-service==2.4.0
mkl_fft 
mkl_random 
mmengine-lite==0.10.5
mpmath 
multidict==6.1.0
multiprocess==0.70.16
networkx 
numpy==1.26.4
nvidia-cublas-cu12==12.6.4.1
nvidia-cuda-runtime-cu12==12.6.77
nvidia-curand-cu12==10.3.7.77
nvidia-ml-py==12.560.30
nvidia-nccl-cu12==2.23.4
openai==1.40.3
orjson==3.10.12
packaging==24.2
pandas==2.2.3
peft==0.11.1
pillow 
platformdirs==4.3.6
propcache==0.2.1
protobuf==5.29.2
psutil==6.1.1
pyarrow==18.1.0
pyarrow-hotfix==0.6
pybind11==2.13.6
pydantic==2.10.4
pydantic_core==2.27.2
pydub==0.25.1
Pygments==2.18.0
pynvml==12.0.0
PySocks 
python-dateutil==2.9.0.post0
python-multipart==0.0.20
python-rapidjson==1.20
pytz==2024.2
PyYAML 
regex==2024.11.6
requests 
rich==13.9.4
ruff==0.8.4
safehttpx==0.1.6
safetensors==0.4.5
semantic-version==2.10.0
sentencepiece==0.2.0
shellingham==1.5.4
shortuuid==1.0.13
six==1.17.0
sniffio==1.3.1
starlette==0.41.3
sympy 
tiktoken==0.8.0
timm==1.0.8
tokenizers==0.21.0
tomli==2.2.1
tomlkit==0.13.2
torch==2.1.2
torchaudio==2.1.2
torchvision==0.16.2
tqdm==4.67.1
transformers==4.47.1
transformers-stream-generator==0.0.5
triton==2.1.0
tritonclient==2.53.0
typer==0.15.1
typing_extensions 
tzdata==2024.2
urllib3 
uvicorn==0.34.0
websockets==14.1
xxhash==3.5.0
yapf==0.43.0
yarl==1.18.3
torch==2.1.2
torchvision==0.16.2
torchaudio==2.1.2
termcolor==2.4.0
streamlit==1.39.0
class_registry==2.1.2
datasets==3.1.0
griffe==0.48.0
asyncer
arxiv
asyncache
duckduckgo_search==5.3.1b1
func_timeout
json5
jsonschema
jupyter==1.0.0
jupyter_client==8.6.2
jupyter_core==5.7.2
timeout-decorator
typing-extensions

2.3.4. 准备app.py

agent_camp4/lagent 文件夹下并没有 app.py,因此需要做一个 app.py 的入口文件


```python
import streamlit as st
import os
import runpy

# 从环境变量获取 token
token = os.getenv('token')
weather_token = os.getenv('weather_token')

st.set_page_config(layout="wide", page_title="My Multi-Page App")

def set_env_variable(key, value):
    os.environ[key] = value

def home_page():
    st.header("欢迎来到首页")
    # 检查环境变量是否已存在
    global token, weather_token
    if not token:
        token = st.text_input("请输入浦语 token:", type="password", key="token")
    if not weather_token:
        weather_token = st.text_input("请输入和风天气 token:", type="password", key="weather_token")
    
    if st.button("保存并体验 agent"):
        if token and weather_token:
            set_env_variable("token", token)  # 设置环境变量
            set_env_variable("weather_token", weather_token)
            st.session_state.token_entered = True
            st.rerun()
        else:
            st.error("请输入所有 token")

# 检查会话状态
if 'token_entered' not in st.session_state:
    # 如果 token 存在于环境变量中,直接跳过输入
    st.session_state.token_entered = bool(token and weather_token)

if not st.session_state.token_entered:
    home_page()
else:
    # 动态加载子页面
    page = st.sidebar.radio("选择页面", ["天气查询助手", "博客写作助手"])
    if page == "天气查询助手":
        runpy.run_path("examples/agent_api_web_demo.py", run_name="__main__")
    elif page == "博客写作助手":
        runpy.run_path("examples/multi_agents_api_web_demo.py", run_name="__main__")

此外由于 streamlit 要求一个页面内只能有一个 st.set_page_config() 函数,因此需要把 agent_api_web_demo.pymulti_agents_api_web_demo.py 中的相应代码注释掉

agent_api_web_demo.py49~53 行和第 136~140

在这里插入图片描述
在这里插入图片描述
multi_agents_api_web_demo.py153
在这里插入图片描述

2.3.5 上传代码和环境

1. 克隆创空间,复制项目

Huggingface需要代理,就以ModelScope 为例,步骤一样。

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

然后我们将 agent_camp4/lagent 文件夹下需要的文件拷贝到自己克隆的新建的 ModelScope Spaces 仓库下。

rsync -av -o -t --exclude='. git*' --exclude='README. md' /root/agent_camp4/lagent/ /root/Lagent/

这是一个 rsync 命令,主要用于高效同步文件和目录内容。以下是命令的逐项解析:

命令的语法和功能 bash rsync -av -o -t --exclude='.git*' --exclude='README. md' /root/agent_camp4/lagent/ /root/Lagent/

  1. rsync

    • 文件同步工具,支持本地与远程文件高效复制。
  2. 选项解析

    • -a (archive):归档模式,保留文件权限、时间戳、符号链接等元信息。
    • -v (verbose):显示详细的同步过程信息。
    • -o (owner):保留文件所有者信息(需要管理员权限)。
    • -t (times):保留文件的修改时间。
    • --exclude='.git*':排除匹配 .git* 模式的文件或文件夹(如 .git.gitignore 等)。
  3. 源目录

    • /root/agent_camp4/lagent/
      • 表示要同步的源目录,/ 表示同步该目录的内容,而非目录本身。
  4. 目标目录

    • /root/Lagent/
      • 表示同步的目标目录,数据会被复制到此目录下。

命令功能

  • /root/agent_camp4/lagent/ 中的内容(包括子文件夹)同步到 /root/Lagent/
  • 保留文件的元信息(权限、所有者、时间戳等)。
  • 排除 .git* 开头的文件和目录。

应用场景

  1. 文件同步

    • 在本地目录之间高效复制文件,避免重复传输已存在的文件。
  2. 版本控制文件排除

    • 在同步时忽略 .git 相关的文件和目录,避免上传与版本控制相关的元数据。

运行后效果

  • /root/Lagent/ 将包含 /root/agent_camp4/lagent/ 的所有内容(不包括 .git* 文件)。
  • 如果 /root/Lagent/ 下已有相同文件,rsync 只会更新不同内容的文件,从而节省资源。
2. 上传代码
git add .
git commit -m "Add files"
git push

在这里插入图片描述

需要用提示命令设置上传平台时,登录的邮箱和名字。

在这里插入图片描述

在这里插入图片描述

3. 环境变量token

环境变量说明
如果您有一些密钥信息不想在空间文件中明文展示,您可以通过环境变量功能隐藏敏感信息。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
创建或更新环境变量后重启空间方可生效

使用方式:

import os
#获取对应环境变量的值, 上面图中的变量名称需要和这里的入参保持一致
app_key = os.getenv('AppKey')
# 使用app_key进行后续操作

2.3.6 部署后测试

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值