diff --git a/.gitignore b/.gitignore index 8d4de8975..c0af7965d 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,5 @@ assembly/runtime/* chm_db/ __pycache__/ /dict -assembly/build/*-SNAPSHOT \ No newline at end of file +assembly/build/*-SNAPSHOT +**/node_modules/ \ No newline at end of file diff --git a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatMemoryFilter.java b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatMemoryFilter.java index d887d411f..d8a5b130f 100644 --- a/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatMemoryFilter.java +++ b/chat/api/src/main/java/com/tencent/supersonic/chat/api/pojo/request/ChatMemoryFilter.java @@ -17,6 +17,8 @@ public class ChatMemoryFilter { private Integer agentId; + private Long queryId; + private String question; private List questions; diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/executor/SqlExecutor.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/executor/SqlExecutor.java index 6783dcd69..908514ee2 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/executor/SqlExecutor.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/executor/SqlExecutor.java @@ -44,7 +44,7 @@ public class SqlExecutor implements ChatQueryExecutor { Text2SQLExemplar.class); MemoryService memoryService = ContextUtils.getBean(MemoryService.class); - memoryService.createMemory(ChatMemory.builder() + memoryService.createMemory(ChatMemory.builder().queryId(queryResult.getQueryId()) .agentId(executeContext.getAgent().getId()).status(MemoryStatus.PENDING) .question(exemplar.getQuestion()).sideInfo(exemplar.getSideInfo()) .dbSchema(exemplar.getDbSchema()).s2sql(exemplar.getSql()) diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/persistence/dataobject/ChatMemoryDO.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/persistence/dataobject/ChatMemoryDO.java index 7622f53fd..ab7c7abc7 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/persistence/dataobject/ChatMemoryDO.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/persistence/dataobject/ChatMemoryDO.java @@ -23,6 +23,9 @@ public class ChatMemoryDO { @TableField("agent_id") private Integer agentId; + @TableField("query_id") + private Long queryId; + @TableField("question") private String question; diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/pojo/ChatMemory.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/pojo/ChatMemory.java index 16227be13..d74a03f1a 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/pojo/ChatMemory.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/pojo/ChatMemory.java @@ -2,11 +2,7 @@ package com.tencent.supersonic.chat.server.pojo; import com.tencent.supersonic.chat.api.pojo.enums.MemoryReviewResult; import com.tencent.supersonic.chat.api.pojo.enums.MemoryStatus; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.ToString; +import lombok.*; import java.util.Date; @@ -20,6 +16,8 @@ public class ChatMemory { private Integer agentId; + private Long queryId; + private String question; private String sideInfo; diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/rest/ChatController.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/rest/ChatController.java index 8c756f545..c3af4f9d0 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/rest/ChatController.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/rest/ChatController.java @@ -53,7 +53,7 @@ public class ChatController { } @PostMapping("/updateQAFeedback") - public Boolean updateQAFeedback(@RequestParam(value = "id") Integer id, + public Boolean updateQAFeedback(@RequestParam(value = "id") Long id, @RequestParam(value = "score") Integer score, @RequestParam(value = "feedback", required = false) String feedback) { return chatService.updateFeedback(id, score, feedback); diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/ChatManageService.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/ChatManageService.java index 6f18cbcfc..2034354ac 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/ChatManageService.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/ChatManageService.java @@ -13,7 +13,6 @@ import com.tencent.supersonic.chat.server.persistence.dataobject.ChatParseDO; import com.tencent.supersonic.chat.server.persistence.dataobject.ChatQueryDO; import com.tencent.supersonic.common.pojo.User; import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.headless.api.pojo.response.ParseResp; import java.util.List; @@ -24,7 +23,7 @@ public interface ChatManageService { boolean updateChatName(Long chatId, String chatName, String userName); - boolean updateFeedback(Integer id, Integer score, String feedback); + boolean updateFeedback(Long id, Integer score, String feedback); boolean updateChatIsTop(Long chatId, int isTop); diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/ChatManageServiceImpl.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/ChatManageServiceImpl.java index db355e8aa..22883b05c 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/ChatManageServiceImpl.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/ChatManageServiceImpl.java @@ -2,9 +2,9 @@ package com.tencent.supersonic.chat.server.service.impl; import com.alibaba.fastjson.JSONObject; import com.github.pagehelper.PageInfo; -import com.tencent.supersonic.chat.api.pojo.request.ChatExecuteReq; -import com.tencent.supersonic.chat.api.pojo.request.ChatParseReq; -import com.tencent.supersonic.chat.api.pojo.request.PageQueryInfoReq; +import com.tencent.supersonic.chat.api.pojo.enums.MemoryReviewResult; +import com.tencent.supersonic.chat.api.pojo.enums.MemoryStatus; +import com.tencent.supersonic.chat.api.pojo.request.*; import com.tencent.supersonic.chat.api.pojo.response.ChatParseResp; import com.tencent.supersonic.chat.api.pojo.response.QueryResp; import com.tencent.supersonic.chat.api.pojo.response.QueryResult; @@ -15,11 +15,12 @@ import com.tencent.supersonic.chat.server.persistence.dataobject.ChatQueryDO; import com.tencent.supersonic.chat.server.persistence.dataobject.QueryDO; import com.tencent.supersonic.chat.server.persistence.repository.ChatQueryRepository; import com.tencent.supersonic.chat.server.persistence.repository.ChatRepository; +import com.tencent.supersonic.chat.server.pojo.ChatMemory; import com.tencent.supersonic.chat.server.service.ChatManageService; +import com.tencent.supersonic.chat.server.service.MemoryService; import com.tencent.supersonic.common.pojo.User; import com.tencent.supersonic.common.util.JsonUtil; import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo; -import com.tencent.supersonic.headless.api.pojo.response.ParseResp; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -38,6 +39,8 @@ public class ChatManageServiceImpl implements ChatManageService { private ChatRepository chatRepository; @Autowired private ChatQueryRepository chatQueryRepository; + @Autowired + private MemoryService memoryService; @Override public Long addChat(User user, String chatName, Integer agentId) { @@ -64,11 +67,28 @@ public class ChatManageServiceImpl implements ChatManageService { } @Override - public boolean updateFeedback(Integer id, Integer score, String feedback) { + public boolean updateFeedback(Long id, Integer score, String feedback) { QueryDO intelligentQueryDO = new QueryDO(); intelligentQueryDO.setId(id); + intelligentQueryDO.setQuestionId(id); intelligentQueryDO.setScore(score); intelligentQueryDO.setFeedback(feedback); + + // enable or disable memory based on user feedback + if (score >= 5 || score <= 1) { + ChatMemoryFilter memoryFilter = ChatMemoryFilter.builder().queryId(id).build(); + List memories = memoryService.getMemories(memoryFilter); + memories.forEach(m -> { + MemoryStatus status = score >= 5 ? MemoryStatus.ENABLED : MemoryStatus.DISABLED; + MemoryReviewResult reviewResult = + score >= 5 ? MemoryReviewResult.POSITIVE : MemoryReviewResult.NEGATIVE; + ChatMemoryUpdateReq memoryUpdateReq = ChatMemoryUpdateReq.builder().id(m.getId()) + .status(status).humanReviewRet(reviewResult) + .humanReviewCmt("Reviewed as per user feedback").build(); + memoryService.updateMemory(memoryUpdateReq, User.getDefaultUser()); + }); + } + return chatRepository.updateFeedback(intelligentQueryDO); } diff --git a/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/MemoryServiceImpl.java b/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/MemoryServiceImpl.java index b3ef0143f..e7f828683 100644 --- a/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/MemoryServiceImpl.java +++ b/chat/server/src/main/java/com/tencent/supersonic/chat/server/service/impl/MemoryServiceImpl.java @@ -140,7 +140,7 @@ public class MemoryServiceImpl implements MemoryService { return chatMemoryDOS.stream().map(this::getMemory).collect(Collectors.toList()); } - private void enableMemory(ChatMemoryDO memory) { + public void enableMemory(ChatMemoryDO memory) { memory.setStatus(MemoryStatus.ENABLED.toString()); exemplarService.storeExemplar(embeddingConfig.getMemoryCollectionName(memory.getAgentId()), Text2SQLExemplar.builder().question(memory.getQuestion()) @@ -148,7 +148,7 @@ public class MemoryServiceImpl implements MemoryService { .sql(memory.getS2sql()).build()); } - private void disableMemory(ChatMemoryDO memory) { + public void disableMemory(ChatMemoryDO memory) { memory.setStatus(MemoryStatus.DISABLED.toString()); exemplarService.removeExemplar(embeddingConfig.getMemoryCollectionName(memory.getAgentId()), Text2SQLExemplar.builder().question(memory.getQuestion()) diff --git a/launchers/standalone/src/main/java/com/tencent/supersonic/demo/S2BaseDemo.java b/launchers/standalone/src/main/java/com/tencent/supersonic/demo/S2BaseDemo.java index d20a90fff..a908cb35b 100644 --- a/launchers/standalone/src/main/java/com/tencent/supersonic/demo/S2BaseDemo.java +++ b/launchers/standalone/src/main/java/com/tencent/supersonic/demo/S2BaseDemo.java @@ -190,7 +190,7 @@ public abstract class S2BaseDemo implements CommandLineRunner { return relateDimension; } - protected void updateQueryScore(Integer queryId) { + protected void updateQueryScore(Long queryId) { chatManageService.updateFeedback(queryId, 5, ""); } diff --git a/launchers/standalone/src/main/java/com/tencent/supersonic/demo/S2VisitsDemo.java b/launchers/standalone/src/main/java/com/tencent/supersonic/demo/S2VisitsDemo.java index 314aa4621..432490ea3 100644 --- a/launchers/standalone/src/main/java/com/tencent/supersonic/demo/S2VisitsDemo.java +++ b/launchers/standalone/src/main/java/com/tencent/supersonic/demo/S2VisitsDemo.java @@ -115,8 +115,8 @@ public class S2VisitsDemo extends S2BaseDemo { // create agent Integer agentId = addAgent(s2DataSet.getId()); addSampleChats(agentId); - updateQueryScore(1); - updateQueryScore(4); + updateQueryScore(1L); + updateQueryScore(4L); } catch (Exception e) { log.error("Failed to add S2Visits demo data", e); } diff --git a/launchers/standalone/src/main/resources/config.update/sql-update.sql b/launchers/standalone/src/main/resources/config.update/sql-update.sql index 766c11413..00ea06110 100644 --- a/launchers/standalone/src/main/resources/config.update/sql-update.sql +++ b/launchers/standalone/src/main/resources/config.update/sql-update.sql @@ -402,3 +402,6 @@ alter table s2_agent add column `viewer` varchar(1000) COLLATE utf8_unicode_ci D --20241201 ALTER TABLE s2_query_stat_info RENAME COLUMN `user` TO `query_user`; ALTER TABLE s2_chat_context RENAME COLUMN `user` TO `query_user`; + +--20241226 +alter table s2_chat_memory add column `query_id` BIGINT DEFAULT NULL; \ No newline at end of file diff --git a/launchers/standalone/src/main/resources/db/schema-h2.sql b/launchers/standalone/src/main/resources/db/schema-h2.sql index 2ea4e51c6..606d56966 100644 --- a/launchers/standalone/src/main/resources/db/schema-h2.sql +++ b/launchers/standalone/src/main/resources/db/schema-h2.sql @@ -86,6 +86,7 @@ COMMENT ON TABLE s2_chat_config IS 'chat config information table '; CREATE TABLE IF NOT EXISTS `s2_chat_memory` ( `id` INT NOT NULL AUTO_INCREMENT, `question` varchar(655) , + `query_id` BIGINT , `agent_id` INT , `db_schema` TEXT , `s2_sql` TEXT , diff --git a/launchers/standalone/src/main/resources/db/schema-mysql.sql b/launchers/standalone/src/main/resources/db/schema-mysql.sql index cbabb98dc..c24e73ffe 100644 --- a/launchers/standalone/src/main/resources/db/schema-mysql.sql +++ b/launchers/standalone/src/main/resources/db/schema-mysql.sql @@ -77,6 +77,7 @@ CREATE TABLE IF NOT EXISTS `s2_chat_memory` ( `id` INT NOT NULL AUTO_INCREMENT, `question` varchar(655) COMMENT '用户问题' , `side_info` TEXT COMMENT '辅助信息' , + `query_id` BIGINT COMMENT '问答ID' , `agent_id` INT COMMENT '助理ID' , `db_schema` TEXT COMMENT 'Schema映射' , `s2_sql` TEXT COMMENT '大模型解析SQL' , diff --git a/launchers/standalone/src/main/resources/db/schema-postgres.sql b/launchers/standalone/src/main/resources/db/schema-postgres.sql index 815224151..284268301 100644 --- a/launchers/standalone/src/main/resources/db/schema-postgres.sql +++ b/launchers/standalone/src/main/resources/db/schema-postgres.sql @@ -70,6 +70,7 @@ CREATE TABLE IF NOT EXISTS s2_chat_memory ( id SERIAL PRIMARY KEY, question varchar(655), side_info TEXT, + query_id bigint, agent_id INTEGER, db_schema TEXT, s2_sql TEXT,