|
@@ -4,13 +4,14 @@ import cn.iocoder.yudao.framework.ai.chat.*;
|
|
|
import cn.iocoder.yudao.framework.ai.chat.prompt.ChatOptions;
|
|
|
import cn.iocoder.yudao.framework.ai.chat.prompt.Prompt;
|
|
|
import cn.iocoder.yudao.framework.ai.chatqianwen.api.QianWenApi;
|
|
|
-import cn.iocoder.yudao.framework.ai.chatqianwen.api.QianWenChatCompletionRequest;
|
|
|
import cn.iocoder.yudao.framework.ai.chatyiyan.exception.YiYanApiException;
|
|
|
import com.alibaba.dashscope.aigc.generation.GenerationResult;
|
|
|
import com.alibaba.dashscope.aigc.generation.models.QwenParam;
|
|
|
import com.alibaba.dashscope.common.Message;
|
|
|
+import com.google.common.collect.Lists;
|
|
|
import io.reactivex.Flowable;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.jetbrains.annotations.NotNull;
|
|
|
import org.springframework.http.ResponseEntity;
|
|
|
import org.springframework.retry.RetryCallback;
|
|
|
import org.springframework.retry.RetryContext;
|
|
@@ -71,7 +72,7 @@ public class QianWenChatClient implements ChatClient, StreamingChatClient {
|
|
|
return this.retryTemplate.execute(ctx -> {
|
|
|
// ctx 会有重试的信息
|
|
|
// 创建 request 请求,stream模式需要供应商支持
|
|
|
- QianWenChatCompletionRequest request = this.createRequest(prompt, false);
|
|
|
+ QwenParam request = this.createRequest(prompt, false);
|
|
|
// 调用 callWithFunctionSupport 发送请求
|
|
|
ResponseEntity<GenerationResult> responseEntity = qianWenApi.chatCompletionEntity(request);
|
|
|
// 获取结果封装 chatCompletion
|
|
@@ -81,11 +82,41 @@ public class QianWenChatClient implements ChatClient, StreamingChatClient {
|
|
|
// response.getRequestId(), response.getCode(), response.getMessage()))));
|
|
|
// }
|
|
|
// 转换为 Generation 返回
|
|
|
- return new ChatResponse(List.of(new Generation(response.getOutput().getText())));
|
|
|
+ return new ChatResponse(response.getOutput().getChoices().stream()
|
|
|
+ .map(choices -> new Generation(choices.getMessage().getContent()))
|
|
|
+ .collect(Collectors.toList()));
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- private QianWenChatCompletionRequest createRequest(Prompt prompt, boolean stream) {
|
|
|
+ private QwenParam createRequest(Prompt prompt, boolean stream) {
|
|
|
+ // 获取 ChatOptions
|
|
|
+ QianWenOptions chatOptions = getChatOptions(prompt);
|
|
|
+ //
|
|
|
+ List<Message> messageList = Lists.newArrayList();
|
|
|
+ prompt.getInstructions().stream().forEach(instruction -> {
|
|
|
+ Message message = new Message();
|
|
|
+ message.setRole(instruction.getMessageType().getValue());
|
|
|
+ message.setContent(instruction.getContent());
|
|
|
+ messageList.add(message);
|
|
|
+ });
|
|
|
+ return QwenParam.builder()
|
|
|
+ .model(qianWenApi.getQianWenChatModal().getValue())
|
|
|
+ .prompt(prompt.getContents())
|
|
|
+ .messages(messageList)
|
|
|
+ .maxTokens(chatOptions.getMaxTokens())
|
|
|
+ .resultFormat(QwenParam.ResultFormat.MESSAGE)
|
|
|
+ .topP(Double.valueOf(chatOptions.getTopP()))
|
|
|
+ .topK(chatOptions.getTopK())
|
|
|
+ .temperature(chatOptions.getTemperature())
|
|
|
+ // 控制流式输出模式,即后面的内容会包含已经输出的内容;设置为True,将开启增量输出模式,后面的输出不会包含已经输出的内容,您需要自行拼接整体输出
|
|
|
+ .incrementalOutput(true)
|
|
|
+ /* set the random seed, optional, default to 1234 if not set */
|
|
|
+ .seed(100)
|
|
|
+ .apiKey(qianWenApi.getApiKey())
|
|
|
+ .build();
|
|
|
+ }
|
|
|
+
|
|
|
+ private @NotNull QianWenOptions getChatOptions(Prompt prompt) {
|
|
|
// 两个都为null 则没有配置文件
|
|
|
if (qianWenOptions == null && prompt.getOptions() == null) {
|
|
|
throw new ChatException("ChatOptions 未配置参数!");
|
|
@@ -96,37 +127,27 @@ public class QianWenChatClient implements ChatClient, StreamingChatClient {
|
|
|
options = (ChatOptions) prompt.getOptions();
|
|
|
}
|
|
|
// Prompt 里面是一个 ChatOptions,用户可以随意传入,这里做一下判断
|
|
|
- if (!(options instanceof QianWenOptions qianWenOptions)) {
|
|
|
+ if (!(options instanceof QianWenOptions)) {
|
|
|
throw new ChatException("Prompt 传入的不是 QianWenOptions!");
|
|
|
}
|
|
|
- return (QianWenChatCompletionRequest) QianWenChatCompletionRequest.builder()
|
|
|
- .model(qianWenApi.getQianWenChatModal().getValue())
|
|
|
- .apiKey(qianWenApi.getApiKey())
|
|
|
- .messages(prompt.getInstructions().stream().map(m -> {
|
|
|
- Message message = new Message();
|
|
|
- message.setRole(m.getMessageType().getValue());
|
|
|
- message.setContent(m.getContent());
|
|
|
- return message;
|
|
|
- }).collect(Collectors.toList()))
|
|
|
- .resultFormat(QwenParam.ResultFormat.MESSAGE)
|
|
|
- // 动态改变的三个参数
|
|
|
- .topP(Double.valueOf(qianWenOptions.getTopP()))
|
|
|
- .topK(qianWenOptions.getTopK())
|
|
|
- .temperature(qianWenOptions.getTemperature())
|
|
|
- .incrementalOutput(true)
|
|
|
- .build();
|
|
|
+ return (QianWenOptions) options;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public Flux<ChatResponse> stream(Prompt prompt) {
|
|
|
// ctx 会有重试的信息
|
|
|
// 创建 request 请求,stream模式需要供应商支持
|
|
|
- QianWenChatCompletionRequest request = this.createRequest(prompt, true);
|
|
|
+ QwenParam request = this.createRequest(prompt, true);
|
|
|
// 调用 callWithFunctionSupport 发送请求
|
|
|
Flowable<GenerationResult> responseResult = this.qianWenApi.chatCompletionStream(request);
|
|
|
+
|
|
|
return Flux.create(fluxSink ->
|
|
|
responseResult.subscribe(
|
|
|
- value -> fluxSink.next(new ChatResponse(List.of(new Generation(value.getOutput().getText())))),
|
|
|
+ value -> fluxSink.next(
|
|
|
+ new ChatResponse(value.getOutput().getChoices().stream()
|
|
|
+ .map(choices -> new Generation(choices.getMessage().getContent()))
|
|
|
+ .collect(Collectors.toList()))
|
|
|
+ ),
|
|
|
error -> fluxSink.error(error),
|
|
|
() -> fluxSink.complete()
|
|
|
)
|