介绍

多模型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")));}

依赖引入

<dependency><groupId>com.framewiki</groupId><artifactId>wiki-all</artifactId><version>1.1.0</version>
</dependency>

模块介绍

模块目录

配置读取

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 返回模型(厂商)名称*/@Overridepublic 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 返回服务名称*/@Overridepublic String getServiceName() {return ModelsName.QWEN.getValue();}/*** 创建服务** @param config 配置信息*/@Overridepublic 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<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);
}

服务接口实现

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回复的消息*/@Overridepublic 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回复的消息*/@Overridepublic 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 流式数据回调函数*/@Overridepublic 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 流式数据回调函数*/@Overridepublic 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回复的消息*/@Overridepublic 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 流式数据回调函数*/@Overridepublic 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回答内容*/@Overridepublic 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 流式数据回调函数*/@Overridepublic 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工厂

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工具

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/96852.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96852.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/96852.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW调用MATLAB 的分形生成

LabVIEW 调用 MATLAB&#xff0c;可借前者可视化流程与硬件交互优势&#xff0c;结合后者强数值计算、算法能力&#xff0c;复用成熟算法提速开发&#xff0c;还能灵活改代码。但需匹配版本、装运行环境&#xff0c;数据传递有性能损耗&#xff0c;脚本出错需跨软件调试。​优点…

ubuntu20.04开发ros2,使用docker安装部署的详细教程

学习docker的教程&#xff1a;可以直接在菜鸟教程上学习即可阶段 0&#xff1a;系统检查| 内容 | 建议 | |------|------| | 操作系统 | Ubuntu 22.04&#xff08;与 ROS2 Humble 最匹配&#xff09; | | 用户权限 | 能执行 sudo |&#x1f9e9; 阶段 1&#xff1a;在 Ubuntu 上…

SQL Server缩小日志文件.ldf的方法(适用于开发环境)

SQL Server缩小日志文件.ldf的方法&#xff08;适用于开发环境&#xff09; 核心概念&#xff1a;为什么日志文件会变大&#xff1f; 首先&#xff0c;理解原因至关重要。事务日志文件在以下情况下会增长&#xff1a; 大量操作&#xff1a;执行了大批量插入、更新或删除操作&am…

2.3零基础玩转uni-app轮播图:从入门到精通 (咸虾米总结)

还在uni-app中的轮播图组件头疼吗&#xff1f;看完这篇&#xff0c;让你轻松掌握swiper的所有秘密&#xff01;轮播图的重要性 在现代移动应用开发中&#xff0c;轮播图&#xff08;Swiper&#xff09;已成为展示焦点内容、广告推广和产品展示的首选组件。无论是电商平台的商品…

FPGA学习笔记——AHT20温湿度读取并在串口显示(IIC协议)

目录 一、任务 二、分析 1.需要了解的 2.需要用到的模块 3.流程分析 三、Visio图 四、代码 五、实验现象 一、任务 使用IIC协议通信的AHT20&#xff0c;将温湿度数据读取出来&#xff0c;并在串口助手上显示。 二、分析 1.需要了解的 需要了解IIC协议简介 也可以看看E…

Pycharm SSH连接

添加远程服务器文件——>设置——>项目下的Python解释器——>添加解释器——>SSH在弹出的弹窗中&#xff0c;输入远程的主机、端口和用户名、一直下一步&#xff0c;得到如下图所示的结果&#xff1a;选择Conda 环境&#xff1a;第一步选择Conda环境&#xff1b;第…

c# 读取xml文件内的数据

好多大型的项目&#xff0c;把一些固定的参数都存在 xml文件里。创建c# winfom 项目&#xff0c;test_xml创建resources文件夹存放xml文件创建parameters.xml文件<root><test_xml><param name "threshold" value "128"/><param name …

Legion Y7000P IRX9 DriveList

Legion Y7000P IRX9 DriveList 联想Y7000P驱动列表 驱动列表 intelwlan-TYY5057FK6MQBRF0.exe NVVGA-TYY5057F3M0H9RF0.exe RTKwlan-TYY5077FFSNECRF0.exe audio-TYY5057F4N1JARF0.exe chipset-TYY5037FB10X3RF0.exe hdr-TYY5027FXNF9AWF0.exe intelVGA-TYY5057F5R9J7RF…

编程与数学 02-017 Python 面向对象编程 23课题、测试面向对象的程序

编程与数学 02-017 Python 面向对象编程 23课题、测试面向对象的程序一、单元测试&#xff08;Unit Testing&#xff09;使用 unittest 模块使用 pytest二、集成测试&#xff08;Integration Testing&#xff09;三、模拟对象&#xff08;Mocking&#xff09;四、测试驱动开发&…

[React]Antd Cascader组件地区选择

前言表单中添加一个地区选择功能&#xff0c;要求支持增删改查功能。Cascader 使用Cascader组件动态加载地区选项。使用 loadData 实现动态加载选项&#xff0c;&#xff08;loadData 与 showSearch 无法一起使用&#xff09;。 这里使用了Form.Item组件。 <Form.Itemlabel{…

深度学习-----《PyTorch神经网络高效训练与测试:优化器对比、激活函数优化及实战技巧》

一、训练过程并行批量训练机制一次性输入64个批次数据&#xff0c;创建64个独立神经网络并行训练。所有网络共享参数&#xff08;Ω&#xff09;&#xff0c;更新时计算64个批次的平均损失&#xff0c;统一更新全局参数。梯度更新策略使用torch.no_grad()上下文管理器清理反向传…

Matplotlib 可视化大师系列(五):plt.pie() - 展示组成部分的饼图

目录Matplotlib 可视化大师系列博客总览Matplotlib 可视化大师系列&#xff08;五&#xff09;&#xff1a;plt.pie() - 展示组成部分的饼图一、 饼图是什么&#xff1f;何时使用&#xff08;何时避免&#xff09;&#xff1f;二、 函数原型与核心参数三、 从入门到精通&#x…

C++ Core Guidelines 核心理念

引言 C 是一门功能强大但复杂性极高的编程语言。为了帮助开发者更高效、安全地使用现代 C&#xff0c;C 核心指南&#xff08;CppCoreGuidelines&#xff09;应运而生。这份由 C 之父 Bjarne Stroustrup 等人主导的指南&#xff0c;提供了大量关于 C 编码的规则、最佳实践和设…

vue3 - 组件间的传值

组件间传参 父传子v-on/props 父组件使用v-on:绑定要传的参数:parentData"parentData"&#xff1a; <template><div><Child1 :parentData"parentData"></Child1></div> </template> <script setup lang"ts…

Kafka 在 6 大典型用例的落地实践架构、参数与避坑清单

一、选型速查表场景关键目标推荐清单&#xff08;示例&#xff09;消息&#xff08;Messaging&#xff09;解耦、低延迟、可靠投递acksall、enable.idempotencetrue、retries>0、min.insync.replicas2、合理分区键、DLT网站活动追踪吞吐极高、可回放主题按类型拆分&#xff…

Node.js(1)—— Node.js介绍与入门

前面我们谈到一些前端开发的内容&#xff0c;学习了HTML、css和JavaScript&#xff0c;已经掌握了如何编写一些简单功能的网页。但是只属于前端部分&#xff0c;我们只能在本地打开文件进行浏览&#xff0c;不能让其他人打开我们编写的网站&#xff1b;这时就需要后端部分上场了…

Python办公——爬虫百度翻译网页版(自制翻译小工具——进阶更新版)

目录 专栏导读 前言 项目概述 功能特点 技术栈 核心架构设计 类结构设计 界面布局设计 核心功能实现 1. 智能语言检测 2. 异步翻译处理 3. HTTP请求处理 4. 结果解析与显示 界面设计亮点 1. 响应式布局 2. 用户体验优化 3. 现代化组件 技术难点与解决方案 1. 跨线程UI更新 2. U…

CentOS7 + Docker 部署 Dify 超详细图文教程

如今Agent在互联网上大行其道&#xff0c;网上吵得火热&#xff0c;各个企业也都想搭建自己的Agent。COZE的开源还有最近新出的JoyAgent也都让大家跃跃欲试&#xff0c;今天为大家带来的是Dify的部署方式&#xff0c;相比其他工作流平台&#xff0c;Dify对于整个Agent制作的流程…

vscode(MSVC)进行c++开发的时,在debug时查看一个eigen数组内部的数值

vscode进行c开发的时&#xff0c;在debug时查看一个eigen数组内部的数值问题描述解决方案拓展其他可视化使用visual studio时的可视化使用别的编译器的可视化问题描述 使用vscode进行c开发&#xff0c;编译器是MSVC&#xff0c;在debug的时候想查看一个eigen数组的数值&#x…