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

feature: 热门问题

parent d48260ed
......@@ -2,12 +2,16 @@ package cn.breeze.elleai.application.dto.response;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class HotQaMobileDto implements Serializable {
@Schema(description = "问题")
......
......@@ -7,6 +7,7 @@ import cn.breeze.elleai.application.dto.langchain.VectorSearchRequest;
import cn.breeze.elleai.application.dto.langchain.VectorSegment;
import cn.breeze.elleai.domain.sparring.model.response.QaAssistantResponseModel;
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.util.ObjectUtil;
import com.alibaba.fastjson2.JSONArray;
......@@ -42,6 +43,8 @@ public class AiPlatformExtensionService {
private final AIService aiService;
private final KbService kbService;
private final ChatCompletionService chatCompletionService;
......@@ -207,12 +210,20 @@ public class AiPlatformExtensionService {
StringBuilder sb = new StringBuilder();
List<VectorSegment> vectorSegments =aiService.searchWithRerank(request);
if (CollUtil.isNotEmpty(vectorSegments)) {
//todo 统计命中的知识,更新统计数据
//结果不为空,组装结果
for (VectorSegment vectorSegment : vectorSegments) {
sb.append(vectorSegment.getContent() + "\n\n");
}
updateKbHitStat(vectorSegments);
}
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;
import cn.breeze.elleai.domain.sparring.model.response.UserChatCompletionHistoryResponseModel;
import cn.breeze.elleai.domain.sparring.model.response.UserChatCompletionResponseModel;
import cn.breeze.elleai.domain.sparring.service.ChatCompletionService;
import cn.breeze.elleai.domain.sparring.service.KbService;
import cn.breeze.elleai.util.UserPrincipal;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
......@@ -52,6 +53,8 @@ public class AppChatCompletionService {
private final ChatCompletionService chatCompletionService;
private final KbService kbService;
/************************************************** AI助手 **************************************************/
......@@ -406,4 +409,13 @@ public class AppChatCompletionService {
}
return null;
}
/**
* 热门提问
* @param request
* @return
*/
public PageResult<HotQaMobileDto> hotQaList(QaAssistantRequestDto request) {
return kbService.hotQaList(request);
}
}
......@@ -36,10 +36,7 @@ public class ChatCompletionMobileController {
@Operation(summary = "热门提问")
@GetMapping("/hot/list")
public ApiResponse<PageResult<HotQaMobileDto>> hotList(@QueryParam QaAssistantRequestDto request) {
PageResult<HotQaMobileDto> pageResult = new PageResult<>();
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);
return ApiResponse.ok(chatCompletionService.hotQaList(request));
}
@Operation(summary = "历史对话")
......
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.KbSaveModel;
import cn.breeze.elleai.domain.sparring.model.response.KbResponseModel;
......@@ -28,4 +31,12 @@ public interface KbService extends IService<KbEntity> {
void deleteKb(Integer id);
void saveKb(KbSaveModel dto);
/**
* 更新热门问题
* @param vectorIds
*/
void updateHotQuestion(List<String> vectorIds);
PageResult<HotQaMobileDto> hotQaList(QaAssistantRequestDto request);
}
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.KbSaveModel;
import cn.breeze.elleai.domain.sparring.model.response.KbResponseModel;
import cn.breeze.elleai.infra.entity.KbEntity;
import cn.breeze.elleai.infra.mapper.KbMapper;
import cn.breeze.elleai.infra.mapper.KbVectorMapper;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.mybatisflex.core.paginate.Page;
......@@ -20,6 +25,7 @@ import java.util.List;
import java.util.Objects;
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
private final KbMapper kbMapper;
private final KbVectorMapper kbVectorMapper;
@Override
public Page<KbResponseModel> kbPaginQuery(KbRequestModel request) {
Integer pageNo = ObjectUtil.defaultIfNull(request.getPageNo(), 1);
......@@ -109,4 +117,29 @@ public class KbServiceImpl extends ServiceImpl<KbMapper, KbEntity> implements Kb
}
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 {
*/
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 {
/**
* 默认字段,不包含逻辑删除或者 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() {
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