Bootstrap

Java - 手写识别; 如何用spring ai和大模型做手写识别教程

识别后的文字

利用大模型提升Java手写识别:更简单、更高效

在Java场景中,我们经常需要处理手写识别的问题。过去,这类需求主要依赖于OCR技术,但其效果并不总是稳定。随着大模型的发展,使用大模型进行java手写识别成为了一种更优的选择。通过引入先进的大模型,不仅提高了识别的准确性,还简化了开发流程。对于开发者而言,在构建支持java手写识别的应用时,现在有了更加高效可靠的工具。采用这种方法后,可以显著提升用户体验和应用性能。值得注意的是,无论是在简单的个人项目还是复杂的企业级解决方案中,利用大模型来进行java手写识别都是一个值得推荐的做法。此外,这样的转变也标志着从传统方法向现代AI驱动技术的重要进步。本例子使用java spring ai和国产大模型qwen vl来做样例,您也可以换成其他实现。

Spring AI:统一接口简化Java AI开发

在过去,Java 缺乏一个专门针对 AI 应用的高质量框架,这限制了开发者在 Java 生态中高效地构建和部署 AI 解决方案。为了解决这个问题,Spring 团队推出了 Spring AI,这是一个专为 AI 工程设计的应用框架。Spring AI 的核心优势在于它提供了一套统一的接口,能够标准化不同 AI 服务提供商(例如 OpenAI、Azure 和阿里云等)的 API 实现,从而使得开发者只需编写一次代码,通过简单的配置更改即可切换不同的 AI 服务。此外,Spring AI 完美兼容现有的 Spring 生态系统及 Java 的面向对象编程模式,支持包括手写识别在内的多种 AI 功能开发,极大简化了程序编写与迁移的工作量。

Qwen VL:领先的图像视频识别多模态大模型

Qwen VL 是一款专为图像和视频识别设计的多模态大模型,在国内同类模型中能力领先。根据思南大模型评测 CompassArena,其表现仅次于国际知名的GPT和Claude模型;在国际视觉大模型竞技场 https://huggingface.co/spaces/lmarena-ai/chatbot-arena-leaderboard 上同样占据中国第一的位置。欢迎各界人士参与测试并投票支持。目前,Qwen-VL-Plus与Qwen-VL-Max版本限时免费开放体验,用户可通过通义千问官网或APP直接尝试Max版本的强大功能。

Spring AI Alibaba:简化对接国产大模型的开发框架

Spring AI Alibaba 是一个针对阿里云百炼系列大模型的实现框架,它基于 Spring AI 的 API 完成了对通义等国产大模型的支持。其核心优势在于通过统一的抽象接口简化了与不同AI提供者的对接过程,使得开发者能够轻松地在不同服务之间切换而无需大幅修改代码。此外,Spring AI Alibaba 提供了包括对话、文生图等多种生成式任务的支持,并且内置有如 OutputParser 和 Prompt Template 等实用功能来增强应用开发体验。这不仅促进了高效的应用构建,还特别强调了对于国产大模型的良好适配性。

基于Spring AI Alibaba实现手写识别的详尽示例

我们知道Spring AI Alibaba提供了一套方便集成阿里云通义大模型(包括但不限于文本生成、图片生成等功能)的能力。为了实现一个具体的手写文字识别功能,并且这个过程涉及使用Prompt模板和以流的形式返回结果,我们可以利用spring-ai-alibaba-starter库来简化开发工作。通过设置合适的配置项与编写必要的代码片段,可以完成从环境准备到最终应用部署的所有步骤。

详细的可执行的具体步骤
  1. 前置准备
    • 确保你的JDK版本在JDK 17或更高。
    • 使用Spring Boot 3.3.x及以上版本。
    • 在阿里云申请通义千问或其他相关AI服务的API Key。
  1. 开通资源及获取API Key
    • 获取API Key后,将其保存以便后续配置使用。
  1. 配置环境变量
export AI_DASHSCOPE_API_KEY=YOUR_OWN_API_KEY
  1. 添加Maven仓库及依赖
<repositories>
    <!-- 其他repository定义... -->
    <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>
<parent>
    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-parent</artifactId>

    <version>3.3.4</version>

    <relativePath/> <!-- lookup parent from repository -->
</parent>

<dependencies>
    <dependency>
        <groupId>com.alibaba.cloud.ai</groupId>

        <artifactId>spring-ai-alibaba-starter</artifactId>

        <version>1.0.0-M3.1</version>

    </dependency>

    <!-- 其它依赖项... -->
</dependencies>
    • 因为某些版本尚未发布到官方Maven仓库,因此需要额外指定Spring的快照和里程碑仓库。
    • 添加项目所需依赖:
  1. 创建控制器类处理请求
@RestController
@RequestMapping("/ai")
public class HandwritingRecognitionController {

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

    @Value("classpath:handwriting.png")
    private Resource handwritingResource;

    private final ChatModel chatModel;

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

    private static final String DEFAULT_PROMPT = "识别图中的文字";

    @GetMapping("/handwritingRecognition1")
    public Flux<String> recognizeHandwriting(
            @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, handwritingResource));
        UserMessage message = new UserMessage(prompt, mediaList);
        message.getMetadata().put(DashScopeChatModel.MESSAGE_FORMAT, MessageFormat.IMAGE);

        Flux<ChatResponse> fluxResponse = chatModel.stream(
                new Prompt(message,
                        DashScopeChatOptions.builder()
                                .withModel("qwen-vl-max-latest") // 使用适合文字识别的模型
                                .withMultiModel(true)
                                .build()));
        Flux<String> fluxString = fluxResponse.map(resp -> resp.getResult().getOutput().getContent());
        return fluxString;
    }
}
    • 编写Controller用于接收客户端发送的图像文件并调用AI接口进行处理。
  1. 配置application.properties
spring.ai.dashscope.api-key=${AI_DASHSCOPE_API_KEY}
    • 将之前获得的API Key配置到application.properties文件中。
对上述具体步骤的解释

以上步骤涵盖了从初始化开发环境到实际编码的全过程。首先确保了所有必要软件包和服务都已就绪;然后通过Maven管理项目依赖关系,使Spring Boot能够自动发现并配置所需的组件;最后,通过简单的RESTful API设计实现了对用户上传的手写图片进行文字内容提取的功能。此过程中特别注意到了如何正确地引用本地资源文件以及如何利用Spring AI Alibaba提供的高级特性如Prompt模板等来增强应用程序的功能性。

;