Solon AI 开发学习16 – generate – 生成模型(图、音、视)

生成模型(GenerateModel) 与 聊天模型(ChatModel)用途区别很大。GenerateModel 只能一次性生成内容,不能对话。比如:

  • 通过文本,生成图片、声音、视频
  • 通过图片,生成视频
  • 等(只要是一次性生成)

补充:GenerateModel 是替代之前的 ImageModel 而新设计的接口,完全兼容 ImageModel 且概念范围更广(旧接口仍可用)。

1、构建生成模型

添加配置

solon.ai.generate:   demo:     apiUrl: "https://ai.gitee.com/v1/images/generations" # 使用完整地址(而不是 api_base)     model: "stable-diffusion-3.5-large-turbo" 

构建并测试

import org.noear.solon.ai.generate.GenerateConfig; import org.noear.solon.ai.generate.GenerateModel; import org.noear.solon.ai.generate.GenerateResponse; import org.noear.solon.annotation.Bean; import org.noear.solon.annotation.Configuration; import org.noear.solon.annotation.Inject;  import java.io.IOException;  @Configuration public class DemoConfig {     @Bean     public GenerateModel build(@Inject("${solon.ai.generate}") GenerateConfig config) {         return GenerateModel.of(config).build();     }      @Bean     public void test(GenerateModel generateModel) throws IOException {         //一次性返回         GenerateResponse resp = generateModel.prompt("一只白色的小花猫").call();          //打印消息         System.out.println(resp.getContent().getUrl());     } } 

2、使用选项

generateModel.prompt("一只白色的小花猫")     .options(o -> o.size("1024x1024"))     .call();      generateModel.prompt("一只白色的小花猫")     .options(o -> {         o.optionAdd("negative_prompt", "");         o.optionAdd("sampler_name", "Euler");         o.optionAdd("scheduler", "Simple");         o.optionAdd("steps", 25);         o.optionAdd("width", 512);         o.optionAdd("height", 768);         o.optionAdd("batch_size", 1);         o.optionAdd("cfg_scale", 1);         o.optionAdd("distilled_cfg_scale", 3.5);         o.optionAdd("seed", -1);         o.optionAdd("n_iter", 1);     })     .call();     

3、方言适配

生成模型(GenerateModel)同样支持方言适配。框架已内置 OllamaGenerateDialect、DashscopeGenerateDialect、OpenaiGenerateDialect(默认) 三种方言(基本够用),自动支持 Ollama 提供的模型接口、Dashscope 提供的模型接口及 Openai 规范的模型接口。

也可以通过定制,实现更多的模型兼容。方言接口:

public interface GenerateDialect extends AiModelDialect {     /**      * 是否为默认      */     default boolean isDefault() {         return false;     }      /**      * 匹配检测      *      * @param config 聊天配置      */     boolean matched(GenerateConfig config);      /**      * 构建请求数据      *      * @param config    聊天配置      * @param options   聊天选项      * @param promptStr 提示语文本形态      * @param promptMap 提示语字典形态      */     String buildRequestJson(GenerateConfig config, GenerateOptions options, String promptStr, Map promptMap);      /**      * 分析响应数据      *      * @param config   聊天配置      * @param respJson 响应数据      */     GenerateResponse parseResponseJson(GenerateConfig config, String respJson); } 

OllamaGenerateDialect 适配参考:

public class OllamaGenerateDialect extends AbstractGenerateDialect {     private static OllamaGenerateDialect instance = new OllamaGenerateDialect();      public static OllamaGenerateDialect getInstance() {         return instance;     }      @Override     public boolean matched(GenerateConfig config) {         return "ollama".equals(config.getProvider());     }      @Override     public GenerateResponse parseResponseJson(GenerateConfig config, String respJson) {         ONode oResp = ONode.load(respJson);          String model = oResp.get("model").getString();          if (oResp.contains("error")) {             return new GenerateResponse(model, new GenerateException(oResp.get("error").getString()), null, null);         } else {             List<GenerateContent> data = null;             if (oResp.contains("response")) {                 //文本模型生成                 String text = oResp.get("response").getString();                 data = Arrays.asList(GenerateContent.builder().text(text).build());             } else if (oResp.contains("data")) {                 //图像模型生成                 data = oResp.get("data").toObjectList(GenerateContent.class);             }              AiUsage usage = null;             if (oResp.contains("prompt_eval_count")) {                 int prompt_eval_count = oResp.get("prompt_eval_count").getInt();                 usage = new AiUsage(                         prompt_eval_count,                         0,                         prompt_eval_count                 );             }              return new GenerateResponse(model, null, data, usage);         }     } } 

发表评论

您必须 [ 登录 ] 才能发表留言!

相关文章