当前位置: 首页 > news >正文

Java8+Spring Boot + Vue + Langchain4j 实现阿里云百炼平台 AI 流式对话对接

1. 引言

在本文中,我们将介绍如何使用 Spring BootVue.jsLangchain4j,实现与 阿里云百炼平台 的 AI 流式对话对接。通过结合这些技术,我们将创建一个能够实时互动的 AI 聊天应用。

这是一个基于 Spring Boot + Vue.js + Langchain4j 的智能对话系统,实现了类似 ChatGPT 的流式交互体验。系统通过 阿里云百炼 qwen-max 大模型 提供 AI 能力,支持多轮对话记忆(Redis 存储)、本地知识库检索(RAG)和实时流式响应(SSE 协议)。前端 Vue.js 动态渲染对话内容,后端 Spring Boot 处理业务逻辑,Langchain4j 简化大模型集成,具有低延迟、易扩展的特点,适用于智能客服、知识问答等场景。

在线预览地址
https://www.coderman.club

对话记忆功能
在这里插入图片描述
代码编写效果图
在这里插入图片描述
预览效果

2. 技术栈概述

  • Spring Boot:后端框架,用于处理与阿里云百炼平台的 API 对接与业务逻辑。
  • Vue.js:前端框架,用于实现与用户的实时交互和流式数据展示。
  • Langchain4j:Java 库,用于简化与文本生成模型的交互。
  • 阿里云百炼平台:为智能对话提供 NLP 模型和 API,支持流式对话功能。

3. 阿里云百炼平台接入准备

3.1 注册阿里云百炼账号

首先,注册一个阿里云账号并访问百炼平台,获取相关的 API 密钥

3.2 创建对话模型

在阿里云百炼平台上创建并配置一个 AI 对话模型,为后续的对接做好准备。

3.3 获取 API 文档

参考阿里云的 API 文档,获取具体的接口信息和请求参数。

4. 后端实现 - Spring Boot 与阿里云百炼平台对接

4.1 创建 Spring Boot 项目

使用 Spring Initializr 创建一个基础的 Spring Boot 项目,配置相关依赖。

 <dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j</artifactId><version>${langchain4j.version}</version></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-dashscope</artifactId><version>${langchain4j.version}</version></dependency>

4.2 编写Controller代码

@Api(value = "AI接口", tags = "AI接口")
@RestController
@Slf4j
@RequestMapping(value = "/common/chat")
public class ChatController {@Resourceprivate ChatService chatService;@ApiModelProperty(value = "AI对话")@PostMapping(value = "/completion",produces = {MediaType.TEXT_EVENT_STREAM_VALUE})public SseEmitter completion(@RequestBody ChatGptDTO chatGptDTO) {SseEmitter sseEmitter = new SseEmitter(5 * 60 * 1000L);this.chatService.completion(chatGptDTO, sseEmitter);sseEmitter.onTimeout(() -> {log.warn("SSE连接超时");sseEmitter.complete();});sseEmitter.onError(e -> {log.error("SSE连接错误", e);sseEmitter.complete();});return sseEmitter;}
}

4.2 编写Service代码

package com.coderman.admin.service.common.impl;import com.alibaba.fastjson.JSONObject;
import com.coderman.admin.dto.common.ChatGptDTO;
import com.coderman.admin.service.common.Assistant;
import com.coderman.admin.service.common.ChatService;
import dev.langchain4j.service.TokenStream;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;import javax.annotation.Resource;
import java.io.IOException;@Service
@Slf4j
@Configuration
public class ChatServiceImpl implements ChatService {@Resourceprivate Assistant assistant;/*** 调用大模型接口* @param chatGptDTO 参数* @param sseEmitter sse*/public void completion(ChatGptDTO chatGptDTO, SseEmitter sseEmitter) {try {TokenStream stream = assistant.completion(chatGptDTO.getSessionId(), chatGptDTO.getPrompt());// 监听回调stream.onNext(result -> sendSseData(sseEmitter, result));stream.onError(throwable -> handleError(sseEmitter, throwable));stream.onComplete(response -> completeSse(sseEmitter));stream.start();} catch (Exception e) {throw new RuntimeException("completion error:"+e.getMessage());}}private void sendSseData(SseEmitter sseEmitter, String result) {try {JSONObject jsonObject =  new JSONObject();jsonObject.put("text",result);sseEmitter.send(jsonObject, MediaType.APPLICATION_JSON);} catch (IOException e) {log.warn("SSE 发送数据失败:{}", e.getMessage());}}private void handleError(SseEmitter sseEmitter, Throwable throwable) {log.error("SSE 发生错误:{}", throwable.getMessage());sseEmitter.completeWithError(throwable);}private void completeSse(SseEmitter sseEmitter) {try {sseEmitter.send("[DONE]");sseEmitter.complete();} catch (Exception e) {log.warn("SSE 关闭失败:{}", e.getMessage());}}
}

4.3 langchain4j配置类

package com.coderman.admin.config;import com.coderman.admin.service.common.Assistant;
import com.coderman.api.constant.CommonConstant;
import com.coderman.service.util.DesUtil;
import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.loader.FileSystemDocumentLoader;
import dev.langchain4j.data.document.parser.TextDocumentParser;
import dev.langchain4j.data.embedding.Embedding;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.chat.StreamingChatLanguageModel;
import dev.langchain4j.model.dashscope.QwenEmbeddingModel;
import dev.langchain4j.model.dashscope.QwenStreamingChatModel;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.model.output.Response;
import dev.langchain4j.rag.content.retriever.ContentRetriever;
import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.annotation.Resource;
import java.util.List;/*** @author :zhangyukang* @date :2025/04/02 11:12*/
@Configuration
@Slf4j
public class ChatAiConfigure {@Resourceprivate RedisProperties redisProperties;@Beanpublic Assistant assistant() {EmbeddingModel embeddingModel =  QwenEmbeddingModel.builder().apiKey(this.getApiKey()).build();InMemoryEmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();ContentRetriever contentRetriever = EmbeddingStoreContentRetriever.builder().embeddingStore(embeddingStore).embeddingModel(embeddingModel)// 最相似的3个结果.maxResults(3)// 只找相似度在0.8以上的内容.minScore(0.8).build();// 初始化知识库this.loadEmbedding(embeddingModel, embeddingStore);// 自定义存储方式RedisChatMemoryStore redisChatMemoryStore = RedisChatMemoryStore.builder().port(redisProperties.getPort()).password(redisProperties.getPassword()).host(redisProperties.getHost()).build();// 构建模型StreamingChatLanguageModel model = QwenStreamingChatModel.builder().apiKey(this.getApiKey()).modelName("qwen-max").maxTokens(1024).enableSearch(true).build();// 构建服务return AiServices.builder(Assistant.class).streamingChatLanguageModel(model).chatMemoryProvider(memoryId -> MessageWindowChatMemory.builder().id(memoryId).maxMessages(10).chatMemoryStore(redisChatMemoryStore).build()).contentRetriever(contentRetriever).build();}/*** 初始化RAG向量* @param embeddingModel 模型* @param embeddingStore 向量存储*/private void loadEmbedding(EmbeddingModel embeddingModel, InMemoryEmbeddingStore<TextSegment> embeddingStore) {try {Document document = FileSystemDocumentLoader.loadDocument("/opt/rag.txt", new TextDocumentParser());List<TextSegment> textSegments = new RagDocumentSplitter().split(document);Response<List<Embedding>> response = embeddingModel.embedAll(textSegments);List<Embedding> embeddings = response.content();embeddingStore.addAll(embeddings, textSegments);} catch (Exception e) {log.warn("初始化知识库失败:{}", e.getMessage());}}private String getApiKey() {try {final String API_KEY_ENCRYPTED = "你的app秘钥";return DesUtil.decrypt(API_KEY_ENCRYPTED, CommonConstant.SECRET_KEY);} catch (Exception e) {log.error("API Key 解密失败", e);throw new RuntimeException("无法解密 API Key");}}
}

4.4 自定义AI对话接口类

package com.coderman.admin.service.common;import dev.langchain4j.service.MemoryId;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.TokenStream;
import dev.langchain4j.service.UserMessage;/*** @author :zhangyukang* @date :2025/04/02 11:14*/
public interface Assistant {@SystemMessage(value = {"你是由小章鱼开发的AI智能助手,专注于高效、友好地帮助用户解决问题。","你的核心能力包括:问题解答、信息查询、任务协助、建议提供等。","当用户询问你的身份时,请明确回复:'我是由小章鱼开发的AI助手,很高兴为你服务!'","回答时需保持专业且亲切,语言简洁易懂,避免冗长或模糊表述。","如果遇到无法回答的问题,应礼貌说明并建议替代方案。","始终以用户需求为核心,主动提供有价值的帮助。"})TokenStream completion(@MemoryId String sessionId, @UserMessage String userMessage);
}

4.5 使用Redis存储实现对话记忆

package com.coderman.admin.config;import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.data.message.ChatMessageDeserializer;
import dev.langchain4j.data.message.ChatMessageSerializer;
import dev.langchain4j.internal.ValidationUtils;
import dev.langchain4j.store.memory.chat.ChatMemoryStore;
import redis.clients.jedis.*;import java.util.ArrayList;
import java.util.List;/*** 使用 Redis 存储聊天记录的 MemoryStore*/
public class RedisChatMemoryStore implements ChatMemoryStore {private final JedisPool jedisPool;private final static String KEY_PREFIX = "chat_memory:";public RedisChatMemoryStore(String host, Integer port, String password) {// 配置 Redis 连接池JedisPoolConfig poolConfig = new JedisPoolConfig();poolConfig.setMaxTotal(10);poolConfig.setMaxIdle(5);poolConfig.setMinIdle(2);// 这里 JedisPool 支持传入密码this.jedisPool = new JedisPool(poolConfig, host, port, 2000, password);}@Overridepublic List<ChatMessage> getMessages(Object memoryId) {try (Jedis jedis = jedisPool.getResource()) {String json = jedis.get(KEY_PREFIX+ toMemoryIdString(memoryId));return json == null ? new ArrayList<>() : ChatMessageDeserializer.messagesFromJson(json);}}@Overridepublic void updateMessages(Object memoryId, List<ChatMessage> messages) {try (Jedis jedis = jedisPool.getResource()) {String json = ChatMessageSerializer.messagesToJson(ValidationUtils.ensureNotEmpty(messages, "messages"));String res = jedis.set(KEY_PREFIX + toMemoryIdString(memoryId), json);if (!"OK".equals(res)) {throw new RuntimeException("Redis set memory error: " + res);}}}@Overridepublic void deleteMessages(Object memoryId) {try (Jedis jedis = jedisPool.getResource()) {jedis.del(KEY_PREFIX + toMemoryIdString(memoryId));}}private static String toMemoryIdString(Object memoryId) {if (memoryId == null || memoryId.toString().trim().isEmpty()) {throw new IllegalArgumentException("memoryId cannot be null or empty");}return memoryId.toString();}public static Builder builder() {return new Builder();}/*** Builder 模式,方便配置 Redis 连接*/public static class Builder {private String host = "127.0.0.1";private Integer port = 6379;private String password = null;public Builder host(String host) {this.host = host;return this;}public Builder port(Integer port) {this.port = port;return this;}public Builder password(String password) {this.password = password;return this;}public RedisChatMemoryStore build() {return new RedisChatMemoryStore(host, port, password);}}
}

源码地址: https://github.com/zykzhangyukang/admin

相关文章:

Java8+Spring Boot + Vue + Langchain4j 实现阿里云百炼平台 AI 流式对话对接

1. 引言 在本文中&#xff0c;我们将介绍如何使用 Spring Boot、Vue.js 和 Langchain4j&#xff0c;实现与 阿里云百炼平台 的 AI 流式对话对接。通过结合这些技术&#xff0c;我们将创建一个能够实时互动的 AI 聊天应用。 这是一个基于 Spring Boot Vue.js Langchain4j 的智…...

【scikit-learn基础】--『数据加载』之外部数据集

这是scikit-learn数据加载系列的最后一篇&#xff0c;本篇介绍如何加载外部的数据集。 外部数据集不像之前介绍的几种类型的数据集那样&#xff0c;针对每种数据提供对应的接口&#xff0c;每个接口加载的数据都是固定的。 而外部数据集加载之后&#xff0c;数据的字段和类型是…...

Redis原理:keys命令

语法&#xff1a; keys pattern 返回所有符合pattern的key 支持 glob-style patterns: h?llo matches hello, hallo and hxlloh*llo matches hllo and heeeelloh[ae]llo matches hello and hallo, but not hilloh[^e]llo matches hallo, hbllo, ... but not helloh[a-b]llo ma…...

4.7学习总结 可变参数+集合工具类Collections+不可变集合

可变参数&#xff1a; 示例&#xff1a; public class test {public static void main(String[] args) {int sumgetSum(1,2,3,4,5,6,7,8,9,10);System.out.println(sum);}public static int getSum(int...arr){int sum0;for(int i:arr){sumi;}return sum;} } 细节&#xff1a…...

高级java每日一道面试题-2025年3月24日-微服务篇[Nacos篇]-使用Nacos如何实现配置管理?

如果有遗漏,评论区告诉我进行补充 面试官: 使用Nacos如何实现配置管理&#xff1f; 我回答: 在Java高级面试中讨论如何使用Nacos实现配置管理的综合回答 在Java高级面试中&#xff0c;关于如何使用Nacos实现配置管理&#xff0c;可以从以下几个方面进行全面、深入的阐述&am…...

Exce格式化批处理工具详解:高效处理,让数据更干净!

Exce格式化批处理工具详解&#xff1a;高效处理&#xff0c;让数据更干净&#xff01; 1. 概述 在数据分析、报表整理、数据库管理等工作中&#xff0c;数据清洗是不可或缺的一步。原始Excel数据常常存在格式不统一、空值、重复数据等问题&#xff0c;影响数据的准确性和可用…...

CExercise_06_1指针和数组_1查找数组的最大值和最小值

题目&#xff1a; 查找数组的最大值和最小值&#xff0c;但要将最大值作为返回值返回&#xff0c;最小值则依靠传入的指针完成赋值。 要求不能使用"[]"运算符。 函数的声明如下&#xff1a; int max_min(int *arr, int len, int *pmin); 关键点 1) * 运算符用于解引用…...

redis中的hash

Redis中的hash是什么 Hash: 哈希&#xff0c;也叫散列&#xff0c;是一种通过哈希函数将键映射到表中位置的数据结构&#xff0c;哈希函数是关键&#xff0c;它把键转换成索引。 Redis Hash&#xff08;散列表&#xff09;是一种 field-value pairs&#xff08;键值对&#x…...

【学习笔记】李沐斯坦福21秋季:实用机器学习中文版

这里写自定义目录标题 数据处理数据获取数据标注数据清洗特征工程 数据处理 数据获取 爬虫 实际工作中大部分都是从数据库里取数 数据标注 只有一小部分有标签 大部分无标签的话 半监督学习&#xff1a;没标注数据和有标注数据共同使用 做法1:半监督学习 基于有标签的小部分…...

UE5学习笔记 FPS游戏制作43 UI材质

文章目录 实现目标制作UI材质使用UI材质 实现目标 把图片变为灰色 制作UI材质 右键新建一个材质 左侧细节栏&#xff0c;材质域改为用户界面&#xff0c;混合模式改为半透明 此时输出节点应该有两个属性 在内容浏览器里找到要用的图片&#xff0c;然后向上拖动到材质标题…...

QT控件 修改QtTreePropertyBrowser自定义属性编辑器源码,添加第一列标题勾选,按钮,右键菜单事件等功能

头阵子遇到一个需要修改QtTreePropertyBrowser控件的需求&#xff0c;QT开发做这么久了&#xff0c;这个控件倒是第一次用&#xff0c;费了点时间研究&#xff0c;在这里做个简单的总结。 QtTreePropertyBrowser控件 是 Qt 解决方案 (Qt Solutions) 中的一个组件&#xff0c;用…...

MFC工具栏CToolBar从专家到小白

CToolBar m_wndTool; //创建控件 m_wndTool.CreateEx(this, TBSTYLE_FLAT|TBSTYLE_NOPREFIX, WS_CHILD | WS_VISIBLE | CBRS_FLYBY | CBRS_TOP | CBRS_SIZE_DYNAMIC); //加载工具栏资源 m_wndTool.LoadToolBar(IDR_TOOL_LOAD) //在.rc中定义&#xff1a;IDR_TOOL_LOAD BITMAP …...

Golang 项目平滑重启

引言 平滑重启&#xff08;Graceful Restart&#xff09;技术作为一种常用的解决方案&#xff0c;通过允许新进程接管而不中断现有的请求&#xff0c;确保了系统的稳定运行和业务连续性。同时目前公司的服务重启绝大部分也都适用的 go 的平滑重启技术。 本部分将对平滑重启的…...

Vue2 插槽 Slot

提示&#xff1a;插槽的目的是让我买原来的设备具备更多的扩展性。 文章目录 前言在组件中定义插槽&#xff08;子组件视角&#xff09;1. 默认插槽2. 具名插槽&#xff08;带名称的插槽&#xff09;3. 作用域插槽&#xff08;带数据的插槽&#xff09; 使用插槽&#xff08;父…...

关于sqlsugar实体多层List映射的问题

如上图所示&#xff0c;当一个主表&#xff08;crm_fina_pay_req&#xff09;的子表list<文件附件关系表>&#xff08; List<crm_fina_payreq_evidofpay_relation> &#xff09;中&#xff0c;还包含有sysfile&#xff08;SysFile SysFiles&#xff09;类型的文件信…...

使用stm32cubeide stm32f407 lan8720a freertos lwip 实现udp client网络数据转串口数据过程详解

1前言 项目需要使用MCU实现网络功能&#xff0c;后续确定方案stm32f407 外接lan8720a实现硬件平台搭建&#xff0c;针对lan8720a也是用的比较多的phy&#xff0c;网上比较多的开发板&#xff0c;硬件上都是选用了这个phy&#xff0c;项目周期比较短&#xff0c;选用了这个常用…...

LangChain4j(4):预设角色(系统消息SystemMessage)

1 预设角色(系统消息SystemMessage) 基础大模型是没有目的性的&#xff0c; 你聊什么给什么&#xff0c;但是如果我们开发的事一个智能票务助手&#xff0c; 我需要他以一个票务助手的角色跟我对话&#xff0c; 并且在我跟他说”退票”的时候&#xff0c; 让大模型一定要告诉我…...

自然语言处理利器NLTK:从入门到核心功能解析

文章目录 一、NLP领域的基石工具包二、NLTK核心模块全景解析1 数据获取与预处理2 语言特征发现3 语义与推理 三、设计哲学与架构优势1 四维设计原则2 性能优化策略 四、典型应用场景1 学术研究2 工业实践 五、生态系统与未来演进 一、NLP领域的基石工具包 自然语言工具包&…...

常见接口协议介绍

1. I2C&#xff08;Inter-Integrated Circuit&#xff09; 定义&#xff1a;两线制串行总线&#xff08;SDA数据线 SCL时钟线&#xff09;&#xff0c;支持主从模式多设备通信。特点&#xff1a; 地址机制&#xff1a;每个设备有唯一地址&#xff0c;主设备通过地址选择从设备…...

宝塔面板使用CDN 部署后获取真实客户端 IP教程

在宝塔面板环境中配置 CDN 加速服务后&#xff0c;服务器日志默认记录的是 CDN 节点 IP&#xff0c;这给网站流量分析带来不便。本文将为您提供多种解决方案&#xff0c;帮助您在 CDN 生效的同时获取真实访客 IP。 一、Nginx 配置调整方案 日志格式优化 在宝塔面板中打开 Ngi…...

生鲜果蔬便利店实体零售门店商城小程序

——线上线下融合赋能社区零售新生态 随着新零售模式的深化和消费者需求的升级&#xff0c;生鲜果蔬便利店亟需通过数字化工具实现经营效率与用户体验的双重提升。结合线下实体门店与线上商城的一体化小程序&#xff0c;成为行业转型的核心工具。以下从功能模块、运营策略及行…...

C++(初阶)(十)——vector模拟实现

vector vector构造尾插&#xff08;删&#xff09;和扩容inert&#xff08;插入&#xff09;迭代器失效erase&#xff08;删除&#xff09;resize&#xff08;调整空间&#xff09;深浅拷贝迭代器拷贝和赋值&#xff08;v2(v1)和v1 v3&#xff09;多个数据插入迭代器区间初始化…...

利用解析差异SSRF + sqlite注入 + waf逻辑漏洞 -- xyctf 2025 fate WP

本文章附带TP(Thinking Process)! #!/usr/bin/env python3 # 导入所需的库 import flask # Flask web框架 import sqlite3 # SQLite数据库操作 import requests # HTTP请求库 import string # 字符串处理 import json # JSON处理app flask.Flask(__name__) # 创建Flask应…...

VScode无法激活conda虚拟环境,不显示虚拟环境名称

在VScode中终端中激活环境时出现下面的情况 PS F:\Model\stMMR-main> conda activate env_mamba usage: conda-script.py [-h] [--no-plugins] [-V] COMMAND ... conda-script.py: error: argument COMMAND: invalid choice: activate (choose from clean, compare, config…...

vscode Colipot 编程助手

1、登录到colipot&#xff0c;以github账号&#xff0c;关联登录 点击【continue】按钮&#xff0c;继续。 点击【打开Visual Studio Code】&#xff0c;回到vscode中。 2、问一下11? 可以看出&#xff0c;很聪明&#xff0c;一下子就算出来了。 3、帮我们写一个文件&#xf…...

vscode中REST Client插件

最近发现vscode中REST Client插件也可以测试接口 简介 在 VS Code 中&#xff0c;REST Client 是一个非常受欢迎的插件&#xff0c;用于测试和调试 RESTful API。以下是关于该插件的安装、使用和功能的详细介绍&#xff1a; 安装 REST Client 插件 打开 VS Code。点击左侧的扩…...

路由器工作在OSI模型的哪一层?

路由器主要工作在OSI模型的第三层&#xff0c;即网络层。网络层的主要功能是将数据包从源地址路由到目标地址&#xff0c;路由器通过检查数据包中的目标IP地址&#xff0c;并根据路由表确定最佳路径来实现这一功能。 路由器的主要功能&#xff1a; a、路由决策&#xff1a;路…...

(PROFINET 转 EtherCAT)EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

型号 协议转换通信网关 PROFINET 转 EtherCAT MS-GW31 概述 MS-GW31 是 PROFINET 和 EtherCAT 协议转换网关&#xff0c;为用户提供两种不同通讯协议的 PLC 进行数据交互的解决方案&#xff0c;可以轻松容易将 EtherCAT 网络接入 PROFINET 网络中&#xff0c;方便扩展&…...

【教程】MacBook 安装 VSCode 并连接远程服务器

目录 需求步骤问题处理 需求 在 Mac 上安装 VSCode&#xff0c;并连接跳板机和服务器。 步骤 Step1&#xff1a;从VSCode官网&#xff08;https://code.visualstudio.com/download&#xff09;下载安装包&#xff1a; Step2&#xff1a;下载完成之后&#xff0c;直接双击就能…...

Solidity基础入门—web3

Remix介绍 官网地址 Remix 是一个基于浏览器的 Solidity 开发环境&#xff0c;主要用于编写、测试、调试和部署以太坊智能合约。 Solidity基本数据类型 类型说明示例uint / int无符号 / 有符号整数uint256, int8, int256bool布尔类型&#xff08;true / false&#xff09;bo…...

微信小程序 request 流式数据处理

什么是流式数据处理&#xff1f; 流式数据处理&#xff08;Streaming Data&#xff09;指逐步接收并处理数据片段的技术&#xff0c;无需等待全部数据加载完成。适用于大文件下载、实时日志、AI生成报告等场景&#xff0c;可显著降低内存占用并提升用户体验。 微信小程序中的…...

Kotlin与HttpClient编写视频爬虫

想用Apache HttpClient库和Kotlin语言写一个视频爬虫。首先&#xff0c;我需要确定用户的具体需求。视频爬虫通常涉及发送HTTP请求&#xff0c;解析网页内容&#xff0c;提取视频链接&#xff0c;然后下载视频。可能需要处理不同的网站结构&#xff0c;甚至可能需要处理动态加载…...

数据结构:通俗解释AOE 网中事件的最早发生时间和最迟发生时间

1. 事件的最早发生时间 在 AOE 网&#xff08;Activity On Edge Network&#xff0c;边表示活动的网络&#xff09;中&#xff0c;事件的最早发生时间指从源点&#xff08;起点&#xff09;到该事件结点的最长路径长度&#xff08;即所需时间&#xff09;。它决定了所有以该事…...

爬虫中遇到的问题

网页假请求导致的阻塞 可以在requests请求当中添加timeout参数&#xff0c;来让网站重新请求 在爬虫请求中&#xff0c;timeout参数的主要作用是控制请求的最大等待时间&#xff0c;避免因服务器响应缓慢或网络问题导致程序长时间阻塞&#xff0c;从而提升爬虫的效率和稳定性…...

聊一聊没有接口文档时如何开展测试

目录 一、前期准备与信息收集 二、使用抓包工具分析接口 三、逆向工程构造测试用例 四、安全测试 五、 模糊测试&#xff08;Fuzz Testing&#xff09; 六、记录并维护发现的接口信息 七、 推动团队规范流程 其它注意事项 在我们进行接口测试时&#xff0c;总会遇到各种…...

第一部分:MCP协议与多智能体系统基础-第1课:MCP服务协议核心架构解析

以下是为《MCP服务协议核心架构解析》设计的课件内容&#xff0c;采用“概念解析→代码实践→运行验证”三段式教学结构&#xff0c;结合可视化图表与可运行代码示例&#xff0c;增强学生对MCP协议核心组件的理解与实操能力&#xff1a; 一、课程导入&#xff1a;MCP协议定位与…...

WEB安全--内网渗透--捕获NET-NTLMv2 Hash

一、前言 在LM&NTLM基础篇中我们了解到了NTLM协议的流程与加密的方式&#xff0c;以及具体的在type3的response中Net-ntlm hash v2的生成方式。 思考&#xff1a; 如果我们入侵的服务器中有域管理员的登录后的密码缓存&#xff0c;那就能用工具&#xff08;mimikatz&…...

使用 J-Flash 读取芯片 Flash 数据的方法

基本读取步骤 硬件连接 确保 J-Link 调试器正确连接到目标板 给目标板供电&#xff08;可通过 J-Link 供电或外部电源&#xff09; 创建/打开项目 启动 J-Flash 软件 选择 "File" > "New Project" 创建新项目 选择正确的目标芯片型号&#xff08;或…...

Spring MVC 返回 JSON 视图的方式及对比(6种)

Spring MVC 返回 JSON 视图的方式及对比&#xff08;新增 MappingJackson2JsonView&#xff09; 1. 方式一&#xff1a;ResponseBody 注解 作用&#xff1a;直接返回对象&#xff0c;由消息转换器&#xff08;如 Jackson&#xff09;序列化为 JSON。 适用场景&#xff1a;简单…...

SpringMVC的数据响应

1)页面跳转 直接返回字符串 通过ModelAndView对象返回 //方式三(model和view拆开)RequestMapping("/quick4")public String save4(Model model){model.addAttribute("username","lisi3");return "success";}//方式二RequestMapping(&…...

GraphRAG与知识图谱

一、GraphRAG介绍 1.1 什么是 Graph RAG&#xff1f; Graph RAG&#xff08;Retrieval-Augmented Generation&#xff09;&#xff0c;是一种基于知识图谱的检索增强技术&#xff0c; 通过构建图模型的知识表达&#xff0c;将实体和关系之间的联系用图的形式进行展示&#xff…...

hive通过元数据库删除分区操作步骤

删除分区失败&#xff1a; alter table proj_60_finance.dwd_fm_ma_kpi_di_mm drop partition(year2025,month0-3,typeADJ); 1、查询分区的DB_ID、TBL_ID – 获取数据库ID-26110 SELECT DB_ID FROM DBS WHERE NAME ‘proj_60_finance’; – 获取表ID-307194 SELECT TBL_ID FR…...

LINUX 5 cat du head tail wc 计算机拓扑结构 计算机网络 服务器 计算机硬件

计算机网络 计算机拓扑结构 计算机按性能指标分&#xff1a;巨型机、大型机、小型机、微型机。大型机、小型机安全稳定&#xff0c;小型机用于邮件服务器 Unix系统。按用途分&#xff1a;专用机、通用机 计算机网络&#xff1a;局域网‘、广域网 通信协议’ 计算机终端、客户端…...

flink 增量快照同步文件引用关系和恢复分析

文章目录 文件引用分析相关代码分析从state 恢复&#xff0c;以rocksdb为例不修改并行度修改并行度keyGroupRange过程问题 文件引用分析 每次生成的checkpoint 里都会有所有文件的引用信息 问题&#xff0c;引用分析里如何把f1,f2去掉了&#xff0c;可以参考下面的代码&#…...

属性修改器 (AttributeModifier)

主页面设置组件 import { MyButtonModifier } from ../datastore/MyButtonModifier;Entry ComponentV2 struct MainPage {// 支持用状态装饰器修饰&#xff0c;行为和普通的对象一致Local modifier: MyButtonModifier new MyButtonModifier();build() {Column() {Button(&quo…...

汽车BMS技术分享及其HIL测试方案

一、BMS技术简介 在全球碳中和目标的战略驱动下&#xff0c;新能源汽车产业正以指数级速度重塑交通出行格局。动力电池作为电动汽车的"心脏"&#xff0c;其性能与安全性不仅直接决定了车辆的续航里程、使用寿命等关键指标&#xff0c;更深刻影响着消费者对电动汽车的…...

电网电能质量分析:原理、算法及实际应用

一、引言 在现代社会&#xff0c;电力供应的稳定性和可靠性对工业生产、社会生活的各个方面都至关重要。电能质量作为衡量电力系统供电能力的关键指标&#xff0c;其优劣直接影响到电力设备的运行效率、使用寿命以及生产过程的稳定性。随着电力系统规模的不断扩大&#xff0c;新…...

PyCharm Community社区版链接WSL虚拟环境

#记录工作 在过去&#xff0c;PyCharm Community Edition&#xff08;社区版&#xff09;不具备链接 WSL 虚拟环境的功能&#xff0c;该功能仅在 PyCharm Professional&#xff08;专业版&#xff09;和企业版中提供。如今&#xff0c;从 PyCharm Community Edition 2024.3.5 …...

2026考研数学张宇武忠祥复习视频课,高数基础班+讲义PDF

2026考研数学武忠祥老师课&#xff08;网盘&#xff09;&#xff1a;点击下方链接 2026考研数学武忠祥网课&#xff08;最新网盘&#xff09; 一、基础阶段&#xff08;3-5个月&#xff09; 目标&#xff1a;搭建知识框架掌握基础题型 教材使用&#xff1a; 高数&#xff1a;…...

Spring Boot嵌入前端静态资源:从原理到实战的完整指南

在Java Spring Boot项目中集成前端静态资源是构建现代Web应用的必备技能。本文将深入解析Spring Boot的静态资源处理机制&#xff0c;通过实战案例演示完整的集成流程&#xff0c;并分享性能优化与安全加固的最佳实践。 一、Spring Boot静态资源处理原理 1.1 默认资源路径 S…...