JeecgBoot 是一款基于代碼生成器的低代碼開(kāi)發(fā)平臺(tái)!前后端分離架構(gòu) SpringBoot2.x 和 3.x掉弛,SpringCloud搅幅,Ant Design Vue3,Mybatis-plus,Shiro躬存,JWT张惹,支持微服務(wù)。強(qiáng)大的代碼生成器讓前后端代碼一鍵生成岭洲,實(shí)現(xiàn)低代碼開(kāi)發(fā)宛逗!JeecgBoot 引領(lǐng)新的低代碼開(kāi)發(fā)模式 (OnlineCoding-> 代碼生成器 -> 手工 MERGE), 幫助解決 Java 項(xiàng)目 70% 的重復(fù)工作钦椭,讓開(kāi)發(fā)更多關(guān)注業(yè)務(wù)拧额。既能快速提高效率,節(jié)省研發(fā)成本彪腔,同時(shí)又不失靈活性侥锦!
JeecgBoot 如何集成 Spring AI
Spring 通過(guò) Spring AI 項(xiàng)目正式啟用了 AI(人工智能)生成提示功能。本文將帶你了解如何在 Jeecg Boot 應(yīng)用中集成生成式 AI德挣,以及 Spring AI 如何與模型互動(dòng)恭垦,包含 RAG 功能。
(Retrieval Augmented Generation)檢索增強(qiáng)生成(RAG)是一種用于將個(gè)人未經(jīng)訓(xùn)練數(shù)據(jù)與人工智能模型集成的技術(shù)格嗅。在 RAG 工作流程中番挺,第一步將文檔數(shù)據(jù)加載到矢量數(shù)據(jù)庫(kù)(例如 Redis)中。當(dāng)收到用戶查詢時(shí)屯掖,矢量數(shù)據(jù)庫(kù)會(huì)檢索一組與該查詢相似的文檔玄柏。然后,這些文檔數(shù)據(jù)充當(dāng)用戶問(wèn)題的上下文贴铜,并與用戶的查詢結(jié)合使用生成響應(yīng)(通常通過(guò) LLM 模型)粪摘。
先來(lái)看一下最終效果,效果分別是 AI 互動(dòng)以及 RAG 互動(dòng)绍坝。
集成 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 自動(dòng)配置完成了大部分工作,引入依賴后轩褐,只需要再進(jìn)入如下配置即可
spring:
ai:
openai:
api-key: open-ai-api-key
base-url: 如非使用代理點(diǎn)椎咧,則無(wú)需更改
進(jìn)行以上配置之后,官方默認(rèn)沒(méi)有提供 ChatClient 的 bean 注冊(cè)把介,所以我們還需要最后一步勤讽,注冊(cè) ChatClient Bean。
@Bean
public ChatClient chatClient(ChatClient.Builder builder, VectorStore vectorStore) {
return builder.build();
}
到這里拗踢,我們已經(jīng)可以正常使用 ChatClient脚牍、ImageModel 等 API 與 OpenAI 進(jìn)行互動(dòng)訪問(wèn)了,如下:
文生文:
chatClient.prompt().user(message).call().content();
文生圖:
imageModel.call(new ImagePrompt(description,
OpenAiImageOptions.builder().build()));
RAG:
// 向量庫(kù)查詢
List<document> documents = vectorStore.similaritySearch(query);
String info = "";
if (documents.size() > 0) {
info = documents.get(0).getContent();
}
// 構(gòu)造系統(tǒng)prompt
String systemPrompt = "你的名字叫Jeecg AI助手,你的官網(wǎng)在http://jeecg.com,以友好的方式回應(yīng),樂(lè)于助人秒拔、快樂(lè)的態(tài)度";
// 構(gòu)造用戶prompt
String userPrompt = """
給你提供一些數(shù)據(jù)參考: {info}莫矗,請(qǐng)回答我的問(wèn)題:{query}
請(qǐng)你跟進(jìn)數(shù)據(jù)參考與工具返回結(jié)果回復(fù)用戶的請(qǐng)求飒硅。
""";
// 構(gòu)造提示詞
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 集成
經(jīng)過(guò)以上兩段配置,已經(jīng)可以正常與 Spring AI 支持的各個(gè)大模型進(jìn)行 API 調(diào)用了作谚,不過(guò)也僅僅是停留在代碼層面三娩,使用門檻也限制在開(kāi)發(fā)員人層面。
JeecgBoot 在 3.7 版本提供了 AI 對(duì)話的頁(yè)面妹懒,不過(guò)現(xiàn)在版本的默認(rèn)實(shí)現(xiàn)并不是通過(guò) Spring AI 進(jìn)行集成的雀监,但是卻已經(jīng)完成了前后端對(duì)話通信的框架,接下來(lái)只需要使用 Spring AI 替換掉原有的大模型交互即可眨唬。
org.jeecg.modules.demo.gpt.service.impl.ChatServiceImpl 這個(gè)類的 sendMessage 方法中会前,將如下代碼進(jìn)行注釋,替換上 Spring AI 的 API 調(diào)用代碼即可匾竿。如下
替換成
Flux<string> contents = client.prompt()
.user(message)
.stream().content().then(“DONE”);
final String id = topicId;
contents.subscribe(p -> {
Map<string, string> result = new HashMap<>();
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);
}
});
最終效果如開(kāi)頭所示瓦宜,如果需要將對(duì)話替換成 RAG 對(duì)話,只需要將 chatClient 調(diào)用更換即可岭妖。