From 58128ba243a8dd5b2f2dc96d44e49ff1ef7e7eab Mon Sep 17 00:00:00 2001 From: Liuyang <2746366019@qq.com> Date: Sat, 8 Feb 2025 11:51:43 +0800 Subject: [PATCH] =?UTF-8?q?feat(llm):=20=E6=B7=BB=E5=8A=A0=E7=9F=A5?= =?UTF-8?q?=E8=AF=86=E5=BA=93=E5=90=91=E9=87=8F=E5=B5=8C=E5=85=A5=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在应用配置文件中添加知识库向量嵌入的 URL - 新增 AsyncKnowledgeBase 类中的 knowledgeEmbed 方法,用于异步处理知识库向量嵌入 - 在 KnowledgeBaseServiceImpl 中集成知识库向量嵌入的逻辑 - 新增 KnowledgeRagEmbedReqVO 类作为知识库向量嵌入的请求参数 - 在 LLMBackendProperties 中添加 embed 属性用于配置向量嵌入的 URL - 在 RagHttpService 中实现 knowledgeEmbed 方法,用于调用向量嵌入的 API --- .../backend/config/LLMBackendProperties.java | 5 + .../llm/service/async/AsyncKnowledgeBase.java | 98 +++++++++++++++++-- .../llm/service/http/RagHttpService.java | 70 ++++++++----- .../http/vo/KnowledgeRagEmbedReqVO.java | 39 ++++++++ .../KnowledgeBaseServiceImpl.java | 64 +++++++----- .../src/main/resources/application-dev.yaml | 3 +- .../src/main/resources/application-local.yaml | 18 ++-- .../src/main/resources/application-prod.yaml | 2 + 8 files changed, 235 insertions(+), 64 deletions(-) create mode 100644 yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/http/vo/KnowledgeRagEmbedReqVO.java diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/framework/backend/config/LLMBackendProperties.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/framework/backend/config/LLMBackendProperties.java index 8c783bce4..a214408ee 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/framework/backend/config/LLMBackendProperties.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/framework/backend/config/LLMBackendProperties.java @@ -102,4 +102,9 @@ public class LLMBackendProperties { private String autoEvaluation; private String textToImage; + + /** + * 知识库向量嵌入 + */ + private String embed; } diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/async/AsyncKnowledgeBase.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/async/AsyncKnowledgeBase.java index 808149f65..521b2bd43 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/async/AsyncKnowledgeBase.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/async/AsyncKnowledgeBase.java @@ -1,9 +1,12 @@ package cn.iocoder.yudao.module.llm.service.async; +import cn.iocoder.yudao.framework.common.exception.ErrorCode; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.module.llm.dal.dataobject.knowledgedocuments.KnowledgeDocumentsDO; import cn.iocoder.yudao.module.llm.framework.backend.config.LLMBackendProperties; import cn.iocoder.yudao.module.llm.service.http.RagHttpService; +import cn.iocoder.yudao.module.llm.service.http.vo.KnowledgeRagEmbedReqVO; import cn.iocoder.yudao.module.llm.service.http.vo.RegUploadReqVO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -11,7 +14,15 @@ import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; import java.util.List; +import java.util.Objects; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @Service public class AsyncKnowledgeBase { @@ -25,12 +36,12 @@ public class AsyncKnowledgeBase { // 向向量知识库创建文件 @Async - public void createKnowledgeBase(List knowledgeList,List ids) { - if (!CollectionUtils.isAnyEmpty(ids)){ + public void createKnowledgeBase (List knowledgeList, List ids) { + if (!CollectionUtils.isAnyEmpty(ids)) { String mes = ragHttpService.ragDocumentsDel(llmBackendProperties.getRagDocumentsDel(), ids); - log.info("delete knowledge base info {}",mes); + log.info("delete knowledge base info {}", mes); } - if (!CollectionUtils.isAnyEmpty(knowledgeList)){ + if (!CollectionUtils.isAnyEmpty(knowledgeList)) { knowledgeList.stream().forEach(knowledge -> { try { RegUploadReqVO regUploadReqVO = new RegUploadReqVO() @@ -39,11 +50,86 @@ public class AsyncKnowledgeBase { .setFileName(knowledge.getDocumentName()) .setFileUrl(knowledge.getFileUrl()); ragHttpService.embedUploadFile(regUploadReqVO); - }catch (Exception e){ - log.error("the creation of the knowledge base error {}",e.getMessage()); + } catch (Exception e) { + log.error("the creation of the knowledge base error {}", e.getMessage()); } }); } } + + /** + * 知识库向量嵌入 + * + * @param knowledgeList 文件列表 + */ + @Async + public void knowledgeEmbed (List knowledgeList) { + if (!CollectionUtils.isAnyEmpty(knowledgeList)) { + knowledgeList.forEach(knowledge -> { + try { + + // TODO:本地调试时打开 + /* + String tmpUrl = "http://xhllm.xinnuojinzhi.com/admin-api/infra/file/29/get/486b9a6fc855abf48847e9639f3c090855c6aafdc22a13b10e3244c37f03d3e0.txt"; + log.info("knowledge url {}", tmpUrl); + knowledge.setFileUrl(tmpUrl); + */ + + // 创建知识向量 + KnowledgeRagEmbedReqVO ragEmbedReqVo = new KnowledgeRagEmbedReqVO() + .setFileId(String.valueOf(knowledge.getId())) + .setFileName(knowledge.getDocumentName()) + .setFileInputStream(new ByteArrayInputStream(Objects.requireNonNull(getFileByte(knowledge.getFileUrl())))) + .setEntityId(String.valueOf(getEntityId())); + + ragHttpService.knowledgeEmbed(ragEmbedReqVo); + + } catch (Exception e) { + log.error("the creation of the knowledge base error {}", e.getMessage(), e); + } + }); + } + } + + /** + * 获取当前用户ID + * + * @return 用户ID + */ + public Long getEntityId () { + return SecurityFrameworkUtils.getLoginUserId(); + } + + /** + * 获取文件字节数组 + * + * @param fileUrl 文件地址 + * @return 文件字节数组 + */ + public static byte[] getFileByte (String fileUrl) { + log.info("knowledge url: {}", fileUrl); + + try (InputStream inputStream = new URL(fileUrl).openStream(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { + + // 缓冲区大小 + byte[] buffer = new byte[1024]; + int bytesRead; + + // 读取文件内容并写入 ByteArrayOutputStream + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + + // 返回字节数组 + return outputStream.toByteArray(); + + } catch (IOException e) { + log.error("Failed to read remote file: {}", e.getMessage()); + + throw exception(new ErrorCode(10001_001, "文件读取错误")); + } + } + } diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/http/RagHttpService.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/http/RagHttpService.java index 1e2911148..98a48f93b 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/http/RagHttpService.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/http/RagHttpService.java @@ -6,7 +6,6 @@ import cn.iocoder.yudao.module.llm.framework.backend.config.LLMBackendProperties import cn.iocoder.yudao.module.llm.service.http.vo.*; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.BeanUtils; import com.google.gson.JsonArray; import kong.unirest.HttpResponse; @@ -40,7 +39,7 @@ public class RagHttpService { /** * RAG健康检查API */ - public RagHealthRespVO ragHealth(Map headers){ + public RagHealthRespVO ragHealth (Map headers) { String ragHealth = llmBackendProperties.getRagHealth(); String res = HttpUtils.get(ragHealth, headers); log.info(" ragHealth:{}", res); @@ -52,10 +51,10 @@ public class RagHttpService { /** * 上传并向量化 */ - public RagEmbedRespVO ragEmbed(Map headers, RagEmbedReqVo ragEmbedReqVo){ + public RagEmbedRespVO ragEmbed (Map headers, RagEmbedReqVo ragEmbedReqVo) { String ragEmbed = llmBackendProperties.getRagEmbed(); Map map = BeanUtils.beanToMap(ragEmbedReqVo); - String res = HttpUtils.postForm(ragEmbed, headers,map); + String res = HttpUtils.postForm(ragEmbed, headers, map); log.info(" ragEmbedRespVO:{}", res); RagEmbedRespVO ragEmbedRespVO = JSON.parseObject(res, RagEmbedRespVO.class); log.info(" ragEmbedRespVO:{}", ragEmbedRespVO); @@ -64,12 +63,13 @@ public class RagHttpService { /** * 向量知识库文档上传 + * * @param ragUploadReqVO * @return * @throws UnirestException * @throws IOException */ - public RagEmbedRespVO embedUploadFile(RegUploadReqVO ragUploadReqVO) throws UnirestException, IOException { + public RagEmbedRespVO embedUploadFile (RegUploadReqVO ragUploadReqVO) throws UnirestException, IOException { CloseableHttpClient httpClient = HttpClients.createDefault(); RagEmbedRespVO ragEmbedRespVO = new RagEmbedRespVO(); HttpGet request = new HttpGet(ragUploadReqVO.getFileUrl()); @@ -108,7 +108,7 @@ public class RagHttpService { return ragEmbedRespVO; } - private static String detectCharset(InputStream inputStream) throws IOException { + private static String detectCharset (InputStream inputStream) throws IOException { byte[] buffer = new byte[4096]; int nread; UniversalDetector detector = new UniversalDetector(null); @@ -122,24 +122,25 @@ public class RagHttpService { return charset; } - public String ragDocumentsDel(String url, List documentIds){ - // 创建JSON数组 - JsonArray jsonArray = new JsonArray(); - for (Long id : documentIds) { - jsonArray.add(String.valueOf(id)); - } - // 发送DELETE请求 - HttpResponse response = Unirest.delete(url) - .header("Content-Type", "application/json") - .body(jsonArray.toString()) - .asString(); - // 返回响应体 - return response.getBody(); + public String ragDocumentsDel (String url, List documentIds) { + // 创建JSON数组 + JsonArray jsonArray = new JsonArray(); + for (Long id : documentIds) { + jsonArray.add(String.valueOf(id)); + } + // 发送DELETE请求 + HttpResponse response = Unirest.delete(url) + .header("Content-Type", "application/json") + .body(jsonArray.toString()) + .asString(); + // 返回响应体 + return response.getBody(); } + /** * 获取所有向量id */ - public List ragIds(Map headers){ + public List ragIds (Map headers) { String ragIds = llmBackendProperties.getRagIds(); String res = HttpUtils.get(ragIds, headers); log.info(" ragIds:{}", res); @@ -151,7 +152,7 @@ public class RagHttpService { /** * 根据id获取文档 */ - public RagDocumentsRespVO ragDocuments(Map headers, RagDocumentsReqVO ragDocumentsReqVO){ + public RagDocumentsRespVO ragDocuments (Map headers, RagDocumentsReqVO ragDocumentsReqVO) { String ragDocuments = llmBackendProperties.getRagDocuments(); String res = HttpUtils.get(ragDocuments, headers); log.info(" ragDocuments:{}", res); @@ -165,7 +166,7 @@ public class RagHttpService { /** * 根据id删除文档 */ - public String ragDocumentsDel(Map headers){ + public String ragDocumentsDel (Map headers) { String ragDocumentsDel = llmBackendProperties.getRagDocumentsDel(); String res = HttpUtils.del(ragDocumentsDel, headers); log.info(" ragDocumentsDel:{}", res); @@ -175,7 +176,7 @@ public class RagHttpService { /** * 根据file_id检索向量 */ - public RagQueryRespVO ragQuery(Map headers, RagQueryReqVo ragQueryReqVo){ + public RagQueryRespVO ragQuery (Map headers, RagQueryReqVo ragQueryReqVo) { String ragQuery = llmBackendProperties.getRagQuery(); String res = HttpUtils.post(ragQuery, headers, JSON.toJSONString(ragQueryReqVo)); log.info(" ragQuery:{}", res); @@ -195,10 +196,31 @@ public class RagHttpService { /** * 支持多个文件id查询向量 */ - public String ragQueryMultiple(Map headers, RagQueryMultipleReqVo ragQueryReqVo){ + public String ragQueryMultiple (Map headers, RagQueryMultipleReqVo ragQueryReqVo) { String ragQueryMultiple = llmBackendProperties.getRagQueryMultiple(); String res = HttpUtils.getBody(ragQueryMultiple, headers, JSON.toJSONString(ragQueryReqVo)); return res; } + /** + * 知识库向量嵌入 + * + * @param reqVO 请求参数 + */ + public void knowledgeEmbed (KnowledgeRagEmbedReqVO reqVO) { + // 获取知识库向量嵌入的url + String ragEmbed = llmBackendProperties.getEmbed(); + log.info("url : {}", ragEmbed); + + // 构建请求参数 + HttpResponse response = Unirest.post(ragEmbed) + .field("file_id", reqVO.getFileId()) + .field("entity_id", reqVO.getEntityId()) + .field("file", reqVO.getFileInputStream(), reqVO.getFileName()) + .asString(); + + log.info(" ========= Response Body Result: {}", response.getBody()); + + } + } diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/http/vo/KnowledgeRagEmbedReqVO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/http/vo/KnowledgeRagEmbedReqVO.java new file mode 100644 index 000000000..7f33d9087 --- /dev/null +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/http/vo/KnowledgeRagEmbedReqVO.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.llm.service.http.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +import java.io.ByteArrayInputStream; + +/** + * @Description 知识库向量化上传请求参数 + * @Author Liu Yang + * @Date 2025/2/8 11:21 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ToString(callSuper = true) +public class KnowledgeRagEmbedReqVO { + /** + * 文件id + */ + private String fileId; + + /** + * 文件名 + */ + private String fileName; + + /** + * 文件流 + */ + private ByteArrayInputStream fileInputStream; + + /** + * 用户Id + */ + private String entityId; +} diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/knowledgebase/KnowledgeBaseServiceImpl.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/knowledgebase/KnowledgeBaseServiceImpl.java index 1f7b5b462..152216b96 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/knowledgebase/KnowledgeBaseServiceImpl.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/knowledgebase/KnowledgeBaseServiceImpl.java @@ -25,6 +25,7 @@ import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -61,46 +62,59 @@ public class KnowledgeBaseServiceImpl implements KnowledgeBaseService { @Override public void updateKnowledgeBase (KnowledgeBaseSaveReqVO updateReqVO) { - // 校验存在 + // 1. 校验知识库是否存在 validateKnowledgeBaseExists(updateReqVO.getId()); + // 2. 校验知识库名称是否重复 validateKnowledgeBaseNameExists(updateReqVO); - // 更新 + + // 3. 更新知识库主表 KnowledgeBaseDO updateObj = BeanUtils.toBean(updateReqVO, KnowledgeBaseDO.class); knowledgeBaseMapper.updateById(updateObj); - List knowledgeDocumentsList = new ArrayList<>(); - // 附表增加数据 + + // 4. 处理附表(知识文档)数据 if (!CollectionUtils.isAnyEmpty(updateReqVO.getKnowledgeDocuments())) { - List ids = updateReqVO.getKnowledgeDocuments().stream().filter( - knowledgeDocuments -> knowledgeDocuments.getId() != null - ).map(KnowledgeDocumentsSaveReqVO::getId).collect(Collectors.toList()); - if (!CollectionUtils.isAnyEmpty(ids)) { - knowledgeDocumentsMapper.delete(new LambdaQueryWrapperX() - .eq(KnowledgeDocumentsDO::getKnowledgeBaseId, updateReqVO.getId()) - .notIn(KnowledgeDocumentsDO::getId, ids)); - } else { - knowledgeDocumentsMapper.delete(new LambdaQueryWrapperX() - .eq(KnowledgeDocumentsDO::getKnowledgeBaseId, updateReqVO.getId())); + // 4.1 获取需要保留的文档 ID + List retainedIds = updateReqVO.getKnowledgeDocuments().stream() + .map(KnowledgeDocumentsSaveReqVO::getId) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + // 4.2 删除不需要保留的文档 + LambdaQueryWrapperX deleteWrapper = new LambdaQueryWrapperX() + .eq(KnowledgeDocumentsDO::getKnowledgeBaseId, updateReqVO.getId()); + if (!CollectionUtils.isAnyEmpty(retainedIds)) { + deleteWrapper.notIn(KnowledgeDocumentsDO::getId, retainedIds); } - updateReqVO.getKnowledgeDocuments().forEach( - knowledgeDocuments -> { - KnowledgeDocumentsDO knowledgeDocumentsDO = BeanUtils.toBean(knowledgeDocuments, KnowledgeDocumentsDO.class); - knowledgeDocumentsDO.setKnowledgeBaseId(updateReqVO.getId()); - if (knowledgeDocuments.getId() == null) { - knowledgeDocumentsList.add(knowledgeDocumentsDO); - } - knowledgeDocumentsMapper.insertOrUpdate(knowledgeDocumentsDO); - } - ); + knowledgeDocumentsMapper.delete(deleteWrapper); + + // 4.3 更新或插入文档数据 + List newDocuments = new ArrayList<>(); + updateReqVO.getKnowledgeDocuments().forEach(doc -> { + KnowledgeDocumentsDO docDO = BeanUtils.toBean(doc, KnowledgeDocumentsDO.class); + docDO.setKnowledgeBaseId(updateReqVO.getId()); + if (doc.getId() == null) { + newDocuments.add(docDO); // 收集新增文档 + } + knowledgeDocumentsMapper.insertOrUpdate(docDO); // 更新或插入文档 + }); + + // 4.4 异步处理新增文档和删除的文档 List deleteIds = knowledgeDocumentsMapper.selectDeleteIds(updateReqVO.getId()); - asyncKnowledgeBase.createKnowledgeBase(knowledgeDocumentsList, deleteIds); + asyncKnowledgeBase.createKnowledgeBase(newDocuments, deleteIds); + // 4.5 异步处理知识库外挂 + asyncKnowledgeBase.knowledgeEmbed(newDocuments); } else { + // 5. 如果传入的文档列表为空,则删除所有关联文档 knowledgeDocumentsMapper.delete(new LambdaQueryWrapperX() .eq(KnowledgeDocumentsDO::getKnowledgeBaseId, updateReqVO.getId())); + + // 5.1 异步处理删除的文档 List deleteIds = knowledgeDocumentsMapper.selectDeleteIds(updateReqVO.getId()); if (!CollectionUtils.isAnyEmpty(deleteIds)) { asyncKnowledgeBase.createKnowledgeBase(null, deleteIds); } } + } @Override diff --git a/yudao-server/src/main/resources/application-dev.yaml b/yudao-server/src/main/resources/application-dev.yaml index 932d60054..bfc253543 100644 --- a/yudao-server/src/main/resources/application-dev.yaml +++ b/yudao-server/src/main/resources/application-dev.yaml @@ -282,7 +282,8 @@ llm: # 文生图 text_to_image: http://36.103.199.104:5123/generate-image - + # 知识库向量嵌入 + embed: http://36.103.199.104:8123/embed --- #################### iot相关配置 TODO 芋艿:再瞅瞅 #################### iot: emq: diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml index 7e9d810e9..260042e7b 100644 --- a/yudao-server/src/main/resources/application-local.yaml +++ b/yudao-server/src/main/resources/application-local.yaml @@ -170,12 +170,12 @@ debug: false --- #################### 微信公众号、小程序相关配置 #################### wx: mp: # 公众号配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档 -# app-id: wx041349c6f39b268b # 测试号(牛希尧提供的) -# secret: 5abee519483bc9f8cb37ce280e814bd0 + # app-id: wx041349c6f39b268b # 测试号(牛希尧提供的) + # secret: 5abee519483bc9f8cb37ce280e814bd0 app-id: wx5b23ba7a5589ecbb # 测试号(自己的) secret: 2a7b3b20c537e52e74afd395eb85f61f -# app-id: wxa69ab825b163be19 # 测试号(Kongdy 提供的) -# secret: bd4f9fab889591b62aeac0d7b8d8b4a0 + # app-id: wxa69ab825b163be19 # 测试号(Kongdy 提供的) + # secret: bd4f9fab889591b62aeac0d7b8d8b4a0 # 存储配置,解决 AccessToken 的跨节点的共享 config-storage: type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 @@ -184,10 +184,10 @@ wx: miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档 # appid: wx62056c0d5e8db250 # 测试号(牛希尧提供的) # secret: 333ae72f41552af1e998fe1f54e1584a -# appid: wx63c280fe3248a3e7 # wenhualian的接口测试号 -# secret: 6f270509224a7ae1296bbf1c8cb97aed -# appid: wxc4598c446f8a9cb3 # 测试号(Kongdy 提供的) -# secret: 4a1a04e07f6a4a0751b39c3064a92c8b + # appid: wx63c280fe3248a3e7 # wenhualian的接口测试号 + # secret: 6f270509224a7ae1296bbf1c8cb97aed + # appid: wxc4598c446f8a9cb3 # 测试号(Kongdy 提供的) + # secret: 4a1a04e07f6a4a0751b39c3064a92c8b appid: wx66186af0759f47c9 # 测试号(puhui 提供的) secret: 3218bcbd112cbc614c7264ceb20144ac config-storage: @@ -325,6 +325,8 @@ llm: # 文生图 text_to_image: http://36.103.199.104:5123/generate-image + # 知识库向量嵌入 + embed: http://36.103.199.104:8123/embed --- #################### iot相关配置 TODO 芋艿:再瞅瞅 #################### iot: emq: diff --git a/yudao-server/src/main/resources/application-prod.yaml b/yudao-server/src/main/resources/application-prod.yaml index 612fc65c6..88d63dded 100644 --- a/yudao-server/src/main/resources/application-prod.yaml +++ b/yudao-server/src/main/resources/application-prod.yaml @@ -325,6 +325,8 @@ llm: # 文生图 text_to_image: http://36.133.1.230:5123/generate-image + # 知识库向量嵌入 + embed: http://36.103.199.104:8123/embed --- #################### iot相关配置 TODO 芋艿:再瞅瞅 #################### iot: emq: