生成模型(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); } } }