Owen_agent需要大模型处理的Function Calling
需要大模型处理的 Function Calling 完整实现
下面我将展示一个完整的需要大模型智能处理的 Function Calling 示例,包含复杂决策、参数生成和结果解释等关键环节。
1. 场景设计:智能旅行规划助手
这个示例将实现一个能处理复杂旅行规划的 Function Calling 系统,需要大模型进行以下智能处理:
理解多要素用户请求
协调多个工具调用
处理工具返回的原始数据
生成自然语言回复
2. 完整代码实现
2.1 定义工具集
from qwen_agent.tools import BaseTool
from typing import Dict, Any
from datetime import datetime, timedelta
import random
# 工具1:航班查询
class FlightSearchTool(BaseTool):
name = 'flight_search'
description = '查询两地之间的航班信息,需要出发城市、到达城市和日期'
def call(self, params: Dict) -> Dict:
# 模拟API返回数据
flights = [
{
'airline': '东方航空',
'flight_no': f'MU{random.randint(1000,9999)}',
'departure': f"{params['departure_city']} 08:00",
'arrival': f"{params['arrival_city']} 11:00",
'price': random.randint(500, 2000)
},
{
'airline': '南方航空',
'flight_no': f'CZ{random.randint(1000,9999)}',
'departure': f"{params['departure_city']} 14:00",
'arrival': f"{params['arrival_city']} 17:00",
'price': random.randint(500, 2000)
}
]
return {'status': 'success', 'data': flights}
# 工具2:酒店查询
class HotelSearchTool(BaseTool):
name = 'hotel_search'
description = '查询城市酒店信息,需要城市、入住日期和离店日期'
def call(self, params: Dict) -> Dict:
hotels = [
{
'name': f"{params['city']}国际大酒店",
'price': random.randint(300, 1500),
'rating': round(random.uniform(3.5, 5.0), 1),
'address': f"{params['city']}市中心区"
},
{
'name': f"{params['city']}快捷酒店",
'price': random.randint(100, 300),
'rating': round(random.uniform(2.0, 4.0), 1),
'address': f"{params['city']}商业区"
}
]
return {'status': 'success', 'data': hotels}
# 工具3:景点推荐
class AttractionRecommendTool(BaseTool):
name = 'attraction_recommend'
description = '推荐城市旅游景点,需要城市名称和旅行天数'
def call(self, params: Dict) -> Dict:
attractions = {
1: [f"{params['city']}博物馆", f"{params['city']}历史街区"],
2: [f"{params['city']}国家公园", f"{params['city']}艺术中心"],
3: [f"{params['city']}周边古镇一日游"]
}
days = min(int(params['days']), 3)
return {'status': 'success', 'data': attractions.get(days, [])}
2.2 配置智能助手
from qwen_agent.agents import Assistant
class TravelPlanner(Assistant):
def __init__(self):
super().__init__(
tools=[
FlightSearchTool(),
HotelSearchTool(),
AttractionRecommendTool()
],
system_message="""
你是一个专业的旅行规划助手,需要:
1. 理解用户的旅行需求
2. 智能协调航班、酒店和景点的查询
3. 将原始数据整合成完整的旅行计划
4. 用友好的语气回复用户
"""
)
def _post_process(self, tool_name: str, result: Dict) -> str:
"""大模型对工具结果的后处理"""
if tool_name == 'flight_search':
flights = result.get('data', [])
return "找到以下航班选项:\n" + "\n".join(
f"{f['airline']} {f['flight_no']}: {f['departure']}→{f['arrival']} 价格:{f['price']}元"
for f in flights
)
elif tool_name == 'hotel_search':
hotels = result.get('data', [])
return "推荐以下酒店:\n" + "\n".join(
f"{h['name']}(评分:{h['rating']}) 价格:{h['price']}元/晚 地址:{h['address']}"
for h in hotels
)
elif tool_name == 'attraction_recommend':
attractions = result.get('data', [])
return "推荐景点:\n" + "\n".join(f"- {a}" for a in attractions)
return str(result)
2.3 使用示例
# 初始化旅行规划助手
planner = TravelPlanner()
# 复杂查询示例1
response = planner.run(
"我想下周从北京去上海玩3天,请帮我规划行程,"
"需要经济型航班和3星级以上的酒店"
)
print("示例1回复:")
print(response)
# 复杂查询示例2
response = planner.run(
"帮我安排一个周末杭州短途游,周五晚上出发周日返回,"
"预算5000元以内"
)
print("\n示例2回复:")
print(response)
3. 大模型的关键处理环节
3.1 意图识别与工具选择
大模型需要从用户输入中识别:
用户输入: "下周北京到上海3天游,要经济型航班" → 解析出: - 需要调用 flight_search (出发:北京, 到达:上海, 日期:下周) - 需要调用 hotel_search (城市:上海, 天数:3) - 需要调用 attraction_recommend (城市:上海, 天数:3)
3.2 参数智能生成
处理模糊时间表述:
"下周" → 计算出具体日期 "2023-11-20" "周末" → 识别为 "周五到周日" "3天" → 计算出离店日期
3.3 结果整合与自然语言生成
将原始数据整合为:
text 北京到上海旅行计划(11月20-22日): 航班选项: 1. 东方航空 MU1234: 北京 08:00→上海 11:00 价格:1200元 2. 南方航空 MU5678: 北京 14:00→上海 17:00 价格:980元 推荐酒店: 1. 上海国际大酒店(评分:4.5) 价格:800元/晚 地址:上海市中心区 2. 上海快捷酒店(评分:3.8) 价格:280元/晚 地址:上海商业区 推荐景点: - 上海博物馆 - 上海历史街区 - 上海国家公园
4. 进阶功能实现
4.1 多工具协同调用
def plan_complex_trip(self, user_input: str):
# 第一步:大模型解析需求
parsed = self.llm.parse_travel_request(user_input)
# 第二步:并行调用工具
flight_task = self.tool_engine.call_async(
'flight_search',
{
'departure_city': parsed['from'],
'arrival_city': parsed['to'],
'date': parsed['date']
}
)
hotel_task = self.tool_engine.call_async(
'hotel_search',
{
'city': parsed['to'],
'check_in': parsed['date'],
'check_out': parsed['end_date']
}
)
# 等待结果
flights = flight_task.result()
hotels = hotel_task.result()
# 第三步:大模型整合结果
return self.llm.generate_travel_plan(
user_request=user_input,
flights=flights,
hotels=hotels
)
4.2 预算智能分配
def optimize_for_budget(self, budget: float, options: Dict):
"""
大模型根据预算智能分配资源
:param budget: 总预算
:param options: 各选项列表
:return: 优化后的选择方案
"""
prompt = f"""
根据总预算{budget}元,从以下选项中做出最优组合:
航班选项: {options['flights']}
酒店选项: {options['hotels']}
请考虑:
- 性价比平衡
- 时间便利性
- 用户偏好(如存在)
"""
return self.llm.optimize_selection(prompt)
5. 生产环境增强建议
5.1 添加验证层
def validate_travel_request(self, params: Dict):
"""大模型验证参数合理性"""
if 'date' in params:
try:
datetime.strptime(params['date'], '%Y-%m-%d')
except ValueError:
return False
return True
5.2 实现对话状态管理
class ConversationState:
def __init__(self):
self.step = 1 # 1=收集需求, 2=确认细节, 3=展示结果
self.collected_info = {}
def update(self, user_input: str):
# 大模型分析对话状态
analysis = self.llm.analyze_conversation(
user_input,
current_state=self.__dict__
)
self.__dict__.update(analysis)
5.3 性能优化方案
# 缓存常见查询
from functools import lru_cache
@lru_cache(maxsize=100)
def get_cached_flights(departure, arrival, date):
return FlightSearchTool().call({
'departure_city': departure,
'arrival_city': arrival,
'date': date
})
这个实现展示了如何构建一个真正需要大模型智能处理的 Function Calling 系统,其中大模型在意图理解、参数生成、结果整合等关键环节都发挥着不可替代的作用。

