函数调用与工具使用入门 - Apideck

作者:API传播员 · 2025-12-16 · 阅读时间:6分钟
函数调用是大型语言模型(LLM)的关键功能,使AI模型能够通过自然语言与外部工具、API和函数交互,执行实际操作如获取实时数据、自动化任务和集成企业系统,从而提升应用性能。本文详细介绍了函数调用的工作原理、实际应用案例,并指导如何使用Ollama和Python构建AI搜索工具实现函数调用。

AI模型如何学会执行操作而非仅仅生成文本

函数调用是大型语言模型(LLM)的一项重要功能,它使得模型能够根据用户输入与外部工具、API和函数进行交互。通过函数调用,LLM不仅可以生成文本,还能够识别需要执行的具体操作,并请求外部函数来完成这些操作。

函数调用的核心在于,用户可以通过自然语言与复杂系统交互,而底层的函数执行则由LLM处理。这种方式让LLM能够专注于解决实际问题,而不仅仅是生成文本。

例如,当用户询问天气时,模型可以调用天气API获取实时数据,而不是仅提供一个泛泛的回答。如果天气预报显示可能下雨,模型还能提醒用户带伞。


函数调用的工作原理

以下是函数调用在LLM中实现的基本流程:

  1. 用户查询
    用户提出问题或请求执行某项操作,例如“我的CRM中有哪些潜在客户?”或“检查产品X是否有库存”。

  2. LLM处理
    LLM分析用户的查询,判断是否需要外部数据或操作来满足请求。例如:

    • 用户询问CRM中的潜在客户时,LLM会识别需要获取实时数据。
    • 用户请求库存信息时,LLM会触发数据库查询。
  3. 函数调用决策
    根据需求,LLM决定调用以下类型的函数:

    • API调用:连接外部服务(如通过Salesforce API获取CRM数据)。
    • 自定义函数:访问内部工具或数据库(如查询库存)。
  4. 数据检索
    调用的函数从外部服务或数据库中获取所需数据。

  5. 数据集成
    检索到的数据被返回给LLM,模型对其进行处理并生成上下文相关的准确响应。


函数调用的实际应用及性能提升

通过函数调用,LLM的能力不仅限于文本生成,还能动态执行多种操作,从而显著提升实际应用中的性能。以下是一些典型用例:

1. 提供最新信息

通过函数调用,模型可以访问实时数据。例如,回答当前事件相关的问题时,模型可以调用新闻API获取最新信息,避免信息过时。

2. 自动化重复性任务

函数调用可以自动完成许多重复性任务。例如,用户请求安排会议时,LLM可以调用日历API自动添加事件,从而节省时间并减少手动操作。

3. 与其他服务集成

LLM可以与数据库、CRM或其他企业系统无缝连接,使其在专业环境中更具适应性和实用性。

4. 处理复杂工作流程

LLM能够协调多个函数调用来完成复杂任务。例如,规划一次旅行时,模型可以通过不同API检查航班、预订酒店并租车。

5. 动态更新功能

无需重新训练模型即可扩展其功能。通过集成新的API或工具,LLM可以快速适应变化,保持系统的最新状态。


函数调用的实际案例

如果您曾使用过ChatGPT市场中的GPT模型,可能已经体验过函数调用的强大功能。这些模型通过自定义功能实现了多种工具,例如待办事项列表生成器、提示增强器、应用连接器和问答机器人。

ChatGPT的“任务”功能就是一个典型案例,它可以通过触发特定功能来设置提醒。类似地,Claude的模型上下文协议(MCP)也支持工具调用,例如激活Brave Search获取网络结果或连接其他应用程序。这些功能展示了AI如何通过函数调用将智能与现实世界的工具结合起来。


支持函数调用的AI模型

以下是一些支持函数调用功能的主要AI模型及其版本:

  • OpenAI: GPT-4o
  • Meta: 骆驼 3.3
  • Google: Gemini 2.0 Flash实验版
  • Anthropic: Claude
  • Cohere: R司令部+
  • Mistral: Mistral大模型、Mistral小模型等

这些模型大多可以通过API访问,其中部分模型也支持通过Ollama本地使用。


创建一个AI搜索工具:使用Ollama实现函数调用

我们将构建一个基于Ollama的AI搜索工具,其中Llama 3.2模型作为决策者。它会分析用户查询是否需要实时网络数据,并通过调用web_search工具获取结果。

所需工具和环境

  1. Ollama:本地运行Llama 3.2模型。
  2. Python 3.11+:支持异步操作以提升性能。
  3. SearchAPI:免费版每天支持100次请求。

项目结构

项目文件夹结构如下:

项目文件夹/
├── .env
├── search_tool.py
└── main.py
  • .env:存储API密钥,确保安全性。
  • search_tool.py:实现搜索逻辑,便于复用。
  • main.py:负责模型与工具的交互编排。

安装依赖

运行以下命令安装必要的依赖项:

pip install ollama python-dotenv requests

核心代码实现

定义搜索工具

以下是search_tool.py中的代码,用于定义搜索工具并处理API调用:

from typing import Dict, Any
import os
import requests
from dotenv import load_dotenv

def web_search(query: str) -> Dict[Any, Any]:
    load_dotenv()
    api_key = os.getenv('SEARCH_API_KEY')
    if not api_key:
        return {"error": "API密钥未找到"}

    url = "https://www.searchapi.io/api/v1/search"
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    }
    params = {
        "engine": "google_news",
        "q": query,
        "num": 5
    }
    try:
        response = requests.get(url, headers=headers, params=params)
        response.raise_for_status()
        return response.json()
    except requests.exceptions.RequestException as e:
        return {"error": f"获取搜索结果时出错:{e}"}

主程序逻辑

以下是main.py的代码,用于协调模型与工具的交互:

import asyncio
from ollama import AsyncClient
from search_tool import web_search

async def process_query(query: str) -> str:
    client = AsyncClient()
    search_tool = {
        "type": "function",
        "function": {
            "name": "web_search",
            "description": "在网络上搜索关于主题的当前信息",
            "parameters": {
                "type": "object",
                "required": ["query"],
                "properties": {
                    "query": {"type": "string", "description": "要查找的搜索查询"}
                }
            }
        }
    }
    response = await client.chat('llama3.2', messages=[{"role": "user", "content": query}], tools=[search_tool])
    if response.message.tool_calls:
        for tool in response.message.tool_calls:
            if tool.function.name == "web_search":
                search_results = web_search(tool.function.parameters["query"])
                return search_results.get("content", "未找到相关信息")
    return response.message.content

if __name__ == "__main__":
    asyncio.run(process_query("今天的天气如何?"))

结论

函数调用赋予了AI模型更强大的能力,使其不仅能生成文本,还能通过连接工具和API执行实际操作。这种功能让AI从简单的聊天助手转变为动态的任务自动化工具,能够实时获取数据、处理复杂工作流程,并与其他系统无缝集成。未来,函数调用将进一步推动AI在各领域的应用和发展。

原文链接: https://www.apideck.com/blog/llm-tool-use-and-function-calling