欢迎来到"智能Agent场景实战指南"系列的第19天!今天我们将深入探讨Agent工具使用与API调用的核心技术。在现代智能Agent系统中,工具调用和API集成能力是决定Agent实用性和扩展性的关键因素。通过本篇文章,您将掌握如何为Agent配备各种工具能力,实现与外部系统的无缝对接,从而大幅扩展Agent的应用边界。
Agent工具使用与API调用能力为智能Agent带来了以下核心价值:
实现高效的Agent工具调用面临以下主要挑战:
智能Agent的工具调用通常遵循以下工作流程:
API调用通常采用以下几种模式:
调用模式 | 适用场景 | 实现复杂度 |
---|---|---|
同步调用 | 快速响应的小型API | 低 |
异步调用 | 长时间运行的任务 | 中 |
流式调用 | 实时数据传输 | 高 |
批量调用 | 处理大量数据 | 中 |
一个完整的Agent工具调用系统包含以下组件:
Agent Core
├── Tool Registry
│ ├── Tool Descriptions
│ ├── Authentication
│ └── Rate Limiting
├── Orchestrator
│ ├── Intent Detector
│ ├── Tool Selector
│ └── Parameter Generator
└── Execution Engine
├── API Client
├── Result Processor
└── Error Handler
以下是使用LangChain实现基础工具调用的完整代码示例:
from langchain.agents import tool
from langchain.agents import AgentType, initialize_agent
from langchain.llms import OpenAI
# 定义自定义工具
@tool
def get_current_weather(location: str) -> str:
"""获取指定城市的当前天气情况"""
# 这里应该是实际调用天气API的代码
# 为简化示例,我们返回模拟数据
return f"{location}的天气是晴朗,温度25°C"
# 初始化LLM
llm = OpenAI(temperature=0)
# 创建工具列表
tools = [get_current_weather]
# 初始化Agent
agent = initialize_agent(
tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
# 运行Agent
response = agent.run("上海现在的天气怎么样?")
print(response)
下面展示如何集成需要认证的REST API:
import requests
from typing import Optional, Dict, Any
from langchain.tools import BaseTool
from pydantic import BaseModel, Field
class SalesDataInput(BaseModel):
start_date: str = Field(..., description="开始日期,格式YYYY-MM-DD")
end_date: str = Field(..., description="结束日期,格式YYYY-MM-DD")
region: Optional[str] = Field(None, description="区域代码")
class SalesDataTool(BaseTool):
name = "get_sales_data"
description = "从企业销售系统获取指定时间范围的销售数据"
args_schema = SalesDataInput
def _run(self, start_date: str, end_date: str, region: Optional[str] = None):
"""实际调用销售系统API"""
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
params = {
"start_date": start_date,
"end_date": end_date
}
if region:
params["region"] = region
try:
response = requests.get(
"https://api.your-sales-system.com/v1/reports",
headers=headers,
params=params,
timeout=10
)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
return f"API调用失败: {str(e)}"
# 使用工具
sales_tool = SalesDataTool()
result = sales_tool.run({
"start_date": "2023-01-01",
"end_date": "2023-01-31",
"region": "EAST"
})
print(result)
实现Agent根据上下文自动选择最合适的工具:
from langchain.agents import Tool
from langchain.utilities import GoogleSearchAPIWrapper
# 创建多个工具
search = GoogleSearchAPIWrapper()
tools = [
Tool(
name="Search",
func=search.run,
description="当需要回答当前事件或最新信息时使用"
),
Tool(
name="Weather",
func=get_current_weather,
description="当需要查询天气时使用"
),
Tool(
name="SalesData",
func=sales_tool.run,
description="当需要查询销售数据时使用"
)
]
# 创建具备工具选择能力的Agent
agent = initialize_agent(
tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
# 测试工具选择
queries = [
"上海最近的天气如何?",
"最新的AI技术新闻有哪些?",
"请给我华东地区上个月的销售数据"
]
for query in queries:
print(f"问题: {query}")
print(f"回答: {agent.run(query)}\n")
对于耗时的API调用,实现异步处理:
import asyncio
from langchain.tools import BaseTool
class AsyncAPITool(BaseTool):
name = "async_data_processor"
description = "处理耗时较长的数据分析请求"
async def _arun(self, query: str) -> str:
"""模拟长时间运行的数据处理API"""
print(f"开始处理请求: {query}")
await asyncio.sleep(5) # 模拟API处理时间
return f"{query}的分析结果: 完成"
# 使用异步工具
async def main():
tool = AsyncAPITool()
result = await tool.arun("大型数据集分析")
print(result)
asyncio.run(main())
针对Agent工具调用系统,需要关注以下关键指标:
指标名称 | 测量方法 | 优化目标 |
---|---|---|
工具选择准确率 | 测试用例验证 | >95% |
API调用成功率 | 日志分析 | >99% |
平均响应时间 | 性能监控 | <1s |
错误处理率 | 异常捕获 | <1% |
from datetime import timedelta
from langchain.cache import InMemoryCache
from langchain.llms import OpenAI
# 启用缓存
llm = OpenAI(cache=InMemoryCache(ttl=timedelta(minutes=10)))
@tool
def batch_weather_query(locations: List[str]) -> Dict[str, str]:
"""批量查询多个城市的天气"""
results = {}
for loc in locations:
results[loc] = get_weather_from_api(loc)
return results
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))
def call_unreliable_api(params):
# 模拟可能失败的API
if random.random() < 0.3:
raise Exception("API暂时不可用")
return "成功结果"
开发一个智能旅行助手Agent,能够:
from typing import List, Optional
from pydantic import BaseModel, Field
# 定义工具集
class FlightSearchInput(BaseModel):
origin: str = Field(..., description="出发城市代码")
destination: str = Field(..., description="到达城市代码")
date: str = Field(..., description="日期,格式YYYY-MM-DD")
class HotelSearchInput(BaseModel):
location: str = Field(..., description="城市名称")
check_in: str = Field(..., description="入住日期")
check_out: str = Field(..., description="离店日期")
guests: int = Field(1, description="入住人数")
class TravelAssistantTools:
@tool(args_schema=FlightSearchInput)
def search_flights(origin: str, destination: str, date: str) -> List[dict]:
"""查询可用航班信息"""
# 实际调用航班API的代码
return [{
"flight": "CA123",
"departure": "08:00",
"arrival": "11:00",
"price": 1200
}]
@tool(args_schema=HotelSearchInput)
def search_hotels(location: str, check_in: str, check_out: str, guests: int = 1) -> List[dict]:
"""查询可用酒店信息"""
# 实际调用酒店API的代码
return [{
"hotel": "四季酒店",
"price": 800,
"rating": 4.8
}]
@tool
def get_attractions(location: str) -> List[str]:
"""获取当地旅游景点推荐"""
# 实际调用旅游API的代码
return ["外滩", "迪士尼乐园", "东方明珠"]
# 创建旅行助手Agent
travel_tools = [
TravelAssistantTools.search_flights,
TravelAssistantTools.search_hotels,
TravelAssistantTools.get_attractions,
get_current_weather # 重用之前的天气工具
]
travel_agent = initialize_agent(
travel_tools,
llm,
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
# 测试旅行助手
response = travel_agent.run(
"我想下周去上海旅行,需要航班和酒店信息,还有当地天气预报"
)
print(response)
该旅行助手Agent可以:
from langchain.agents import Tool
from langchain.tools import ToolPermissions
# 定义工具权限
permissions = ToolPermissions(
tools=["get_sales_data"],
groups=["sales_team"],
users=["[email protected]"]
)
def safe_api_call(func):
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except Exception as e:
return {
"error": str(e),
"suggestion": "请稍后再试或联系管理员"
}
return wrapper
@safe_api_call
def call_critical_api(params):
# 关键业务API调用
pass
from pydantic import validate_arguments
@validate_arguments
def validate_inputs(param1: str, param2: int):
# 只有通过验证的输入才会执行
pass
【智能Agent场景实战指南 Day 20】将探讨Agent多模态交互能力,包括:
AI Agent, API集成, 工具调用, LangChain, 智能助手
本文是"智能Agent场景实战指南"系列的第19篇,深入讲解了智能Agent工具使用与API调用的核心技术。文章从业务价值和技术挑战入手,详细解析了工具调用机制、API集成模式、系统架构设计等关键技术,提供了完整的代码实现和优化策略。通过一个智能旅行助手Agent的完整案例,展示了如何将理论应用于实际业务场景。本文特别强调企业级部署的安全考虑和性能优化,为开发者提供了可直接应用于生产环境的实践指南。学习本文后,开发者将掌握如何为Agent扩展各种实用功能,实现与外部系统的无缝对接。