Owen_agent需要大模型处理的Function Calling

作者: adm 分类: AI 发布时间: 2025-02-18

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

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!