你是否曾惊叹于 ChatGPT 这样的大语言模型(LLM)理解和生成文本的能力,但又希望它们能做得更多?如果它们能够从互联网上获取实时数据,与 API 交互,并充当现实世界应用程序的智能大脑,那该有多好?这就是工具调用(Tool Calling,或称函数调用 Function Calling)的用武之地,它正在改变游戏规则!
大语言模型(LLM)的智能与工具调用的实用性
大语言模型在海量文本数据上训练而成,因此在理解语言、总结信息甚至编写代码方面表现出色。然而,它们的知识通常是静态的,停留在上次训练运行时的状态。它们无法独立告诉你今天的天气或获取最新新闻。工具调用弥补了这一差距。它允许大语言模型:
- 识别用户的请求何时需要外部信息或操作。
- 确定要使用的正确“工具”(你定义的函数)。
- 从用户的查询中提取该工具所需的必要参数。
- 请求你的应用程序运行该工具。
- 接收工具的输出并使用该信息来形成全面的答案。
把它想象成一个智能助手,它不仅知道事情,而且知道如何通过使用特定资源来找到新的东西。对于我们的项目,NASA 的 API 是我们宇宙数据的宝库!例如,如果用户询问“今天的日冕物质抛射活动如何?”,LLM可以通过工具调用去访问NASA的太空天气API,获取相关数据,然后将数据整合到答案中,而不是仅仅依靠预训练的知识。
NASA API:连接宇宙数据
NASA API 为我们提供了大量关于太空的公开数据,例如每日天文图片、火星探测车拍摄的照片、小行星信息等。 这些 API 的易用性和丰富的数据内容,使得它们成为 LLM 学习如何与外部世界交互的绝佳起点。例如,NASA 的 APOD(Astronomy Picture of the Day)API每天都会提供一张精美的天文照片,配有详细的解释。通过工具调用,我们可以让 LLM 根据用户指定的日期,自动获取并展示 APOD 的信息,从而创建一个交互式的宇宙探索工具。
根据NASA官网统计,APOD API每日被调用超过百万次,这足以说明其受欢迎程度和实用价值。 除了APOD API,NASA还提供了大量的其他API,例如:
- Near Earth Object Web Service (NEOWS):用于查询近地天体的信息。
- Mars Rover Photos API:用于获取火星探测车拍摄的照片。
- Space Weather Database of Notifications, Knowledge, Information (DONKI):用于获取太空天气信息。
这些API为我们提供了无限的可能性,可以创建各种有趣和实用的应用。
工具调用 (Tool Calling):赋能LLM的关键
工具调用 是使 LLM 真正有用的关键。它允许 LLM 超越其自身的知识边界,并根据需要访问和使用外部信息和资源。具体来说,工具调用的工作原理如下:
- 定义工具: 首先,我们需要定义 LLM 可以使用的工具。这通常涉及编写一个函数,该函数可以执行特定的任务,例如从 API 获取数据或执行计算。同时,我们需要为 LLM 提供关于该工具的详细描述,包括其名称、功能和所需的参数。例如,我们可以定义一个名为 “get_weather” 的工具,用于获取指定城市的天气信息。该工具需要一个参数:城市名称。
- LLM 识别工具需求: 当用户向 LLM 发出请求时,LLM 会分析该请求,以确定是否需要使用任何工具。如果 LLM 认为需要使用工具,它会选择最合适的工具,并提取所需的参数。例如,如果用户询问 “北京今天天气怎么样?”,LLM 可能会识别出需要使用 “get_weather” 工具,并将城市名称设置为 “北京”。
- 调用工具并获取结果: LLM 会将工具的名称和参数发送给应用程序。应用程序会调用相应的工具,并将结果返回给 LLM。例如,应用程序会调用 “get_weather” 工具,并将 “北京” 作为参数传递给它。该工具会从天气 API 获取北京的天气信息,并将结果返回给 LLM。
- LLM 生成最终答案: LLM 使用工具返回的结果来生成最终答案。例如,LLM 可能会说 “北京今天天气晴朗,温度 25 度。”
工具调用的优势在于,它允许 LLM 处理超出其自身知识范围的问题,并提供更准确和有用的答案。它还可以使 LLM 能够执行各种任务,例如预订机票、发送电子邮件或控制智能家居设备。
构建 NASA APOD Explorer:一个实践案例
为了更好地理解 工具调用 的工作原理,我们可以构建一个简单的 NASA APOD Explorer 应用。这个应用允许用户询问特定日期的 APOD,并显示相应的图像和解释。
以下是构建该应用的关键步骤:
- 获取 NASA API 密钥: 首先,我们需要从 NASA 官网获取一个免费的 API 密钥。
- 定义 get_apod_data 工具: 接下来,我们需要定义一个名为 “get_apod_data” 的工具,用于获取指定日期的 APOD 信息。该工具需要一个参数:日期(YYYY-MM-DD 格式)。
- 编写 get_apod_data 函数: 我们需要编写一个 Python 函数来实现 “get_apod_data” 工具的功能。该函数将使用 NASA API 密钥和日期参数来调用 APOD API,并返回 APOD 的标题、解释和图像 URL。
- 集成 LLM: 我们可以使用 OpenAI 或其他 LLM API 来集成 LLM。我们需要将 “get_apod_data” 工具的描述信息传递给 LLM,以便 LLM 知道如何使用该工具。
- 创建用户界面: 我们可以使用 Gradio 或其他 UI 框架来创建一个简单的用户界面,允许用户输入日期并显示 APOD 信息。
通过这个实践案例,我们可以深入了解 工具调用 的工作原理,并掌握如何使用 LLM 来访问和利用外部数据。
代码亮点:关键代码片段解析
以下是构建 NASA APOD Explorer 应用的一些关键代码片段:
1. 定义 “get_apod_data” 工具 (app.py):
tools_list = [
{
"type": "function",
"function": {
"name": "get_apod_data",
"description": "Fetches the NASA Astronomy Picture of the Day (APOD). "
"If a date is provided (YYYY-MM-DD), it fetches APOD for that date. "
"Otherwise, it fetches today's APOD.",
"parameters": {
"type": "object",
"properties": {
"date_str": {
"type": "string",
"description": "The date to fetch APOD for, in YYYY-MM-DD format "
"(e.g., '2024-05-15'). Optional.",
}
},
"required": [], # date_str is optional for our APOD tool
},
},
}
]
这段代码定义了一个 JSON 结构,描述了 “get_apod_data” 工具的名称、功能和所需的参数。这个 JSON 结构会被传递给 LLM,以便 LLM 知道如何使用该工具。
2. 编写 “get_apod_data” 函数 (space_tools.py):
import requests
import os
NASA_API_KEY = os.getenv("NASA_API_KEY") # Securely loaded
def get_apod_data(date_str: str = None):
"""
Fetches the NASA Astronomy Picture of the Day (APOD).
If a date is provided (YYYY-MM-DD), it fetches APOD for that date.
Otherwise, it fetches today's APOD.
"""
if not NASA_API_KEY:
return {"error": "NASA_API_KEY not configured."}
base_url = "https://api.nasa.gov/planetary/apod"
params = {"api_key": NASA_API_KEY}
if date_str:
params["date"] = date_str
try:
response = requests.get(base_url, params=params)
response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx)
data = response.json()
return {
"title": data.get("title"),
"explanation": data.get("explanation"),
"image_url": data.get("hdurl") or data.get("url"),
"media_type": data.get("media_type"),
"date": data.get("date")
}
except requests.exceptions.RequestException as e:
return {"error": f"API request failed: {e}"}
except (KeyError, TypeError) as e:
return {"error": f"Error parsing API response: {e}"}
这段代码实现了 “get_apod_data” 工具的功能。它使用 requests
库来调用 APOD API,并返回 APOD 的标题、解释和图像 URL。
3. 集成 LLM (app.py):
def process_query_with_llm(user_query):
messages = [{"role": "user", "content": user_query}]
response = llm_client.chat.completions.create(
model=MODEL_TO_USE, # e.g., "llama3-8b-8192"
messages=messages,
tools=tools_list, # <-- We pass our defined tools
tool_choice="auto" # <-- LLM decides if a tool is needed
)
response_message = response.choices[0].message
tool_calls = response_message.tool_calls
if tool_calls:
# LLM wants to call a tool!
tool_call = tool_calls[0] # Assuming one tool call for simplicity
function_name = tool_call.function.name
function_args = json.loads(tool_call.function.arguments)
if function_name == "get_apod_data":
# Call our Python function
api_response_data = get_apod_data(**function_args)
# Send the result back to the LLM
messages.append(response_message) # Add LLM's request
messages.append({
"tool_call_id": tool_call.id,
"role": "tool",
"name": function_name,
"content": json.dumps(api_response_data), # Tool output must be a string
})
# Second call to LLM, now with tool results
final_response = llm_client.chat.completions.create(
model=MODEL_TO_USE, messages=messages
)
return final_response.choices[0].message.content, api_response_data.get("image_url")
else:
# LLM answered directly
return response_message.content, None
这段代码演示了如何将 LLM 与 “get_apod_data” 工具集成。它首先将用户的查询发送给 LLM,并告诉 LLM 可以使用 “get_apod_data” 工具。如果 LLM 决定使用该工具,它会返回一个包含工具名称和参数的 JSON 结构。然后,应用程序会调用 “get_apod_data” 函数,并将结果返回给 LLM。最后,LLM 使用工具返回的结果来生成最终答案。
工作流程:工具调用的魔力
当我们询问 “显示昨天 APOD” 时,以下是 工具调用 的工作流程:
- 用户提问: 用户的查询进入 Gradio UI。
- LLM 思考: 我们的
app.py
将您的查询以及get_apod_data
工具的描述发送给 LLM (例如, Llama 3 on Groq)。 - LLM 决定: LLM 识别出 “昨天 APOD” 与
get_apod_data
工具匹配。它意识到需要找到 “昨天的日期” (或者 LLM 甚至可能要求你的get_apod_data
工具来计算 “昨天”,如果你这样设计它,尽管通常 LLM 会计算日期参数)。 - LLM 指示: LLM 并没有给出 APOD 信息,而是回复我们的
app.py
一个结构化的信息: “调用get_apod_data
函数,并将date_str
设置为 YYYY-MM-DD (昨天的日期)。” - Python 行动: 我们的
app.py
代码看到这个指令,调用我们的实际get_apod_data(date_str="...")
Python 函数。 - NASA 响应:
get_apod_data
联系 NASA APOD API,获取图片的标题、解释和图像 URL。 - 数据返回 LLM: 这些信息被
app.py
发送回 LLM。 - LLM 整合: 现在,LLM 接受你的原始问题 (“昨天 APOD”) 和来自 NASA 的数据,并创建一个友好、人性化的回答,例如 “昨天的每日天文图片是 ‘XYZ’… 这是图片!”
- 用户看到: Gradio UI 显示文本和图像。
展望未来:无限可能
这个 APOD Explorer 只是一个起点。想象一下以下的可能性:
- 火星探测车照片机器人: “使用 Mastcam 显示 Sol 1000 的 Curiosity 探测车照片。”
- 小行星追踪器: “下周是否有任何潜在危险的小行星经过地球?”
- 太空天气报告员: “最新的太阳耀斑活动是什么?”
除了 NASA,还可以连接到天气 API、股票市场数据、您自己的数据库、智能家居设备…任何具有 API 的东西!工具调用 将 LLM 从知识渊博的对话者转变为能够与数字世界交互并采取行动的有能力的代理。
结论
工具调用是连接大语言模型和外部世界的桥梁,通过结合 NASA API 等数据源,我们可以构建出各种有趣和实用的应用。无论是探索宇宙奥秘,还是解决现实生活中的问题,工具调用都为我们打开了无限的可能。希望本文能够帮助你理解 工具调用 的概念和实践,并激发你创造出更多令人惊叹的 LLM 应用!现在就开始你的 LLM 项目吧,天空不是极限!
获取代码和参与讨论
- GitHub 代码库:https://github.com/rajashekarkasturi/space-tool
- Hugging Face Spaces 演示:https://huggingface.co/spaces/rajakasturi/space-tool