摘要:普通的 AI 接入只能陪用户聊聊天,而真正的企业级 AI 应用需要具备“行动力”、“结构化思维”以及“多模态感知力”。本文将深入剖析 Spring AI Alibaba 的四大高级特性:Function Calling(工具调用)、Structured Output(结构化输出)、Multimodality(多模态) 以及 Advanced RAG(元数据过滤),并结合实际业务场景给出代码落地方案。
一、Function Calling:让 AI 拥有“双手”
这是目前 Agent(智能体)开发中最核心的特性。
大模型本身是被封闭在服务器里的“大脑”,它无法联网、无法查数据库。Function Calling 允许你定义一组 Java 方法(工具),并告诉大模型:“如果你需要做这些事,就告诉我,我帮你调代码。”
核心原理
Spring AI Alibaba 会自动扫描你注册的 java.util.function.Function Bean,将其入参和出参生成 JSON Schema 描述发给通义千问(Qwen)。当用户意图匹配时,模型回调函数,实现“意图 -> 代码执行”的闭环。
实战场景:智能家居/运维机器人
场景描述:用户说“帮我把客厅空调调到24度”。这涉及到调用 IoT 设备的 API。
代码实现
@Configuration
public class ToolsConfig {
// 定义工具类 Record
public record ACRequest(String location, int temperature) {}
public record ACResponse(String status) {}
@Bean
@Description("调节指定房间的空调温度") // 这个描述至关重要,AI靠它识别意图
public Function<ACRequest, ACResponse> acControlTool() {
return request -> {
// 模拟调用 IoT 接口
System.out.println("正在调节 " + request.location() + " 的空调至 " + request.temperature() + "度");
return new ACResponse("调节成功");
};
}
}
// 在 Controller 中使用
chatClient.prompt()
.user("我觉得客厅有点热,设成24度吧")
.functions("acControlTool") // 注册工具
.call()
.content();
二、Structured Output:让 AI 听懂“Java 语言”
这是解决 AI 与传统系统对接难题的关键。
大模型天生输出的是“字符串(String)”,但 Java 业务系统需要的是 POJO 对象、JSON 或 List。以前我们需要写复杂的 Prompt:“请返回 JSON 格式...”,效果还不稳定。现在 Spring AI Alibaba 提供了 BeanOutputConverter。
核心原理
Spring AI 会自动在 Prompt 后面追加一段“格式化指令(Format Instructions)”,强制大模型按指定的 JSON Schema 输出,并自动反序列化为 Java 对象。
实战场景:简历解析/票据识别
场景描述:上传一段非结构化的简历文本,系统需要自动提取出姓名、技能列表、工作年限,存入数据库。
代码实现
// 1. 定义目标 Java Bean
public record UserResume(String name, List<String> skills, int yearsExperience) {}
@GetMapping("/extract")
public UserResume extractResume(@RequestParam String resumeText) {
// 2. 定义转换器
var converter = new BeanOutputConverter<>(UserResume.class);
// 3. 调用 AI
String response = chatClient.prompt()
.user(u -> u.text("请从以下文本提取简历信息:\n{text}")
.param("text", resumeText))
// 自动注入格式化指令
.format(converter.getFormat())
.call()
.content();
// 4. 自动转为对象
return converter.convert(response);
}
三、Multimodality:让 AI 具备“火眼金睛”
这是通义千问(Qwen-VL)模型的强项。
文本交互已经不够用了,现在的 AI 需要能看懂图片、听懂声音。Spring AI Alibaba 完美适配了阿里云的视觉理解模型。
核心原理
通过 UserMessage 支持多媒体输入,将图片(URL 或 Base64)作为 Prompt 的一部分发送给模型。
实战场景:电商以图搜图/配料分析
场景描述:用户拍了一张冰箱里剩余食材的照片,问 AI:“用这些能做什么菜?”
代码实现
@GetMapping("/analyze-fridge")
public String analyzeImage() throws IOException {
// 读取本地图片或 URL
Resource imageResource = new ClassPathResource("fridge_photo.jpg");
// 构建多模态 Prompt
UserMessage userMessage = new UserMessage(
"请识别图片中的食材,并推荐一道食谱。",
List.of(new Media(MimeTypeUtils.IMAGE_JPEG, imageResource))
);
return chatClient.prompt()
.messages(userMessage)
.call()
.content();
}
四、Advanced RAG:带元数据过滤的精准检索
这是解决 RAG“幻觉”和“权限隔离”的高级技巧。
普通的 RAG 只是计算向量相似度。但在企业场景中,我们经常面临这样的问题:员工 A 只能搜“技术部”的文档,或者我们只想搜“2024年”之后发布的合同。
核心原理
结合 DashVector(阿里云向量检索服务)的 Metadata Filtering(元数据过滤)能力。在存入向量时打标签,在检索时通过 Spring AI 的 Filter.Expression 进行过滤。
实战场景:企业内部知识库(带权限控制)
场景描述:用户问“去年的财报怎么样?”,系统必须只检索 year == 2023 且 category == financial 的文档。
// 1. 存入文档时带上 Metadata
Document doc = new Document(
"2023年公司净利润增长20%...",
Map.of("year", 2023, "category", "financial", "dept", "finance")
);
vectorStore.add(List.of(doc));
// 2. 检索时带上 Filter
@GetMapping("/search-report")
public String searchReport(@RequestParam String query) {
// 使用 Filter Expression 语言
FilterExpressionBuilder b = new FilterExpressionBuilder();
// 类似 SQL: WHERE year == 2023 AND category == 'financial'
Expression filter = b.and(
b.eq("year", 2023),
b.eq("category", "financial")
).build();
// 检索配置
SearchRequest searchRequest = SearchRequest.defaults()
.withQuery(query)
.withFilterExpression(filter); // 注入过滤条件
// 使用 Advisor 自动检索
return chatClient.prompt()
.user(query)
.advisors(new QuestionAnswerAdvisor(vectorStore, searchRequest))
.call()
.content();
}
五、总结:如何选择?
我们可以根据自己的业务场景需要来选择对应的技术,下面列了一个技术和场景的适配关系:
| 高级特性 | 适用场景 | 核心价值 |
| Function Calling | 订票、查库、IoT控制、RPA | 解决模型无法与外部世界交互的问题,实现“执行” |
| Structured Output | 数据清洗、爬虫解析、表单提取 | 解决模型输出不可控的问题,实现“系统集成” |
| Multimodality | 拍照问答、语音助手、视频分析 | 拓展输入维度,从“文本交互”升级为“感官交互” |
| Advanced RAG | 合同审查、分级知识库、精准搜索 | 解决向量检索精度低、无权限控制的问题 |
欢迎关注、一起交流、一起进步~
72

被折叠的 条评论
为什么被折叠?



