首页 > 编程语言 >Java - 手写识别; 如何用spring ai和大模型做手写识别教程

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

时间:2024-11-01 15:16:25浏览次数:3  
标签:Java AI Spring 模型 API spring 手写 识别

识别后的文字

利用大模型提升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模板等来增强应用程序的功能性。

标签:Java,AI,Spring,模型,API,spring,手写,识别
From: https://blog.csdn.net/whisperzzza/article/details/143407002

相关文章

  • java.sql.SQLException: ORA-00971: 缺失 SET 关键字
    目录背景:过程:错误原因: 解决办法:总结:背景:正在运行某个项目程序,提交信息之后发现库中并没有刚刚的相关数据,后来查看后台信息,发现提示错误,java.sql.SQLException:ORA-00971:缺失SET关键字,下面一片红色,经过筛选,我看到(UserManage.java:194),显然是UserManage类里面的......
  • 2024最新IntelliJ IDEA常用的小技巧汇总,JAVA 新手上路必备
    目录一、IntelliJIDEA概述二、下载与安装2.1下载2.2安装三、快速创建并运行Java工程3.1创建Java工程3.2创建package和class四、详细设置4.1字体大小设置4.2字符编码设置4.3大小写不敏感设置4.4自动导包4.5启动退出设置4.6自动更新五、快速开发5.1代码模板......
  • java--标识符、常量、变量、类型 转换
    1、注释(增强代码可读性)java中的注释单行注释(“//”)多行注释(/**/)tips:多行注释不能嵌套,否则会报错文档注释(/***/)源代码文件(Xxxx.java)通过编译生成字节码文件(Xxxx.class)的过程中编译器会忽略掉源码中的注释部分2、关键字(赋予特定含义的单词)特点组成关键字的字母全部小......
  • 【日常记录-Java】应用引入Slf4J
    1.简介    SLF4J(SimpleLoggingFacadeforJava)是Java的一个简单日志门面,为Java日志访问提供了一套标准、规范的API框架。而具体日志的实现则可以根据这套接口去实现具体的日志框架,以便将来需要更换日志框架时,只替换实现框架即可。常见的具体实现有JUL、log4j、......
  • 【日常记录-Java】SLF4J扫描实现框架的过程
    1.简介    SLF4J(SimpleLoggingFacadeforJava)作为一种简单的门面或抽象,服务于其他各种日志框架,例如JUL、log4j、logback等,核心作用有两项:提供日志接口;提供获取具体日志对象的方法;2.扫描过程 2.1引入依赖    在使用SLF4J时,需要引入其API依赖以及......
  • JAVA 二叉树面试题
    @目录摘要代码Node节点main函数问题1:递归——求二叉树的最大深度问题2:求二叉树的最小深度问题3:求二叉树中节点的个数问题4:求二叉树中叶子节点的个数问题5:求二叉树中第k层节点的个数,不是求第k层叶子节点个数问题6:判断两棵树是否相同问题7:给定一个二叉树,检查它是否是镜像对称的。问......
  • 为什么 C++ 编译速度比 Java 慢得多
    ###为什么C++编译速度比Java慢得多在探讨为什么C++编译速度比Java慢得多时,我们可以归纳出几个核心原因:C++的编译模型更为复杂、模板元编程、宏处理以及链接时间。其中,C++的编译模型更为复杂这一点尤为突出。C++需要处理的细节更多,如模板实例化、头文件的重复包含等,这些......
  • 揭秘命名实体识别:从基础到实战,带你探索文本中的隐藏宝藏!
     欢迎关注我......
  • Java 传参时,如何做到两个 String 实参的实际值交换_3
    ###Java传参时,如何做到两个String实参的实际值交换在Java中,所有的参数传递都是值传递,这意味着方法接收的是实参值的一个副本。对于基本数据类型,这个副本是实际值;对于对象,副本是引用的一个拷贝。因此,直接在方法内部交换两个`String`实参的实际值是不可能的。然而,可以通过一......
  • 一文彻底熟练掌握并使用Java的NIO操作
    一、基本概念JavaNIO是Java1.4引入的,用于处理高速、高并发的I/O操作。与传统的阻塞I/O不同,NIO支持非阻塞I/O和选择器,可以更高效地管理多个通道。二、核心组件通道(Channel)Channel是NIO中用于读取和写入数据的主要接口,提供双向数据传输的能力。常见的通道实现......