工具
简介¶
CrewAI 工具为代理提供了从网络搜索和数据分析到协作和同事间任务委派的各种能力。本文档概述了如何在 CrewAI 框架内创建、集成和利用这些工具,包括对协作工具的新关注。
什么是工具?¶
定义
在 CrewAI 中,工具是代理可以用来执行各种操作的技能或功能。这包括来自 crewAI Toolkit 和 LangChain Tools 的工具,使代理能够从简单搜索到复杂交互和有效团队合作。
工具的关键特性¶
- 实用性:专为网络搜索、数据分析、内容生成和代理协作等任务而设计。
- 集成性:通过无缝集成工具到代理的工作流程中,提升代理能力。
- 可定制性:提供灵活性,开发定制工具或利用现有工具,满足代理的特定需求。
- 错误处理:包含强大的错误处理机制,确保平稳运行。
- 缓存机制:具备智能缓存功能,优化性能并减少冗余操作。
使用 crewAI 工具¶
要使用 crewAI 工具增强代理能力,首先安装我们的额外工具包:
以下是一个示例,演示其使用方法:
import os
from crewai import Agent, Task, Crew
# 导入 crewAI 工具
from crewai_tools import (
DirectoryReadTool,
FileReadTool,
SerperDevTool,
WebsiteSearchTool
)
# 设置 API 密钥
os.environ["SERPER_API_KEY"] = "Your Key" # serper.dev API 密钥
os.environ["OPENAI_API_KEY"] = "Your Key"
# 实例化工具
docs_tool = DirectoryReadTool(directory='./blog-posts')
file_tool = FileReadTool()
search_tool = SerperDevTool()
web_rag_tool = WebsiteSearchTool()
# 创建代理
researcher = Agent(
role='市场研究分析师',
goal='提供人工智能行业的最新市场分析',
backstory='一位具有敏锐市场洞察力的专家分析师。',
tools=[search_tool, web_rag_tool],
verbose=True
)
writer = Agent(
role='内容作家',
goal='撰写关于人工智能行业的吸引人博客文章',
backstory='一位对技术充满热情的熟练作家。',
tools=[docs_tool, file_tool],
verbose=True
)
# 定义任务
research = Task(
description='研究人工智能行业的最新趋势并提供总结。',
expected_output='人工智能行业前三大趋势的总结,并提供对其重要性的独特见解。',
agent=researcher
)
write = Task(
description='根据研究分析师的总结,撰写一篇关于人工智能行业的吸引人博客文章。从目录中的最新博客文章中获取灵感。',
expected_output='一篇格式为 Markdown 的四段博客文章,内容吸引人、信息丰富且易于理解,避免使用复杂术语。',
agent=writer,
output_file='blog-posts/new_post.md' # 最终博客文章将保存在此处
)
)
# 组装一个启用规划的团队
crew = Crew(
agents=[researcher, writer],
tasks=[research, write],
verbose=True,
planning=True, # 启用规划功能
)
# 执行任务
crew.kickoff()
可用的 crewAI 工具¶
- 错误处理:所有工具都内置错误处理能力,允许代理优雅地管理异常并继续任务。
- 缓存机制:所有工具支持缓存,使代理能够高效地重用之前获得的结果,减少对外部资源的负载并加快执行时间。您还可以使用工具上的
cache_function属性对缓存机制进行更精细的控制。
以下是可用工具及其描述列表:
| 工具 | 描述 |
|---|---|
| BrowserbaseLoadTool | 用于与网络浏览器交互并从中提取数据的工具。 |
| CodeDocsSearchTool | 优化用于搜索代码文档和相关技术文档的 RAG 工具。 |
| CodeInterpreterTool | 用于解释 Python 代码的工具。 |
| ComposioTool | 启用 Composio 工具的使用。 |
| CSVSearchTool | 设计用于在 CSV 文件中搜索的 RAG 工具,专门处理结构化数据。 |
| DALL-E Tool | 使用 DALL-E API 生成图像的工具。 |
| DirectorySearchTool | 用于在目录中搜索的 RAG 工具,适用于浏览文件系统。 |
| DOCXSearchTool | 旨在在 DOCX 文档中搜索的 RAG 工具, ideal for processing Word files. |
| DirectoryReadTool | 促进目录结构及其内容的读取和处理。 |
| EXASearchTool | 设计用于在各种数据源中进行详尽搜索的工具。 |
| FileReadTool | 能够读取和提取文件中的数据,支持多种文件格式。 |
| FirecrawlSearchTool | 使用 Firecrawl 搜索网页并返回结果的工具。 |
| FirecrawlCrawlWebsiteTool | 使用 Firecrawl 抓取网页的工具。 |
| FirecrawlScrapeWebsiteTool | 使用 Firecrawl 抓取网页 URL 并返回其内容的工具。 |
| GithubSearchTool | 用于在 GitHub 仓库中搜索的 RAG 工具,适用于代码和文档搜索。 |
| SerperDevTool | 一个专门的开发工具,具有特定功能正在开发中。 |
| TXTSearchTool | 专注于在文本(.txt)文件中搜索的 RAG 工具,适用于非结构化数据。 |
| JSONSearchTool | 设计用于在 JSON 文件中搜索的 RAG 工具,适用于处理结构化数据。 |
| LlamaIndexTool | 启用 LlamaIndex 工具的使用。 |
| MDXSearchTool | 专为在 Markdown (MDX) 文件中搜索而量身定制的 RAG 工具,适用于文档处理。 |
| PDFSearchTool | 旨在在 PDF 文档中搜索的 RAG 工具,适用于处理扫描文档。 |
| PGSearchTool | 优化用于在 PostgreSQL 数据库中搜索的 RAG 工具,适用于数据库查询。 |
| Vision Tool | 使用 DALL-E API 生成图像的工具。 |
| RagTool | 一个通用 RAG 工具,能够处理各种数据源和类型。 |
| ScrapeElementFromWebsiteTool | 启用从网站中抓取特定元素,适用于有针对性的数据提取。 |
| ScrapeWebsiteTool | 促进整个网站的抓取,适用于全面的数据收集。 |
| WebsiteSearchTool | 用于搜索网站内容的 RAG 工具,优化了网络数据提取。 |
| XMLSearchTool | 设计用于在 XML 文件中搜索的 RAG 工具,适用于结构化数据格式。 |
| YoutubeChannelSearchTool | 用于在 YouTube 频道中搜索的 RAG 工具,适用于视频内容分析。 |
| YoutubeVideoSearchTool | 旨在在 YouTube 视频中搜索的 RAG 工具,适用于视频数据提取。 |
创建自己的工具¶
自定义工具创建
开发人员可以创建定制的工具来满足代理的需求,或利用预构建的选项:
要创建自己的 crewAI 工具,您需要安装我们的额外工具包:
一旦完成,创建 crewAI 工具有两种主要方法:
继承 BaseTool¶
from crewai_tools import BaseTool
class MyCustomTool(BaseTool):
name: str = "我的工具名称"
description: str = "这个工具用途的清晰描述,您的代理需要这些信息来使用它。"
def _run(self, argument: str) -> str:
# 实现代码在这里
return "来自自定义工具的结果"
使用 tool 装饰器¶
from crewai_tools import tool
@tool("我的工具名称")
def my_tool(question: str) -> str:
"""这个工具用途的清晰描述,您的代理需要这些信息来使用它。"""
# 函数逻辑在这里
return "来自您的自定义工具的结果"
自定义缓存机制¶
缓存
工具可以选择实现 cache_function 来微调缓存行为。此函数根据特定条件确定何时缓存结果,提供对缓存逻辑的精细控制。
from crewai_tools import tool
@tool
def multiplication_tool(first_number: int, second_number: int) -> str:
"""当你需要将两个数字相乘时很有用。"""
return first_number * second_number
def cache_func(args, result):
# 在这种情况下,只有当结果是 2 的倍数时,我们才缓存结果
cache = result % 2 == 0
return cache
multiplication_tool.cache_function = cache_func
writer1 = Agent(
role="作家",
goal="你为孩子们编写数学课程。",
backstory="你是一位写作专家,你喜欢教孩子们,但你不懂数学。",
tools=[multiplication_tool],
allow_delegation=False,
)
#...
结论¶
工具对于扩展 CrewAI 代理的能力至关重要,使它们能够承担广泛的任务并有效协作。在构建 CrewAI 解决方案时,利用自定义和现有工具来增强代理的能力并提升 AI 生态系统。考虑利用错误处理、缓存机制和工具参数的灵活性来优化代理的性能和能力。