文章目录
1. 任务介绍
Lagent:从零搭建你的 Multi-Agent
记录复现过程并截图
1.1. 基础任务(完成此任务即完成闯关)
- 使用 Lagent 复现文档中 “制作一个属于自己的Agent” 和 “Multi-Agents博客写作系统的搭建”两部分内容,记录复现过程并截图。
1.2. 闯关材料提交(完成任务并且提交材料视为闯关成功)
- 闯关作业总共分为一个任务,一个任务完成视作闯关成功。
- 请将作业发布到知乎、优快云等任一社交媒体,将作业链接提交到以下问卷,助教老师批改后将获得 100 算力点奖励!!!
- 提交地址:https://aicarrier.feishu.cn/share/base/form/shrcnUqshYPt7MdtYRTRpkiOFJd
2. 基础任务(完成此任务即完成闯关)“制作一个属于自己的Agent” 和 “Multi-Agents博客写作系统的搭建”
- 使用 Lagent 复现文档中 “制作一个属于自己的Agent” 和 “Multi-Agents博客写作系统的搭建”两部分内容,记录复现过程并截图。
2.1. 动手实践(“制作一个属于自己的Agent”)
2.1.1. 环境配置
- 开发机选择 30% A100,镜像选择为 Cuda12.2-conda。
- 首先来为 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博客写作系统的流程图如下:
-
首先,创建一个新的 Python 文件 multi_agents_api_web_demo.py,并进入 lagent 环境:
-
运行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
这表示环境中安装了 numpy
、pandas
和 requests
,并指定了其版本。
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
这将安装所有列出的依赖。注意事项
虚拟环境:
- 推荐在虚拟环境中运行,以避免全局依赖混乱。
- 创建虚拟环境:
python -m venv myenv source myenv/bin/activate # Linux/macOS myenv\Scripts\activate # Windows
剔除不必要的包:
- 如果当前环境中有许多无关的依赖(例如开发过程中安装的工具包),可手动清理或使用工具生成精简版本(如
pipreqs
)。指定 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.py
和 multi_agents_api_web_demo.py
中的相应代码注释掉
agent_api_web_demo.py
第 49~53
行和第 136~140
行
multi_agents_api_web_demo.py
第 153
行
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/
rsync
- 文件同步工具,支持本地与远程文件高效复制。
选项解析:
-a
(archive):归档模式,保留文件权限、时间戳、符号链接等元信息。-v
(verbose):显示详细的同步过程信息。-o
(owner):保留文件所有者信息(需要管理员权限)。-t
(times):保留文件的修改时间。--exclude='.git*'
:排除匹配.git*
模式的文件或文件夹(如.git
、.gitignore
等)。源目录:
/root/agent_camp4/lagent/
- 表示要同步的源目录,
/
表示同步该目录的内容,而非目录本身。目标目录:
/root/Lagent/
- 表示同步的目标目录,数据会被复制到此目录下。
命令功能
- 将
/root/agent_camp4/lagent/
中的内容(包括子文件夹)同步到/root/Lagent/
。- 保留文件的元信息(权限、所有者、时间戳等)。
- 排除
.git*
开头的文件和目录。
应用场景
文件同步:
- 在本地目录之间高效复制文件,避免重复传输已存在的文件。
版本控制文件排除:
- 在同步时忽略
.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进行后续操作