工具调用(Tool Calling)解析与智能旅行规划助手实战全景

一、工具调用是什么

在 AI 应用开发中,工具调用 是一种让大语言模型(LLM)借助外部工具完成自身能力边界之外任务的技术。
它相当于给 AI 装上了 “手” 和 “脚”,不仅能给出文字回答,还能操作本地文件、联网搜索、抓取网页、执行终端命令、下载资源、生成 PDF 等。

本质上,工具可以是任何外部 API、可执行函数、数据库连接或一段脚本。模型本身只负责判断 “是否需要使用某个工具” 以及 “需要传递什么参数”,真正执行工具的是我们编写的应用程序。


二、工作原理:AI 打申请,程序来执行

很多人会误以为工具调用是 AI 服务端直接调用你的程序,其实 所有操作都由你的应用控制。整个过程分步如下:

  1. 定义工具:告诉 AI 有哪些工具可用,每个工具的功能、名称、参数说明等。
  2. 用户提问:用户通过应用程序提出问题。
  3. AI 分析并请求工具:模型分析问题后,如果判断需要借助工具,会返回一个 “工具调用请求”,包含工具名称和所需参数。
  4. 程序执行工具:你的应用收到该请求后,从本地工具集中找到对应函数并执行,拿到执行结果。
  5. 结果回传:应用程序将工具返回的数据再交给模型。
  6. 生成最终回复:模型基于工具结果组织和生成最终回答,返回给用户。

这种设计的关键在于 安全性:模型永远接触不到你的真实 API 密钥或系统资源,所有危险操作都必须经过你的程序把关。比如用户让 AI “拆掉这栋房子”,AI 最多表示 “需要用到爆破工具”,但最终是否执行,由你的代码进行权限校验。


三、工具调用与 Function Calling 是同一回事

你可能会看到不同平台使用 “Tool Calling” 或 “Function Calling” 的说法,实际上两者是 完全等价 的概念,只是各个厂商习惯的命名不同。


Spring 官方文档明确 Tool Calling 和 Function Calling 为同一种机制

在 Python 生态中,OpenAI、DeepSeek 等接口常用 tools 参数传递工具定义,LangChain、LlamaIndex 等框架也统一使用 “Tool” 来表示可被模型调用的函数。


四、技术选型与 Python 生态

实现工具调用的核心任务包括:

  • 工具定义(描述功能和参数)
  • 与模型的多轮交互(请求 → 执行 → 回传)
  • 工具执行与结果处理

在 Python 项目中,你可以选择:

  • 直接调用大模型 API:如 OpenAI / DeepSeek / Qwen 的 Chat Completion 接口,手动解析返回的 tool_calls 字段,然后执行对应函数,再将结果以 tool 角色发回。
  • 使用 LLM 开发框架
    • LangChain:提供了完整的 Tool、ToolExecutor、Agent 体系,一键式集成。
    • LlamaIndex:通过 QueryPipeline 和 FunctionTool 可以实现类似机制。
    • Semantic Kernel (Microsoft):也支持基于 Plugin 的工具调用。
  • 使用模型服务商的 SDK:OpenAI、DashScope、Baidu Qianfan 等 SDK 均提供工具调用的封装。

所有技术的前提是:模型本身必须支持工具调用,否则即便你发送工具定义,模型也不会返回调用请求。各个模型厂商的文档中一般都会明确说明是否支持。


五、常用工具类型与开发实践

教程中通过具体需求引出六大类工具,以下逐一解释设计思路和 Python 实现要点,避免直接使用 Spring/Java 代码

5.1 文件操作工具

  • 功能:保存文件(将 AI 生成的文本内容写入磁盘)、读取文件(从指定目录读取文件内容)。
  • 重要考虑:文件必须统一存储在一个隔离的目录中(例如项目根目录下的 /tmp/file),防止 AI 越权访问系统关键路径。
  • Python 示例逻辑

python

import os

FILE_DIR = os.path.join(os.getcwd(), "tmp", "file")
os.makedirs(FILE_DIR, exist_ok=True)

def read_file(file_name: str) -> str:
    file_path = os.path.join(FILE_DIR, file_name)
    with open(file_path, "r", encoding="utf-8") as f:
        return f.read()

def write_file(file_name: str, content: str) -> str:
    file_path = os.path.join(FILE_DIR, file_name)
    with open(file_path, "w", encoding="utf-8") as f:
        f.write(content)
    return f"File written to {file_path}"
  • 工具描述建议:清晰说明文件名参数必须是纯文件名(不带路径),内容为纯文本或 Markdown。

5.2 联网搜索工具

  • 功能:根据关键词调用搜索引擎 API(如 Bing Search、SearchAPI 等),返回前几条有机结果的摘要和链接。
  • 实现方式:申请一个联网搜索 API 的访问凭证(API Key),通过 HTTP 请求查询,解析 organic_results 字段。
  • Python 示例逻辑

python

import requests

def search_web(query: str) -> str:
    url = "https://www.searchapi.io/api/v1/search"
    params = {"q": query, "api_key": "YOUR_API_KEY", "engine": "baidu"}
    resp = requests.get(url, params=params)
    data = resp.json()
    results = []
    for item in data.get("organic_results", [])[:5]:
        results.append(f"{item['title']} - {item['link']}")
    return "\n".join(results)
  • 安全提醒:API Key 不要硬编码在源码中,统一使用环境变量或 .env 文件管理,并在 .gitignore 中排除。

(此处插入图片:SearchAPI 官网获取 API Key 的界面截图)
图 4:在联网搜索服务中获取 API Key,注意保护好隐私

5.3 网页抓取工具

  • 功能:用户给一个网址,AI 调用抓取工具获取网页内容,然后进行分析或摘要。
  • 方案:使用 requests + BeautifulSoup 清洗出纯文本,避免带入过多的 HTML 标签干扰模型理解;也可调用 Jina Reader 等专用抓取服务。
  • 注意事项:设置超时、处理反爬异常、控制抓取内容长度(一般截取前几千字符),防止 token 溢出。

5.4 终端操作工具

  • 功能:执行指定的终端命令(如运行 Python 脚本生成报告、统计文件行数等),并将标准输出返回给 AI。
  • Python 实现

python

import subprocess

def execute_command(command: str) -> str:
    try:
        result = subprocess.run(command, shell=True, capture_output=True, text=True, timeout=30)
        return result.stdout or result.stderr
    except Exception as e:
        return f"Command failed: {str(e)}"
  • 安全提示:终端操作极具危险性,必须限制可运行的命令白名单,且避免直接使用用户输入的原始命令。

5.5 资源下载工具

  • 功能:根据 URL 下载图片、音频、视频等资源,保存到本地服务器,返回本地路径。
  • 典型用途:用户让 AI 帮忙下载一张星空壁纸,工具下载后存储到文件目录,后续可由文件操作工具读取或发送给用户。
  • Python 实现:使用 requests 流式下载,注意判断文件类型,自动命名。

5.6 PDF 生成工具

  • 功能:将 Markdown 或纯文本内容渲染为 PDF 文件,保存并返回路径。
  • 方案:Python 中可使用 python-docx 先生成 Word,再借助 docx2pdf 或直接使用 fpdf / reportlab / weasyprint 等库。也可以调用外部服务如 Google Chrome headless 模式打印 PDF。
  • 技巧:工具描述中明确说明参数为 “PDF 的完整文本内容”,让模型学会一次性提供全量文本。

六、工具调用的进阶话题

6.1 工具的动态注册

在真实生产环境中,工具可能不是一成不变的。比如根据用户会员等级决定是否提供高级搜索工具。
Python 中可以在运行时根据配置动态加载工具函数列表,再传入给模型。例如:

python

def get_available_tools(user_level):
    tools = [{"name": "file_read", ...}]
    if user_level == "pro":
        tools.append({"name": "pdf_generate", ...})
    return tools

6.2 多工具协同与链式调用

AI 可以一次调用多个工具,也可以将前一个工具的输出作为下一个工具的输入。例如:

  1. 用户:“搜索上海近3天的天气,生成一份出行建议 PDF”
  2. AI 先调用 联网搜索 获取天气数据
  3. 拿到天气数据后,调用 PDF 生成工具 将结果写入 PDF
  4. 最后返回 “PDF 已生成,路径为 …”

程序需要支持多轮循环,直到模型返回普通回复文本而不是新的工具调用请求为止。

6.3 错误处理与容错

工具执行可能失败(网络超时、API 超量、文件权限不足等)。必须将错误信息以字符串形式返回给模型,让模型判断是否需要重试或更换策略。
在 Python 中强烈推荐捕获异常并返回描述性错误,如:

python

return f"Error: 文件读取失败 - {str(e)},请检查文件名是否正确。"

这样模型就有机会调整参数再次调用。

6.4 安全与权限控制

由于模型可能被诱导调用危险工具,务必做到:

  • 所有工具必须限定作用域(如文件操作固定在指定目录)
  • 终端命令限制白名单,严禁执行 rm -rf 等破坏性指令
  • 联网请求对 URL 进行校验,禁止访问内网地址
  • 在工具执行前增加人工确认环节(敏感场景)

七、补充内容:后续计划添加的工具列表

以下工具将按优先级逐步集成到我们的 AI 智能体项目中,覆盖出行决策、实时信息查询、行程管理和个性化体验等场景。每款工具都遵循统一规范:清晰的输入/输出定义、合理的免费或商用 API 选型,以及充分的错误处理设计。


地理位置与周边发现

  1. 地点搜索 search_places
    根据查询词、位置偏好(经纬度 + 半径)和最大结果数,返回周边地点列表,包含 place_id、名称、地址、坐标、评分、营业时间、价格区间、照片等信息。
    适合查找景点、餐厅、酒店、商店等。可使用 Google Places API、高德地图 POI 搜索或大众点评开放接口实现。
  2. 地图路线规划 get_directions
    输入起点、终点、途经点及交通方式(驾车、步行、公交、骑行等),返回路线总时长、距离以及分段指引。
    典型用途:规划一天游览动线,估算通勤时间。可接入 Google Maps Directions API 或高德路径规划服务。

实时信息查询

  1. 天气查询 get_weather
    输入地点(城市名或经纬度)和日期范围,返回温度、降水、风力、气象预警等结构化数据。
    用于判断行程是否需要调整,并提供穿衣建议。免费 API 如 OpenWeatherMap 或和风天气即可满足需求。
  2. 网络搜索 web_search
    输入查询词,返回网页摘要和链接。
    用作 RAG 知识库的实时补充,处理最新签证政策、景区临时关闭通知等知识库覆盖不到的动态信息。

高价值出行工具

  1. 航班查询 search_flights
    输入出发地、目的地、日期、舱位、人数,返回航班号、起降时间、价格、中转详情。
    价格波动大,必须实时查询,绝不能依赖缓存或静态数据。可对接 Skyscanner API、Amadeus API 或国内携程飞猪接口。
  2. 酒店查询 search_hotels
    输入城市、入住与离店日期、人数、价格区间、星级等条件,返回酒店列表、实时价格和可订房型。
    适合行程规划中的住宿推荐环节,可使用 Booking.com API、Agoda API 或携程开放平台。
  3. 汇率换算 convert_currency
    输入金额、源货币与目标货币,返回换算结果和实时汇率。
    这是一个使用频率极高的小工具,在用户询问 “这家餐厅人均多少人民币” 等场景下自动激活。可调用 exchangerate-api 或银行提供的开放接口。
  4. 时区与时差 get_timezone_info
    输入地点,返回当地时间、与用户所在地的时差,以及是否处于夏令时等信息。
    帮助避免订机票、打电话或参加线上活动时因时区错乱造成事故,可使用 TimeZoneDB 或 Google Time Zone API。

进阶体验与行程管理

图片识别 analyze_image
输入图片(如菜单、招牌、景点照片),返回识别出的文字、物体描述或场景解释。
这项多模态能力能大幅提升助手的场景感知能力,例如拍下菜单自动翻译成用户母语,或识别地标并触发讲解。可结合 GPT‑4V 或 LLaVA 等模型实现。

行程规划与存储 manage_itinerary
支持创建、更新、删除、查询行程条目,每条记录包含日期、时间、地点、活动、备注、前后交通衔接等。
通过这个工具,AI 助手可以跨对话记住用户行程,实现连贯的旅行管理。数据存储在你自己的数据库中,完全可控。

用户偏好管理 user_preferences
支持读取和设置用户的多维度偏好:饮食限制(素食、清真、过敏原)、预算等级、出行节奏(紧凑或悠闲)、兴趣标签(历史、美食、购物、自然)等。
用于让所有推荐越来越贴合个人口味,可与其它工具联动形成闭环。

翻译 translate
输入待翻译文本和目标语言,返回译文,并可附带发音音标。
在阅读外文菜单、路牌或应急沟通时非常实用,可接入 Google Translate API 或 DeepL 等翻译服务。


八、结语

工具调用是 AI 智能体从 “只会说” 迈向 “能够做” 的关键一步。通过合理设计工具集合,你的 AI 应用可以变成真正的个人助理:帮你搜资料、写报告、抓数据、生成 PDF,甚至控制智能家居。

在 Python 生态中,实现工具调用并不复杂,无论是直接调用 API 还是借助 LangChain 等框架,都能快速落地。希望这份总结能帮助你在项目中顺利引入工具调用能力,打造更强的 AI 应用。

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇