SpringAIAlibaba之高级特性与实战场景全解析(5)

摘要:普通的 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 | 合同审查、分级知识库、精准搜索 | 解决向量检索精度低、无权限控制的问题 |

欢迎关注、一起交流、一起进步~

相关推荐
Funny_AI_LAB2 小时前
重构 Coding Agent:当 LLM 没有 KV Cache 时,上下文工程该怎么做?
人工智能·经验分享·语言模型·重构
GISMagic2 小时前
AI 时代的软件工程与架构能力提升路线
人工智能·架构·软件工程
中伟视界2 小时前
化工检修作业新规明日施行,边缘AI如何守好现场?
人工智能
OpenCSG2 小时前
OpenCSG Agentic-27B 正式开源:27B Dense 模型,Agent 执行能力实现全面跃升
人工智能·开源·opencsg
Elastic 中国社区官方博客2 小时前
使用 Lucene 搜索你的 Bean —— Elasticsearch
大数据·开发语言·人工智能·elasticsearch·搜索引擎·全文检索·lucene
雪兽软件2 小时前
AI爆改学术研究?
人工智能·学术研究
合调于形2 小时前
Rengong zhzzneng 《人工智能》词条汉语拼音字母标调拼写实测案例
人工智能·自然语言处理·人机交互·语音识别·学习方法
cg50172 小时前
大模型 SFT(监督微调)该怎么做?(实践版)
人工智能·深度学习·机器学习
Qt云程序员2 小时前
选型参考:光刃RPA 与常见 RPA / 自动化方案的对比
人工智能·自动化·rpa
neocheng_5222 小时前
品牌、内容和效果营销,受AI影响为什么完全不同?
人工智能