FastCI:基于智能缓存的CI/CD构建加速方案

news2026/5/6 6:31:41
1. 项目概述当CI/CD遇上二进制制品管理如果你是一名开发工程师或者正在负责团队的持续集成与交付CI/CD流程那么你一定对“构建慢”、“依赖下载卡顿”、“制品管理混乱”这几个词深恶痛绝。尤其是在微服务和云原生架构大行其道的今天一个项目动辄几十上百个模块每次构建都要从中央仓库拉取海量依赖或者将生成的Jar包、Docker镜像推送到某个地方这个过程往往成为研发效率的瓶颈。今天要聊的这个项目jfrog-fastci/fastci就是瞄准这个痛点而来。它不是另一个Jenkins或者GitLab CI的替代品而是一个旨在为现有CI/CD流程“提速”的智能加速器。简单来说fastci是一个开源工具它通过智能地缓存和复用构建过程中的中间产物主要是二进制制品比如依赖包、构建缓存、Docker层来显著减少CI流水线的执行时间。它的核心思想很直观既然每次构建都要下载相同的依赖、编译相同的代码模块为什么不能把上一次构建中已经验证过的部分直接拿来用呢fastci试图在保证构建一致性和可靠性的前提下最大化地利用历史构建成果从而实现“快速CI”。这个项目特别适合那些构建任务繁重、依赖关系复杂、且对交付速度有极高要求的团队。2. 核心设计理念与架构拆解2.1 为什么传统CI/CD会“慢”要理解fastci的价值得先看看慢在哪里。一个典型的CI流水线比如基于Jenkins的通常会经历这几个阶段拉取代码 - 安装/下载依赖 - 编译 - 运行测试 - 打包 - 发布。其中“下载依赖”和“编译”是两大耗时巨头。依赖下载无论是Maven的.m2仓库npm的node_modules还是Docker的基础镜像拉取都需要从远程仓库下载。网络延迟、仓库服务器负载、依赖包体积巨大都会导致这一步耗时不可预测。编译过程尤其是对于Java、C这类需要编译的语言即使只改了一行代码整个模块甚至整个项目都可能需要重新编译。虽然增量编译可以缓解但在CI的干净环境中为了保证可重复性CI Job通常从一个干净的工作空间开始增量编译的优势荡然无存。fastci的聪明之处在于它不试图改变你的构建脚本如pom.xml,build.gradle,Dockerfile而是作为一个“中间人”或“加速层”插入到你的CI流程中拦截这些耗时的操作并用缓存的结果来替代。2.2 FastCI 的核心工作原理基于内容的智能缓存fastci的核心是一个内容寻址的智能缓存系统。它的工作原理可以概括为“计算指纹 - 查询缓存 - 命中则复用未命中则执行并缓存”。指纹计算在CI任务开始前fastci会分析你的项目上下文。这不仅仅是计算代码的哈希值。它会根据你的构建配置文件如pom.xml、锁文件如package-lock.json、甚至环境变量计算出一个唯一标识本次构建上下文的“指纹”Fingerprint。这个指纹是缓存命中的关键。缓存查询fastci将这个指纹作为键Key去查询它的缓存服务器。缓存的内容Value可能是已经下载好的依赖库目录、编译好的.class文件目录、或者构建好的Docker镜像层。结果复用如果缓存命中fastci会直接将缓存的内容例如整个~/.m2/repository目录恢复到当前CI的工作空间中。这样构建工具如Maven就会认为依赖已经存在跳过下载阶段。对于编译缓存也是如此。缓存回填如果缓存未命中则正常执行完整的构建流程。构建成功后fastci会将本次构建产生的新制品如新的依赖、编译输出进行过滤和压缩然后以刚才计算的指纹为键存储到缓存服务器中供后续构建使用。这种机制的强大之处在于它的粒度和准确性。它不仅可以缓存整个依赖目录还能做到更细粒度的缓存比如单个依赖包、单个模块的编译输出。只要构建输入代码配置的指纹没变输出就一定可以从缓存中获取完美符合CI对可重复性的要求。注意缓存的安全性至关重要。fastci必须确保缓存的内容绝对可靠不能被污染。因此它的指纹计算算法必须非常严谨要包含所有可能影响构建输出的因素。例如Java项目如果使用了-D传递的系统属性也需要被纳入指纹计算否则可能导致使用了错误参数的缓存造成难以排查的构建问题。2.3 架构组成客户端与服务器端fastci通常采用客户端-服务器架构这与它的使用场景紧密相关。FastCI 客户端 (CLI/Agent)这是一个需要集成到你的CI流水线中的命令行工具或代理。它的职责是分析项目并计算构建指纹。与fastci服务器通信查询和存储缓存。在本地工作空间执行缓存内容的恢复和保存操作。通常以Docker容器或直接安装在CI Runner上的二进制文件形式存在。FastCI 服务器 (Cache Server)这是一个独立的服务用于存储和管理所有的缓存数据。它需要提供高性能的缓存存储和检索接口通常基于REST API。实现高效的缓存淘汰策略如LRU因为存储空间不可能是无限的。可能支持分布式存储后端如S3、MinIO或Azure Blob Storage以满足企业级的海量缓存需求。提供缓存统计、清理和监控功能。在实际部署中团队通常会搭建一个内部共享的fastci服务器供所有CI任务使用。这样不同分支、不同流水线之间的构建成果也可以互相复用进一步提升效率。3. 实战部署与集成指南3.1 环境准备与服务器搭建假设我们选择使用Docker Compose来快速部署一个fastci服务器。这是最便捷的入门方式。首先你需要一个Linux服务器或虚拟机安装好Docker和Docker Compose。然后创建一个docker-compose.yml文件。由于fastci的具体镜像名和配置需要参考其官方文档这里我以一个典型的配置为例进行说明。你需要去项目的GitHub仓库jfrog-fastci/fastci查找最新的官方镜像。version: 3.8 services: fastci-server: image: fastci/server:latest # 请替换为官方镜像 container_name: fastci-server restart: unless-stopped ports: - “8080:8080” # 假设服务端口是8080 volumes: - fastci-data:/var/lib/fastci # 持久化缓存数据 - ./server-config.yaml:/etc/fastci/config.yaml:ro # 挂载配置文件 environment: - FASTCI_LOG_LEVELinfo - FASTCI_STORAGE_TYPElocal # 使用本地存储生产环境可改为s3 # 可选提供一个简单的Web UI进行监控如果项目提供 fastci-ui: image: fastci/ui:latest container_name: fastci-ui restart: unless-stopped ports: - “80:80” depends_on: - fastci-server environment: - API_BASE_URLhttp://fastci-server:8080 volumes: fastci-data:接下来创建一个基础的服务器配置文件server-config.yaml。这个文件用于定义缓存策略、存储路径等。server: port: 8080 host: 0.0.0.0 storage: type: local local: path: /var/lib/fastci/cache # 如果使用S3配置如下 # type: s3 # s3: # endpoint: “https://s3.amazonaws.com” # bucket: “my-fastci-cache” # accessKeyId: ${AWS_ACCESS_KEY_ID} # secretAccessKey: ${AWS_SECRET_ACCESS_KEY} # region: us-east-1 cache: policy: lru maxSize: 100GB # 缓存总大小限制 defaultTTL: 720h # 缓存默认存活时间30天配置完成后运行docker-compose up -d即可启动服务。通过docker-compose logs -f fastci-server可以查看启动日志确认服务是否正常。实操心得在首次搭建时建议先将maxSize设置得小一些如10GB并观察缓存增长情况。过早设置过大的缓存空间如果缓存清理策略不生效可能导致磁盘被迅速写满。另外一定要将数据卷fastci-data挂载到持久化存储上否则容器重启后缓存将全部丢失前功尽弃。3.2 集成到主流CI平台以GitLab CI为例fastci的价值只有在CI流水线中才能体现。下面以GitLab CI为例展示如何将fastci客户端集成到你的.gitlab-ci.yml中。首先你需要在CI Runner能够访问的环境中安装fastci客户端。通常我们会创建一个包含fastciCLI的自定义Docker镜像作为CI Job的基础镜像。或者在Job的before_script中动态安装。这里展示在before_script中安装的方法variables: FASTCI_SERVER_URL: “http://your-fastci-server.com:8080” # 你的fastci服务器地址 FASTCI_PROJECT_ID: “$CI_PROJECT_PATH_SLUG” # 使用项目路径作为缓存命名空间 cache: # GitLab CI的原生缓存用于在不同Job间缓存fastci自身的状态非必须但有益 key: “fastci” paths: - .fastci/ stages: - build build-java-app: stage: build image: maven:3.8-openjdk-11 # 使用Maven官方镜像 before_script: # 1. 安装fastci客户端假设提供了linux-amd64的二进制包 - curl -L -o fastci-cli.tar.gz “https://github.com/jfrog-fastci/fastci/releases/latest/download/fastci-cli-linux-amd64.tar.gz” - tar -xzf fastci-cli.tar.gz - chmod x fastci - mv fastci /usr/local/bin/ # 2. 配置fastci客户端 - fastci config set server.url ${FASTCI_SERVER_URL} - fastci config set project.id ${FASTCI_PROJECT_ID} script: # 3. 使用fastci包装你的构建命令 # fastci run 会计算指纹尝试恢复缓存执行命令最后保存缓存 - fastci run — mvn clean compile -DskipTests after_script: # 可选上传构建报告或清理 - echo “Build stage completed with fastci acceleration.”关键点在于fastci run —命令。它会根据当前工作目录的内容计算一个哈希指纹。向配置的服务器查询该指纹对应的缓存例如缓存的~/.m2和target/classes。如果找到则解压恢复到工作空间。然后执行--后面的命令mvn clean compile。命令执行成功后将本次构建产生的新制品同样是~/.m2和target/classes中有变化的部分压缩并上传到服务器关联到这个指纹。这样下一次任何人在任何Runner上运行相同的构建代码和配置未变时fastci就能直接命中缓存mvn compile可能瞬间完成因为不需要下载任何依赖也不需要编译任何类。3.3 针对不同技术栈的配置要点fastci的威力在于其通用性但针对不同语言和工具链最佳实践略有不同。Java (Maven/Gradle)缓存目标主要缓存本地仓库~/.m2/repository或~/.gradle/caches和编译输出目录target/classes,build/classes。注意事项Maven的settings.xml中的仓库配置、Gradle的init.gradle脚本也会影响依赖解析需要确保这些文件也被纳入指纹计算范围否则可能导致缓存错误。fastci通常会自动包含项目根目录下的常见配置文件。命令示例fastci run — mvn clean package或fastci run — gradle build。JavaScript/Node.js (npm/yarn)缓存目标node_modules目录是核心。但node_modules体积庞大且文件数量极多直接缓存效率可能不高。更好的方式是缓存npm cache或yarn cache目录让包管理工具自己进行增量安装。配置技巧可以配置fastci只缓存~/.npm或~/.yarn-cache然后在before_script中先恢复缓存再运行npm ci使用package-lock.json确保一致性或yarn install —frozen-lockfile。这样比直接缓存node_modules更可靠。命令示例fastci run — npm ci npm run build。Docker镜像构建缓存目标Docker构建的每一层Layer。这是fastci能发挥巨大价值的场景。工作原理fastci可以拦截docker build命令计算Dockerfile和构建上下文context的指纹。如果命中则直接将缓存好的镜像层加载到本地Docker守护进程docker build只会构建发生变化的层及其后续层。集成方式可能需要使用fastci提供的docker-build子命令或者使用支持缓存导入/导出的Docker BuildKit特性。具体需要查看fastci对Docker的集成文档。巨大收益对于基础层如FROM ubuntu:20.04和应用依赖安装层如RUN apt-get update apt-get install -y...只要Dockerfile指令没变这些耗时极长的层都可以被完全跳过。避坑指南缓存虽好但要注意“缓存污染”。例如在构建中从外部动态下载资源如curl -O http://example.com/latest.tar.gz这个latest.tar.gz的内容变化不会导致构建指纹变化从而使用了旧的缓存引发问题。因此务必确保构建过程是“纯函数”式的所有输入都能被fastci感知到。对于动态资源要么将其版本化并纳入指纹计算要么在构建命令中强制跳过缓存fastci run --no-cache。4. 高级特性与性能调优4.1 分布式缓存与弹性伸缩当团队规模扩大CI任务并发量激增时单个fastci服务器可能成为新的瓶颈和单点故障。此时就需要考虑分布式缓存架构。共享存储后端最简单的分布式方案是让多个fastci服务器实例共享同一个存储后端。如上文配置所示将storage.type设置为s3、gcs或azure。这样任何实例写入的缓存其他实例都能读取到。这种方案扩展性好但需要注意对象存储的请求成本和延迟。缓存代理与分层更复杂的架构可以引入缓存代理。本地机房部署一个fastci服务器作为一级缓存速度快并配置其回源到云上的中央fastci服务器或共享对象存储。这样大部分缓存命中发生在本地速度极快未命中的请求再走网络同时回填本地缓存。这类似于CDN的工作模式。一致性考虑在分布式环境下缓存一致性是个挑战。fastci通常采用“内容寻址”本身来解决一部分问题——相同的输入指纹永远对应相同的输出缓存内容。但需要考虑缓存清理操作如何同步到所有节点。通常可以通过设置较短的TTL或者通过消息队列广播清理事件来实现最终一致性。4.2 缓存策略与清理机制缓存空间是有限的必须有一套良好的清理机制。LRU (最近最少使用)这是fastci默认也是最常用的策略。当缓存空间不足时自动淘汰最久未被访问的缓存条目。这种策略符合CI场景的特点活跃分支的构建缓存会被频繁使用而老旧分支的缓存会逐渐被淘汰。基于TTL的过期为缓存设置一个固定的存活时间如7天、30天。超过TTL的缓存自动失效。这可以防止一些“僵尸”缓存长期占用空间。基于分支/标签的清理可以与Git事件联动。例如配置当某个分支被删除时自动清理该分支相关的所有缓存。或者只为main分支和最新标签保留长期缓存其他特性分支的缓存TTL较短。手动清理API运维人员可以通过fastci服务器提供的管理API根据项目ID、时间范围、缓存大小等条件手动清理缓存。一个健壮的策略往往是组合拳LRU TTL 基于分支的规则。例如main分支的缓存TTL为30天特性分支的缓存TTL为7天并且整体缓存总量不超过1TB由LRU策略兜底管理。4.3 监控、度量与成本分析引入fastci后需要建立监控体系来衡量其效果和健康度。关键指标缓存命中率这是最重要的效能指标。命中率 命中次数 / (命中次数 未命中次数)。一个健康的系统命中率应逐步提升并稳定在较高水平如80%以上。平均构建时间节省对比启用fastci前后的构建耗时。可以按项目、按分支进行统计。缓存存储用量与增长趋势监控缓存服务器的磁盘或对象存储使用量预测何时需要扩容或清理。请求延迟fastci服务器处理查询和存储请求的P99延迟确保其不会成为瓶颈。监控实现fastci服务器应提供Prometheus格式的 metrics 端点。你可以用Grafana搭建一个仪表盘实时查看上述指标。同时将缓存未命中的构建记录下来分析原因是指纹计算太敏感导致无法复用还是遇到了“缓存污染”成本效益分析fastci节省的是工程师的等待时间和CI Runner的计算资源。你需要估算构建时间减少后每月能节省多少CI Runner的计费时长工程师因为等待构建而上下文切换的损耗降低了多少将这些收益与维护fastci服务器硬件/云存储成本、运维精力的成本进行对比就能清晰地看到ROI投资回报率。对于中大型团队这笔账算下来通常非常划算。5. 常见问题排查与实战经验即使设计再精良在实际运维中也会遇到各种问题。下面是一些我实践中遇到的典型问题及解决方法。5.1 缓存命中率低这是最常见的问题。构建速度没有明显提升。原因1指纹计算过于敏感。比如构建时间戳、随机生成的临时文件路径被纳入了指纹计算导致每次构建指纹都不同。排查检查fastci的调试日志看它计算指纹时包含了哪些文件和元数据。确保构建过程是“确定性的”。解决配置fastci忽略无关文件如target/,build/,*.log或环境变量。在.fastciignore文件中定义忽略规则如果支持类似于.gitignore。原因2缓存空间不足或过早被淘汰。LRU策略下如果并发构建很多缓存可能还没来得及被第二次使用就被新缓存挤掉了。排查查看缓存服务器的存储使用情况和淘汰日志。解决增加缓存服务器存储容量。或者调整缓存策略为重要项目如main分支的缓存设置更高的优先级或更长的TTL。原因3构建环境不一致。不同CI Runner上的工具版本如JDK、Node.js、Maven不同导致指纹虽然一致但实际构建环境差异导致缓存不敢复用或复用后出错。解决使用容器化构建Docker确保所有Runner上的构建环境完全一致。将工具版本也作为指纹计算的一部分。5.2 构建失败缓存污染或状态不一致构建因使用了“脏缓存”而失败报错可能千奇百怪。典型场景构建脚本中有一个步骤会从网络下载一个“latest”版本的工具但这个下载操作没有被fastci感知。第一次构建下载了v1.0缓存了结果。一周后第二次构建网络上的工具更新到v2.0且有破坏性变更但fastci直接使用了v1.0时的缓存导致后续步骤失败。排查这是一个逻辑错误。需要审查构建流程识别所有非确定性的外部输入。解决最佳实践消除非确定性。将外部依赖版本化。例如不要下载latest而是下载v2.0.1并将这个版本号写入构建脚本或配置文件使其成为指纹的一部分。临时方案在构建命令前添加fastci run --no-cache强制本次构建跳过缓存并回填新缓存。但这治标不治本。清理缓存找到被污染的缓存条目并手动清除。可以通过fastci管理API根据项目ID和大致时间范围进行清理。5.3 性能瓶颈分析感觉集成了fastci但整体构建流程并没有变快甚至更慢了。瓶颈在缓存服务器如果缓存服务器配置过低CPU、内存、磁盘IO处理并发请求时可能成为瓶颈。特别是缓存压缩/解压缩非常消耗CPU。排查监控缓存服务器的CPU、内存、磁盘IO和网络IO。观察在构建高峰期是否达到瓶颈。解决升级服务器硬件。对于磁盘IO考虑使用SSD。对于CPU考虑使用更高主频或多核的型号。也可以将存储后端切换到高性能的对象存储服务。瓶颈在网络CI Runner与缓存服务器之间的网络延迟过高或者带宽不足导致上传/下载缓存包的时间超过了直接执行构建的时间。排查在CI Runner上测试到缓存服务器的网络延迟和带宽。解决将缓存服务器部署在离CI Runner网络更近的位置如同一个云服务商、同一个可用区。或者如前所述搭建本地缓存代理。缓存包过大如果一次性缓存整个node_modules可能几百MB甚至上GB压缩、上传、下载、解压这个包本身就会耗时很长。解决优化缓存策略。不要缓存整个node_modules改为缓存包管理器的全局缓存目录。或者启用fastci的增量缓存功能如果支持只传输变化的部分。5.4 安全与权限管理缓存服务器存储了所有构建的中间产物可能存在安全风险。风险1敏感信息泄露。构建过程中可能会将API密钥、密码等敏感信息打入包内或留在环境变量中如果被缓存可能被其他有权限访问缓存的构建任务读取。防护严格遵守“不将秘密放入构建产物”的原则。使用CI系统的秘密管理功能如GitLab CI的variables: secret GitHub Actions的secrets。确保构建脚本不会将秘密写入到会被缓存的文件中。风险2未经授权的访问。任何人都可以向缓存服务器推送或拉取缓存。防护为fastci服务器配置身份认证和授权。例如要求CI Runner在连接时提供API Token并且Token与项目绑定只能访问自己项目的缓存命名空间。fastci项目本身可能提供基础的HTTP Basic Auth或JWT支持更复杂的需求可能需要通过反向代理如Nginx集成统一的认证系统。风险3缓存投毒攻击。恶意用户如果能够控制构建输入可能会故意制造特定的指纹并向缓存服务器推送包含恶意代码的缓存影响后续使用相同指纹的合法构建。防护这是一个高级威胁模型。防护措施包括严格的身份认证和项目隔离对缓存内容进行签名验证如果fastci支持定期审计和清理缓存最重要的是确保CI系统的 Runner 本身是受信且隔离的。引入fastci这类工具就像给CI/CD管道加装了一个涡轮增压器。它能带来显著的效率提升但也增加了系统的复杂性。成功的秘诀在于深入理解其原理根据自己团队的实际情况进行细致的配置、监控和调优。从一个小型试点项目开始逐步推广到全团队并持续收集反馈和指标你会发现等待构建完成的那段无聊时光正在变得越来越短。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…