您现在的位置是:首页 > 文章详情

​维基框架 (Wiki Framework) 1.1.0 版本发布​ 提供多模型 AI 辅助开发

日期:2025-08-22点击:10

介绍

多模型AI辅助开发

维基框架1.1.0集成了主流AI引擎的统一接口,支持开发者按需调用不同模型的优势能力:

  • DeepSeek​:专注代码生成与重构,擅长复杂业务逻辑实现
  • ChatGPT​:多模态推理能力,适用于系统架构设计
  • Grok​:实时数据分析,优化生产环境问题诊断
  • DouBao​:中文语义深度理解,提升本土化文档质量
  • Qwen3​:强化数学推理,专精财务/统计模块开发,支持在线搜索功能

通过智能路由机制,系统根据代码特征自动选择最佳模型(可手动配置)。开发者可同时使用多个模型协同工作,例如用DeepSeek生成代码,Qwen3验证事务,DouBao编写文档。

使用

运行环境要求

最低JDK版本:17+(1.0.7及更早版本支持Java 8)

统一接口架构

 public static void main(String[] args) { CdkjApplication.run(AiApplication.class, args); QwenConfig config = new QwenConfig(); config.setApiKey("sk-xxxx"); QwenService chatService = (QwenService) AiUtils.findAiService(config); System.out.printf("AI回复" + chatService.chat("你好,请介绍一下你呢。")); config.setModel(Qwen.QWEN_VL_MAX_LATEST.getModel()); QwenService service = AiUtils.findAiService(config, QwenService.class); System.out.printf("AI回复" + service.chatVision(List.of("介绍这个图片。"), List.of("https://framewiki.com/logo.png"))); }

依赖引入

  com.framewiki wiki-all 1.1.0 

模块介绍

模块目录

配置读取

 package com.cdkjframework.ai.model.qwen; import com.cdkjframework.ai.core.impl.BaseAiConfig; import com.cdkjframework.ai.enums.ModelsName; import com.cdkjframework.ai.enums.Openai; import com.cdkjframework.ai.enums.Qwen; import com.cdkjframework.util.tool.StringUtils; /** * @ProjectName: wiki-framework * @Package: com.cdkjframework.ai.model.qwen * @ClassName: QwenConfig * @Description: java类作用描述 * @Author: xiaLin * @Date: 2025/8/3 9:07 * @Version: 1.0 */ public class QwenConfig extends BaseAiConfig { /** * 构造函数 */ public QwenConfig() { // API接口地址 super.setApiUrl("https://dashscope.aliyuncs.com/compatible-mode/v1"); if (StringUtils.isNullAndSpaceOrEmpty(super.getModel())) { super.setModel(Qwen.QWEN_PLUS.getModel()); } } /** * 构造函数 * * @param apiKey API密钥 */ public QwenConfig(String apiKey) { this(); super.setApiKey(apiKey); } /** * 获取模型(厂商)名称 * * @return 返回模型(厂商)名称 */ @Override public String getModelName() { return ModelsName.QWEN.getValue(); } }

服务注入

 package com.cdkjframework.ai.model.qwen; import com.cdkjframework.ai.core.AiConfig; import com.cdkjframework.ai.core.AiProvider; import com.cdkjframework.ai.enums.ModelsName; import com.cdkjframework.ai.model.qwen.impl.QwenServiceImpl; /** * @ProjectName: wiki-framework * @Package: com.cdkjframework.ai.model.qwen * @ClassName: QwenProvider * @Description: java类作用描述 * @Author: xiaLin * @Date: 2025/8/3 9:08 * @Version: 1.0 */ public class QwenProvider implements AiProvider { /** * 获取服务名称 * * @return 返回服务名称 */ @Override public String getServiceName() { return ModelsName.QWEN.getValue(); } /** * 创建服务 * * @param config 配置信息 */ @Override public QwenService create(AiConfig config) { return new QwenServiceImpl(config); } }

接口

服务接口

 package com.cdkjframework.ai.model.qwen; import java.util.List; import java.util.function.Consumer; import com.cdkjframework.ai.constant.AiCommon; import com.cdkjframework.ai.core.AiService; import com.cdkjframework.ai.core.Message; import com.cdkjframework.builder.ResponseBuilder; /** * @ProjectName: wiki-framework * @Package: com.cdkjframework.ai.model.qwen * @ClassName: QwenService * @Description: java类作用描述 * @Author: xiaLin * @Date: 2025/8/3 9:08 * @Version: 1.0 */ public interface QwenService extends AiService { /** * 搜索 */ String EXTRA_BODY = "extra_body"; /** * 搜索值 */ String EXTRA_BODY_VALUE = "{\\"enable_search\\": True\\"}"; /** * 流式参数 */ String STREAM_OPTIONS = "stream_options"; /** * 流式参数值 */ String STREAM_OPTIONS_VALUE = "{\\"include_usage\\": True}"; /** * 对话 * messages 可以由当前对话组成的消息列表,可以设置role,content。详细参考官方文档 * * @param messages 消息列表 * @return 返回AI回复的消息 */ String chatSearch(final List messages); /** * 对话-SSE 流式输出 * messages 可以由当前对话组成的消息列表,可以设置role,content。详细参考官方文档 * * @param messages 消息列表 * @param callback 流式数据回调函数 */ void chatSearch(final List messages, final Consumer callback); /** * 图像理解:模型会依据传入的图片信息以及问题,给出回复。 * * @param prompts 提问 * @param images 图片列表/或者图片Base64编码图片列表(URI形式) * @return AI回答内容 */ String chatVision(List prompts, final List images); /** * 图像理解-SSE流式输出 * * @param prompts 提问 * @param images 传入的图片列表地址/或者图片Base64编码图片列表(URI形式) * @param callback 流式数据回调函数 */ void chatVision(List prompts, final List images, final Consumer callback); /** * 图像理解:模型会依据传入的图片信息以及问题,给出回复。 * * @param prompts 提问 * @param videos 视频列表(URI形式) * @return AI回答内容 */ String chatVideoVision(List prompts, final List> videos); /** * 图像理解-SSE流式输出 * * @param prompts 提问 * @param videos 视频列表(URI形式) * @param callback 流式数据回调函数 */ void chatVideoVision(List prompts, final List> videos, final Consumer callback); }

服务接口实现

 package com.cdkjframework.ai.model.qwen.impl; import com.cdkjframework.ai.core.AiConfig; import com.cdkjframework.ai.core.Message; import com.cdkjframework.ai.core.impl.BaseAiService; import com.cdkjframework.ai.model.qwen.QwenService; import com.cdkjframework.builder.ResponseBuilder; import com.cdkjframework.constant.IntegerConsts; import com.cdkjframework.util.tool.JsonUtils; import com.cdkjframework.util.tool.ThreadUtils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Consumer; import static com.cdkjframework.ai.constant.AiConstant.*; import static com.cdkjframework.ai.constant.AiConstant.Qwen.*; /** * @ProjectName: wiki-framework * @Package: com.cdkjframework.ai.model.qwen.impl * @ClassName: QwenServiceImpl * @Description: Qwen AI 服务实现类 * @Author: xiaLin * @Date: 2025/8/3 9:08 * @Version: 1.0 */ public class QwenServiceImpl extends BaseAiService implements QwenService { /** * 构造函数 * * @param config AI 服务接口 */ public QwenServiceImpl(AiConfig config) { super(config); } /** * 对话 * messages 可以由当前对话组成的消息列表,可以设置role,content。详细参考官方文档 * * @param messages 消息列表 * @return 返回AI回复的消息 */ @Override public String chat(List messages) { final String paramJson = buildChatRequestBody(messages, Boolean.FALSE); // 发送POST请求 final StringBuilder response = post(CHAT_ENDPOINT, paramJson); // 返回结果 return response.toString(); } /** * 对话-检索增强 * messages 可以由当前对话组成的消息列表,可以设置role,content。详细参考官方文档 * * @param messages 消息列表 * @return 返回AI回复的消息 */ @Override public String chatSearch(List messages) { final String paramJson = buildChatRequestBody(messages, Boolean.TRUE); // 发送POST请求 final StringBuilder response = post(CHAT_ENDPOINT, paramJson); // 返回结果 return response.toString(); } /** * 对话-SSE 流式输出 * messages 可以由当前对话组成的消息列表,可以设置role,content。详细参考官方文档 * * @param messages 消息列表 * @param callback 流式数据回调函数 */ @Override public void chat(List messages, Consumer callback) { Map paramMap = buildChatStreamRequestBody(messages, Boolean.FALSE); ThreadUtils.newThread(() -> postStream(CHAT_ENDPOINT, paramMap, callback), QWEN_CHAT_SSE).start(); } /** * 对话-SSE 流式输出 * messages 可以由当前对话组成的消息列表,可以设置role,content。详细参考官方文档 * * @param messages 消息列表 * @param callback 流式数据回调函数 */ @Override public void chatSearch(List messages, Consumer callback) { Map paramMap = buildChatStreamRequestBody(messages, Boolean.TRUE); ThreadUtils.newThread(() -> postStream(CHAT_ENDPOINT, paramMap, callback), QWEN_CHAT_SSE).start(); } /** * 对话-检索增强 * messages 可以由当前对话组成的消息列表,可以设置role,content。详细参考官方文档 * * @param prompts 消息列表 * @return 返回AI回复的消息 */ @Override public String chatVision(List prompts, List images) { // 构建请求体 String paramJson = buildChatVisionRequestBody(prompts, images); return post(CHAT_ENDPOINT, paramJson).toString(); } /** * 对话 VISION SSE 流式输出 * messages 可以由当前对话组成的消息列表,可以设置role,content。详细参考官方文档 * * @param prompts 提词 * @param images 图片列表 * @param callback 流式数据回调函数 */ @Override public void chatVision(List prompts, List images, Consumer callback) { // 构建请求体 Map paramMap = buildChatVisionStreamRequestBody(prompts, images); ThreadUtils.newThread(() -> postStream(CHAT_ENDPOINT, paramMap, callback), QWEN_CHAT_VISION_SSE).start(); } /** * 图像理解:模型会依据传入的图片信息以及问题,给出回复。 * * @param prompts 提问 * @param videos 视频列表(URI形式) * @return AI回答内容 */ @Override public String chatVideoVision(List prompts, List> videos) { // 构建请求体 String paramJson = buildChatVideoRequestBody(prompts, videos); return post(CHAT_ENDPOINT, paramJson).toString(); } /** * 图像理解-SSE流式输出 * * @param prompts 提问 * @param videos 视频列表(URI形式) * @param callback 流式数据回调函数 */ @Override public void chatVideoVision(List prompts, List> videos, Consumer callback) { // 构建请求体 Map paramMap = buildChatVideoStreamRequestBody(prompts, videos); ThreadUtils.newThread(() -> postStream(CHAT_ENDPOINT, paramMap, callback), QWEN_CHAT_VISION_SSE).start(); } /** * 构建chat请求体 * * @param messages 消息列表 * @param search 是否搜索 * @return 返回消息字符串 */ private String buildChatRequestBody(final List messages, boolean search) { final Map paramMap = new HashMap<>(); buildRequestBody(Boolean.FALSE, search, paramMap, messages); // 合并其他参数 paramMap.putAll(config.getAddConfigMap()); // JSON 序列化 return JsonUtils.objectToJsonString(paramMap); } /** * 构建chatVision请求体 * * @param prompts 提词 * @param images 图片列表 * @return 请求体字符串 */ private String buildChatVisionRequestBody(List prompts, final List images) { // 使用JSON工具 Map paramMap = buildRequestBody(Boolean.FALSE, prompts, images); return JsonUtils.objectToJsonString(paramMap); } /** * 构建chatStream请求体 * * @param messages 消息列表 * @return 返回消息集合 */ private Map buildChatStreamRequestBody(final List messages, boolean search) { final Map paramMap = new HashMap<>(); buildRequestBody(Boolean.TRUE, search, paramMap, messages); // 合并其他参数 paramMap.putAll(config.getAddConfigMap()); return paramMap; } /** * 构建图片生成请求体 * * @param prompts 描述 * @param images 图片 * @return 请求体 */ private Map buildChatVisionStreamRequestBody(List prompts, final List images) { // 返回参数 return buildRequestBody(Boolean.TRUE, prompts, images); } /** * 构建视频生成请求体 * * @param prompts 描述 * @param videos 图片 * @return 请求体 */ private String buildChatVideoRequestBody(List prompts, final List> videos) { // 使用JSON工具 Map paramMap = buildVideoRequestBody(Boolean.FALSE, prompts, videos); return JsonUtils.objectToJsonString(paramMap); } /** * 构建视频生成请求体 * * @param prompts 描述 * @param videos 图片 * @return 请求体 */ private Map buildChatVideoStreamRequestBody(List prompts, final List> videos) { // 返回参数 return buildVideoRequestBody(Boolean.TRUE, prompts, videos); } /** * 构建请求体 * * @param stream 是否流式 * @param prompts 提词 * @param videos 图片列表 * * @return 请求体集合 */ private Map buildVideoRequestBody(boolean stream, List prompts, final List> videos) { // 定义消息结构 final List messages = new ArrayList<>(); final List content = getVideoObjects(prompts, videos); messages.add(new Message(USER, content)); // 使用JSON工具 final Map paramMap = new HashMap<>(); if (stream) { paramMap.put(STREAM, Boolean.TRUE); } paramMap.put(MODEL, config.getModel()); paramMap.put(MESSAGES, messages); // 合并其他参数 paramMap.putAll(config.getAddConfigMap()); return paramMap; } /** * 构建请求体 * * @param stream 是否流式 * @param prompts 提词 * @param images 图片列表 * * @return 请求体集合 */ private Map buildRequestBody(boolean stream, List prompts, final List images) { // 定义消息结构 final List messages = new ArrayList<>(); final List content = getObjects(prompts, images); messages.add(new Message(USER, content)); // 使用JSON工具 final Map paramMap = new HashMap<>(); if (stream) { paramMap.put(STREAM, Boolean.TRUE); } paramMap.put(MODEL, config.getModel()); paramMap.put(MESSAGES, messages); // 合并其他参数 paramMap.putAll(config.getAddConfigMap()); return paramMap; } /** * 获取图片内容 * * @param prompts 提词 * @param videos 图片列表 * * @return 图片内容 */ private static List getVideoObjects(List prompts, List> videos) { final List content = new ArrayList<>(videos.size()); for (List video : videos) { int idx = videos.indexOf(video); String prompt = prompts.get(idx); // 构建视频内容 HashMap urlMap = new HashMap<>(IntegerConsts.TWO); urlMap.put(TYPE, VIDEO); urlMap.put(VIDEO, video); content.add(urlMap); // 构建文本内容 final Map contentMap = new HashMap<>(IntegerConsts.TWO); contentMap.put(TYPE, TEXT); contentMap.put(TEXT, prompt); content.add(contentMap); } return content; } /** * 获取视频内容 * * @param prompts 提词 * @param images 图片列表 * * @return 图片内容 */ private static List getObjects(List prompts, List images) { final List content = new ArrayList<>(IntegerConsts.ONE); for (String img : images) { int idx = img.indexOf(img); String prompt = prompts.get(idx); // 构建图片内容 HashMap imgUrlMap = new HashMap<>(IntegerConsts.ONE); imgUrlMap.put(TYPE, IMAGE_URL); HashMap imgMap = new HashMap<>(IntegerConsts.ONE); imgMap.put(URL, img); imgUrlMap.put(IMAGE_URL, imgMap); content.add(imgUrlMap); HashMap urlMap = new HashMap<>(IntegerConsts.TWO); urlMap.put(TYPE, TEXT); urlMap.put(TEXT, prompt); content.add(urlMap); } return content; } /** * 构建请求体 * * @param stream 是否流式 * @param search 是否搜索 * @param paramMap 参数集合 * @param messages 聊天消息 */ private void buildRequestBody(boolean stream, boolean search, final Map paramMap, final List messages) { paramMap.put(MODEL, config.getModel()); paramMap.put(MESSAGES, messages); if (stream) { paramMap.put(STREAM, Boolean.TRUE); paramMap.put(STREAM_OPTIONS, STREAM_OPTIONS_VALUE); } if (search) { paramMap.put(EXTRA_BODY, EXTRA_BODY_VALUE); } } }

AI工厂

 package com.cdkjframework.ai; import com.cdkjframework.ai.core.AiConfig; import com.cdkjframework.ai.core.AiProvider; import com.cdkjframework.ai.core.AiService; import com.cdkjframework.exceptions.GlobalRuntimeException; import java.util.Map; import java.util.ServiceLoader; import java.util.concurrent.ConcurrentHashMap; /** * 创建 AiFactory 工厂类 * * @ProjectName: wiki-framework * @Package: com.cdkjframework.ai * @ClassName: AiFactory * @Description: 创建 AiFactory 工厂类 * @Author: xiaLin * @Version: 1.0 */ public class AiFactory { /** * 创建 AiFactory 工厂类 */ private static final Map PROVIDERS = new ConcurrentHashMap<>(); // 加载所有 AiProvider 实现类 static { final ServiceLoader loader = ServiceLoader.load(AiProvider.class); for (final AiProvider provider : loader) { PROVIDERS.put(provider.getServiceName().toLowerCase(), provider); } } /** * 获取AI服务 * * @param config AI 配置 * @return AI服务实例 */ public static AiService findAiService(final AiConfig config) { return findAiService(config, AiService.class); } /** * 获取AI服务 * * @param config Ai 配置 * @param clazz AI服务类 * @param AI服务类 * @return clazz对应的AI服务类实例 */ @SuppressWarnings("unchecked") public static T findAiService(final AiConfig config, final Class clazz) { final AiProvider provider = PROVIDERS.get(config.getModelName().toLowerCase()); if (provider == null) { throw new IllegalArgumentException("不支持的模型: " + config.getModelName()); } final AiService service = provider.create(config); if (!clazz.isInstance(service)) { throw new GlobalRuntimeException("模型服务不属于指定类型: " + clazz.getSimpleName()); } // 返回服务 return (T) service; } }

AI工具

 package com.cdkjframework.ai; import com.cdkjframework.ai.core.AiConfig; import com.cdkjframework.ai.core.AiService; import com.cdkjframework.ai.core.Message; import com.cdkjframework.ai.model.deepseek.DeepSeekService; import com.cdkjframework.ai.model.doubao.DouBaoService; import com.cdkjframework.ai.model.grok.GrokService; import com.cdkjframework.ai.model.openai.OpenaiService; import com.cdkjframework.ai.model.qwen.QwenService; import java.util.List; /** * AI 工具类 * * @ProjectName: wiki-framework * @Package: com.cdkjframework.ai * @ClassName: AiUtils * @Description: AI 工具类 * @Author: xiaLin * @Version: 1.0 */ public class AiUtils { /** * 获取AI模型服务,每个大模型提供的功能会不一样,可以调用此方法指定不同AI服务类,调用不同的功能 * * @param config 创建的AI服务模型的配置 * @param clazz AI模型服务类 * @param AiService实现类 * @return 返回 AI 模型服务类 的实现类实例 */ public static T findAiService(final AiConfig config, final Class clazz) { return AiFactory.findAiService(config, clazz); } /** * 获取AI模型服务 * * @param config 创建的AI服务模型的配置 * @return 返回 AI 服务模型 其中只有公共方法 */ public static AiService findAiService(final AiConfig config) { return findAiService(config, AiService.class); } /** * 获取DeepSeek模型服务 * * @param config 创建的AI服务模型的配置 * @return DeepSeekService */ public static DeepSeekService findDeepSeekService(final AiConfig config) { return findAiService(config, DeepSeekService.class); } /** * 获取DouBao模型服务 * * @param config 创建的AI服务模型的配置 * @return DouBaoService */ public static DouBaoService findDouBaoService(final AiConfig config) { return findAiService(config, DouBaoService.class); } /** * 获取Grok模型服务 * * @param config 创建的AI服务模型的配置 * @return GrokService */ public static GrokService findGrokService(final AiConfig config) { return findAiService(config, GrokService.class); } /** * 获取Openai模型服务 * * @param config 创建的AI服务模型的配置 * @return OpenAiService */ public static OpenaiService findOpenAiService(final AiConfig config) { return findAiService(config, OpenaiService.class); } /** * 获取Qwen模型服务 * * @param config 创建的AI服务模型的配置 * @return QwenService */ public static QwenService findQwenService(final AiConfig config) { return findAiService(config, QwenService.class); } /** * AI大模型对话功能(公共) * * @param config 创建的AI服务模型的配置 * @param prompt 需要对话的内容 * @return 返回 AI模型返回消息内容 */ public static String chat(final AiConfig config, final String prompt) { return findAiService(config).chat(prompt); } /** * AI大模型对话功能(公共) * * @param config 创建的AI服务模型的配置 * @param messages 由目前为止的对话组成的消息列表,可以设置role,content。详细参考官方文档 * @return 返回 AI模型返回消息内容 */ public static String chat(final AiConfig config, final List messages) { return findAiService(config).chat(messages); } }

总结

以上只是博主自己在实际项目中和参考其它文章总结出来,然后在将其实封成工具分享给大家。

相关源码在:维基框架

Gitee: https://gitee.com/cdkjframework/wiki-framework

Github:https://github.com/cdkjframework/wiki-framework

如果喜欢博主的分享记得给博主点点小星星

原文链接:https://www.oschina.net/news/367954
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章