package cc.mrbird.febs.ai.service.impl;
|
|
import cc.mrbird.febs.ai.entity.AiProductQuestion;
|
import cc.mrbird.febs.ai.entity.AiTalk;
|
import cc.mrbird.febs.ai.enumerates.AiPromptEnum;
|
import cc.mrbird.febs.ai.mapper.AiTalkMapper;
|
import cc.mrbird.febs.ai.req.talk.AiTalkAnswerStream;
|
import cc.mrbird.febs.ai.req.talk.ApiTalkDto;
|
import cc.mrbird.febs.ai.req.talk.ApiTalkItemPageDto;
|
import cc.mrbird.febs.ai.req.talk.ApiTalkPageDto;
|
import cc.mrbird.febs.ai.res.talk.ApiTalkPageVo;
|
import cc.mrbird.febs.ai.res.talk.ApiTalkQuestionVo;
|
import cc.mrbird.febs.ai.res.talk.ApiTalkVo;
|
import cc.mrbird.febs.ai.service.AiProductQuestionService;
|
import cc.mrbird.febs.ai.service.AiService;
|
import cc.mrbird.febs.ai.service.AiTalkItemService;
|
import cc.mrbird.febs.ai.service.AiTalkService;
|
import cc.mrbird.febs.ai.strategy.LlmStrategyFactory;
|
import cc.mrbird.febs.ai.strategy.enumerates.LlmStrategyContextEnum;
|
import cc.mrbird.febs.ai.strategy.enumerates.LlmStrategyEnum;
|
import cc.mrbird.febs.ai.strategy.param.LlmStrategyDto;
|
import cc.mrbird.febs.ai.utils.UUID;
|
import cc.mrbird.febs.common.entity.FebsResponse;
|
import cc.mrbird.febs.common.utils.LoginUserUtil;
|
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.date.DateTime;
|
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.json.JSONUtil;
|
import com.alibaba.dashscope.common.Role;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import lombok.RequiredArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.stereotype.Service;
|
import reactor.core.publisher.Flux;
|
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.HashMap;
|
import java.util.List;
|
|
@Slf4j
|
@Service
|
@RequiredArgsConstructor
|
public class AiTalkServiceImpl extends ServiceImpl<AiTalkMapper, AiTalk> implements AiTalkService {
|
|
private final AiTalkItemService aiTalkItemService;
|
private final AiProductQuestionService aiProductQuestionService;
|
private final AiService aiService;
|
private final LlmStrategyFactory llmStrategyFactory;
|
|
@Override
|
public FebsResponse questionList() {
|
List<ApiTalkQuestionVo> list = new ArrayList<>();
|
LambdaQueryWrapper<AiProductQuestion> queryWrapper = Wrappers.lambdaQuery(AiProductQuestion.class);
|
queryWrapper.orderByDesc(AiProductQuestion::getCreatedTime);
|
queryWrapper.last("limit 30");
|
List<AiProductQuestion> listByQuery = aiProductQuestionService.getListByQuery(queryWrapper);
|
if (CollUtil.isNotEmpty(listByQuery)){
|
for (AiProductQuestion aiProductQuestion : listByQuery){
|
ApiTalkQuestionVo apiTalkQuestionVo = new ApiTalkQuestionVo();
|
apiTalkQuestionVo.setContext(aiProductQuestion.getTitle());
|
list.add(apiTalkQuestionVo);
|
}
|
}
|
return new FebsResponse().success().data(list);
|
}
|
|
@Override
|
public FebsResponse talkOpen(ApiTalkDto dto) {
|
String talkId = dto.getTalkId();
|
String context = dto.getContext();
|
Integer type = dto.getType();
|
String reasoningContent = dto.getReasoningContent();
|
String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid();
|
|
AiTalk aiTalk = this.getById(talkId);
|
DateTime date = DateUtil.date();
|
if (StrUtil.isEmpty(talkId)){
|
aiTalk = this.add(memberUuid,context, date);
|
}
|
HashMap<String, String> stringStringHashMap = new HashMap<>();
|
stringStringHashMap.put(LlmStrategyContextEnum.THINK.getName(),reasoningContent);
|
stringStringHashMap.put(LlmStrategyContextEnum.CONTENT.getName(),context);
|
aiTalkItemService.add(aiTalk.getId(), type, JSONUtil.toJsonStr(stringStringHashMap), memberUuid, date);
|
|
ApiTalkVo apiTalkVo = new ApiTalkVo();
|
apiTalkVo.setTalkId(aiTalk.getId());
|
return new FebsResponse().success().data(apiTalkVo);
|
}
|
|
@Override
|
public AiTalk add(String memberUuid, String question, Date date) {
|
AiTalk aiTalk = new AiTalk();
|
aiTalk.setId(UUID.getSimpleUUIDString());
|
aiTalk.setQuestion(question);
|
aiTalk.setCreatedTime(date);
|
aiTalk.setMemberId(memberUuid);
|
this.baseMapper.insert(aiTalk);
|
return aiTalk;
|
}
|
|
@Override
|
public Flux<FebsResponse> answerStream(String question) {
|
|
return aiService.answerStream(question);
|
}
|
|
@Override
|
public FebsResponse talkList(ApiTalkPageDto dto) {
|
String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid();
|
dto.setMemberUuid(memberUuid);
|
// 创建分页对象,传入当前页和每页大小
|
Page<ApiTalkPageVo> page = new Page<>(dto.getPageNow(), dto.getPageSize());
|
Page<ApiTalkPageVo> pageListByQuery = this.getBaseMapper().getPageTalkListByQuery(page, dto);
|
|
return new FebsResponse().success().data(pageListByQuery);
|
}
|
|
@Override
|
public FebsResponse historyPage(ApiTalkItemPageDto dto) {
|
String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid();
|
dto.setMemberUuid(memberUuid);
|
return aiTalkItemService.historyPage(dto);
|
}
|
|
@Override
|
public Flux<FebsResponse> answerStreamV2(AiTalkAnswerStream dto) {
|
return aiService.answerStreamV2(dto);
|
}
|
|
@Override
|
public Flux<FebsResponse> answerStreamV3(AiTalkAnswerStream dto) {
|
ArrayList<LlmStrategyDto> llmStrategyDtoList = new ArrayList<>();
|
if (dto.getPrompt() != null){
|
LlmStrategyDto llmStrategyDto = new LlmStrategyDto();
|
llmStrategyDto.setRole(Role.SYSTEM.getValue());
|
llmStrategyDto.setContent(aiService.getSystemSetLTAiPrompt());
|
llmStrategyDtoList.add(llmStrategyDto);
|
}
|
if (dto.getQuestion() != null){
|
LlmStrategyDto llmStrategyDto = new LlmStrategyDto();
|
llmStrategyDto.setRole(Role.USER.getValue());
|
String format = StrUtil.format("请使用中文回答:{}", dto.getQuestion());
|
llmStrategyDto.setContent(format);
|
llmStrategyDtoList.add(llmStrategyDto);
|
}
|
String modelName = LlmStrategyEnum.getName(aiService.getSystemSetAiType());
|
return llmStrategyFactory.getCalculationStrategyMap().get(modelName).llmInvokeStreamingWithThink(llmStrategyDtoList);
|
}
|
|
}
|