Spring_Ai

Spring AI Alibaba 学习 学习 大模型调用、图片生成、语音合成、工具调用、云RAG、Agent 的实践 Spring Ai Alibaba Chat 简单的流式大模型问答接口 🏷️模型配置信息 1spring: 2 ai: 3 dashscope: 4 api-key: "API_KEY" # api key 5 chat: 6 options: 7 model: "qwen-plus" # 模型名称: qwen-plus, deepseek-r1 ⭐Api 接口代码 1@RestController 2@RequestMapping("/chat-memory") 3public class ChatMemoryController { 4 5 private final ChatClient chatClient; 6 7 public ChatMemoryController(ChatModel chatModel) { 8 this.chatClient = ChatClient.builder(chatModel) 9 .defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory())) 10 .defaultAdvisors() 11 .build(); 12 } 13 14 /** 15 * 使用 Spring AI 提供的基于内存的 Chat memory方法 16 */ 17 @GetMapping("/in-memory") 18 public Flux<String> chatWithMemory(@RequestParam("prompt") String prompt, 19 @RequestParam("chatId") String chatId, 20 HttpServletResponse response) { 21 response.setCharacterEncoding("UTF-8"); 22 23 return chatClient.prompt(prompt) 24 .advisors(advisorSpec -> advisorSpec 25 .param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId) // 上下文记忆ID,隔离不同的聊天上下文 26 .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100)) // 检索长度 27 .stream() 28 .content(); 29 } 30 31} 多模型切换示例 1@RestController 2@RequestMapping("/multi-model-chat-client") 3public class multiModelChatClientController { 4 5 private final Set<String> modelList = Set.of( 6 "deepseek-r1", 7 "deepseek-v3", 8 "qwen-plus", 9 "qwen-max" 10 ); 11 12 private final ChatClient chatClient; 13 14 public multiModelChatClientController(ChatModel chatModel) { 15 this.chatClient = ChatClient.builder(chatModel) 16 .defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory())) 17 .build(); 18 } 19 20 @GetMapping("/chat") 21 public Flux<String> stream( 22 @RequestParam("prompt") String prompt, 23 @RequestParam("chatId") String chatId, 24 @RequestParam(value = "modelName", required = false) String modelName, 25 HttpServletResponse response 26 ) { 27 response.setCharacterEncoding("UTF-8"); 28 29 if (!modelList.contains(modelName)) { 30 return Flux.just("model not exist!"); 31 } 32 33 return chatClient.prompt(prompt) 34 .options(ChatOptions.builder() // 这里构建聊天选项,指定不同的模型 35 .withModel(modelName) 36 .build()) 37 .advisors(advisorSpec -> advisorSpec // 这里构建顾问参数,指定不同的聊天id和上下文长度 38 .param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId) 39 .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100)) 40 .stream() 41 .content(); 42 } 43} Spring AI Alibaba Image Gen 调用文生图模型示例 ...

April 25, 2025 · 7 min · 1352 words · 👨🏻‍🎓 LongWei

Linux&Docker&Shell命令

docker 1service docker start 2 3docker pull <镜像名称>:<标签> 4 5docker rmi <镜像名称或ID> 6 7docker images 8 9docker run [选项] <镜像名称>:<标签> 10 11docker start <容器名称或ID> 12 13docker ps 14 15docker exec -it <容器名称或ID> /bin/bash # execute -it:Interactive and Teletypewriter 交互式&伪终端 Linux 文件和目录 1ls -l # -l:详细信息 2cd 3pwd # 当前目录 4mkdir/vim 5rm/rmdir 6cp mv 文件权限 1chmod # Change Mode # chmod u+rwx file.txt x:Execute 2chown 系统命令 1ps -ef # e:all -f full info 2ps -u $USER 3ps -ef | grep <info> # global regular expression print 4 5htop # 显示系统资源使用情况 网络管理 ...

March 16, 2025 · 2 min · 372 words · LongWei

DL基准模型训练伪代码

minGPT author: karpathy Andrej ✅ 解决问题 生成式文本任务,比如写文章、对话、续写句子。目标是给定前文,预测下一个词。 🛠️ 具体措施 输入一句话,例如:"我 爱 自然" → 转成数字编号 [23, 45, 67]。 构造训练样本: 输入 X = [X1, X2, X3, Y1, Y2] 标签 Y = [-1, -1, Y1, Y2, Y3](-1表示忽略不计算损失) 模型结构: 首层:词嵌入 + 位置编码 骨干:多层的 单向自注意力(只能看前面的词) + 前馈网络 尾层:分类头输出每个位置的词概率分布 训练时一次性并行预测多个词(只看前面上下文) 推理时串行生成:每生成一个词,就加到输入里继续生成下一个。 💥 损失函数 就像做 完形填空: 给前面几个字,猜后面是什么字。 猜错一个字就扣分,扣分规则是 交叉熵(预测概率分布和真实答案差多远)。 -1的位置不扣分(相当于没让你填)。 💼 工作流程 1String: ['X1', 'X2', ..., 'Xn'] =[dictionary]=> [k1, k2, ..., kn] # word2index 2 3# Train: 4X = [X1, X2, X3, Y1, Y2], Y = [-1, -1, Y1, Y2, Y3] 5Model = {(WordEmbed+PosEmbed) => (CausalSelfAttention+FFN)xN => (ClassHead)} 6# attn = A B C 7# A √ × × uni-directional 8# B √ √ × 9# C √ √ √ 10 11Z = Model(X) => [Z1, Z2, Z3, Z4, Z5] 12Y = [-1, -1, Y1, Y2, Y3] 13# Equal to Parallel Train 14(X1,X2,X3) =predict=> Y1 15(X1,X2,X3,Y1) =predict=> Y2 16(X1,X2,X3,Y1,Y2) =predict=> Y3 17 18loss = crossentropy(Z, Y, ignore=-1) # Zi => {P1,...,Pclass} multi-class task 19 20# Test: Serial generation 21give inp = [X1, X2, X3] 22Step 1: 23 Z = Model(inp) = [Z1,Z2,Z3] 24 Y = [-1,-1,Y1] 25 inp = inp + Y[-1] = [Z1,Z2,Z3,Y1] 26Step 2: 27 Z = Model(inp) = [Z1,Z2,Z3,Z4] 28 Y = [-1,-1,-1,Y2] 29 inp = inp + Y[-1] = [Z1,Z2,Z3,Y1,Y2] 30Step 3: 31 Z = Model(inp) = [Z1,Z2,Z3,Z4,Z5] 32 Y = [-1,-1,-1,-1,Y3] 33 inp = inp + Y[-1] = [Z1,Z2,Z3,Y1,Y2,Y3] 34 35out: [Z1,Z2,Z3,Y1,Y2,Y3] minBert ✅ 解决问题 理解类任务:比如问答、文本分类、句子关系判断(如是否上下句)、填补缺失词。 ...

October 31, 2024 · 4 min · 738 words · LongWei

ECG论文和实验

论文 ⭐IM-ECG - 2023 IM-ECG: An interpretable framework for arrhythmia detection using multi-lead ECG - Expert Systems With Applications sci-1 创新点: Conv2D模型与Grad-CAM的适配更好 - 实时标注病理区域 解释性 双核残差块 - 横轴与竖轴+面 三种扫描方式 k * n(区域扫描)内核朝向中心压缩ECG以更直接地捕获导联间特征,而1 * n(横轴扫描)内核沿着时间维度压缩ECG并且因此更关注导联内特征 流程图示 模型结构 Block Lightweight Transformer - 2022 Enhancing dynamic ECG heartbeat classification with lightweight transformer model Artificial Intelligence In Medicine sci-1 创新点: 两级注意力机制: 局部 + 全局 // 局部注意力 == 通道注意力 SEBlock || 全局注意力 == Transformer Encoder ...

April 19, 2024 · 12 min · 2541 words · LongWei

Java学习笔记

Java 反射 它提供了动态性和灵活性,使得程序可以在运行时动态地加载类、调用方法、访问字段等,而不需要在编译时确定这些操作。 1. 动态加载类 在运行时根据类名动态加载类,而不是在编译时硬编码类名。 – 插件化架构:根据配置文件或用户输入动态加载类。 2. 创建对象 通过反射可以在运行时动态创建对象,即使类的构造函数是私有的。 工厂模式:根据配置动态创建对象。 依赖注入框架:Spring 通过反射创建 Bean 实例。 3. 调用方法 通过反射可以在运行时动态调用对象的方法,即使方法是私有的。 测试框架:JUnit 通过反射调用测试方法。 4. 访问字段 通过反射可以在运行时动态访问对象的字段,即使字段是私有的 序列化和反序列化:通过反射访问对象的字段。 对象关系映射(ORM):Hibernate 通过反射访问实体类的字段。 7. 注解处理 通过反射可以获取类、方法、字段上的注解,并根据注解执行相应的逻辑。 24/4/14 1️⃣ 反射的作用 获取类中的所有信息(e.g.持久化、IDE的代码提示) 1Field[] fields = cls.getDeclaredFields(); 2for (int i = 0; i < fields.length; i++) { 3 fields[i].setAccessible(true); 4 // String name = fields[i].getName(); // 属性名 第一次先生成列名 5 Object value = fields[i].get(obj); 6 bw.append(value.toString()); 7 if (i < fields.length - 1) { 8 bw.append(", "); 9 } 10} 11bw.newLine(); 结合配置文件动态创建对象 1Properties prop = new Properties(); 2 3String filename = "prop.properties"; 4FileInputStream is = new FileInputStream(filename); 5 6prop.load(is); 7 8String classname = prop.getProperty("classname"); 9String method = prop.getProperty("method"); 10String name = prop.getProperty("name"); 11 12Class cls = Class.forName(classname); 13Constructor con = cls.getDeclaredConstructor(); 14Object o = con.newInstance(); 15 16Method setName = cls.getMethod("setName", String.class); 17setName.invoke(o, name); 18 19Method met = cls.getDeclaredMethod(method); 20met.invoke(o); 2️⃣ 获取Class的三种方式 ...

April 19, 2024 · 25 min · 5142 words · LongWei

深度学习论文汇总1

图示 卷积注意力 自注意力 学习 Norm Loss Cross Entropy $$ Loss = -\sum_{i}^{C}y_ilog(p(x_{i})), where \ y_i\ is label,p(x_i)\ is\ predict. $$ BCE Loss $$ Loss = −\sum_{i}^{c}(y_ilog(p(x_i)+(1−y_i)log(1−p(x_i)) \ where \ y_i \in [0, 1] \ pos_partition = -log(p(x_i))\ neg_partition = -log(1-p(x_i)) $$ Focal Loss $$ Loss = -α_t(1-p_t)^γlog(p_t)\ # Multi-Label:\ 1.\ pos_loss = α(1-p(x_i))^γ\ \ -log(p_t)\ 2.\ neg_loss = (1-α)p(x_i)^γ\ \ -log(1-p_t) $$ 论文 Mlp-mixer - NIPS 2021 title: Mlp-mixer: An all-mlp architecture for vision ...

April 19, 2024 · 12 min · 2517 words · LongWei

深度学习论文汇总2

CAM - CVPR 2015 Learning Deep Features for Discriminative Localization 弱监督对象定位 - 仅提供Image level label 期望:每个单元被其感受野内的某种视觉模式激活。因此 fk (表示空间位置 (x, y) 处最后一个卷积层中单元 k 的激活//输出特征图的一个像素)是该视觉模式存在的地图。类激活图只是这些视觉模式在不同空间位置的存在的加权线性和 计算卷积特征图对于特定输出单元的重要性来实现的 ⭐⭐⭐网络可以保留其卓越的定位能力,直到最后一层 => 深层特征的定位能力 ❗❗❗尽管接受了图像级标签的训练,CNN 仍具有出色的对象定位能力 缺陷:卷积特征图→全局平均池化→softmax层 // 特定网络结构 做法图示 数学公式 在卷积特征图上执行全局平均池化,并将它们用作全连接层的特征,产生所需的输出分类; ❗❗❗将输出层的权重投影回卷积特征图来识别图像区域的重要性 Grad-CAM - ICCV 2017 适用CNN模型 但论文提到在CNN+LSTM的也能定位有区别的图像区域 α 捕获特征图 k 对于目标类 c 的重要性 // 与CAM的分类线性层权重作用一致 ReLU的作用,只对对感兴趣的类别有积极影响的特征感兴趣。负像素可能属于图像中的其他类别 上述操作 => 具有类别区分性并且可以很好地定位相关图像区域 - 最后特征图比较小! 但缺乏显示细粒度重要性的能力 (能区分猫狗,但对为什么识别为猫,不够精确) 通过点乘法融合 引导反向传播 和 Grad-CAM => 可视化 ...

April 19, 2024 · 22 min · 4530 words · LongWei