介绍
多模型AI辅助开发
维基框架1.1.0集成了主流AI引擎的统一接口,支持开发者按需调用不同模型的优势能力:
-
DeepSeek:专注代码生成与重构,擅长复杂业务逻辑实现
-
ChatGPT:多模态推理能力,适用于系统架构设计
-
Grok:实时数据分析,优化生产环境问题诊断
-
DouBao:中文语义深度理解,提升本土化文档质量
-
Qwen3 :强化数学推理,专精财务/统计模块开发,支持在线搜索功能。
通过智能路由机制,系统根据代码特征自动选择最佳模型(可手动配置)。开发者可同时使用多个模型协同工作,例如用DeepSeek生成代码,Qwen3验证事务,DouBao编写文档。
使用
运行环境要求
最低JDK版本:17+(1.0.7及更早版本支持Java 8)
统一接口架构
java
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")));
}
依赖引入
XML
<dependency>
<groupId>com.framewiki</groupId>
<artifactId>wiki-all</artifactId>
<version>1.1.0</version>
</dependency>
模块介绍
模块目录

配置读取
java
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();
}
}
服务注入
java
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);
}
}
接口
服务接口
java
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<Message> messages);
/**
* 对话-SSE 流式输出
* messages 可以由当前对话组成的消息列表,可以设置role,content。详细参考官方文档
*
* @param messages 消息列表
* @param callback 流式数据回调函数
*/
void chatSearch(final List<Message> messages, final Consumer<ResponseBuilder> callback);
/**
* 图像理解:模型会依据传入的图片信息以及问题,给出回复。
*
* @param prompts 提问
* @param images 图片列表/或者图片Base64编码图片列表(URI形式)
* @return AI回答内容
*/
String chatVision(List<String> prompts, final List<String> images);
/**
* 图像理解-SSE流式输出
*
* @param prompts 提问
* @param images 传入的图片列表地址/或者图片Base64编码图片列表(URI形式)
* @param callback 流式数据回调函数
*/
void chatVision(List<String> prompts, final List<String> images, final Consumer<ResponseBuilder> callback);
/**
* 图像理解:模型会依据传入的图片信息以及问题,给出回复。
*
* @param prompts 提问
* @param videos 视频列表(URI形式)
* @return AI回答内容
*/
String chatVideoVision(List<String> prompts, final List<List<String>> videos);
/**
* 图像理解-SSE流式输出
*
* @param prompts 提问
* @param videos 视频列表(URI形式)
* @param callback 流式数据回调函数
*/
void chatVideoVision(List<String> prompts, final List<List<String>> videos, final Consumer<ResponseBuilder> callback);
}
服务接口实现
java
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<Message> 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<Message> 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<Message> messages, Consumer<ResponseBuilder> callback) {
Map<String, Object> 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<Message> messages, Consumer<ResponseBuilder> callback) {
Map<String, Object> 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<String> prompts, List<String> 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<String> prompts, List<String> images, Consumer<ResponseBuilder> callback) {
// 构建请求体
Map<String, Object> 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<String> prompts, List<List<String>> 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<String> prompts, List<List<String>> videos, Consumer<ResponseBuilder> callback) {
// 构建请求体
Map<String, Object> 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<Message> messages, boolean search) {
final Map<String, Object> 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<String> prompts, final List<String> images) {
// 使用JSON工具
Map<String, Object> paramMap = buildRequestBody(Boolean.FALSE, prompts, images);
return JsonUtils.objectToJsonString(paramMap);
}
/**
* 构建chatStream请求体
*
* @param messages 消息列表
* @return 返回消息集合
*/
private Map<String, Object> buildChatStreamRequestBody(final List<Message> messages, boolean search) {
final Map<String, Object> paramMap = new HashMap<>();
buildRequestBody(Boolean.TRUE, search, paramMap, messages);
// 合并其他参数
paramMap.putAll(config.getAddConfigMap());
return paramMap;
}
/**
* 构建图片生成请求体
*
* @param prompts 描述
* @param images 图片
* @return 请求体
*/
private Map<String, Object> buildChatVisionStreamRequestBody(List<String> prompts, final List<String> images) {
// 返回参数
return buildRequestBody(Boolean.TRUE, prompts, images);
}
/**
* 构建视频生成请求体
*
* @param prompts 描述
* @param videos 图片
* @return 请求体
*/
private String buildChatVideoRequestBody(List<String> prompts, final List<List<String>> videos) {
// 使用JSON工具
Map<String, Object> paramMap = buildVideoRequestBody(Boolean.FALSE, prompts, videos);
return JsonUtils.objectToJsonString(paramMap);
}
/**
* 构建视频生成请求体
*
* @param prompts 描述
* @param videos 图片
* @return 请求体
*/
private Map<String, Object> buildChatVideoStreamRequestBody(List<String> prompts, final List<List<String>> videos) {
// 返回参数
return buildVideoRequestBody(Boolean.TRUE, prompts, videos);
}
/**
* 构建请求体
*
* @param stream 是否流式
* @param prompts 提词
* @param videos 图片列表
*
* @return 请求体集合
*/
private Map<String, Object> buildVideoRequestBody(boolean stream, List<String> prompts,
final List<List<String>> videos) {
// 定义消息结构
final List<Message> messages = new ArrayList<>();
final List<Object> content = getVideoObjects(prompts, videos);
messages.add(new Message(USER, content));
// 使用JSON工具
final Map<String, Object> 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<String, Object> buildRequestBody(boolean stream, List<String> prompts, final List<String> images) {
// 定义消息结构
final List<Message> messages = new ArrayList<>();
final List<Object> content = getObjects(prompts, images);
messages.add(new Message(USER, content));
// 使用JSON工具
final Map<String, Object> 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<Object> getVideoObjects(List<String> prompts, List<List<String>> videos) {
final List<Object> content = new ArrayList<>(videos.size());
for (List<String> video : videos) {
int idx = videos.indexOf(video);
String prompt = prompts.get(idx);
// 构建视频内容
HashMap<String, Object> urlMap = new HashMap<>(IntegerConsts.TWO);
urlMap.put(TYPE, VIDEO);
urlMap.put(VIDEO, video);
content.add(urlMap);
// 构建文本内容
final Map<String, String> 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<Object> getObjects(List<String> prompts, List<String> images) {
final List<Object> content = new ArrayList<>(IntegerConsts.ONE);
for (String img : images) {
int idx = img.indexOf(img);
String prompt = prompts.get(idx);
// 构建图片内容
HashMap<String, Object> imgUrlMap = new HashMap<>(IntegerConsts.ONE);
imgUrlMap.put(TYPE, IMAGE_URL);
HashMap<String, Object> imgMap = new HashMap<>(IntegerConsts.ONE);
imgMap.put(URL, img);
imgUrlMap.put(IMAGE_URL, imgMap);
content.add(imgUrlMap);
HashMap<String, String> 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<String, Object> paramMap,
final List<Message> 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工厂
java
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<String, AiProvider> PROVIDERS = new ConcurrentHashMap<>();
// 加载所有 AiProvider 实现类
static {
final ServiceLoader<AiProvider> 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 <T> AI服务类
* @return clazz对应的AI服务类实例
*/
@SuppressWarnings("unchecked")
public static <T extends AiService> T findAiService(final AiConfig config, final Class<T> 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工具
java
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 <T> AiService实现类
* @return 返回 AI 模型服务类 的实现类实例
*/
public static <T extends AiService> T findAiService(final AiConfig config, final Class<T> 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<Message> messages) {
return findAiService(config).chat(messages);
}
}
总结
以上只是博主自己在实际项目中和参考其它文章总结出来,然后在将其实封成工具分享给大家。
相关源码在:维基框架
Gitee: https://gitee.com/cdkjframework/wiki-framework
Github:https://github.com/cdkjframework/wiki-framework
如果喜欢博主的分享记得给博主点点小星星