JeecgBoot 低代码平台快速集成 Spring AI

发布于:2024-08-08 ⋅ 阅读:(254) ⋅ 点赞:(0)

JeecgBoot 是一款基于代码生成器的低代码开发平台!前后端分离架构 SpringBoot2.x和3.x,SpringCloud,Ant Design Vue3,Mybatis-plus,Shiro,JWT,支持微服务。强大的代码生成器让前后端代码一键生成,实现低代码开发! JeecgBoot 引领新的低代码开发模式(OnlineCoding-> 代码生成器-> 手工MERGE), 帮助解决Java项目70%的重复工作,让开发更多关注业务。既能快速提高效率,节省研发成本,同时又不失灵活性!

JeecgBoot如何集成Spring AI

Spring 通过 Spring AI 项目正式启用了 AI(人工智能)生成提示功能。本文将带你了解如何在 Jeecg Boot 应用中集成生成式 AI,以及 Spring AI 如何与模型互动,包含RAG功能。

(Retrieval Augmented Generation)检索增强生成(RAG)是一种用于将个人未经训练数据与人工智能模型集成的技术。在 RAG 工作流程中,第一步将文档数据加载到矢量数据库(例如 Redis)中。当收到用户查询时,矢量数据库会检索一组与该查询相似的文档。然后,这些文档数据充当用户问题的上下文,并与用户的查询结合使用生成响应(通常通过 LLM 模型)。

先来看一下最终效果,效果分别是AI互动以及RAG互动。

集成Spring AI
在Jeecg-module-demo模块的pom.xml中,添加如下配置

<dependency>
	<groupid>org.springframework.ai</groupid>
	<artifactid>spring-ai-openai-spring-boot-starter</artifactid>
	<version>1.0.0-M1</version>
</dependency>
<repositories>
	<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>

添加配置
Spring AI提供的starter自动配置完成了大部分工作,引入依赖后,只需要再进入如下配置即可

spring:
  ai:
    openai:
      api-key: open-ai-api-key
      base-url: 如非使用代理点,则无需更改

进行以上配置之后,官方默认没有提供ChatClient的bean注册,所以我们还需要最后一步,注册ChatClient Bean。

@Bean
public ChatClient chatClient(ChatClient.Builder builder, VectorStore vectorStore) {
	return builder.build();
}

到这里,我们已经可以正常使用ChatClient、ImageModel等API与OpenAI进行互动访问了,如下:

文生文:

chatClient.prompt().user(message).call().content();

文生图:

imageModel.call(new ImagePrompt(description,
                        OpenAiImageOptions.builder().build()));

RAG:

 // 向量库查询
List<document> documents = vectorStore.similaritySearch(query);
String info = "";
if (documents.size() &gt; 0) {
   info = documents.get(0).getContent();
}

// 构造系统prompt
String systemPrompt = "你的名字叫Jeecg AI助手,你的官网在http://jeecg.com,以友好的方式回应,乐于助人、快乐的态度";

// 构造用户prompt
String userPrompt = """
                给你提供一些数据参考: {info},请回答我的问题:{query}
                请你跟进数据参考与工具返回结果回复用户的请求。
                """;

// 构造提示词
Message systemMessage = new SystemMessage(systemPrompt);
PromptTemplate promptTemplate = new PromptTemplate(userPrompt);
Message userMessage = promptTemplate.createMessage(Map.of("info", info, "query", query));
Prompt prompt = new Prompt(List.of(userMessage, systemMessage));

client.prompt(prompt).stream().content();

与JeecgBoot集成

经过以上两段配置,已经可以正常与Spring AI支持的各个大模型进行API调用了,不过也仅仅是停留在代码层面,使用门槛也限制在开发员人层面。

JeecgBoot在3.7版本提供了AI对话的页面,不过现在版本的默认实现并不是通过Spring AI进行集成的,但是却已经完成了前后端对话通信的框架,接下来只需要使用Spring AI替换掉原有的大模型交互即可。

org.jeecg.modules.demo.gpt.service.impl.ChatServiceImpl这个类的sendMessage方法中,将如下代码进行注释,替换上Spring AI的API调用代码即可。如下

替换成

Flux<string> contents = client.prompt()
                        .user(message)
                        .stream().content().then(“DONE”);

final String id = topicId;
        contents.subscribe(p -&gt; {
            Map<string, string> result = new HashMap&lt;&gt;();
            result.put("content", p);
            try {
                if ("DONE".equals("p")) {
                    sseEmitter.send(SseEmitter.event().id("DONE").data(p), MediaType.TEXT_EVENT_STREAM);
                } else {
                    sseEmitter.send(SseEmitter.event()
                            .id(id)
                            .data(result)
                            .reconnectTime(3000));
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });

最终效果如开头所示,如果需要将对话替换成RAG对话,只需要将chatClient调用更换即可。


网站公告

今日签到

点亮在社区的每一天
去签到