函数调用与工具使用入门 - Apideck
AI模型如何学会执行操作而非仅仅生成文本
函数调用是大型语言模型(LLM)的一项重要功能,它使得模型能够根据用户输入与外部工具、API和函数进行交互。通过函数调用,LLM不仅可以生成文本,还能够识别需要执行的具体操作,并请求外部函数来完成这些操作。
函数调用的核心在于,用户可以通过自然语言与复杂系统交互,而底层的函数执行则由LLM处理。这种方式让LLM能够专注于解决实际问题,而不仅仅是生成文本。
例如,当用户询问天气时,模型可以调用天气API获取实时数据,而不是仅提供一个泛泛的回答。如果天气预报显示可能下雨,模型还能提醒用户带伞。
函数调用的工作原理
以下是函数调用在LLM中实现的基本流程:
-
用户查询
用户提出问题或请求执行某项操作,例如“我的CRM中有哪些潜在客户?”或“检查产品X是否有库存”。 -
LLM处理
LLM分析用户的查询,判断是否需要外部数据或操作来满足请求。例如:- 用户询问CRM中的潜在客户时,LLM会识别需要获取实时数据。
- 用户请求库存信息时,LLM会触发数据库查询。
-
函数调用决策
根据需求,LLM决定调用以下类型的函数:- API调用:连接外部服务(如通过Salesforce API获取CRM数据)。
- 自定义函数:访问内部工具或数据库(如查询库存)。
-
数据检索
调用的函数从外部服务或数据库中获取所需数据。 -
数据集成
检索到的数据被返回给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工具获取结果。
所需工具和环境
- Ollama:本地运行Llama 3.2模型。
- Python 3.11+:支持异步操作以提升性能。
- 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
最新文章
- 函数调用与工具使用入门 – Apideck
- 什么是API测试?其优势、类型及最佳实践
- API 安全策略和基础指南
- 如何在Python、PHP、Ruby中使用今日头条热搜榜API
- 如何获取文心一言 API Key 密钥(分步指南)
- 2025 ComfyUI 稳定扩散流水线|拖拽式节点化+API 集成教程
- Flask-Limiter:为 API 添加访问速率限制的 Python 扩展!
- OpenAI o1原理逆向工程图解
- 性别预测API:如何让名字背后的性别信息一目了然?
- 小红书AI文章风格转换:违禁词替换与内容优化技巧指南
- REST API 设计:过滤、排序和分页
- 认证与授权API对比:OAuth vs JWT