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 系统,其中大模型在意图理解、参数生成、结果整合等关键环节都发挥着不可替代的作用。