Files
agents-course/units/zh-CN/unit1/tutorial.mdx
2025-02-24 21:35:54 +01:00

228 lines
8.8 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 使用 smolagents 创建我们的第一个智能体
在上一节中,我们学习了如何使用 Python 代码从头开始创建智能体,并且我们**看到了这个过程是多么繁琐**。幸运的是,许多智能体库通过**为你处理大量繁重的工作**来简化这项工作。
在本教程中,**你将创建你的第一个智能体**,它能够执行图像生成、网络搜索、时区检查等更多操作!
你还将把你的智能体**发布到 Hugging Face Space 上,以便与朋友和同事分享**。
让我们开始吧!
## 什么是 smolagents
<img src="https://huggingface.co/datasets/agents-course/course-images/resolve/main/en/unit1/smolagents.png" alt="smolagents"/>
为了创建这个智能体,我们将使用 `smolagents`,这是一个**提供轻松开发智能体框架的库**。
这个轻量级库设计简洁,但它抽象了构建智能体的许多复杂性,使你能够专注于设计智能体的行为。
我们将在下一个单元中深入了解 smolagents。同时你也可以查看这篇<a href="https://huggingface.co/blog/smolagents" target="_blank">博客文章</a>或该库的<a href="https://github.com/huggingface/smolagents" target="_blank">GitHub 仓库</a>。
简而言之,`smolagents` 是一个专注于 **codeAgent** 的库codeAgent 是一种通过代码块执行**“操作”**,然后通过执行代码**“观察”**结果的智能体。
以下是我们将构建的一个示例!
我们为我们的智能体提供了一个**图像生成工具**,并要求它生成一张猫的图片。
`smolagents` 中的智能体将具有**与我们之前构建的自定义智能体相同的行为**:它将**以循环的方式思考、行动和观察**,直到得出最终答案:
[智能体流程](https://www.youtube.com/watch?v=PQDKcWiuln4)
很令人兴奋,对吧?
## 让我们来构建我们的智能体!
首先,复制这个 Space<a href="https://huggingface.co/spaces/agents-course/First_agent_template" target="_blank">https://huggingface.co/spaces/agents-course/First_agent_template</a>
> 感谢 <a href="https://huggingface.co/m-ric" target="_blank">Aymeric</a> 提供的这个模板!🙌
复制这个 Space 意味着**在你的个人资料中创建一个本地副本**
<img src="https://huggingface.co/datasets/agents-course/course-images/resolve/main/en/unit1/duplicate-space.gif" alt="复制"/>
在整个课程中,你唯一需要修改的文件是当前不完整的**"app.py"**。你可以在这里查看[模板中的原始文件](https://huggingface.co/spaces/agents-course/First_agent_template/blob/main/app.py)。要找到你的文件,请进入你复制的 Space然后点击 `Files` 选项卡,再在目录列表中点击 `app.py`。
让我们一起分解代码:
- 文件开头是一些简单但必要的库导入
```python
from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModel, load_tool, tool
import datetime
import requests
import pytz
import yaml
from tools.final_answer import FinalAnswerTool
```
正如之前所述,我们将直接使用 **smolagents** 中的 **CodeAgent** 类。
### Tool工具
现在让我们来了解一下工具!如果你需要回顾一下工具的相关内容,请随时回到课程的[工具](tools)部分。
```python
@tool
def my_custom_tool(arg1:str, arg2:int)-> str: # it's important to specify the return type
# Keep this format for the tool description / args description but feel free to modify the tool
"""A tool that does nothing yet
Args:
arg1: the first argument
arg2: the second argument
"""
return "What magic will you build ?"
@tool
def get_current_time_in_timezone(timezone: str) -> str:
"""A tool that fetches the current local time in a specified timezone.
Args:
timezone: A string representing a valid timezone (e.g., 'America/New_York').
"""
try:
# Create timezone object
tz = pytz.timezone(timezone)
# Get current time in that timezone
local_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S")
return f"The current local time in {timezone} is: {local_time}"
except Exception as e:
return f"Error fetching time for timezone '{timezone}': {str(e)}"
```
这些工具是我们在这个部分鼓励你构建的东西!我们给你两个例子:
1. 一个**不工作的虚拟工具**,你可以修改它来制作一些有用的东西。
2. 一个**实际工作的工具**,它可以获取世界某地的当前时间。
要定义你的工具,重要的是:
1. 为你的函数提供输入和输出类型,例如 `get_current_time_in_timezone(timezone: str) -> str:`
2. **格式良好的文档字符串**。`smolagents` 期望所有参数在文档字符串中都有**文字描述**。
### The Agent智能体
它使用 [`Qwen/Qwen2.5-Coder-32B-Instruct`](https://huggingface.co/Qwen/Qwen2.5-Coder-32B-Instruct) 作为 LLM 引擎。这是一个非常强大的模型,我们将通过无服务器 API 访问它。
```python
final_answer = FinalAnswerTool()
model = HfApiModel(
max_tokens=2096,
temperature=0.5,
model_id='Qwen/Qwen2.5-Coder-32B-Instruct',
custom_role_conversions=None,
)
with open("prompts.yaml", 'r') as stream:
prompt_templates = yaml.safe_load(stream)
# We're creating our CodeAgent
agent = CodeAgent(
model=model,
tools=[final_answer], # add your tools here (don't remove final_answer)
max_steps=6,
verbosity_level=1,
grammar=None,
planning_interval=None,
name=None,
description=None,
prompt_templates=prompt_templates
)
GradioUI(agent).launch()
```
这个智能体仍在使用我们在前面部分中看到的`InferenceClient`,它位于**HfApiModel**类的背后!
当我们介绍 Unit 2 中的框架时,我们会给出更深入的例子。目前,你需要专注于通过智能体的`tools`参数**向工具列表中添加新工具**。
例如,你可以使用代码第一行导入的`DuckDuckGoSearchTool`,或者你可以检查稍后从 Hub 加载的`image_generation_tool`。
**添加工具将赋予你的智能体新的能力**,在这里尝试发挥创意吧!
完整的"app.py"
```python
from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModel, load_tool, tool
import datetime
import requests
import pytz
import yaml
from tools.final_answer import FinalAnswerTool
from Gradio_UI import GradioUI
# Below is an example of a tool that does nothing. Amaze us with your creativity!
@tool
def my_custom_tool(arg1:str, arg2:int)-> str: # it's important to specify the return type
# Keep this format for the tool description / args description but feel free to modify the tool
"""A tool that does nothing yet
Args:
arg1: the first argument
arg2: the second argument
"""
return "What magic will you build ?"
@tool
def get_current_time_in_timezone(timezone: str) -> str:
"""A tool that fetches the current local time in a specified timezone.
Args:
timezone: A string representing a valid timezone (e.g., 'America/New_York').
"""
try:
# Create timezone object
tz = pytz.timezone(timezone)
# Get current time in that timezone
local_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S")
return f"The current local time in {timezone} is: {local_time}"
except Exception as e:
return f"Error fetching time for timezone '{timezone}': {str(e)}"
final_answer = FinalAnswerTool()
model = HfApiModel(
max_tokens=2096,
temperature=0.5,
model_id='Qwen/Qwen2.5-Coder-32B-Instruct',
custom_role_conversions=None,
)
# Import tool from Hub
image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True)
with open("prompts.yaml", 'r') as stream:
prompt_templates = yaml.safe_load(stream)
agent = CodeAgent(
model=model,
tools=[final_answer], # add your tools here (don't remove final_answer)
max_steps=6,
verbosity_level=1,
grammar=None,
planning_interval=None,
name=None,
description=None,
prompt_templates=prompt_templates
)
GradioUI(agent).launch()
```
你的**目标**是熟悉 Space 和智能体。
目前,模板中的智能体**没有使用任何工具,所以尝试为它提供一些预制的工具,甚至自己动手制作一些新工具!**
我们非常期待在 Discord 频道 **#agents-course-showcase** 中看到你的精彩智能体成果!
---
恭喜你,你已经构建了你的第一个智能体!不要犹豫,与你的朋友和同事分享吧。
由于这是你的第一次尝试,如果有点小问题或速度有点慢,这是完全正常的。在未来的单元中,我们将学习如何构建更好的智能体。
最好的学习方法是尝试,所以不要犹豫,去更新它,添加更多工具,尝试使用另一个模型,等等。
在下一节中,你将完成最后的测验并获得证书!