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