feat(chat): 新增保存润色结果向量接口并重构向量类型
- ChatController 新增 /save_embed 接口,接收 ChatSaveReq 保存用户选中润色句子的向量 - 统一向量参数由 List<Float> 改为 float[],降低 GC 压力 - 向量搜索增加 ≥0.9 相似度过滤,仅返回高置信结果 - 精简 DemoController 测试接口,下线冗余的 testSaveEmbed/testSearch - 调整 Embedding 模型为 qwen3-embedding-4b,降低资源占用 - 放开 /chat/save_embed 匿名访问,适配前端直调
This commit is contained in:
@@ -1,7 +1,11 @@
|
||||
package com.yolo.keyborad.controller;
|
||||
|
||||
import cn.dev33.satoken.stp.StpUtil;
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import com.yolo.keyborad.common.BaseResponse;
|
||||
import com.yolo.keyborad.common.ResultUtils;
|
||||
import com.yolo.keyborad.model.dto.chat.ChatReq;
|
||||
import com.yolo.keyborad.model.dto.chat.ChatSaveReq;
|
||||
import com.yolo.keyborad.model.dto.chat.ChatStreamMessage;
|
||||
import com.yolo.keyborad.model.entity.KeyboardCharacter;
|
||||
import com.yolo.keyborad.service.KeyboardCharacterService;
|
||||
@@ -12,6 +16,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.ai.chat.client.ChatClient;
|
||||
import org.springframework.ai.embedding.EmbeddingResponse;
|
||||
import org.springframework.ai.openai.OpenAiChatOptions;
|
||||
import org.springframework.ai.openai.OpenAiEmbeddingModel;
|
||||
import org.springframework.boot.context.properties.bind.DefaultValue;
|
||||
@@ -47,15 +52,11 @@ public class ChatController {
|
||||
|
||||
@PostMapping("/talk")
|
||||
@Operation(summary = "聊天润色接口", description = "聊天润色接口")
|
||||
@Parameter(name = "userInput",required = true,description = "测试聊天接口",example = "talk to something")
|
||||
public Flux<ServerSentEvent<ChatStreamMessage>> testTalk(@RequestBody ChatReq chatReq){
|
||||
|
||||
KeyboardCharacter character = keyboardCharacterService.getById(chatReq.getCharacterId());
|
||||
|
||||
// 1. LLM 流式输出
|
||||
Flux<ChatStreamMessage> llmFlux = client
|
||||
.prompt(character.getPrompt() +
|
||||
"\nUser message: %s".formatted(chatReq.getMessage()))
|
||||
.prompt(character.getPrompt())
|
||||
.system("""
|
||||
Format rules:
|
||||
- Return EXACTLY 3 replies.
|
||||
@@ -97,8 +98,9 @@ public class ChatController {
|
||||
@PostMapping("/save_embed")
|
||||
@Operation(summary = "保存润色后的句子", description = "保存润色后的句子")
|
||||
@Parameter(name = "userInput",required = true,description = "测试聊天接口",example = "talk to something")
|
||||
public Flux<String> testTalkWithVector(@RequestBody ChatReq chatReq) {
|
||||
|
||||
return null;
|
||||
public BaseResponse<Boolean> testTalkWithVector(@RequestBody ChatSaveReq chatSaveReq) {
|
||||
float[] embed = embeddingModel.embed(chatSaveReq.getUserInputMessage());
|
||||
qdrantVectorService.upsertPoint(IdUtil.getSnowflakeNextId(), embed, chatSaveReq.getUserSelectMessage());
|
||||
return ResultUtils.success(true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -97,23 +97,23 @@ public class DemoController {
|
||||
}
|
||||
|
||||
|
||||
@PostMapping("/testSaveEmbed")
|
||||
@Operation(summary = "测试存储向量接口", description = "测试存储向量接口")
|
||||
@Parameter(name = "userInput",required = true,description = "测试存储向量接口")
|
||||
public BaseResponse<Boolean> testSaveEmbed(@RequestBody EmbedSaveReq embedSaveReq) {
|
||||
qdrantVectorService.upsertPoint(embedSaveReq.getRecordItem().getId()
|
||||
, embedSaveReq.getVector()
|
||||
, JSONUtil.toJsonStr(embedSaveReq.getRecordItem()));
|
||||
return ResultUtils.success(true);
|
||||
}
|
||||
// @PostMapping("/testSaveEmbed")
|
||||
// @Operation(summary = "测试存储向量接口", description = "测试存储向量接口")
|
||||
// @Parameter(name = "userInput",required = true,description = "测试存储向量接口")
|
||||
// public BaseResponse<Boolean> testSaveEmbed(@RequestBody EmbedSaveReq embedSaveReq) {
|
||||
// qdrantVectorService.upsertPoint(embedSaveReq.getRecordItem().getId()
|
||||
// , embedSaveReq.getVector()
|
||||
// , JSONUtil.toJsonStr(embedSaveReq.getRecordItem()));
|
||||
// return ResultUtils.success(true);
|
||||
// }
|
||||
|
||||
|
||||
@PostMapping("/testSearch")
|
||||
@Operation(summary = "测试搜索向量接口", description = "测试搜索向量接口")
|
||||
@Parameter(name = "userInput",required = true,description = "测试搜索向量接口")
|
||||
public BaseResponse<List<QdrantSearchItem>> testSearch(@RequestBody SearchEmbedReq searchEmbedReq) {
|
||||
return ResultUtils.success(qdrantVectorService.searchPoint(searchEmbedReq.getUserInputEmbed(), 3));
|
||||
}
|
||||
// @PostMapping("/testSearch")
|
||||
// @Operation(summary = "测试搜索向量接口", description = "测试搜索向量接口")
|
||||
// @Parameter(name = "userInput",required = true,description = "测试搜索向量接口")
|
||||
// public BaseResponse<List<QdrantSearchItem>> testSearch(@RequestBody SearchEmbedReq searchEmbedReq) {
|
||||
// return ResultUtils.success(qdrantVectorService.searchPoint(searchEmbedReq.getUserInputEmbed(), 3));
|
||||
// }
|
||||
|
||||
|
||||
@PostMapping("/tsetSearchText")
|
||||
|
||||
Reference in New Issue
Block a user