【代码评审】AI:写作实现

This commit is contained in:
YunaiV
2024-07-03 21:26:38 +08:00
parent 9ddd2eddf8
commit f20c27a7ef
7 changed files with 43 additions and 30 deletions

View File

@ -1,5 +1,7 @@
package cn.iocoder.yudao.module.ai.controller.admin.write.vo;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import cn.iocoder.yudao.module.ai.enums.write.AiWriteTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@ -8,6 +10,11 @@ import lombok.Data;
@Data
public class AiWriteGenerateReqVO {
@Schema(description = "写作类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@InEnum(AiWriteTypeEnum.class)
private Integer type;
// TODO @xin如果非必填可以不用写 requiredMode
@Schema(description = "写作内容提示", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "1.撰写田忌赛马2.回复:不批")
private String prompt;
@ -30,7 +37,4 @@ public class AiWriteGenerateReqVO {
@NotNull(message = "语言不能为空")
private Integer language;
@Schema(description = "写作类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Integer type; //参见 AiWriteTypeEnum 枚举
}

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.ai.dal.dataobject.write;
import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
@ -34,6 +35,18 @@ public class AiWriteDO extends BaseDO {
*/
private Integer type;
/**
* 模型
*/
private String model;
/**
* 平台
*
* 枚举 {@link AiPlatformEnum}
*/
private String platform;
/**
* 生成内容提示
*/
@ -69,16 +82,6 @@ public class AiWriteDO extends BaseDO {
*/
private Integer language;
/**
* 模型
*/
private String model;
/**
* 平台
*/
private String platform;
/**
* 错误信息
*/

View File

@ -11,7 +11,6 @@ import reactor.core.publisher.Flux;
*/
public interface AiWriteService {
/**
* 生成写作内容
*
@ -21,5 +20,4 @@ public interface AiWriteService {
*/
Flux<CommonResult<String>> generateWriteContent(AiWriteGenerateReqVO generateReqVO, Long userId);
}

View File

@ -46,23 +46,22 @@ public class AiWriteServiceImpl implements AiWriteService {
@Resource
private AiChatModelService chatModalService;
@Resource
private AiWriteMapper writeMapper;
private AiWriteMapper writeMapper; // TODO @xin上面空一行因为同类之间不要空行非同类空行
@Override
public Flux<CommonResult<String>> generateWriteContent(AiWriteGenerateReqVO generateReqVO, Long userId) {
//TODO 芋艿 写作的模型配置放哪好 先用千问测试
// 1.1 校验模型
// TODO @xin可以约定大于配置先查询某个名字。例如说写作助手然后写作助手上面是有个 model 的,可以使用它。
AiChatModelDO model = chatModalService.validateChatModel(14L);
StreamingChatModel chatClient = apiKeyService.getStreamingChatClient(model.getKeyId());
AiPlatformEnum platform = AiPlatformEnum.validatePlatform(model.getPlatform());
ChatOptions chatOptions = buildChatOptions(platform, model.getModel(), model.getTemperature(), model.getMaxTokens());
//1.2 插入写作信息
// 1.2 插入写作信息
AiWriteDO writeDO = BeanUtils.toBean(generateReqVO, AiWriteDO.class);
writeMapper.insert(writeDO.setUserId(userId).setModel(model.getModel()).setPlatform(platform.getPlatform()));
//2.1 构建提示词
// 2.1 构建提示词
Prompt prompt = new Prompt(buildWritingPrompt(generateReqVO), chatOptions);
Flux<ChatResponse> streamResponse = chatClient.stream(prompt);
// 2.2 流式返回
@ -81,7 +80,6 @@ public class AiWriteServiceImpl implements AiWriteService {
}).onErrorResume(error -> Flux.just(error(ErrorCodeConstants.WRITE_STREAM_ERROR)));
}
private String buildWritingPrompt(AiWriteGenerateReqVO generateReqVO) {
String template;
Integer writeType = generateReqVO.getType();