diff --git a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/pom.xml b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/pom.xml
index 3f488c14d..82e8829cb 100644
--- a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/pom.xml
+++ b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/pom.xml
@@ -31,10 +31,28 @@
- 0.35.0
2.9.1
+
+
+
+ dev.langchain4j
+ langchain4j-bom
+ 1.3.0
+ pom
+ import
+
+
+ dev.langchain4j
+ langchain4j-community-bom
+ 1.3.0-beta9
+ pom
+ import
+
+
+
+
@@ -55,7 +73,7 @@
org.jeecgframework.boot3
jeecg-aiflow
- 1.2.0
+ 3.8.3.1
@@ -72,7 +90,6 @@
provided
-
com.yomahub
@@ -105,17 +122,19 @@
-
+
dev.langchain4j
- langchain4j-ollama
- ${langchain4j.version}
+ langchain4j-open-ai
dev.langchain4j
- langchain4j-zhipu-ai
- ${langchain4j.version}
+ langchain4j-ollama
+
+
+ dev.langchain4j
+ langchain4j-community-zhipu-ai
checker-qual
@@ -129,13 +148,11 @@
dev.langchain4j
- langchain4j-qianfan
- ${langchain4j.version}
+ langchain4j-community-qianfan
dev.langchain4j
- langchain4j-dashscope
- ${langchain4j.version}
+ langchain4j-community-dashscope
org.slf4j
@@ -151,7 +168,7 @@
org.jeecgframework
langchain4j-pgvector
- ${langchain4j.version}
+ 1.3.0-beta9
diff --git a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/service/impl/AiragAppServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/service/impl/AiragAppServiceImpl.java
index 5a56b4a1d..cc71f8c64 100644
--- a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/service/impl/AiragAppServiceImpl.java
+++ b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/service/impl/AiragAppServiceImpl.java
@@ -71,7 +71,7 @@ public class AiragAppServiceImpl extends ServiceImpl i
AtomicBoolean isThinking = new AtomicBoolean(false);
String requestId = UUIDGenerator.generate();
// ai聊天响应逻辑
- tokenStream.onNext((String resMessage) -> {
+ tokenStream.onPartialResponse((String resMessage) -> {
// 兼容推理模型
if ("".equals(resMessage)) {
isThinking.set(true);
@@ -99,9 +99,9 @@ public class AiragAppServiceImpl extends ServiceImpl i
throw new RuntimeException(e);
}
})
- .onComplete((responseMessage) -> {
+ .onCompleteResponse((responseMessage) -> {
// 记录ai的回复
- AiMessage aiMessage = responseMessage.content();
+ AiMessage aiMessage = responseMessage.aiMessage();
FinishReason finishReason = responseMessage.finishReason();
String respText = aiMessage.text();
if (FinishReason.STOP.equals(finishReason) || null == finishReason) {
@@ -114,9 +114,6 @@ public class AiragAppServiceImpl extends ServiceImpl i
throw new RuntimeException(e);
}
closeSSE(emitter, eventData);
- } else if (FinishReason.TOOL_EXECUTION.equals(finishReason)) {
- // 需要执行工具
- // TODO author: chenrui for: date:2025/3/7
} else {
// 异常结束
log.error("调用模型异常:" + respText);
diff --git a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/service/impl/AiragChatServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/service/impl/AiragChatServiceImpl.java
index 7abe46c6f..6fff5d99e 100644
--- a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/service/impl/AiragChatServiceImpl.java
+++ b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/service/impl/AiragChatServiceImpl.java
@@ -860,7 +860,7 @@ public class AiragChatServiceImpl implements IAiragChatService {
*/
AtomicBoolean isThinking = new AtomicBoolean(false);
// ai聊天响应逻辑
- chatStream.onNext((String resMessage) -> {
+ chatStream.onPartialResponse((String resMessage) -> {
// 兼容推理模型
if ("".equals(resMessage)) {
isThinking.set(true);
@@ -886,12 +886,12 @@ public class AiragChatServiceImpl implements IAiragChatService {
return;
}
sendMessage2Client(emitter, eventData);
- }).onComplete((responseMessage) -> {
+ }).onCompleteResponse((responseMessage) -> {
// 打印流程耗时日志
printChatDuration(requestId, "LLM输出消息完成");
AiragLocalCache.remove(AiragConsts.CACHE_TYPE_SSE_SEND_TIME, requestId);
// 记录ai的回复
- AiMessage aiMessage = responseMessage.content();
+ AiMessage aiMessage = responseMessage.aiMessage();
FinishReason finishReason = responseMessage.finishReason();
String respText = aiMessage.text();
// sse
diff --git a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/handler/AIChatHandler.java b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/handler/AIChatHandler.java
index e6d37f978..6b11f5144 100644
--- a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/handler/AIChatHandler.java
+++ b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/handler/AIChatHandler.java
@@ -105,14 +105,14 @@ public class AIChatHandler implements IAIChatHandler {
// langchain4j 异常友好提示
String errMsg = "调用大模型接口失败,详情请查看后台日志。";
if (oConvertUtils.isNotEmpty(e.getMessage())) {
-// // 根据常见异常关键字做细致翻译
-// for (Map.Entry entry : MODEL_ERROR_MAP.entrySet()) {
-// String key = entry.getKey();
-// String value = entry.getValue();
-// if (errMsg.contains(key)) {
-// errMsg = value;
-// }
-// }
+ // 根据常见异常关键字做细致翻译
+ for (Map.Entry entry : MODEL_ERROR_MAP.entrySet()) {
+ String key = entry.getKey();
+ String value = entry.getValue();
+ if (errMsg.contains(key)) {
+ errMsg = value;
+ }
+ }
}
log.error("AI模型调用异常: {}", errMsg, e);
throw new JeecgBootException(errMsg);
diff --git a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/handler/EmbeddingHandler.java b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/handler/EmbeddingHandler.java
index 8ca4d457c..cc7bfcf8f 100644
--- a/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/handler/EmbeddingHandler.java
+++ b/jeecg-boot/jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/llm/handler/EmbeddingHandler.java
@@ -9,7 +9,6 @@ import dev.langchain4j.data.document.splitter.DocumentSplitters;
import dev.langchain4j.data.embedding.Embedding;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.embedding.EmbeddingModel;
-import dev.langchain4j.model.openai.OpenAiTokenizer;
import dev.langchain4j.rag.content.retriever.ContentRetriever;
import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;
import dev.langchain4j.rag.query.router.DefaultQueryRouter;
@@ -167,7 +166,7 @@ public class EmbeddingHandler implements IEmbeddingHandler {
// 删除旧数据
embeddingStore.removeAll(metadataKey(EMBED_STORE_METADATA_DOCID).isEqualTo(doc.getId()));
// 分段器
- DocumentSplitter splitter = DocumentSplitters.recursive(DEFAULT_SEGMENT_SIZE, DEFAULT_OVERLAP_SIZE, new OpenAiTokenizer());
+ DocumentSplitter splitter = DocumentSplitters.recursive(DEFAULT_SEGMENT_SIZE, DEFAULT_OVERLAP_SIZE);
// 分段并存储
EmbeddingStoreIngestor ingestor = EmbeddingStoreIngestor.builder()
.documentSplitter(splitter)
diff --git a/jeecg-boot/pom.xml b/jeecg-boot/pom.xml
index 5bc910bda..b6c7d5136 100644
--- a/jeecg-boot/pom.xml
+++ b/jeecg-boot/pom.xml
@@ -524,7 +524,7 @@
org.jeecgframework.boot3
jeecg-boot-starter-chatgpt
- ${jeecgboot.version}
+ 3.8.3.1