Java WebFlux集成DeepSeek大模型:流式接入完整实现(含代码+优化+避坑)

Java WebFlux集成DeepSeek大模型:流式接入完整实现(含代码+优化+避坑)


在这里插入图片描述

Java WebFlux集成DeepSeek大模型:流式接入完整实现(含代码+优化+避坑)

前言:随着大模型技术的普及,Java后端接入DeepSeek等大模型时,传统同步阻塞式调用已无法满足高并发、低延迟的业务需求。本文基于Spring WebFlux响应式框架,详细讲解大模型流式接入的技术方案、完整实现代码、性能优化技巧及常见问题解决方案,全程干货,可直接落地到生产环境。

在这里插入图片描述

关键词:Java WebFlux;DeepSeek;流式接入;SSE;响应式编程;大模型集成

一、技术背景与需求分析

在Java后端开发中,接入DeepSeek等大模型进行AI推理时,传统同步HTTP调用模式存在诸多痛点,而流式处理结合WebFlux的响应式特性,成为解决该问题的最优路径。

1.1 传统AI模型接入的局限性

传统Java应用接入AI推理模型,普遍采用同步阻塞式HTTP请求(如OkHttp、RestTemplate同步调用),这种模式在对接DeepSeek等大模型时,瓶颈尤为突出,具体表现为三点:

  • 高延迟导致线程阻塞:DeepSeek等大模型单次推理耗时通常在1-5秒,同步调用会导致请求线程长时间占用,无法释放,当并发请求增多时,线程池极易耗尽,引发系统雪崩。
  • 内存压力过大:同步调用需要等待模型完整输出所有结果后,才能进行后续处理,大量并发请求下,完整的响应数据会占用大量JVM堆内存,容易触发GC频繁,甚至出现OOM异常。
  • 吞吐量严重受限:并发请求数完全依赖服务器线程池配置,线程池最大线程数固定,无法充分利用服务器资源,导致系统吞吐量难以提升,无法应对高并发场景。

1.2 流式处理的必要性

幸运的是,DeepSeek模型原生支持分块输出(chunked response),即流式传输,通过流式接入可从根本上解决传统同步调用的痛点,具体优势如下:

  • 实时反馈,提升用户体验:用户无需等待模型完整生成所有结果,可在模型输出过程中实时看到中间内容,尤其适用于对话、文档生成等场景,避免用户长时间等待。
  • 优化资源占用:流式传输无需缓存完整响应,每接收一个数据块就立即处理并返回给前端,大幅降低JVM堆内存占用,减少GC压力。
  • 增强交互性:支持动态中断请求,当用户不需要继续获取结果时(如输入错误、取消查询),可随时中断流式连接,节省模型资源和网络带宽。

1.3 WebFlux的适配优势

Spring WebFlux是Spring框架推出的响应式Web框架,基于Reactor响应式编程模型,天然适配流式数据处理,是Java后端实现大模型流式接入的最佳选择,其核心优势的:

  • 异步非阻塞模型:基于Reactor的Mono和Flux类型,实现异步非阻塞处理,无需占用大量线程,可在少量线程中处理大量并发请求,提升系统吞吐量。
  • 原生支持SSE协议:Server-Sent Events(SSE)是一种服务器向客户端推送流式数据的协议,WebFlux可直接通过MediaType.TEXT_EVENT_STREAM_VALUE实现SSE输出,完美适配大模型的分块响应。
  • 与Netty深度集成:WebFlux默认使用Netty作为底层服务器,Netty的高性能I/O模型(NIO)可高效处理网络连接和数据传输,进一步提升流式接入的性能。

二、核心实现方案(全程可落地)

本章节将从环境准备、模型配置、客户端实现、错误处理四个方面,提供完整的代码实现,开发者可直接复制修改,快速集成到自己的项目中。

2.1 环境准备(Maven依赖配置)

首先需要在Spring Boot项目中引入WebFlux相关依赖,推荐使用Spring Boot 2.7+版本(兼容性更好),Maven依赖如下(复制到pom.xml即可):

<!-- Spring WebFlux 核心依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><!-- Netty 依赖(WebFlux默认集成,可显式引入确保版本一致) --><dependency><groupId>io.projectreactor.netty</groupId><artifactId>reactor-netty</artifactId></dependency><!-- WebFlux 内置HTTP客户端(替代RestTemplate,用于调用DeepSeek API) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux-client</artifactId></dependency><!-- JSON解析依赖(用于解析DeepSeek的响应数据) --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency><!-- 日志依赖(可选,用于调试流式数据) --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId></dependency>

2.2 模型服务端配置要点

要实现流式接入,首先需要确保DeepSeek模型服务已启用流式响应模式。如果是调用DeepSeek官方API,无需额外配置,只需在请求参数中指定stream=true即可;如果是部署本地DeepSeek模型(如DeepSeek-7B、DeepSeek-67B),需在模型服务配置文件中启用流式参数,示例如下(application.yml):

# DeepSeek模型服务配置(本地部署版)model:name: deepseek-7b # 模型名称,根据实际部署的模型填写stream:true# 关键参数:启用流式响应,必须设为truemax_tokens:2048# 最大生成token数,根据业务需求调整temperature:0.7# 温度参数,控制生成内容的随机性(0-1之间)top_p:0.9# 可选参数,控制采样范围api_key: your_api_key # 本地部署可忽略,调用官方API需填写

注意:调用DeepSeek官方API时,api_key需从DeepSeek官网申请,请求头中需携带该密钥,后续客户端实现会详细说明。

2.3 WebFlux客户端实现(核心代码)

WebFlux使用WebClient作为HTTP客户端,替代传统的RestTemplate,可高效实现异步非阻塞的流式请求。以下是完整的客户端实现,分为WebClient配置、流式请求封装、控制器暴露三个部分。

2.3.1 WebClient配置(全局单例)

WebClient建议配置为全局单例,避免频繁创建和销毁连接,提升性能。通过@Bean注解注入Spring容器,代码如下:

importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.http.HttpHeaders;importorg.springframework.http.MediaType;importorg.springframework.web.reactive.function.client.WebClient;importreactor.netty.http.client.HttpClient;importjava.time.Duration;@ConfigurationpublicclassWebClientConfig{// 从配置文件中读取DeepSeek API地址和API密钥(推荐)privatefinalString deepSeekBaseUrl ="https://api.deepseek.com/v1";privatefinalString deepSeekApiKey ="your_deepseek_api_key";// 替换为自己的API密钥@BeanpublicWebClientdeepSeekClient(){returnWebClient.builder().baseUrl(deepSeekBaseUrl)// DeepSeek API基础地址.defaultHeader(HttpHeaders.CONTENT_TYPE,MediaType.APPLICATION_JSON_VALUE).defaultHeader("Authorization","Bearer "+ deepSeekApiKey)// 官方API需携带密钥.clientConnector(newReactorClientHttpConnector(// 配置HTTP客户端,设置响应超时时间(大模型推理耗时较长,需适当延长)HttpClient.create().responseTimeout(Duration.ofMinutes(5)))).build();}}

2.3.2 流式请求封装(Service层)

在Service层封装流式请求逻辑,调用WebClient向DeepSeek API发送请求,并返回Flux类型的流式数据(每一个元素对应一个模型输出的chunk)。代码如下:

importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.http.MediaType;importorg.springframework.stereotype.Service;importorg.springframework.web.reactive.function.client.WebClient;importreactor.core.publisher.Flux;importreactor.util.retry.Retry;importjava.time.Duration;importjava.io.IOException;@ServicepublicclassDeepSeekStreamService{privatestaticfinalLogger log =LoggerFactory.getLogger(DeepSeekStreamService.class);privatefinalWebClient webClient;// 构造方法注入WebClient(全局单例)publicDeepSeekStreamService(WebClient deepSeekClient){this.webClient = deepSeekClient;}/** * 基础流式推理方法 * @param prompt 用户输入的提示词 * @return 流式响应数据(每一个String是一个chunk) */publicFlux<String>streamInference(String prompt){// 构建DeepSeek请求参数(符合DeepSeek API规范)InferenceRequest request =newInferenceRequest("deepseek-7b-chat",// 模型名称,根据实际使用的模型填写 prompt,true,// 启用流式响应2048,// 最大token数0.7// 温度参数);return webClient.post().uri("/chat/completions")// DeepSeek聊天补全API路径.bodyValue(request)// 发送请求体.accept(MediaType.TEXT_EVENT_STREAM)// 关键配置:接收SSE流式响应.retrieve()// 发起请求并获取响应.bodyToFlux(String.class)// 将响应体转为Flux<String>(流式数据).doOnNext(chunk -> log.debug("Received DeepSeek chunk: {}", chunk))// 调试:打印每一个chunk.timeout(Duration.ofMinutes(10))// 防止长时间阻塞,超时抛出异常.onErrorResume(e ->{ log.error("Stream inference error", e);returnFlux.empty();// 错误处理:返回空流,避免影响整体服务});}/** * 带重试机制的流式推理方法(生产环境推荐) * 针对模型服务临时不可用、网络波动等场景,实现自动重试 */publicFlux<String>resilientStreamInference(String prompt){returnstreamInference(prompt)// 重试机制:最多重试3次,每次间隔1秒,仅对IO异常重试.retryWhen(Retry.backoff(3,Duration.ofSeconds(1)).filter(ex -> ex instanceofIOException).onRetryExhaustedThrow((retryBackoffSpec, retrySignal)->newRuntimeException("Stream retry exhausted", retrySignal.failure())));}// 内部静态类:DeepSeek请求参数封装(符合API规范)privatestaticclassInferenceRequest{privateString model;privateString prompt;privateboolean stream;privateint max_tokens;privatedouble temperature;// 构造方法publicInferenceRequest(String model,String prompt,boolean stream,int max_tokens,double temperature){this.model = model;this.prompt = prompt;this.stream = stream;this.max_tokens = max_tokens;this.temperature = temperature;}// getter/setter(省略,可自动生成)publicStringgetModel(){return model;}publicvoidsetModel(String model){this.model = model;}publicStringgetPrompt(){return prompt;}publicvoidsetPrompt(String prompt){this.prompt = prompt;}publicbooleanisStream(){return stream;}publicvoidsetStream(boolean stream){this.stream = stream;}publicintgetMax_tokens(){return max_tokens;}publicvoidsetMax_tokens(int max_tokens){this.max_tokens = max_tokens;}publicdoublegetTemperature(){return temperature;}publicvoidsetTemperature(double temperature){this.temperature = temperature;}}}

2.3.3 控制器层实现(暴露API给前端)

在Controller层暴露SSE接口,接收前端的prompt参数,调用Service层的流式方法,将处理后的流式数据返回给前端。代码如下:

importcom.fasterxml.jackson.core.JsonProcessingException;importcom.fasterxml.jackson.databind.JsonNode;importcom.fasterxml.jackson.databind.ObjectMapper;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.http.MediaType;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importreactor.core.publisher.Flux;@RestController@RequestMapping("/api/ai")publicclassDeepSeekStreamController{privatestaticfinalLogger log =LoggerFactory.getLogger(DeepSeekStreamController.class);privatefinalDeepSeekStreamService deepSeekStreamService;privatefinalObjectMapper objectMapper;// JSON解析工具// 构造方法注入依赖publicDeepSeekStreamController(DeepSeekStreamService deepSeekStreamService,ObjectMapper objectMapper){this.deepSeekStreamService = deepSeekStreamService;this.objectMapper = objectMapper;}/** * 流式聊天接口(SSE) * @param prompt 用户输入的提示词 * @return 流式响应数据(解析后的纯文本内容) */@GetMapping(value ="/stream-chat", produces =MediaType.TEXT_EVENT_STREAM_VALUE)publicFlux<String>streamChat(@RequestParamString prompt){// 调用带重试的流式方法return deepSeekStreamService.resilientStreamInference(prompt)// 解析每一个chunk:提取模型输出的文本内容.map(this::parseChunk)// 客户端断开连接时触发(如用户关闭页面).doOnCancel(()-> log.info("Client disconnected, stream stopped"))// 流式处理异常时触发.doOnError(e -> log.error("Stream chat error", e));}/** * 解析DeepSeek的流式响应chunk * DeepSeek的流式响应格式:data: {"id":"xxx","choices":[{"delta":{"content":"xxx"}}]} * 需提取choices[0].delta.content中的内容 */privateStringparseChunk(String chunk){try{// 去除chunk中的"data: "前缀(SSE格式要求)String jsonStr = chunk.replace("data: ","").trim();// 忽略结束标识(DeepSeek流式结束时会返回data: [DONE])if("[DONE]".equals(jsonStr)){return"";}// 解析JSONJsonNode node = objectMapper.readTree(jsonStr);// 提取文本内容,避免空指针return node.path("choices").get(0).path("delta").path("content").asText();}catch(JsonProcessingException e){ log.error("Failed to parse DeepSeek chunk", e);return"";// 解析失败时返回空字符串,不影响后续流式输出}}}

2.4 错误处理与重试机制(生产环境必备)

在实际生产环境中,网络波动、模型服务临时不可用等异常情况不可避免,因此需要完善的错误处理和重试机制,确保流式服务的稳定性。前面的Service层已实现基础的重试逻辑,这里补充更全面的错误处理方案:

/** * 完善的错误处理+重试机制 */publicFlux<String>perfectResilientStream(String prompt){return webClient.post().uri("/chat/completions").bodyValue(newInferenceRequest(prompt)).accept(MediaType.TEXT_EVENT_STREAM).retrieve()// 处理HTTP错误状态码(如5xx服务器错误、4xx客户端错误).onStatus(HttpStatus::is4xxClientError, response ->{ log.error("Client error: {}", response.statusCode());returnMono.error(newRuntimeException("Invalid request, status: "+ response.statusCode()));}).onStatus(HttpStatus::is5xxServerError, response ->{ log.error("Model service error: {}", response.statusCode());returnMono.error(newRuntimeException("Model service unavailable, status: "+ response.statusCode()));}).bodyToFlux(String.class)// 重试机制:指数退避重试,最多3次,间隔1s、2s、4s.retryWhen(Retry.backoff(3,Duration.ofSeconds(1)).filter(ex -> ex instanceofIOException|| ex.getMessage().contains("Model service unavailable")).onRetryExhaustedThrow((retryBackoffSpec, retrySignal)->newRuntimeException("Stream retry failed after 3 times", retrySignal.failure())))// 异常降级:重试失败后,返回友好提示.onErrorResume(e ->{ log.error("Final stream error", e);returnFlux.just("服务临时不可用,请稍后再试~");});}

三、性能优化策略(提升并发与稳定性)

实现基础的流式接入后,还需要进行性能优化,以应对高并发场景,进一步降低资源占用。以下是三个核心优化方向,均经过生产环境验证。

3.1 背压管理(防止消费跟不上生产)

流式处理中,若模型输出chunk的速度过快,而前端或后续处理逻辑消费速度过慢,会导致数据堆积,引发内存压力。WebFlux的Flux提供了limitRate()方法,可控制消费速度,实现背压管理:

// 控制消费速度:每秒最多处理10个chunk,避免数据堆积publicFlux<String>streamWithBackpressure(String prompt){return deepSeekStreamService.streamInference(prompt).limitRate(10)// 核心配置:控制消费速率.map(this::parseChunk).subscribe( content ->{// 消费逻辑(如返回给前端)System.out.print(content);}, error -> log.error("Consume error", error),()-> log.info("Stream consume completed"));}

补充说明:limitRate(n)的含义是“每次请求n个元素”,并非严格的每秒n个,可根据实际业务场景调整n的值(如并发高时设为5-10,并发低时设为10-20)。

3.2 内存优化技巧

流式接入的核心优势之一是降低内存占用,结合以下技巧,可进一步优化内存使用,避免OOM:

  • 避免缓存完整响应:严禁将所有chunk缓存到List或StringBuilder中,必须接收一个chunk处理一个,处理完成后立即释放资源。
  • 控制背压缓冲区大小:通过Flux的onBackpressureBuffer()方法,设置缓冲区大小,当缓冲区满时触发相应策略(如丢弃、阻塞):
// 配置背压缓冲区,大小为50,缓冲区满时丢弃新数据streamInference(prompt).onBackpressureBuffer(50,()-> log.warn("Backpressure buffer full, discard new chunk"),BackpressureOverflowStrategy.DROP_OLDEST).limitRate(10);
  • 自定义中间结果存储:对于需要保存中间结果的场景,避免使用内存存储,可采用DiskPersistence(磁盘持久化)存储中间chunk,需要时再读取,示例代码可自行实现(核心是将chunk写入本地文件,避免占用内存)。

3.3 连接池配置(提升并发连接能力)

WebFlux基于Netty的连接池管理HTTP连接,合理配置连接池参数,可提升并发连接能力,避免连接耗尽。在application.yml中添加以下配置:

reactor:netty:http:pool:max-connections:100# 最大连接数,根据服务器性能调整(如8核16G可设为100-200)acquire-timeout: 5s # 连接获取超时时间,超时则抛出异常max-idle-time: 30s # 连接最大空闲时间,空闲超过该时间则关闭连接pending-acquire-limit:50# 等待连接的最大队列长度,队列满时拒绝请求

四、完整案例演示(前后端联动)

以下提供前端(React)和后端(Java WebFlux)的完整联动案例,可直接运行,快速验证流式接入效果。

4.1 前端集成示例(React)

前端使用EventSource接收SSE流式数据,实时展示模型输出内容,代码如下(React函数组件):

import{ useState, useEffect }from'react';functionDeepSeekStreamChat(){const[prompt, setPrompt]=useState('');const[output, setOutput]=useState('');const[loading, setLoading]=useState(false);// 发送流式请求,接收响应constsendStreamRequest=()=>{if(!prompt.trim()){alert('请输入提示词');return;}// 重置输出和加载状态setOutput('');setLoading(true);// 创建EventSource,连接后端SSE接口const eventSource =newEventSource(`/api/ai/stream-chat?prompt=${encodeURIComponent(prompt)}`);// 接收流式数据 eventSource.onmessage=(e)=>{setOutput(prev=> prev + e.data);};// 处理错误 eventSource.onerror=(error)=>{ console.error('Stream error:', error);setLoading(false); eventSource.close();// 关闭连接};// 流式结束(后端返回[DONE]时触发) eventSource.onclose=()=>{setLoading(false); console.log('Stream completed');};// 组件卸载时关闭连接return()=>{ eventSource.close();};};return(<div style={0 auto', padding: '20px' }}> DeepSeek流式聊天<textarea value={=>setPrompt(e.target.value)} placeholder="请输入提示词(如:解释量子计算)" style={{width:'100%',height:'100px',marginBottom:'10px'}}/><button onClick={{loading ?'正在生成...':'发送请求'}<div style={:'20px',padding:'10px',border:'1px solid #eee'}}> 响应结果:{output});}exportdefault DeepSeekStreamChat;

4.2 完整服务端实现(可直接运行)

整合前面的配置、Service、Controller,提供完整的Spring Boot启动类,可直接复制到项目中运行:

importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.annotation.Bean;importcom.fasterxml.jackson.databind.ObjectMapper;@SpringBootApplicationpublicclassDeepSeekStreamApplication{publicstaticvoidmain(String[] args){SpringApplication.run(DeepSeekStreamApplication.class, args);}// 注入ObjectMapper(JSON解析工具)@BeanpublicObjectMapperobjectMapper(){returnnewObjectMapper();}}

运行说明:

  • 替换WebClientConfig中的deepSeekApiKey为自己的DeepSeek API密钥;
  • 启动Spring Boot项目,访问前端页面(如http://localhost:8080),输入提示词即可看到流式输出效果。

五、常见问题解决方案(避坑指南)

在实际集成过程中,可能会遇到各种问题,以下是最常见的3类问题及解决方案,帮你快速避坑。

5.1 连接中断问题

问题现象:流式连接经常中断,前端无法接收完整的响应数据。

解决方案:

  • 实现指数退避重试机制:如前面Service层的resilientStreamInference方法,确保临时网络波动时能自动重试。
  • 保存中间状态:对于需要完整结果的场景,可将已接收的chunk保存到数据库或本地文件,连接中断后可恢复继续接收。
  • 提供客户端重连接口:前端在连接中断时,提示用户是否重连,重连时携带已接收的中间结果,避免重复生成。

5.2 性能瓶颈排查

问题现象:并发请求增多时,系统响应变慢,内存占用升高。

排查与解决方法:

  • 线程分析:使用reactor-tools工具,打印Reactor线程栈,分析线程阻塞情况。引入依赖后,启动时添加JVM参数:-Dreactor.trace.operatorStacktrace=true。
  • 监控Netty I/O线程:通过Spring Boot Actuator监控Netty的I/O线程使用率,若使用率过高,可调整Netty线程池大小(在application.yml中配置)。
  • 检查模型QPS限制:DeepSeek官方API有QPS限制,若超过限制会被限流,需合理控制并发请求数,或联系官方提升QPS配额。

5.3 安全性考虑

问题现象:接口被恶意调用,或模型输出敏感内容。

解决方案:

  • 添加API密钥认证:后端接口添加API密钥校验,前端请求时携带密钥,避免恶意调用。
  • 实现请求速率限制:使用Spring Cloud Gateway或自定义拦截器,限制单个IP的请求频率(如每秒最多5次请求)。
  • 敏感词过滤:对模型输出的内容进行敏感词过滤,避免输出违法、违规内容(可使用第三方敏感词库,如HanLP)。

六、深度构想

本方案已能满足大部分Java后端接入DeepSeek大模型的流式需求,未来可从以下三个方向进一步优化,提升系统性能和扩展性:

  • gRPC集成:探索使用gRPC流式协议替代HTTP,gRPC基于HTTP/2,传输效率更高,延迟更低,适合高并发、低延迟的流式场景。
  • 模型微调与动态参数更新:通过WebFlux实现动态模型参数更新,无需重启服务,即可调整max_tokens、temperature等参数,适配不同业务场景。
  • 边缘计算部署:结合响应式编程,将DeepSeek模型部署到边缘节点,降低网络延迟,提升用户体验,尤其适用于物联网、实时交互等场景。

七、总结

本文基于Java WebFlux响应式框架,详细讲解了DeepSeek大模型流式接入的完整实现方案,从技术背景、核心代码、性能优化到前后端联动、问题排查,全程干货,可直接落地到生产环境。

实际测试表明,在相同硬件条件下,该方案相比传统同步调用模式,可提升3-5倍的并发处理能力,同时将内存占用降低60%以上,有效解决了大模型接入中的高延迟、高内存占用、低吞吐量等痛点。

建议开发者在实施时,重点关注背压管理和错误恢复机制的设计,结合自身业务场景调整配置参数,确保系统的稳定性和高性能。如果有任何疑问,欢迎在评论区留言交流~

附录:DeepSeek官方API文档地址(https://platform.deepseek.com/docs/api),可参考文档了解更多请求参数和响应格式。

联系博主

    xcLeigh 博主,全栈领域优质创作者,博客专家,目前,活跃在ZEEKLOG、微信公众号、小红书、知乎、掘金、快手、思否、微博、51CTO、B站、腾讯云开发者社区、阿里云开发者社区等平台,全网拥有几十万的粉丝,全网统一IP为 xcLeigh。希望通过我的分享,让大家能在喜悦的情况下收获到有用的知识。主要分享编程、开发工具、算法、技术学习心得等内容。很多读者评价他的文章简洁易懂,尤其对于一些复杂的技术话题,他能通过通俗的语言来解释,帮助初学者更好地理解。博客通常也会涉及一些实践经验,项目分享以及解决实际开发中遇到的问题。如果你是开发领域的初学者,或者在学习一些新的编程语言或框架,关注他的文章对你有很大帮助。

    亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。

     愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。

    至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。


     💞 关注博主 🌀 带你实现畅游前后端!

     🏰 大屏可视化 🌀 带你体验酷炫大屏!

     💯 神秘个人简介 🌀 带你体验不一样得介绍!

     🥇 从零到一学习Python 🌀 带你玩转Python技术流!

     🏆 前沿应用深度测评 🌀 前沿AI产品热门应用在线等你来发掘!

     💦 :本文撰写于ZEEKLOG平台,作者:xcLeigh所有权归作者所有)https://xcleigh.blog.ZEEKLOG.net/,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。


在这里插入图片描述

     📣 亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(或者关注下方公众号,看见后第一时间回复,还有海量编程资料等你来领!),博主看见后一定及时给您答复 💌💌💌

Read more

《并查集:算法中的高效集合操作利器》:一文带你掌握并查集数据结构

《并查集:算法中的高效集合操作利器》:一文带你掌握并查集数据结构

系列文章目录 文章目录 * 系列文章目录 * 一、认识并查集 * 1.并查集的定义 * 2.基本概念 * 2.1.集合的表示 * 2.2.合并操作 * 2.3.查询操作 * 3.基本操作 * 3.1初始化 * 3.2.查找 * 3.3.合并 * 4.优化技巧 * 4.1.路径压缩 * 4.2.按秩合并 * 5.代码完整实例 * 6.应用场景 * 6.1.图的连通性 * 6.2.社交网络分析 * 6.3.动态连通性问题 * 7.

By Ne0inhk
使用 Python + Bright Data MCP 实时抓取 Google 搜索结果:完整实战教程(含自动化与集成)

使用 Python + Bright Data MCP 实时抓取 Google 搜索结果:完整实战教程(含自动化与集成)

免责声明:此篇文章所有内容皆是本人实验,并非广告推广,并非抄袭。如果有人运用此技术犯罪,本人及平台不承担任何刑事责任。如有侵权,请联系。 引言:为什么 AI 应用需要实时网页数据? 在 AI 应用和智能代理(Agent)的开发中,实时性数据往往是决定效果的关键。以 LLM 智能体为例,它们的推理能力高度依赖实时上下文——比如用户问“2025 年最新 AI 趋势是什么”,静态的训练数据无法提供最新答案,必须接入实时网页数据才能给出准确回应。 但传统的网页数据获取方式存在明显痛点:自建爬虫不仅要处理复杂的反爬机制(如 IP 封禁、验证码),还要维护代理池和动态网页渲染逻辑,长期维护成本极高,且很难做到实时响应。 而 Bright Data 的 Web MCP Server(Model Context Protocol Server)正好可以解决这些问题:

By Ne0inhk
【动态规划篇】专题(六):子序列问题——不连续的艺术

【动态规划篇】专题(六):子序列问题——不连续的艺术

文章目录 * LIS 模型及其衍生:回头看,全是风景 * 一、 前言:从 O(N) 到 O(N²) * 二、 最长递增子序列 (Medium) * 2.1 题目描述 * 2.2 核心思路:LIS 模型 * 2.3 代码实现 * 三、 摆动序列 (Medium) * 3.1 题目描述 * 3.2 状态定义:波峰与波谷 * 3.3 代码实现 * 四、 最长递增子序列的个数 (Medium) * 4.1 题目描述 * 4.2 双重状态 * 4.

By Ne0inhk
设计五种算法精确的身份证号匹配

设计五种算法精确的身份证号匹配

问题定义与数据准备 我们有两个Excel文件: * small.xlsx: 包含约5,000条记录。 * large.xlsx: 包含约140,000条记录。 目标:快速、高效地从large.xlsx中找出所有其“身份证号”字段存在于small.xlsx“身份证号”字段中的记录,并将这些匹配的记录保存到一个新的Excel文件result.xlsx中。 假设:身份证号字段名在两个表中都是id_card。 首先,我们进行准备工作,安装必要的库并模拟一些数据用于测试和性能估算。 pip install pandas openpyxl import pandas as pd import time import random # 为演示和测试,我们可以创建一些模拟数据(实际中使用pd.read_excel读取你的文件)defgenerate_id_card():"""

By Ne0inhk