AI 面试八股文 Vol.3:Tool Calling 为什么总在一面被问到?
发表于:2026-03-28 |
字数统计: 2.1k | 阅读时长: 7分钟 | 阅读量:

为什么现在值得写

上周五晚上十点半,有个读者发来微信,说他在一家头部大厂的 AI 岗一面挂了,心情很郁闷。

他觉得自己项目经验挺丰富,RAG 也讲得头头是道,结果栽在了一个看似基础的点上:Tool Calling。

面试官让他现场设计一个查询积分并处理异常的流程,他支支吾吾画了个流程图,却被追问得冷汗直流,最后连自己都不知道在画什么。

系统当面抛出一个异常时的无语表情

异常直接甩脸上了

Tool Calling 就像给一辆法拉利装了个自行车刹车——跑得是快,但停不下来,还容易翻车。很多候选人以为会调 API 就算掌握,但在面试官眼里,这恰恰是区分“调包侠”和“工程师”的分水岭。

现在的 AI 岗位市场,一面通过率低得离谱。半年前,你会调 OpenAI 的接口可能就能过初筛;现在,面试官要的是工程化落地能力,是你在系统出问题时能不能兜底的底气。

Tool Calling 作为 Agent 与现实世界交互的核心触手,自然成了必考题。如果你还没把它的工程边界想清楚,现在的每一次面试,其实都是在碰运气。

拆开讲透

问题:那个让很多人挂在一面的问题

面试官放下简历,看着你的眼睛,抛出了那个问题:

“如果我要你设计一个 Tool Calling 流程,用于查询用户积分,并且在查询失败时进行异常处理,你会怎么设计?请详细描述参数传递和错误重试的逻辑。”

听起来不难,对吧?不就是写个函数让大模型调一下吗?

但魔鬼藏在细节里。面试官不是在考你怎么写 Python 函数,而是在考你有没有“边界感”。他想知道的是:当 LLM 开始胡说八道时,你的系统能不能活下来;

当接口超时的时候,你的重试机制会不会把数据库搞崩。

很多候选人一上来就开始写代码,完全忽略了结构化的设计。这就像还没看地图就猛踩油门,方向错了,开得越快死得越快。

标准答案:不仅仅是调用函数

要接住这一招,你得先明白 Tool Calling 的本质:它不是让 LLM 直接干活,而是让 LLM 生成“干活的指令”。

真正的执行权永远在你的应用层手里。一个标准的 Tool Calling 闭环,其实就三步:结构化参数生成、应用层执行、结果回传。

首先,LLM 根据你的提示词和工具描述,生成一个结构化的 JSON 对象,里面包含了要调用的函数名和参数。注意,这里只是生成,不是执行。

明知不合理但还是把锅背上的表情

锅先背上,工先继续打

LLM 就像个只会写便利贴的指挥官,真正的活儿还得靠下面的兵(你的代码)去干。

其次,你的应用层拿到这个 JSON,解析它,校验它,然后执行真正的函数调用。这一步是工程化的核心,也是最容易出bug的地方。

最后,把执行结果(或者报错信息)再扔回给 LLM,让它组织自然语言回复给用户。

看看下面这段简化的请求体,你就知道这玩意儿长什么样了:

{
  "model": "gpt-4o",
  "messages": [
    {"role": "user", "content": "查询用户 12345 的积分"}
  ],
  "tools": [
    {
      "type": "function",
      "function": {
        "name": "query_user_points",
        "description": "查询指定用户的当前积分余额",
        "parameters": {
          "type": "object",
          "properties": {
            "user_id": {
              "type": "string",
              "description": "用户唯一标识 ID"
            }
          },
          "required": ["user_id"]
        }
      }
    }
  ]
}

为什么一面必问:考察你的工程边界感

面试官为什么要在一面问这个?因为这是考察你“工程边界感”最高效的方式。

大模型是个黑盒,它不可控。你永远不知道它下一秒是给你一个完美的 JSON,还是突然开始给你背唐诗。Tool Calling 的难点,从来不在调用本身,而在防御。

第一,JSON Schema 校验。LLM 生成的参数格式不对怎么办?user_id 传了个中文怎么办?

如果你不做校验直接丢给数据库,这就是一个潜在的 SQL 注入漏洞。面试官想看的是,你有没有在应用层加一把锁。

第二,上下文管理。Tool 的描述也是要占 Token 的。如果你一股脑把几十个工具全塞进 Prompt,还没开始干活,上下文窗口就爆了。怎么动态选择工具,怎么精简描述,这都是实打实的工程取舍。

第三,安全性控制。有些操作是不能让 LLM 随便调的,比如“删除数据库”。你有没有权限控制?有没有“人工确认”的环节?

这些都不是算法问题,是系统设计问题。面试官问 Tool Calling,其实是在问你:如果系统挂了,你知道它会在哪里挂,以及怎么挂得体面吗?

还没解释就先被安排转身背锅时的表情

还没解释就先被安排转身背锅时的表情

常见追问:连环炮怎么接

如果你答完了上面那些,以为这就结束了?太天真了。面试官的连环炮才刚刚开始。

追问一:如果 LLM 生成的参数格式错误,你的系统怎么处理?

这里有个坑。很多人会说“报错返回”。但更好的做法是,把错误信息回传给 LLM,让它自己修正。

这就像你让实习生填表,填错了你骂他一顿没用,你得把表扔回去告诉他哪里错了,让他重填。这就是 Self-Correction(自我修正)机制。

追问二:如果有多个工具都可以解决问题,LLM 怎么选择?

这考察的是你对 Tool 描述的精细化程度。LLM 选工具全靠看描述。如果两个工具描述差不多,它就会“精神分裂”。你得通过更精准的描述,或者引入一个 Router 层来分发任务。

追问三:Tool Calling 和 RAG 结合时,上下文怎么管理?

这是高阶题。RAG 检索回来的文档可能很长,再加上 Tool 的定义,上下文很容易溢出。你需要做取舍:是截断文档,还是只保留 Tool 的关键参数定义?

这取决于你的业务场景是更依赖检索结果,还是更依赖工具调用的准确性。

易错点:别把 LLM 当数据库

最后说两个典型的“自杀式回答”。

第一,混淆执行主体。很多人在描述流程时,会说“LLM 查询数据库”。大错特错。

LLM 永远不会直接碰你的数据库,它只是生成了一个查询指令,真正去查的是你的后端代码。这个概念如果不清晰,面试官直接就会把你归类为“不懂架构”。

第二,Tool 描述过于复杂。恨不得把整个业务逻辑都写在 description 里。结果 LLM 被绕晕了,动不动就幻觉。

好的 Tool 描述应该像好的 API 文档:简单、清晰、无歧义。写太长,不仅费 Token,还费脑子。

写在最后

Tool Calling 这块硬骨头,早晚得啃下来。它不仅是面试的必考题,更是你从“玩模型”走向“做系统”的第一步。

别光盯着 API 文档看,自己动手写一个 Demo,故意传错参数,故意制造超时,看看你的系统能不能优雅地报错。工程能力,都是在翻车现场练出来的。

你在 Tool Calling 上踩过最惨的坑是什么?欢迎在评论区分享你的翻车故事。

参考文献

  1. OpenAI Platform Documentation: Function Calling

  2. LangChain Docs: Tools and Toolkits

  3. 《Building LLM Apps: A Guide to Tool Use》


如果你想继续追更,欢迎在公众号 计算机魔术师 找到我。后续的新稿、精选合集和阶段性复盘,会优先在那里做串联。

下一篇:
Claude 一周两翻车:从 Mythos 泄露到 Code Interpreter 数据窃取

分享到这些地方