Commit 91c2614d authored by 杨翌文's avatar 杨翌文

feature: 热门问题

parent d48260ed
...@@ -2,12 +2,16 @@ package cn.breeze.elleai.application.dto.response; ...@@ -2,12 +2,16 @@ package cn.breeze.elleai.application.dto.response;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
@Data @Data
@NoArgsConstructor
@AllArgsConstructor
public class HotQaMobileDto implements Serializable { public class HotQaMobileDto implements Serializable {
@Schema(description = "问题") @Schema(description = "问题")
......
...@@ -7,6 +7,7 @@ import cn.breeze.elleai.application.dto.langchain.VectorSearchRequest; ...@@ -7,6 +7,7 @@ import cn.breeze.elleai.application.dto.langchain.VectorSearchRequest;
import cn.breeze.elleai.application.dto.langchain.VectorSegment; import cn.breeze.elleai.application.dto.langchain.VectorSegment;
import cn.breeze.elleai.domain.sparring.model.response.QaAssistantResponseModel; import cn.breeze.elleai.domain.sparring.model.response.QaAssistantResponseModel;
import cn.breeze.elleai.domain.sparring.service.ChatCompletionService; import cn.breeze.elleai.domain.sparring.service.ChatCompletionService;
import cn.breeze.elleai.domain.sparring.service.KbService;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONArray;
...@@ -42,6 +43,8 @@ public class AiPlatformExtensionService { ...@@ -42,6 +43,8 @@ public class AiPlatformExtensionService {
private final AIService aiService; private final AIService aiService;
private final KbService kbService;
private final ChatCompletionService chatCompletionService; private final ChatCompletionService chatCompletionService;
...@@ -207,12 +210,20 @@ public class AiPlatformExtensionService { ...@@ -207,12 +210,20 @@ public class AiPlatformExtensionService {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
List<VectorSegment> vectorSegments =aiService.searchWithRerank(request); List<VectorSegment> vectorSegments =aiService.searchWithRerank(request);
if (CollUtil.isNotEmpty(vectorSegments)) { if (CollUtil.isNotEmpty(vectorSegments)) {
//todo 统计命中的知识,更新统计数据
//结果不为空,组装结果 //结果不为空,组装结果
for (VectorSegment vectorSegment : vectorSegments) { for (VectorSegment vectorSegment : vectorSegments) {
sb.append(vectorSegment.getContent() + "\n\n"); sb.append(vectorSegment.getContent() + "\n\n");
} }
updateKbHitStat(vectorSegments);
} }
return sb.toString(); return sb.toString();
} }
/**
* 重排后统计热门问题
* @param segments
*/
private void updateKbHitStat(List<VectorSegment> segments) {
kbService.updateHotQuestion(CollUtil.map(segments, VectorSegment::getId, true));
}
} }
...@@ -13,6 +13,7 @@ import cn.breeze.elleai.domain.sparring.model.response.QaAssistantResponseModel; ...@@ -13,6 +13,7 @@ import cn.breeze.elleai.domain.sparring.model.response.QaAssistantResponseModel;
import cn.breeze.elleai.domain.sparring.model.response.UserChatCompletionHistoryResponseModel; import cn.breeze.elleai.domain.sparring.model.response.UserChatCompletionHistoryResponseModel;
import cn.breeze.elleai.domain.sparring.model.response.UserChatCompletionResponseModel; import cn.breeze.elleai.domain.sparring.model.response.UserChatCompletionResponseModel;
import cn.breeze.elleai.domain.sparring.service.ChatCompletionService; import cn.breeze.elleai.domain.sparring.service.ChatCompletionService;
import cn.breeze.elleai.domain.sparring.service.KbService;
import cn.breeze.elleai.util.UserPrincipal; import cn.breeze.elleai.util.UserPrincipal;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
...@@ -52,6 +53,8 @@ public class AppChatCompletionService { ...@@ -52,6 +53,8 @@ public class AppChatCompletionService {
private final ChatCompletionService chatCompletionService; private final ChatCompletionService chatCompletionService;
private final KbService kbService;
/************************************************** AI助手 **************************************************/ /************************************************** AI助手 **************************************************/
...@@ -406,4 +409,13 @@ public class AppChatCompletionService { ...@@ -406,4 +409,13 @@ public class AppChatCompletionService {
} }
return null; return null;
} }
/**
* 热门提问
* @param request
* @return
*/
public PageResult<HotQaMobileDto> hotQaList(QaAssistantRequestDto request) {
return kbService.hotQaList(request);
}
} }
...@@ -36,10 +36,7 @@ public class ChatCompletionMobileController { ...@@ -36,10 +36,7 @@ public class ChatCompletionMobileController {
@Operation(summary = "热门提问") @Operation(summary = "热门提问")
@GetMapping("/hot/list") @GetMapping("/hot/list")
public ApiResponse<PageResult<HotQaMobileDto>> hotList(@QueryParam QaAssistantRequestDto request) { public ApiResponse<PageResult<HotQaMobileDto>> hotList(@QueryParam QaAssistantRequestDto request) {
PageResult<HotQaMobileDto> pageResult = new PageResult<>(); return ApiResponse.ok(chatCompletionService.hotQaList(request));
String json = "{\"items\": [{\"question\": \"热门提问1\"},{\"question\": \"热门提问2\"},{\"question\": \"热门提问3\"},{\"question\": \"热门提问4\"},{\"question\": \"热门提问5\"},{\"question\": \"热门提问6\"},{\"question\": \"热门提问7\"},{\"question\": \"热门提问8\"},{\"question\": \"热门提问9\"},{\"question\": \"热门提问10\"}],\"total\": 10,\"total_page\": 1,\"page_no\": 1,\"page_size\": 10}";
pageResult = JSON.parseObject(json, PageResult.class);
return ApiResponse.ok(pageResult);
} }
@Operation(summary = "历史对话") @Operation(summary = "历史对话")
......
package cn.breeze.elleai.domain.sparring.service; package cn.breeze.elleai.domain.sparring.service;
import cn.breeze.elleai.application.dto.PageResult;
import cn.breeze.elleai.application.dto.request.QaAssistantRequestDto;
import cn.breeze.elleai.application.dto.response.HotQaMobileDto;
import cn.breeze.elleai.domain.sparring.model.request.KbRequestModel; import cn.breeze.elleai.domain.sparring.model.request.KbRequestModel;
import cn.breeze.elleai.domain.sparring.model.request.KbSaveModel; import cn.breeze.elleai.domain.sparring.model.request.KbSaveModel;
import cn.breeze.elleai.domain.sparring.model.response.KbResponseModel; import cn.breeze.elleai.domain.sparring.model.response.KbResponseModel;
...@@ -28,4 +31,12 @@ public interface KbService extends IService<KbEntity> { ...@@ -28,4 +31,12 @@ public interface KbService extends IService<KbEntity> {
void deleteKb(Integer id); void deleteKb(Integer id);
void saveKb(KbSaveModel dto); void saveKb(KbSaveModel dto);
/**
* 更新热门问题
* @param vectorIds
*/
void updateHotQuestion(List<String> vectorIds);
PageResult<HotQaMobileDto> hotQaList(QaAssistantRequestDto request);
} }
package cn.breeze.elleai.domain.sparring.service; package cn.breeze.elleai.domain.sparring.service;
import cn.breeze.elleai.application.dto.PageResult;
import cn.breeze.elleai.application.dto.request.QaAssistantRequestDto;
import cn.breeze.elleai.application.dto.response.HotQaMobileDto;
import cn.breeze.elleai.domain.sparring.model.request.KbRequestModel; import cn.breeze.elleai.domain.sparring.model.request.KbRequestModel;
import cn.breeze.elleai.domain.sparring.model.request.KbSaveModel; import cn.breeze.elleai.domain.sparring.model.request.KbSaveModel;
import cn.breeze.elleai.domain.sparring.model.response.KbResponseModel; import cn.breeze.elleai.domain.sparring.model.response.KbResponseModel;
import cn.breeze.elleai.infra.entity.KbEntity; import cn.breeze.elleai.infra.entity.KbEntity;
import cn.breeze.elleai.infra.mapper.KbMapper; import cn.breeze.elleai.infra.mapper.KbMapper;
import cn.breeze.elleai.infra.mapper.KbVectorMapper;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.paginate.Page;
...@@ -20,6 +25,7 @@ import java.util.List; ...@@ -20,6 +25,7 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import static cn.breeze.elleai.infra.entity.table.KbTableDef.KB_ENTITY; import static cn.breeze.elleai.infra.entity.table.KbTableDef.KB_ENTITY;
import static cn.breeze.elleai.infra.entity.table.KbVectorTableDef.KB_VECTOR_ENTITY;
/** /**
* 服务层实现。 * 服务层实现。
...@@ -33,6 +39,8 @@ public class KbServiceImpl extends ServiceImpl<KbMapper, KbEntity> implements Kb ...@@ -33,6 +39,8 @@ public class KbServiceImpl extends ServiceImpl<KbMapper, KbEntity> implements Kb
private final KbMapper kbMapper; private final KbMapper kbMapper;
private final KbVectorMapper kbVectorMapper;
@Override @Override
public Page<KbResponseModel> kbPaginQuery(KbRequestModel request) { public Page<KbResponseModel> kbPaginQuery(KbRequestModel request) {
Integer pageNo = ObjectUtil.defaultIfNull(request.getPageNo(), 1); Integer pageNo = ObjectUtil.defaultIfNull(request.getPageNo(), 1);
...@@ -109,4 +117,29 @@ public class KbServiceImpl extends ServiceImpl<KbMapper, KbEntity> implements Kb ...@@ -109,4 +117,29 @@ public class KbServiceImpl extends ServiceImpl<KbMapper, KbEntity> implements Kb
} }
kbMapper.insertOrUpdateSelective(entity); kbMapper.insertOrUpdateSelective(entity);
} }
@Override
public void updateHotQuestion(List<String> vectorIds) {
QueryWrapper qw = QueryWrapper.create()
.select(KB_VECTOR_ENTITY.KB_ID)
.where(KB_VECTOR_ENTITY.VECTOR_ID.in(vectorIds));
List<Integer> kbIds = kbVectorMapper.selectObjectListByQueryAs(qw, Integer.class);
if (CollUtil.isNotEmpty(kbIds)) {
UpdateChain.of(KbEntity.class)
.set(KB_ENTITY.HINT, KB_ENTITY.HINT.add(1))
.where(KB_ENTITY.ID.in(kbIds))
.update();
}
}
@Override
public PageResult<HotQaMobileDto> hotQaList(QaAssistantRequestDto request) {
QueryWrapper qw = QueryWrapper.create()
.select(KB_ENTITY.QUESTION)
.where(KB_ENTITY.STATUS.eq(1).and(KB_ENTITY.DELETED.eq(0)))
.orderBy(KB_ENTITY.HINT.desc())
.limit(10);
List<String> questions = kbMapper.selectObjectListByQueryAs(qw, String.class);
return PageResult.of(1, 10, questions.size(), CollUtil.map(questions, HotQaMobileDto::new, true));
}
} }
...@@ -44,6 +44,11 @@ public class KbTableDef extends TableDef { ...@@ -44,6 +44,11 @@ public class KbTableDef extends TableDef {
*/ */
public final QueryColumn DELETED = new QueryColumn(this, "deleted"); public final QueryColumn DELETED = new QueryColumn(this, "deleted");
/**
* 统计次数
*/
public final QueryColumn HINT = new QueryColumn(this, "hint");
/** /**
* 创建时间 * 创建时间
*/ */
...@@ -67,7 +72,7 @@ public class KbTableDef extends TableDef { ...@@ -67,7 +72,7 @@ public class KbTableDef extends TableDef {
/** /**
* 默认字段,不包含逻辑删除或者 large 等字段。 * 默认字段,不包含逻辑删除或者 large 等字段。
*/ */
public final QueryColumn[] DEFAULT_COLUMNS = new QueryColumn[]{ID, TAG_ID, QUESTION, ANSWER, STATUS, DELETED, CREATE_AT, UPDATE_AT}; public final QueryColumn[] DEFAULT_COLUMNS = new QueryColumn[]{ID, TAG_ID, HINT, QUESTION, ANSWER, STATUS, DELETED, CREATE_AT, UPDATE_AT};
public KbTableDef() { public KbTableDef() {
super("", "cs_kb"); super("", "cs_kb");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment