spring ai 入门之3:Java 验证码识别

686 阅读7分钟

其实现在Java基于大模型做验证码识别,已经非常牛了。

java场景中,我们经常需要处理java识别验证码的任务。过去,这类需求主要依赖于OCR技术来实现,但其效果并不总是稳定。现在,随着大模型的兴起,我们可以利用这些强大的工具来进行java识别验证码,从而获得更好的结果。通过使用先进的大模型,如qwen vl,可以显著提高java识别验证码的准确性和可靠性。

在传统的解决方式中,java识别验证码的效果往往受到诸多因素的影响,例如图像质量、背景复杂度以及文字扭曲程度等。然而,借助大模型的力量,这些问题得到了有效的缓解。大模型通过学习大量的数据和模式,能够更好地理解和解析各种类型的图像内容,使得java识别验证码的过程变得更加高效和精准。

实际测试中,某网站的这种很有挑战的都可以识别:

image.png

模型给出:

image.png

本例子采用的是基于java spring ai框架与国产大模型qwen vl结合的方式作为示例展示如何完成这一任务。当然,根据您的具体需求,您也可以选择其他的技术栈或模型进行替换。希望这个案例能够为您提供一个良好的起点,并激励您探索更多关于如何运用现代AI技术来提升java识别验证码体验的可能性。

Spring AI:简化Java中的AI开发

过去,Java在AI应用开发方面缺乏一个高效且统一的框架,导致开发者需要针对不同的AI服务提供商编写独立的代码,增加了开发和维护成本。为了解决这一问题,Spring团队推出了Spring AI,这是一个专为AI工程设计的应用框架。Spring AI的核心优势在于它提供了一套标准化接口,允许开发者通过简单的配置更改来切换不同AI提供商(如OpenAI、Azure等),极大地简化了代码迁移过程。此外,Spring AI完美兼容现有的Spring生态系统及Java面向对象编程原则,使得集成验证码识别等功能变得更加便捷高效。借助Spring AI,开发者可以更专注于业务逻辑实现,而非繁琐的技术对接工作。

Qwen vl 介绍 :阿里云发布新版本,性能超越GPT-4V

Qwen-VL-Plus和Qwen-VL-Max是阿里云推出的视觉语言模型,在MMMU、MathVista等测评中远超业界所有开源模型,尤其在文档分析(DocVQA)、中文图像相关任务(如MM-Bench-CN)上超越了GPT-4V,达到了世界最佳水平。这两个版本的模型能够准确地描述和识别图片信息,并根据图片进行推理与创作;它们还具有视觉定位能力,可以针对画面中的特定区域进行问答。在视觉推理方面,Qwen-VL-Plus和Qwen-VL-Max能理解流程图等复杂形式的图片,完成看图做题、作文甚至编写代码的任务。此外,新版Qwen-VL在处理图像文本时显著提升了中英文文本识别能力,支持高清分辨率及极端宽高比的图像处理,能从表格和文档中高效提取信息。目前,Qwen-VL-Plus和Qwen-VL-Max限时免费提供给用户使用,感兴趣的用户可以直接通过通义千问官网或其官方应用程序体验Max版本模型的强大功能。

Spring AI Alibaba框架介绍:集成阿里云大模型服务

Spring AI Alibaba是专为Spring AI设计的一个实现框架,专注于集成阿里云的国产大模型服务。它基于Spring AI API完成对接,使得开发者能够轻松地利用阿里云提供的通义系列(如通义千问)等生成式AI能力来开发应用程序。Spring AI Alibaba支持多种AI功能,包括但不限于对话、文生图、文生语音等,并且提供了诸如OutputParser、Prompt Template等功能,帮助开发者更高效地构建和管理AI应用。其核心优势在于简化了对不同AI提供者的接入过程,通过一套标准化接口就能访问到强大的国产大模型服务,极大降低了开发成本与迁移难度。此外,该框架还特别针对流处理进行了优化,便于与当前流行的机器人技术结合使用。

基于Spring AI Alibaba实现验证码识别的详尽示例

前置准备

在开始集成Spring AI Alibaba以完成基于Prompt和流式返回的二维码图像识别之前,请确保你的开发环境满足以下条件:

  1. JDK版本需在JDK 17(含)以上。
  2. Spring Boot版本需在3.3.x以上。

申请开通资源及配置API KEY

首先,你需要访问阿里云百炼页面并登录您的阿里云账号。接着选择开通“百炼大模型推理”服务,并等待开通成功的短信通知。成功开通后,回到阿里云百炼页面点击右上角的小人图标进入个人中心,在API-KEY部分创建一个新的API-KEY,并记录下这个key,因为后续步骤中会用到它来配置百炼API_KEY。

配置百炼 API KEY

请按照如下命令设置环境变量AI_DASHSCOPE_API_KEY为刚才获取的API-KEY值:

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

开通通义万象图像生成模型

前往百炼控制台左侧列表栏选择模型广场,寻找图像生成相关的模型——通义万象,并点击其对应的“API调用”按钮。请注意记下该模型的英文名qwen-vl-max-latest,这是配置时指定使用的模型名称。

添加Spring仓库

由于Spring AI M3版本尚未提交至Maven正式仓库,因此需要向项目添加Spring自有的仓库以及快照仓库。请将下面这段代码添加到你的pom.xml文件中的<repositories>标签内:

<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>

添加依赖

接下来,在项目的pom.xml文件里加入对spring-ai-alibaba-starter及其所需依赖项的支持。这样可以确保Spring Boot自动装配机制能够初始化与阿里云通义大模型通信的相关实例。

<dependencies>
    <dependency>
        <groupId>com.alibaba.cloud.ai</groupId>
        <artifactId>spring-ai-alibaba-starter</artifactId>
        <version>1.0.0-M3.1</version>
    </dependency>
    <!-- 其他必需的依赖 -->
</dependencies>

同时不要忘记定义Spring Boot的parent依赖关系:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.3.4</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

构建读图代码

现在让我们编写一个简单的控制器类CaptchaRecognitionController用于处理验证码图片识别请求。在这个示例中,默认提示文本为"识别图中的文字",并且我们使用了预设的模型qwen-vl-max-latest进行图像内容解析。请确保已有一张名为captcha.png的PNG格式验证码图片放置于src/main/resources/目录下。

Controller实现

@RestController
@RequestMapping("/captcha")
public class CaptchaRecognitionController {

    private static final Logger logger = LoggerFactory.getLogger(CaptchaRecognitionController.class);

    @Value("classpath:captcha.png")
    private Resource captchaImage;

    private final ChatModel chatModel;

    public CaptchaRecognitionController(ChatModel chatModel) {
        this.chatModel = chatModel;
    }

    private static final String DEFAULT_PROMPT = "识别图中的文字";
    private static final String DEFAULT_MODEL = "qwen-vl-max-latest";

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

        List<Media> mediaList = List.of(new Media(MimeTypeUtils.IMAGE_PNG, captchaImage));
        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());
    }
}

通过上述步骤,你已经成功集成了Spring AI Alibaba来实现带有Prompt输入及流式输出的文字验证码识别功能。你可以运行应用程序并通过访问http://localhost:8080/captcha/recognize地址测试此功能是否按预期工作。

注意:为了保证应用的安全性,请始终保护好你的API密钥等敏感信息。