feat: 本地知识库功能优化

This commit is contained in:
ageer
2025-03-24 23:35:45 +08:00
parent 567498654e
commit e893110ee5
4 changed files with 33 additions and 19 deletions

View File

@@ -33,6 +33,7 @@ import org.ruoyi.knowledge.service.IKnowledgeAttachService;
import org.ruoyi.knowledge.service.IKnowledgeFragmentService;
import org.ruoyi.knowledge.service.IKnowledgeInfoService;
import org.ruoyi.system.listener.SSEEventSourceListener;
import org.ruoyi.system.service.ISseService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.ruoyi.knowledge.chain.vectorstore.VectorStore;
@@ -68,11 +69,14 @@ public class KnowledgeController extends BaseController {
private final ChatConfig chatConfig;
private final ISseService sseService;
/**
* 知识库对话
*/
@PostMapping("/send")
public SseEmitter send(@RequestBody @Valid ChatRequest chatRequest) {
openAiStreamClient = chatConfig.getOpenAiStreamClient();
SseEmitter sseEmitter = new SseEmitter(0L);
SSEEventSourceListener openAIEventSourceListener = new SSEEventSourceListener(sseEmitter);
@@ -87,6 +91,10 @@ public class KnowledgeController extends BaseController {
}
Message userMessage = Message.builder().content(content + (nearestList.size() > 0 ? "\n\n注意回答问题时须严格根据我给你的系统上下文内容原文进行回答请不要自己发挥,回答时保持原来文本的段落层级" : "") ).role(Message.Role.USER).build();
messages.add(userMessage);
if (chatRequest.getModel().startsWith("ollama")) {
return sseService.ollamaChat(chatRequest);
}
ChatCompletion completion = ChatCompletion
.builder()
.messages(messages)

View File

@@ -43,7 +43,7 @@ import java.util.List;
@RequestMapping("/chat")
public class ChatController {
private final ISseService ISseService;
private final ISseService sseService;
private final IChatMessageService chatMessageService;
@@ -54,9 +54,9 @@ public class ChatController {
@ResponseBody
public SseEmitter sseChat(@RequestBody @Valid ChatRequest chatRequest, HttpServletRequest request) {
if (chatRequest.getModel().startsWith("ollama")) {
return ISseService.ollamaChat(chatRequest);
return sseService.ollamaChat(chatRequest);
}
return ISseService.sseChat(chatRequest,request);
return sseService.sseChat(chatRequest,request);
}
@@ -66,7 +66,7 @@ public class ChatController {
@PostMapping("/upload")
@ResponseBody
public UploadFileResponse upload(@RequestPart("file") MultipartFile file) {
return ISseService.upload(file);
return sseService.upload(file);
}
@@ -78,7 +78,7 @@ public class ChatController {
@PostMapping("/audio")
@ResponseBody
public WhisperResponse audio(@RequestParam("file") MultipartFile file) {
WhisperResponse whisperResponse = ISseService.speechToTextTranscriptionsV2(file);
WhisperResponse whisperResponse = sseService.speechToTextTranscriptionsV2(file);
return whisperResponse;
}
@@ -90,7 +90,7 @@ public class ChatController {
@PostMapping("/speech")
@ResponseBody
public ResponseEntity<Resource> speech(@RequestBody TextToSpeech textToSpeech) {
return ISseService.textToSpeed(textToSpeech);
return sseService.textToSpeed(textToSpeech);
}
/**
@@ -101,13 +101,13 @@ public class ChatController {
@PostMapping("/translation")
@ResponseBody
public String translation(@RequestBody TranslationRequest translationRequest) {
return ISseService.translation(translationRequest);
return sseService.translation(translationRequest);
}
@PostMapping("/dall3")
@ResponseBody
public R<List<Item>> dall3(@RequestBody @Valid Dall3Request request) {
return R.ok(ISseService.dall3(request));
return R.ok(sseService.dall3(request));
}
/**

View File

@@ -229,21 +229,19 @@ public class WeaviateVectorStore implements VectorStore{
@Override
public void storeEmbeddings(List<String> chunkList, List<List<Double>> vectorList,String kid, String docId,List<String> fidList) {
WeaviateClient client = getClient();
for (int i = 0; i < chunkList.size(); i++) {
if (vectorList != null) {
if (vectorList != null) {
for (int i = 0; i < Math.min(chunkList.size(), vectorList.size()); i++) {
List<Double> vector = vectorList.get(i);
Float[] vf = new Float[vector.size()];
for (int j = 0; j < vector.size(); j++) {
Double value = vector.get(j);
vf[j] = value.floatValue();
}
Float[] vf = vector.stream().map(Double::floatValue).toArray(Float[]::new);
Map<String, Object> dataSchema = new HashMap<>();
dataSchema.put("content", chunkList.get(i));
dataSchema.put("kid", kid);
dataSchema.put("docId", docId);
dataSchema.put("fid", fidList.get(i));
String uuid = UUID.randomUUID(true).toString();
String uuid = UUID.randomUUID().toString();
dataSchema.put("uuid", uuid);
Result<WeaviateObject> result = client.data().creator()
.withClassName(className + kid)
.withID(uuid)

View File

@@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.zhipu.oapi.ClientV4;
import com.zhipu.oapi.service.v4.tools.*;
import io.github.ollama4j.OllamaAPI;
import io.github.ollama4j.models.chat.OllamaChatMessage;
import io.github.ollama4j.models.chat.OllamaChatMessageRole;
import io.github.ollama4j.models.chat.OllamaChatRequestBuilder;
import io.github.ollama4j.models.chat.OllamaChatRequestModel;
@@ -626,13 +627,20 @@ public class SseServiceImpl implements ISseService {
final SseEmitter emitter = new SseEmitter();
String host = sysModel.getApiHost();
List<Message> msgList = chatRequest.getMessages();
Message message = msgList.get(msgList.size() - 1);
List<OllamaChatMessage> messages = new ArrayList<>();
for (Message message : msgList) {
OllamaChatMessage ollamaChatMessage = new OllamaChatMessage();
ollamaChatMessage.setRole(OllamaChatMessageRole.USER);
ollamaChatMessage.setContent(message.getContent().toString());
messages.add(ollamaChatMessage);
}
OllamaAPI api = new OllamaAPI(host);
api.setRequestTimeoutSeconds(100);
OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance(parts[1]);
OllamaChatRequestModel requestModel = builder
.withMessage(OllamaChatMessageRole.USER,
message.getContent().toString())
.withMessages(messages)
.build();
// 异步执行 OllAma API 调用