crewAi 如何调用tools
在 CrewAI 中,调用工具(Tools)是让智能体(Agent)拥有“执行能力”(如联网搜索、读写文件、查询数据库等)的关键。
以下是 CrewAI 调用工具的完整全景指南:
第一步:安装工具包
CrewAI 官方提供了一个极其丰富的工具库 crewai_tools。你可以直接在终端中安装它:
bash
pip install 'crewai[tools]'
请谨慎使用此类代码。
第二步:在代码中调用工具的三种方式
方式一:使用内置的官方工具(最快捷)
官方内置了非常多开箱即用的工具,比如文件读写、网页爬取、目录读取等。
这里我们以内置的 文件读取工具 (FileReadTool) 和 网页抓取工具 (ScrapeWebsiteTool) 为例:
python
from crewai import Agent, Task, Crew, LLM
# 导入官方内置工具
from crewai_tools import FileReadTool, ScrapeWebsiteTool
# 1. 实例化工具
file_reader = FileReadTool()
web_scraper = ScrapeWebsiteTool(website_url="https://example.com") # 也可以不传固定网址,让Agent运行时自己传
# 2. 将工具分配给 Agent
researcher = Agent(
role="资料审查员",
goal="分析给定的网页和本地文件并提取核心摘要",
backstory="你是一个极其细心的资料审核员。",
# 📌 在这里把工具列表传给这个 Agent,它就会自己根据任务去调用了
tools=[file_reader, web_scraper],
llm=LLM(model="openai/qwen2.5:7b", base_url="http://127.0.0", api_key="sk-xxx"),
verbose=True
)
请谨慎使用此类代码。
方式二:把任何 Python 函数变成工具(最灵活)
如果你想让 AI 执行你自定义的复杂业务逻辑(比如调用公司内部的某个 API、查询特定数据库、或者做一段数学计算),你可以使用 @tool 装饰器。
注意:函数的注释(Docstring)和参数类型提示非常重要,AI 是通过读你的注释来理解这个工具是干什么用的、以及如何传参的。
python
from crewai.tools import tool
@tool("我的天气查询工具")
def fetch_weather_tool(city: str) -> str:
"""
当你需要查询某个城市的实时天气时,请调用这个工具。
输入参数 city 必须是城市名称的字符串。
"""
# 这里写你真正的 Python 业务代码(例如请求高德天气API)
if "北京" in city:
return "北京今天晴天,25度,微风。"
else:
return f"已成功查询 {city} 的天气,气温适宜。"
# 分配给 Agent
weather_agent = Agent(
role="天气播报员",
goal="为用户提供精准的天气出行建议",
backstory="你是一个天气预报专家。",
tools=[fetch_weather_tool], # 📌 像这样直接把函数名传进去
llm=local_llm,
verbose=True
)
请谨慎使用此类代码。
方式三:直接复用 LangChain 的庞大工具生态
因为 CrewAI 底层对 LangChain 有着极好的兼容性,你可以直接把 LangChain 的丰富工具拿过来用。例如使用谷歌搜索(Google Serper):
python
from langchain_community.utilities import GoogleSerperAPIWrapper
from crewai_tools import Tool
# 1. 创建 LangChain 的搜索组件
search_wrapper = GoogleSerperAPIWrapper()
# 2. 用 CrewAI 的 Tool 类包装它
google_search_tool = Tool(
name="谷歌搜索工具",
description="当你需要联网查询最新的实时信息、热点新闻或事实时,使用此工具。",
func=search_wrapper.run
)
# 3. 分配给 Agent
agent = Agent(role="新闻追踪者", goal="搜集最新动态", tools=[google_search_tool], ... )
请谨慎使用此类代码。
第三步:任务(Task)级别的工具限制
在 CrewAI 中,你不仅可以把工具绑定给 Agent(代表这个员工能用什么工具),还可以进一步绑定给 Task(代表这个任务只准用什么工具)。
python
research_task = Task(
description="去特定网页抓取最新的 AI 行业报告数据。",
expected_output="一份包含核心数据的摘要。",
agent=researcher,
# 📌 如果 Task 强制指定了 tools,它会覆盖 Agent 自带的 tools,常用于防止 AI 乱用其他工具
tools=[web_scraper]
)
请谨慎使用此类代码。
💡 避坑与高级技巧
为什么 AI 总是调用工具失败(Tool Execution Error)?
如果你使用的是本地小模型(如 7B/14B 的 Qwen 或 Llama),它们的 Function Calling(函数调用) 能力可能不够强,容易出现传参格式错误。
解决方法:尽量使用针对工具调用优化过的模型(如
qwen2.5系列),或者在自定义工具的description(注释)里用极其直白、大白的语言告诉 AI:“请务必只传入一个字符串,不要传入 JSON”。
控制工具调用次数:
为了防止本地模型陷入死循环(比如不断报错、不断重新调用工具),你可以在 Agent 中设置最大迭代次数:python
agent = Agent(..., max_iter=5) # 限制针对一个任务最多尝试调用工具 5 次请谨慎使用此类代码。
您目前是希望让您的多智能体系统去实现哪种具体的业务动作?
联网搜索最新行业信息(需要配置搜索 Key)
读取和整理本地电脑的 Excel/PDF 文件
对接您现有的 SQL 数据库或内部系统的 API
我可以根据您的具体需求,为您打包一段开箱即用的完整工具调用代码。