Spring AI入门之2 : java 图像识别_image recongition

1,468 阅读7分钟

图像识别在Java开发中的应用介绍

在Java开发中,图像识别能力被广泛应用于多种场景,比如商品分类、车牌识别等。过去,开发者通常依赖OCR等技术来实现这些功能,但其准确性和灵活性往往不尽人意。随着大模型技术的发展,现在可以直接利用这些先进的AI模型进行图像识别任务,不仅大大提高了识别的准确性,还增强了处理复杂场景的能力,为应用提供了更强大的支持。

Spring AI:为Java生态系统带来高效易用的人工智能框架

在过去,Java 缺乏一个高效且易用的 AI 应用框架,这限制了开发者在 Java 生态系统中快速集成和使用人工智能技术。为解决这一问题,Spring 团队推出了 Spring AI,它作为一个专门用于 AI 工程的应用框架,旨在将 Spring 的设计原则(如可移植性、模块化)引入到 AI 开发领域。Spring AI 提供了一套统一的接口来调用各种不同的 AI 组件,使得开发者只需编写一次代码,并通过简单的配置更改即可切换至不同的 AI 服务提供商。此外,由于其完全兼容于现有的 Spring 生态系统及 Java 的面向对象编程模式,因此能够无缝集成到现有项目中,极大地方便了开发者对 AI 功能的接入与管理。对于需要实现图像识别功能的应用而言,利用 Spring AI 可以轻松地构建出高性能的解决方案,无需额外学习新的工具链或语言特性。

Spring AI的核心功能概览

模型 Model

一句话说明:支持多种模型,包括多模态处理与图像识别。 输入输出举例:输入为文本或图片等,输出为相应的内容生成、分析结果。例如使用qwen-vl-max-latest模型进行图像内容识别。

提示 Prompt

一句话说明:提供给AI的初始信息或问题,用于引导其生成特定类型的响应。 输入输出举例:输入可以是一段话如“请描述这张照片”,输出则是基于此提示对图片内容的解释。

提示词模板 Prompt Template

一句话说明:预设好的结构化提示模板,简化了复杂提示的设计过程。 输入输出举例:通过定义类似"我想知道消息id: {id}"这样的模板,并填充具体值(如{id}替换为实际ID),以产生针对特定场景的有效查询语句。

嵌入 Embedding

一句话说明:将数据转换成固定长度向量表示的方法,便于进行相似度计算和检索。 输入输出举例:一段文本作为输入,经过嵌入处理后得到一个数值向量作为输出,该向量可用于后续的相似性比较或其他机器学习任务中。

结构化输出 Structured Output

一句话说明:确保生成的内容符合预定格式,提高数据的一致性和可解析性。 输入输出举例:请求天气预报时,返回的数据不仅包含天气状况的文字描述,还包括温度、湿度等具体数值信息,这些都按照事先定义好的JSON格式组织起来。

检索增强生成 RAG

一句话说明:结合检索技术和生成模型,利用私有知识库来提升回答质量和准确性。 输入输出举例:用户询问公司财报中的某个具体数字,系统先从已存储的文档中检索相关信息,再结合这些上下文生成精准的回答。

函数调用 Function Calling

一句话说明:允许大语言模型在需要时执行开发者提供的功能,如调用外部API或执行特定代码。 输入输出举例:当询问某条消息的状态时,LLM不会直接回应,而是触发一个函数去查询数据库并返回状态详情。

向量存储 Vector Store

一句话说明:用于保存和管理大量高维向量数据的数据库,支持快速搜索相似项。 输入输出举例:上传一系列文档后将其转化为向量形式存入向量库,在需要时可通过关键词快速定位相关资料。

Spring AI Alibaba介绍:接入阿里云大模型,简化AI应用开发

Spring AI Alibaba 是 Spring AI 的一个实现,它基于 Spring AI 的 API 完成对阿里云百炼系列云产品大模型的接入。通过 Spring AI Alibaba,开发者可以轻松地利用阿里云提供的通义大模型(如通义千问、通义万象等国产大模型)开发聊天、图片或语音生成等 AI 应用。其核心优势在于标准化了不同AI提供者的接口实现,使得用户只需写一次代码并通过更改配置即可切换不同的AI服务提供商。此外,Spring AI Alibaba 提供了诸如 OutputParser、Prompt Template 和 Stuff 等实用功能,进一步简化了AI应用的开发流程。这不仅减少了程序员对接各种API的工作量,还增强了应用程序的可移植性和模块化设计。

使用Spring AI Alibaba构建支持Prompt和流式响应的图像识别服务:从环境配置到代码实现

基于Spring AI Alibaba实现一个具有Prompt功能和流式返回的图像识别服务,首先需要满足一定的前置条件,并按步骤配置相关环境与依赖。下面是详细的集成步骤,包括所有的pom.xml配置、代码示例以及必要的设置。

前置准备

  1. 确保JDK版本在17及以上。
  2. 使用Spring Boot版本3.3.x或更高。
  3. 通过阿里云获取通义千问API key。
  4. 开通并配置好通义万象图像生成模型(这里主要针对图像识别)。

申请开通资源

  • 登录阿里云百炼页面,开通“百炼大模型推理”服务。
  • 成功后创建一个新的API Key,并保存此Key以备后续使用。

配置环境变量

export AI_DASHSCOPE_API_KEY=${REPLACE-WITH-VALID-API-KEY}

请将${REPLACE-WITH-VALID-API-KEY}替换为你实际获得的API Key。

Maven仓库及依赖配置

为了使用spring-ai-alibaba-starter库,你需要在pom.xml文件中添加特定的Maven仓库地址以及相应的依赖项。

<repositories>
    <repository>
        <id>sonatype-snapshots</id>
        <url>https://oss.sonatype.org/content/repositories/snapshots</url>
        <snapshots><enabled>true</enabled></snapshots>
    </repository>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots><enabled>false</enabled></snapshots>
    </repository>
    <repository>
        <id>spring-snapshots</id>
        <name>Spring Snapshots</name>
        <url>https://repo.spring.io/snapshot</url>
        <releases><enabled>false</enabled></releases>
    </repository>
</repositories>

<dependencies>
    <!-- Spring Boot parent project -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.4</version>
        <relativePath/>
    </parent>
    
    <dependency>
        <groupId>com.alibaba.cloud.ai</groupId>
        <artifactId>spring-ai-alibaba-starter</artifactId>
        <version>1.0.0-M3.1</version>
    </dependency>
    <!-- 其他必要依赖... -->
</dependencies>

创建控制器类

接下来定义一个控制器类来处理图片上传请求,并利用ChatModel执行图像识别任务。这里我们采用流式响应模式来逐步返回结果。

@RestController
@RequestMapping("/ai")
public class ChatModelController {

    private final ChatModel chatModel;

    @Autowired
    public ChatModelController(ChatModel chatModel) {
        this.chatModel = chatModel;
    }

    @Value("classpath:catexample.png")
    private Resource imageResource;

    private static final String DEFAULT_PROMPT = "这些是什么?";
    private static final String DEFAULT_MODEL = "qwen-vl-max-latest";

    @GetMapping("/imageRecognition")
    public Flux<String> imageRecognition(@RequestParam(value = "prompt", required = false, defaultValue = DEFAULT_PROMPT) String prompt,
                                         HttpServletResponse response) throws Exception {
        response.setCharacterEncoding("UTF-8");

        List<Media> mediaList = Collections.singletonList(new Media(MimeTypeUtils.IMAGE_PNG, imageResource));
        UserMessage message = new UserMessage(prompt, mediaList);
        message.getMetadata().put(DashScopeChatModel.MESSAGE_FORMAT, MessageFormat.IMAGE);

        return chatModel.stream(
                new Prompt(message,
                        DashScopeChatOptions.builder()
                                .withModel(DEFAULT_MODEL)
                                .withMultiModel(true)
                                .build()))
                .map(resp -> resp.getResult().getOutput().getContent());
    }
}

这段代码中,我们设置了默认提示文本DEFAULT_PROMPT和默认使用的模型DEFAULT_MODEL。当客户端调用/ai/imageRecognition接口时,可以通过URL参数prompt传递自定义的问题描述给模型进行识别。系统会读取项目资源目录下的catexample.png作为输入图片。

最后,请确保已在application.properties中正确设置了API密钥:

spring.ai.dashscope.api-key=${AI_DASHSCOPE_API_KEY}

按照上述步骤操作后,你就可以运行你的Spring Boot应用,并通过访问http://localhost:8080/ai/imageRecognition?prompt=你的问题描述来测试图像识别功能了。

image.png