Appearance
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)是最关键的设计点——要写清适用场景和禁用场景,避免模型滥用或不用。生产要注意:结果截断防上下文爆炸、异常处理返回结构化错误、调用次数和成本限制。