在本笔记本中,我们将制作一个 多代理网络浏览器:由多个代理组成的代理系统,利用网络协作解决问题!
它将是一个简单的层次结构,使用一个 托管代理
对象来封装受管网络搜索代理:
复制的
+----------------+ | 经理代理 | +----------------+ | _______________|______________ | | 代码解释器 +--------------------------------+ 工具 | 管理代理 | | +------------------+ | | | 网络搜索代理 | | | | +------------------+ | | | | | | 网页搜索工具 | 访问网页工具 +--------------------------------+
让我们来建立这个系统。
运行下面的命令行安装所需的依赖项:
复制的
!pip install markdownify duckduckgo-search smolagents --upgrade -q
让我们登录以调用高频推理 API:
复制的
从 huggingface_hub 导入 login 登录()
⚡️ 我们的代理将由 Qwen/Qwen2.5-Coder-32B-Instruct 使用 HfApiModel
类使用 HF 的推理应用程序接口(Inference API):推理应用程序接口允许快速、轻松地运行任何操作系统模型。
请注意: Inference API 基于各种标准托管模型,部署的模型可能会更新或替换,恕不另行通知。了解更多 这里.
复制的
model_id = "Qwen/Qwen2.5-Coder-32B-Instruct"
🔍 创建网络搜索工具 #
在网页浏览方面,我们已经可以使用已有的 鸭子搜索工具
工具,提供与谷歌搜索相当的功能。
但是,我们还需要能够通过 鸭子搜索工具
.为此,我们可以导入该库内置的 访问网页工具
但我们会再次建造它,看看它是如何完成的。
因此,让我们创建我们的 访问网页工具
工具,从头开始使用 markdownify
.
复制的
导入 re 导入请求 from markdownify import markdownify from requests.exceptions import RequestException 从 smolagents 导入工具 @tool def visit_webpage(url: str) -> str: ""访问给定 URL 上的网页,并以 markdown 字符串形式返回其内容。 参数: url:要访问的网页的 URL。 返回 返回 返回 返回值值值值 转换为 Markdown 的网页内容,如果请求失败,则返回错误信息。 """ try: # 向 URL 发送 GET 请求 response = requests.get(url) response.raise_for_status() # 为错误状态码引发异常 # 将 HTML 内容转换为 Markdown markdown_content = markdownify(response.text).strip() # 删除多个换行符 markdown_content = re.sub(r"\n{3,}", "\n\n", markdown_content) return markdown_content except RequestException as e: return f "Error fetching the webpage:{str(e)}" except Exception as e: return f "发生意外错误:{str(e)}"
好了,现在让我们初始化并测试我们的工具!
复制的
print(visit_webpage("https://en.wikipedia.org/wiki/Hugging_Face")[:500])
构建我们的多代理系统🤖🤝🤖 #
现在我们有了所有工具 搜索
和 访问网页
,我们可以使用它们来创建网络代理。
为该代理选择哪种配置?
- 网页浏览是一项不需要并行工具调用的单时间线任务,因此 JSON 工具调用在这方面非常有效。因此,我们选择了
JsonAgent
. - 此外,由于有时网络搜索需要浏览很多页面才能找到正确答案,因此我们更倾向于增加搜索页数。
最大步数
至 10。
复制的
从 smolagents 导入 ( CodeAgent、 工具调用代理 HfApiModel、 ManagedAgent、 DuckDuckGoSearchTool、 LiteLLMModel、 ) 模型 = HfApiModel(model_id) web_agent = ToolCallingAgent( tools=[DuckDuckGoSearchTool(), visit_webpage]、 model=model、 max_steps=10、 )
然后,我们将该代理包装成一个 托管代理
使其可被管理代理调用。
复制的
managed_web_agent = ManagedAgent( agent=web_agent、 name="search"、 description="为你运行网络搜索。将您的查询作为参数交给它。"、 )
最后,我们创建一个管理代理,并在初始化时将受管代理的 受管代理
争论。
由于该代理负责规划和思考,因此高级推理将大有裨益,因此需要一个 代码代理
将是最佳选择。
此外,我们还想问一个涉及当年的问题,并进行额外的数据计算:因此,让我们添加 additional_authorized_imports=["time", "numpy", "pandas"]
以防代理需要这些软件包。
复制的
manager_agent = CodeAgent( tools=[]、 model=model、 managed_agents=[managed_web_agent]、 additional_authorized_imports=["time", "numpy", "pandas"]、 )
就是这样!现在,让我们运行我们的系统!我们选择一个既需要计算又需要研究的问题:
复制的
answer = manager_agent.run("If LLM training continues to scale up at the current pace until 2030, what would be the electricity power required in GW to power the biggest training runs by 2030?与一些国家相比,相当于多少?请提供所用数字的来源。)
我们得到的答案就是这份报告:
复制的
根据目前的增长预测和能源消耗估算,如果 LLM 培训继续以目前的速度扩大,到 2030 年 直到 2030 年: 1.到 2030 年,最大规模培训所需的电力约为 303.74 千兆瓦,即每年约 2,660,762 千兆瓦时。 即每年约 2,660,762 千兆瓦时。 2.2. 与各国的耗电量相比: - 相当于中国总用电量的 34%。 - 将超过印度(184%)、俄罗斯(267%)和日本(291%)的用电总量。 - 这将是意大利或墨西哥等国用电量的近 9 倍。 3.数字来源: - AWS 首席执行官马特-加曼(Matt Garman)对未来 LLM 培训的初步估计为 5 GW。 - 增长预测使用的是 Springs 市场研究得出的 79.80% 的年均复合增长率。 - 国家电力消耗数据来自美国能源信息管理局,主要是 2021 年的数据。 2021.
看来我们需要一些大型动力装置,如果 缩放假设 仍然适用。
我们的代理成功地通过高效协作完成了任务!✅
💡 您可以轻松地将此协调扩展到更多代理:一个代理执行代码,一个代理进行网络搜索,一个代理处理文件加载...