字数:约4000字|预计阅读时间:10分钟
嗨,大家好!作为一个喜欢折腾AI新技术的算法攻城狮,最近又学习了一些Agent工作流调用工具的文章,学完之后,我真的是“啊这”,一边感慨AI技术的强大,一边觉得自己打开了新世界的大门。于是,我决定写这篇博客,把我的学习心得分享给大家!如果你对AI智能体、工具集成,以及如何让它们更“聪明”感兴趣,那千万别错过这篇文章!
Agent,直译就是“代理”,但在AI领域,它更像是一个“智能小帮手”,可以帮用户完成各种复杂任务,比如回答问题、处理数据,甚至操控其他系统。
但问题来了:Agent再智能,它的基础能力终归有限,比如它不可能自带所有最新的数据,也不可能直接执行某些复杂操作。这时候,就需要一个“外挂”神器——工具!
工具可以赋予Agent超能力,比如:
Agent+工具的组合,就像盖伦拿到了一把三相之力(好吧,暴露年龄了),能力瞬间爆炸!而这篇调研报告的核心就是:如何设计这些工具,并让Agent高效调用它们。重点关注了OpenAI的Function Call机制和CrewAI框架下的工具创建方法。下面,我就把我的学习心得分享给大家。
在AI领域,工具可以理解为一些功能模块,通过标准化接口与Agent交互。文中将工具分为以下几类:
引入工具,可以让Agent像开了挂一样,具备模型本身无法完成的能力。就好比给钢铁侠的战甲装上各种黑科技,简直不要太爽!
想要把工具整合到Agent中,大体需要以下几个步骤:
这三个步骤确保了Agent能够正确识别和调用工具,发挥工具的功能,增强Agent的能力。
Agent调用工具的过程涉及到任务理解、工具选择、参数传递和结果处理。下面,我们分别看看OpenAI的Function Call机制和CrewAI框架下的调用机制。
OpenAI的Function Call机制是GPT模型的一种扩展能力,允许Agent调用预定义的工具(函数)。在这个机制中,开发者通过提供函数的签名及其功能描述,让模型能够动态地选择、调用并与这些工具交互。
调用过程的核心是:
调用流程可以用下面这个图示简单表示:
prompt匹配可用函数/工具传参并调用执行函数生成自然语言的用户响应用户问题LLM模型生成ToolCal应用程序返回ToolCallRespons
在设计和实现智能Agent时,核心挑战之一在于如何让Agent高效完成任务。Agent需要具备以下能力:理解用户意图、判断是否需要调用工具、精准生成工具调用参数,并将调用结果格式化为用户可理解的自然语言输出。
在OpenAI Function Call中,意图识别的核心依赖于模型对工具描述的理解。以下是具体流程:
1. 工具描述注册:
functions = [
{
"name": "query_weather",
"description": "查询天气信息。",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名称"},
"date": {"type": "string", "description": "查询日期"}
},
"required": ["city", "date"]
}
}
]
2. 模型推断意图:
city="北京"
和date="明天"
。function_call="auto"
,模型会自动判断是否需要调用工具。进一步,如果模型认为用户意图需要调用某个工具,会生成一个函数调用请求,包含工具名称和参数。Agent需要根据用户输入动态判断是否调用工具。这一过程依赖于几方面的机制:
生成工具调用参数是工具调用中的关键步骤。参数的准确性直接影响工具的执行结果。
举个栗子,假设我们有一个处理CAD文件的函数:
functions = [
{
"name": "process_cad_file",
"description": "处理CAD图纸文件,提取设备信息并生成统计报告",
"parameters": {
"type": "object",
"properties": {
"file_path": {
"type": "string",
"description": "CAD文件的路径,支持.dwg格式"
}
},
"required": ["file_path"]
}
},
]
当用户输入“请帮我处理这个CAD图纸:project.dwg”时,模型会自动生成函数调用:
{
"function_call": {
"name": "process_cad_file",
"arguments": "{\"file_path\": \"project.dwg\"}"
}
}
CrewAI是一个基于LangChain的开源Agent框架,提供了方便的工具集成和Agent构建能力。在CrewAI中,工具的创建和调用也非常灵活。
run
方法,获取结果。在OpenAI的Function Call机制中,工具(函数)的定义需要提供详细的描述和参数schema。步骤如下:
functions
参数传递函数描述列表。def calculate_sum(a, b):
return a + b
functions = [
{
"name": "calculate_sum",
"description": "计算两个数的和。",
"parameters": {
"type": "object",
"properties": {
"a": {"type": "number", "description": "第一个数"},
"b": {"type": "number", "description": "第二个数"}
},
"required": ["a", "b"]
}
}
]
function_call
参数为"auto"
,模型会自动决定是否调用函数。function_call
信息,获取函数名称和参数。除了可以直接使用CrewAI框架下提供的工具(包括 CrewAI Toolkit 和 LangChain Tools 的工具),还可以创建自己的专属工具。
在CrewAI中创建工具非常简单:
1. 使用装饰器@tool
定义工具:
from crewai.tools import tool
@tool("查询天气")
def query_weather(city: str, date: str):
return f"{city}在{date}的天气是晴天,气温5°C。"
2. 或者继承BaseTool
实现工具:
from crewai.tools import BaseTool
class WeatherTool(BaseTool):
name = "查询天气"
description = "根据城市和日期查询天气。"
def _run(self, city: str, date: str):
return f"{city}在{date}的天气是晴天,气温5°C。"
3. 更多的时候还可以使用API来包装函数为结构化工具:
from crewai.tools.structured_tool import CrewStructuredTool
from pydantic import BaseModel
classWeatherTool(BaseModel):
file_path: str
process_type: str
defquery_weather(file_path: str, process_type: str):
# 实现处理逻辑
return"处理结果"
queryweather = CrewStructuredTool.from_function(
name="查询天气",
description="根据城市和日期查询天气",
func=query_weather
)
CrewAI的调用机制与Function Call类似,但支持更复杂的任务分解。比如多个工具可以协同合作,完成一个复杂任务。
在创建工具时,需要注意以下设计细节:
我觉得,这些设计考虑对于提升Agent的开发效率和性能非常重要!毕竟,没有人喜欢和一个总是出错的Agent对话,对吧?
通过写这篇絮叨的文章,我深刻感受到,Agent的智能化很大程度上依赖工具的设计和调用能力。无论是OpenAI的Function Call,还是CrewAI框架,都在探索如何让Agent具备更强大的外部能力。
我们可以畅想一下未来:
总之,Agent+工具的组合,无疑是AI发展的重要方向。如果你也是AI开发者,不妨尝试用这些技术,打造属于自己的智能Agent!
最后一句废话:作为一个热爱AI技术的算法攻城狮,我真的很享受探索这些新奇有趣的东西。学习的过程虽然有时候会遇到困难,但当你突破瓶颈的那一刻,真的是爽到飞起!好了,不扯了,期待下次能和大家分享更多有趣的内容。掰掰~
参考资料: