在这里插入图片描述
欢迎来到「周五刷题营」,每周五一道Java+AI高频面试题,花10分钟刷完,悄悄积累面试底气。

📝 本期考题

面试官:你简历上写了AI Agent和Function Calling,那你说说Function Calling是什么?和普通的API调用有什么区别?大模型怎么知道该调哪个工具?

先别急着看答案,花30秒想想你会怎么回答。

我见过太多人面试时被问到这个题,支支吾吾半天就挤出一句:"就是大模型调用工具嘛。“然后面试官追问"那参数怎么传?调用失败怎么办?结果怎么回传?”,直接就卡壳了。

这道题的分水岭不在概念,在生产级细节。 60分的人能说出基本概念,90分的人能讲清楚从工具定义到错误处理的完整链路。今天把这道题从60分到90分的回答全部讲透,附完整Java代码和面试话术模板。


✅ 60分及格回答:能说出基本概念

能答出这几点,说明你确实用过Function Calling,有基础经验。

  1. Function Calling是什么:大模型的一项能力,你把工具的名称、描述、参数定义(JSON Schema)告诉大模型,大模型根据用户问题,自主决定是否调用工具、调用哪个工具、传什么参数,返回一个调用指令,由你的后端代码执行工具,再把结果回传给大模型生成最终回答。

  2. 和普通API调用的区别

    • 普通API调用:代码写死了调什么接口、传什么参数,大模型不参与决策
    • Function Calling:大模型自主决策调哪个工具、传什么参数,代码只负责执行
    • 核心区别:决策权在大模型,不在代码
  3. 大模型怎么知道调哪个工具:靠工具描述(description)。你写的工具描述越清晰,大模型决策越准确。它会根据用户意图和工具描述做匹配,选择最合适的工具。

能答出这3点,60分及格,面试官知道你用过。但想拿高分,必须往下讲生产级细节。


✨ 90分加分回答:能讲清完整生产级链路

能答出这几点,说明你真的在生产环境用过Function Calling,不是跟着教程做了个Demo。

加分点1:工具定义的3层信息

"工具定义不只是写个名称和描述,生产级的工具定义需要3层信息:

  1. 元信息层:工具名称、描述(写清楚什么时候用、什么时候不用)、参数JSON Schema(必填字段、类型、枚举值)
  2. 执行配置层:超时时间(每个工具独立配置,比如检索10秒、外部API 30秒)、最大重试次数、是否关键工具(关键工具失败终止任务,非关键工具降级)
  3. 结果处理层:结果格式化(转成大模型能看懂的键值对,不是丢原始JSON)、结果长度截断(防止Token爆炸)

我们项目里用注解定义工具,这3层信息都在注解里配置:"

@FunctionTool(
    name = "search_knowledge_base",
    description = "从企业知识库检索文档。用户问公司制度、产品文档时用;问实时信息时不用。",
    parameters = "{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\"}},\"required\":[\"query\"]}",
    timeoutMs = 10000,   // 执行配置层
    maxRetry = 1,
    critical = false
)
public String search(String argumentsJson) {
    // ... 结果处理层:格式化成清晰的键值对
}
加分点2:工具执行的5个生产级机制

"工具执行不是简单的method.invoke(),生产级需要5个机制:

  1. 参数校验:大模型传的参数可能格式错误、缺必填字段,要先校验,校验失败返回明确的错误信息+正确格式,大模型会自动修正重试
  2. 超时控制:用独立线程池+Future.get(timeout),防止某个工具卡死拖垮整个Agent
  3. 失败重试:区分可重试异常(超时、网络错误)和不可重试异常(参数错误),可重试的才重试
  4. 结果截断:工具返回结果超过2000字符自动截断,防止Token爆炸
  5. 关键/非关键降级:关键工具失败直接终止任务并告知用户,非关键工具失败后Agent可以用其他方式回答

这5个机制缺一个,Demo能跑但上生产全是bug。"

加分点3:Agent循环的终止保护

"Function Calling是在Agent的ReAct循环里执行的,必须有终止保护,否则大模型判断失误会陷入死循环:

  1. 最大轮次限制:最多10轮推理,到了就强制终止
  2. 重复调用检测:同一个工具用同样的参数调了2次还没成功,就停止重复调用
  3. 连续失败检测:连续3次工具调用失败,终止任务

我们项目里写了一个AgentLoopGuard,每次工具调用后检测这3个条件,触发任何一个就终止循环,把终止原因告诉大模型,让它基于已有信息给出最终回答。"

加分点4:多工具调用和并行执行

"大模型一次可能返回多个工具调用(tool_calls数组),生产级要支持:

  1. 串行执行:有依赖关系的工具(比如先查用户ID,再查用户订单)串行执行
  2. 并行执行:无依赖关系的工具(同时查天气和查新闻)可以并行执行,减少总耗时
  3. 结果顺序回传:无论串行还是并行,结果必须按tool_call_id的顺序回传,大模型才能正确匹配

我们项目里默认串行,对无依赖的工具用CompletableFuture并行执行,平均响应时间减少40%。"


💻 完整Java实现核心代码

面试官追问"能写一下核心实现吗",直接写这段:

// 工具执行器核心逻辑
public ToolResult execute(String toolName, String argumentsJson) {
    // 1. 参数校验
    ValidationResult validation = validateParams(toolName, argumentsJson);
    if (!validation.isValid()) {
        return ToolResult.fail("参数校验失败: " + validation.getErrorMsg()
                + ",请修正参数后重新调用。正确格式: " + getToolParams(toolName));
    }

    // 2. 带超时+重试执行
    for (int attempt = 1; attempt <= maxRetry + 1; attempt++) {
        try {
            Future<ToolResult> future = executor.submit(() -> {
                Object result = method.invoke(instance, argumentsJson);
                return ToolResult.success(formatResult(result)); // 3. 结果格式化+截断
            });
            return future.get(timeoutMs, TimeUnit.MILLISECONDS); // 4. 超时控制
        } catch (TimeoutException e) {
            if (attempt <= maxRetry) continue;
            return handleFailure(toolName, "执行超时");
        } catch (Exception e) {
            if (attempt <= maxRetry && isRetryable(e)) continue; // 5. 可重试才重试
            return handleFailure(toolName, e.getMessage());
        }
    }
    return ToolResult.fail("执行失败");
}

📦 落地资源推荐

Function Calling和Agent开发需要稳定的测试环境,我平时调试工具调用、跑Agent循环都用阿里云轻量应用服务器,2核4G跑SpringBoot+大模型调用完全够用,新用户首年特惠性价比高再加上通过推荐渠道可以领取9折优惠券,适合自己动手搭一个Agent测试环境。有部署需求了解https://www.aliyun.com/daily-act/ecs/activity_selection?userCode=fzoabro9阿里云开发者特惠,无需求直接忽略。

资源领取

关注图片上水印即Java-AI工程师打出agent即可领取完整的配套资料!

🎤 面试话术模板

可以直接这么说:

Function Calling是大模型的一项能力,核心是让大模型自主决策调用什么工具、传什么参数,而不是代码写死调用逻辑。和普通API调用的本质区别是决策权在大模型。

生产级实现需要4层:工具定义层(名称、描述、JSON Schema、超时、重试配置)、执行层(参数校验、超时控制、失败重试、结果截断、关键/非关键降级)、循环层(最大轮次、重复调用检测、连续失败检测,防止死循环)、多工具层(串行/并行执行、按tool_call_id顺序回传)。

我们项目用注解定义工具,Spring AOP统一处理执行逻辑,AgentLoopGuard做循环终止保护,支持多工具并行执行,上线后工具调用准确率95%以上,平均响应时间2秒以内。

这段话讲完,面试官就知道你真的在生产环境用过,不是只会调接口。


💬 本期互动

你被问到Function Calling时,最容易卡在哪一步?
A. 概念说不清
B. 参数校验和错误处理
C. Agent循环和死循环
D. 多工具并行执行

评论区报你的选项就行~有想刷的面试题,欢迎后台投稿,入选送完整源码包。

📢 下周预告
下周一开启Agent系列第2周:《Agent没有记忆就是个傻子?Java实现短期记忆+长期记忆+向量记忆》
Agent只能单轮对话?多轮对话上下文丢失?记忆系统是Agent从玩具到生产的关键一步。3种记忆模式的Java实现,附完整代码,记得关注。

祝大家周末愉快!

本文属于「周五刷题营」合集

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐