Skip to content

8. 如何用 Spring AI 实现联网搜索工具? ​

难度 P0 必背 · 岗位 应用 · 频率 ★★★ · 预计阅读 5 min

TL;DR 速记 ​

  • 是什么:用 @Tool 把联网搜索封装成模型可调用的工具,Spring AI 负责生成 schema 和回传结果。
  • 关键点:description 要写清适用场景、禁用场景和参数含义,否则模型会乱用或不用。
  • 怎么答:工具方法只暴露受控能力,真正搜索由 Java 代码执行;模型只决定是否调用和传什么参数。

图解 ​

💡 简要回答 ​

用 @Tool 注解声明联网搜索工具,Spring AI 自动处理工具调用的 JSON Schema 生成和结果回传。工具描述要写清楚「什么时候调用」,否则 LLM 不知道什么场景该用这个工具。

📝 详细解析 ​

java
@Component
public class WebSearchTool {

    @Tool(description = "搜索互联网获取最新信息,适用于:实时新闻、最新数据、近期发生的事件。"
                      + "不适用于:历史事实、常识性问题。")
    public String searchWeb(
        @ToolParam(description = "搜索关键词,尽量简短精准") String query
    ) {
        return tavilyClient.search(query).getResults().stream()
            .limit(3)
            .map(r -> r.getTitle() + "\n" + r.getContent())
            .collect(Collectors.joining("\n\n---\n\n"));
    }
}

工具描述是关键:LLM 依赖 description 判断何时调用工具。「搜索互联网」太模糊,要明确写「适用于实时新闻、最新数据」,并且告诉它「不适用于历史事实、常识性问题」,防止模型滥用搜索工具(每次都去搜,增加延迟和成本)。


常见踩坑与反例 ​

踩坑 1:工具描述太泛 ​

错误描述:description = "搜索互联网",以为模型自然知道什么时候用。

正确做法:写清适用场景和禁用场景,比如“实时新闻、最新数据可用;历史事实、常识问题不用”。

踩坑 2:参数说明不约束 ​

错误描述:只声明 String query,不说明关键词格式、长度和语言。

正确做法:用 @ToolParam 说明参数语义,要求关键词简短精准,必要时在代码里二次校验。

踩坑 3:把工具执行交给模型 ​

错误描述:「Spring AI 让模型自己联网搜索。」

正确做法:模型只输出工具调用意图,真正调用 Tavily、搜索 API 或内部服务的是 Spring 应用代码。

踩坑 4:不限制结果数量和内容 ​

错误描述:把搜索 API 的完整返回原样塞回模型。

正确做法:限制条数、裁剪字段、保留标题和摘要,避免上下文爆炸、噪声过多和成本失控。

面试官可能继续追问 ​

  • 追问 1:怎么避免模型滥用搜索工具? 答题要点:在工具 description 中写禁用场景,在系统提示里要求“只有实时信息才搜索”,再加调用次数、超时和成本限制。

  • 追问 2:搜索结果不可信怎么办? 答题要点:保留来源、时间和摘要,必要时多源交叉验证;回答时区分“搜索结果显示”和模型推断。

  • 追问 3:工具异常如何处理? 答题要点:代码层捕获超时、限流和空结果,返回可理解的错误信息,让模型决定降级回答、重试或提示用户。

  • 追问 4:企业内部搜索怎么做? 答题要点:把内部检索服务封装成 @Tool,加鉴权、权限过滤和审计日志,避免把用户无权访问的数据返回给模型。

🎯 面试总结 ​

Spring AI 工具调用的核心:@Tool 注解声明接口,Spring AI 生成 JSON Schema,模型决定是否调用,Java 代码执行实际逻辑。工具描述(description)是最关键的设计点——要写清适用场景和禁用场景,避免模型滥用或不用。生产要注意:结果截断防上下文爆炸、异常处理返回结构化错误、调用次数和成本限制。

章节首页 · ← Q7 · Q9 →

最后更新2026-05-01
难度P0
频率medium
阅读5 min
主题framework
觉得有帮助?把这个链接转给正在求职的朋友 · 用 Ctrl + K 全站搜索其它题