图片来源:superface.ai
函数调用正在改变人工智能应用的格局。这一功能使得大型语言模型(LLMs)能够与外部工具和API无缝交互,显著增强了它们的能力。在这篇博客中,我们将探讨函数调用的概念、其工作流程以及实际应用。
什么是函数调用?函数调用,通常称为工具使用,是LLM连接外部工具的一个重要功能。这一能力使得模型能够通过将复杂任务分解为可管理的部分来执行这些任务,从而提高任务处理和执行的效率。
最初由OpenAI在2023年7月为其GPT模型引入的功能调用,此后已被包括Google和Anthropic在内的多家竞争对手采用。这种广泛采用突显了其在开发能够依赖大型语言模型(LLMs)作为核心组件的自主AI代理中的重要性。
函数调用在AI中的重要性随着AI应用程序变得越来越复杂,对函数调用的需求也在增长。这一功能允许开发人员描述LLM可以根据用户提示调用的函数。通过这种方式,它可以实现实时与数据库、API和其他外部服务的交互。
例如,如果用户请求需要访问数据库或执行计算的信息,模型可以调用必要的函数来检索这些信息,从而提供更有效的响应。
函数调用工作流理解函数调用的工作流程对于其实现至关重要。以下是一个简化的概述,介绍了函数调用在AI代理中的工作方式:
- 用户输入: 过程始于用户的输入,这可以是从简单到复杂的任务。
- 任务评估: 模型评估任务是否可以直接处理,或者是否需要调用函数。
- 函数调用: 如果任务复杂,模型会识别所需的函数并调用它们。
- 输出整合: 调用函数的输出随后被整合到模型的最终响应中。
为了说明函数调用的概念,让我们通过一个查询天气数据和当前新闻的实例来探索其实现。我们将使用一个天气数据API和一个搜索功能来收集新闻。
设置环境对于此实现,我们将使用SingleStore的笔记本功能,该功能与Jupyter Notebooks类似。此平台允许轻松集成和执行代码。
首先,在 SingleStore 注册并创建一个新的笔记本。你需要导入必要的库,包括 OpenAI API 和一个搜索库。
定义工具和函数在我们的示例中,我们将定义两个主要函数:
- 获取天气信息: 此功能将调用 Open Weather Map API 以根据用户输入获取天气数据。
- 搜索互联网: 此功能将利用搜索API根据用户查询获取最新新闻文章。
以下是我们将如何使用函数调用的分步方法。
步骤 1 : 定义工具 — 从 Open Weather Map 获取天气数据 API,从 Duck Duck Go 搜索互联网。从 官方网站 获取你的 Open Weather Map API 密钥。
步骤 2:实现 search_internet 和 get_weather_info 函数。
步骤 3:初始化 OpenAI 客户端。
步骤 4 : 定义主要的对话函数 run_conversation。
步骤 5 : 使用我们的工具运行对话。
像上面说的,我使用的是SingleStore笔记本(就像Jupyter笔记本,但增加了更多功能)来运行代码并理解函数调用是如何工作的。注册SingleStore并免费开始使用。
一旦你注册完毕,前往“数据工作室”标签并创建一个新的笔记本。
一旦你准备好新的笔记本,让我们开始添加代码。
导入所需的库
!pip install openai duckduckgo_search --quiet
定义工具/APIs
first_tools = [
# 工具1 - 获取天气信息
{
"type": "function",
"function": {
"name": "get_weather_info",
"description": "获取特定地点的当前天气信息",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "获取天气信息的位置,即城市名称或坐标",
}
},
"required": ["location"],
},
},
},
# 工具2 - 搜索互联网
{
"type": "function",
"function": {
"name": "search_internet",
"description": "获取实时互联网搜索结果",
"parameters": {
"type": "object",
"properties": {
"search_query": {
"type": "string",
"description": "用于搜索网络的查询",
}
},
"required": ["search_query"],
},
},
}
]
实现功能
定义 search_internet
和 get_weather_info
函数。
from duckduckgo_search import DDGS
import requests
def search_internet(search_query: str) -> list:
results = DDGS().text(str(search_query), max_results=5)
return results
def get_weather_info(location: str) -> dict:
api_key = "add your open weather map api key"
url = f"http://api.openweathermap.org/data/2.5/weather?q={location}&appid={api_key}&units=metric"
response = requests.get(url)
if response.status_code == 200:
data = response.json()
return {
"temperature": data["main"]["temp"],
"description": data["weather"][0]["description"],
"humidity": data["main"]["humidity"],
"wind_speed": data["wind"]["speed"]
}
else:
raise Exception(f"Failed to fetch weather information: {response.status_code}")
初始化OpenAI客户端
在调用 run_conversation 函数之前,初始化 OpenAI 客户端。
from openai import OpenAI
import json
# 初始化 OpenAI 客户端
client = OpenAI(api_key="添加你的 OpenAI API 密钥")
定义主要对话函数
集成新功能到您的对话工作流程中。
import inspect
# 主对话函数
def run_conversation(prompt, tools, tool_choice = "auto"):
messages = [{"role": "user", "content": prompt}]
print("\n初始消息: ", messages)
# 将对话和可用功能发送给模型
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=tools,
tool_choice=tool_choice,
)
response_message = response.choices[0].message
print("\n响应消息: ", response_message)
tool_calls = response_message.tool_calls
print("\n工具调用: ", tool_calls)
# 检查模型是否想要调用一个函数
if tool_calls:
# 调用函数
available_functions = {
"get_weather_info": get_weather_info,
"search_internet": search_internet,
}
# 用助手的回复扩展对话
messages.append(response_message)
# 调用函数并添加响应
for tool_call in tool_calls:
function_name = tool_call.function.name
function_to_call = available_functions[function_name]
function_args = json.loads(tool_call.function.arguments)
# 获取函数签名并使用给定参数调用函数
sig = inspect.signature(function_to_call)
call_args = {
k: function_args.get(k, v.default)
for k, v in sig.parameters.items()
if k in function_args or v.default is not inspect.Parameter.empty
}
print(f"\n调用 {function_to_call} 参数为 {call_args}")
function_response = str(function_to_call(**call_args))
print("\n函数响应: ", function_response)
# 将输出放入工具消息中
tool_message = {
"tool_call_id": tool_call.id, # 用于并行工具调用
"role": "tool",
"name": function_name,
"content": function_response,
}
print("\n附加消息: ", tool_message)
# 用函数响应扩展对话
messages.append(tool_message)
# 从模型获取新的响应,其中可以看到整个对话,包括函数调用输出
second_response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
)
print("\n大语言模型响应: ", second_response)
print("\n---格式化的大语言模型响应---")
print("\n",second_response.choices[0].message.content)
return
运行对话
现在,使用 run_conversation
函数和你的工具。
prompt = "德里现在的天气怎么样?香港呢?还有,印度最近有什么新闻?"
run_conversation(prompt, first_tools)
这里是你可以尝试的完整代码仓库。
GitHub - pavanbelagatti/Function-Calling-Tutorial通过在 GitHub 上创建一个帐户来为 pavanbelagatti/Function-Calling-Tutorial 的开发做出贡献。
或者你更喜欢通过视频来学习,从 YouTube 视频中更容易理解,这里是我的关于函数调用的详细视频。
函数调用是一项强大的功能,能够显著增强大型语言模型的能力。通过让这些模型能够与外部API和工具进行交互,开发人员可以创建更加自主和有效的AI应用程序。
在这篇博客中,我们探讨了函数调用的定义、其工作流程以及一个实际的实现示例。随着AI技术的不断发展,掌握函数调用对于充分发挥LLM在各种应用中的潜力将至关重要。
为进一步探索,可以考虑使用提供的代码并根据您的需求进行调整。将函数调用集成到您的AI应用程序中可以带来更动态和响应迅速的用户交互。
共同學習,寫下你的評論
評論加載中...
作者其他優質文章