找回密码
 立即注册
首页 业界区 业界 Solon AI 开发学习16 - generate - 生成模型(图、音、 ...

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

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

  • 通过文本,生成图片、声音、视频
  • 通过图片,生成视频
  • 等(只要是一次性生成)
补充:GenerateModel 是替代之前的 ImageModel 而新设计的接口,完全兼容 ImageModel 且概念范围更广(旧接口仍可用)。
1、构建生成模型

添加配置
  1. solon.ai.generate:
  2.   demo:
  3.     apiUrl: "https://ai.gitee.com/v1/images/generations" # 使用完整地址(而不是 api_base)
  4.     model: "stable-diffusion-3.5-large-turbo"
复制代码
构建并测试
  1. import org.noear.solon.ai.generate.GenerateConfig;
  2. import org.noear.solon.ai.generate.GenerateModel;
  3. import org.noear.solon.ai.generate.GenerateResponse;
  4. import org.noear.solon.annotation.Bean;
  5. import org.noear.solon.annotation.Configuration;
  6. import org.noear.solon.annotation.Inject;
  7. import java.io.IOException;
  8. @Configuration
  9. public class DemoConfig {
  10.     @Bean
  11.     public GenerateModel build(@Inject("${solon.ai.generate}") GenerateConfig config) {
  12.         return GenerateModel.of(config).build();
  13.     }
  14.     @Bean
  15.     public void test(GenerateModel generateModel) throws IOException {
  16.         //一次性返回
  17.         GenerateResponse resp = generateModel.prompt("一只白色的小花猫").call();
  18.         //打印消息
  19.         System.out.println(resp.getContent().getUrl());
  20.     }
  21. }
复制代码
2、使用选项
  1. generateModel.prompt("一只白色的小花猫")
  2.     .options(o -> o.size("1024x1024"))
  3.     .call();
  4.    
  5. generateModel.prompt("一只白色的小花猫")
  6.     .options(o -> {
  7.         o.optionAdd("negative_prompt", "");
  8.         o.optionAdd("sampler_name", "Euler");
  9.         o.optionAdd("scheduler", "Simple");
  10.         o.optionAdd("steps", 25);
  11.         o.optionAdd("width", 512);
  12.         o.optionAdd("height", 768);
  13.         o.optionAdd("batch_size", 1);
  14.         o.optionAdd("cfg_scale", 1);
  15.         o.optionAdd("distilled_cfg_scale", 3.5);
  16.         o.optionAdd("seed", -1);
  17.         o.optionAdd("n_iter", 1);
  18.     })
  19.     .call();   
复制代码
3、方言适配

生成模型(GenerateModel)同样支持方言适配。框架已内置 OllamaGenerateDialect、DashscopeGenerateDialect、OpenaiGenerateDialect(默认) 三种方言(基本够用),自动支持 Ollama 提供的模型接口、Dashscope 提供的模型接口及 Openai 规范的模型接口。
也可以通过定制,实现更多的模型兼容。方言接口:
  1. public interface GenerateDialect extends AiModelDialect {
  2.     /**
  3.      * 是否为默认
  4.      */
  5.     default boolean isDefault() {
  6.         return false;
  7.     }
  8.     /**
  9.      * 匹配检测
  10.      *
  11.      * @param config 聊天配置
  12.      */
  13.     boolean matched(GenerateConfig config);
  14.     /**
  15.      * 构建请求数据
  16.      *
  17.      * @param config    聊天配置
  18.      * @param options   聊天选项
  19.      * @param promptStr 提示语文本形态
  20.      * @param promptMap 提示语字典形态
  21.      */
  22.     String buildRequestJson(GenerateConfig config, GenerateOptions options, String promptStr, Map promptMap);
  23.     /**
  24.      * 分析响应数据
  25.      *
  26.      * @param config   聊天配置
  27.      * @param respJson 响应数据
  28.      */
  29.     GenerateResponse parseResponseJson(GenerateConfig config, String respJson);
  30. }
复制代码
OllamaGenerateDialect 适配参考:
  1. public class OllamaGenerateDialect extends AbstractGenerateDialect {
  2.     private static OllamaGenerateDialect instance = new OllamaGenerateDialect();
  3.     public static OllamaGenerateDialect getInstance() {
  4.         return instance;
  5.     }
  6.     @Override
  7.     public boolean matched(GenerateConfig config) {
  8.         return "ollama".equals(config.getProvider());
  9.     }
  10.     @Override
  11.     public GenerateResponse parseResponseJson(GenerateConfig config, String respJson) {
  12.         ONode oResp = ONode.load(respJson);
  13.         String model = oResp.get("model").getString();
  14.         if (oResp.contains("error")) {
  15.             return new GenerateResponse(model, new GenerateException(oResp.get("error").getString()), null, null);
  16.         } else {
  17.             List<GenerateContent> data = null;
  18.             if (oResp.contains("response")) {
  19.                 //文本模型生成
  20.                 String text = oResp.get("response").getString();
  21.                 data = Arrays.asList(GenerateContent.builder().text(text).build());
  22.             } else if (oResp.contains("data")) {
  23.                 //图像模型生成
  24.                 data = oResp.get("data").toObjectList(GenerateContent.class);
  25.             }
  26.             AiUsage usage = null;
  27.             if (oResp.contains("prompt_eval_count")) {
  28.                 int prompt_eval_count = oResp.get("prompt_eval_count").getInt();
  29.                 usage = new AiUsage(
  30.                         prompt_eval_count,
  31.                         0,
  32.                         prompt_eval_count
  33.                 );
  34.             }
  35.             return new GenerateResponse(model, null, data, usage);
  36.         }
  37.     }
  38. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册