生成模型(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);
- }
- }
- }
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |