纯情 发布的文章

避雷一个卖 Claude/ChatGPT 账号的商家:AI 女娲 / vuvuva / 相关站点

我把自己的经历发出来,给各位准备买 AI 账号、共享会员、代充账号的朋友提个醒。

我是在星期一下午左右购买的账号/会员,价格约 300 元。实际使用时间只有星期二、星期三、星期四这三天左右,今天就已经出现无法正常使用/会员失效的问题。

我随后联系商家沟通售后,对方明确表示没有质保。也就是说,我这边实际相当于花了 300 元,只用了大概 3 天。这个体验我个人完全无法接受。

我不是来吵架的,只是把经过和商家信息记录下来,提醒大家下单前一定要看清楚风险。尤其是这种 AI 账号、共享会员、代充类商品,本身就存在封号、掉会员、无法登录、无售后等风险。如果商家提前写明“无质保”,那大家一定要慎重,别像我一样踩坑。

以下是该商家对外展示/关联的信息,我会尽可能向相关平台、QQ 群、论坛、网站渠道提交举报和投诉,也提醒大家自行判断:

商家/品牌名:AI 女娲

相关网站:
http://api.muxufo.com/
https://coco.aimages.art
https://www.vuvuva.com/

公开展示的客服/站长信息:
客服 QQ:2213379779
站长 QQ:1075123336 、805135867
QQ 群:797775252

商家页面中还写着类似内容:

“本站为批发网,所有标价都为行业低价”
“请勿询问小白问题,如质保、怎么登录、如何避免封号等”
“本店只对接圈内代理,个人也可购买,请查询风险后下单”

我现在的核心诉求很简单:

  1. 希望商家能给出合理解释或补偿方案;
  2. 如果商家坚持没有任何售后,那我也会把这次经历发出来,提醒其他人谨慎购买;
  3. 建议大家购买 AI 会员、API 中转、共享账号、代充服务时,尽量选择官方渠道或有明确售后保障的平台。

最后提醒一句:便宜不一定是真便宜。尤其是这种非官方 AI 账号/会员服务,买之前一定要问清楚是否质保、掉号怎么办、多久失效算正常、能否补发。没有明确承诺的,最好别买。

大家好,最近做了一个 iPhone 拍摄工具,叫 DuoScene 。

ig-0e9c07a129db57c80169f3f1e3aab48191bb691a2d3a423715.png

起因是我自己有时候想拍一些 vlog 、开箱、产品体验或者反应类视频,需要同时记录「眼前画面」和「自己的反应」。

如果分开拍,后面还要手动剪画中画;如果来回切镜头,很多自然反应又会错过。所以我做了一个比较直接的工具:打开就拍,前后摄同时录,录完自动合成并保存到系统相册。

目前主要支持:

  • 前后摄同时录制
  • 画中画、上下分屏、对角布局
  • 小窗大小、形状、位置调整
  • 主副画面切换
  • 双摄照片
  • 单摄录一次,自动生成 9:16 和 16:9 两个版本
  • 1080p 免费可用
  • Pro 支持 4K 和 60fps

这两天更新了 1.2 版本:

  • 优化了拍摄画面布局,减少顶部和底部留白
  • 新增查看模式,方便拍完后查看照片或视频

查看模式这里没有使用私有 API ,也没有请求全量读取相册权限,而是用系统相册选择器,由用户主动选择想查看的照片或视频。

补充一下,iPhone 17 系列已经有系统自带的双摄能力; DuoScene 对 iPhone 17 以下机型会更有价值一些。

目前做了 3 天限免,想收集一些真实反馈:

  • 这种前后摄同录,你会在哪些场景下用?
  • 画中画 / 上下分屏 / 对角布局,哪种布局更顺手?
  • 自动生成 9:16 和 16:9 两个版本,对你有没有用?
  • 还有什么功能会让它更适合日常拍摄?

欢迎大家试用,也欢迎直接拍砖。谢谢。

传送门:https://apps.apple.com/cn/app/duoscene-%E5%8F%8C%E6%91%84%E7%9B%B8%E6%9C%BA/id6757759933

npp.6.6.9.Installer.1410249599就是 Notepad++ 6.6.9​ 的安装包,一款轻量级文本编辑器,写代码、改配置、看日志都很好用。

    • *

一、准备工作

  1. 确认安装包

  2. 断开网络(按要求)

    • 安装前可以先拔掉网线或关掉 Wi‑Fi,全程离线安装。
  3. 用管理员身份运行(推荐)

    • 右键 npp.6.6.9.Installer.1410249599.exe→ 选“以管理员身份运行”。
    • *

二、安装步骤

  1. 双击运行安装包(如果右键过了就直接双击)。
  2. 弹出“用户账户控制”提示 → 点 “是”
  3. 安装向导欢迎界面 → 语言选 “中文(简体)” ​ → 点 “确定”
  4. 许可协议 → 点 “我接受”
  5. 选择安装位置:

    • 默认是 C:\Program Files\Notepad++,可点 “浏览” ​ 改到其他盘(比如 D 盘)。
  6. 组件选择:

    • 建议勾选 “创建桌面快捷方式”
    • 勾选 “添加到资源管理器右键菜单” (以后右键文件可直接用 Notepad++ 打开)。
    • 其它保持默认,点 “下一步”
  7. 点击 “安装” ,等进度条走完。
  8. 安装完成 → 勾选 “运行 Notepad++” ​ → 点 “完成”
    • *

三、验证是否安装成功

  1. 打开 Notepad++。
  2. 菜单栏点 “帮助” ​ → “关于 Notepad++”
  3. 能看到版本号显示为 6.6.9,说明安装正确。

Mistral AI 推出Workflows,一个面向企业 AI 的编排层,目前已进入公开预览阶段。尽管 AI 模型和智能体的能力愈发先进,但要将它们可靠地部署到生产环境中仍然存在不小难度,核心原因是缺少用于协调调度、全程监控和故障恢复的配套基础设施。此次发布正是为了解决这一重大挑战。

 

Workflows 是 Mistral Studio 平台的一部分,旨在通过持久性、可观测性和容错能力来管理多步骤 AI 流程。开发者可以使用 Python 定义工作流,将模型、智能体和外部连接器等组件组合成结构化流程。这些工作流随后可通过Le Chat在整个组织内触发执行,执行全过程均可在 Studio 中完成追踪与审计。

 

该平台解决了 AI 部署中的常见问题,比如开发环境运行正常、生产环境却出现异常的流水线,因超时而中断的长时间运行流程,以及需要人工干预、却无法暂停和恢复的工作流。它引入了有状态执行机制,使流程能够从故障点继续执行。

 

一项关键能力是支持“人机协同”步骤。开发者可以使用简单的构造插入审批检查点,让工作流能够在不消耗计算资源的情况下暂停,并在获取到相关输入后再继续运行。这在合规监管环境中尤为重要,这类环境要求所有决策可追溯、且接受人工监督。

 

Workflows 基于 Temporal 搭建构建,并拓展了 AI 专属功能,如流式处理、负载处理以及增强的可观测性。它的架构采用控制平面与数据平面分离设计:编排服务运行在 Mistral 托管的基础设施上,而执行工作器与数据处理环节则保留在客户环境中,支持云端、本地或混合部署模式。

该系统还集成了重试策略、速率限制以及 SDK 追踪等功能,旨在减少自定义编排逻辑的工作量。通过将这些能力整合至同一个平台,Workflows 被定位为一款能够加速 AI 应用从实验阶段落地走向生产阶段的工具。

 

早期的市场反馈既有积极的关注,也存有审慎态度。Prashanth Velidandi指出

终于有了一个像样的编排层,但在实践中,问题依旧出在底层。要让模型在各类工作负载下稳定可靠地运行,并且不浪费 GPU 资源,同时能够承载真实的业务流量,这件事依旧难度不小。

 

Des Raj C.指出了额外的运营挑战:

企业编排的难点不在于串联各个智能体,而在于当智能体执行结果仅有部分正确时该如何处理。在受合规监管的工作流中,需要具备回滚机制、人工审批节点、审计追踪记录以及模型每一次触发操作所对应的责任人。而这一层面也正是大多数“AI 自动化”试点项目悄然失败的地方。

 

Workflows 可通过 Mistral Python SDK 接入使用,仅需一条命令即可完成安装。预览版为开发者提供了定义、运行和监控工作流的工具,同时能让执行环境与数据始终处于客户的管控范围内。

 

【声明:本文由 InfoQ 翻译,未经许可禁止转载。】

 

查看英文原文https://www.infoq.com/news/2026/04/mistral-ai-workflows/

待业一年了多少有点跟不上时代,目前在学习 ai 编程,正在使用 trae 练练手,想了解下现在 java 生态下有哪些比较好用的 skill 呢,像是 springboot 、sql 规范之类的,前端有好用的也麻烦推荐下,最近在尝试用 ai 生成一个完整项目,感觉受到 ai 的冲击太大了,现在找工作都有点迷茫

 XMind是一款风靡全球的头脑风暴和思维导图软件,为激发灵感和创意而生.在国内使用广泛,拥有强大的功能,包括思维管理、商务演示、与办公软件协同工作等功能

一、安装准备

二、安装步骤

1. 解压安装包

右键点击【Xmind26(64bit)】压缩包 → 选择【解压到 Xmind26(64bit)】。

2. 运行安装程序

打开解压后的文件夹 → 右键【Setup】→ 选择【以管理员身份运行】。

3. 自定义安装路径

  • 点击【自定义...】。
  • 修改路径地址中的首字符“C”可更改软件安装位置(例如将 C 改为 D,软件将装到 D 盘)。
  • 点击【开始安装】。

4~5. 完成安装

等待安装进度完成 → 点击【安装完成】。

    • *

三、验证安装

6. 启动软件

双击桌面【Xmind】图标。

7. 安装成功

成功进入 Xmind 主界面,表示安装完成,可开始创建思维导图。

引言

在我们的一条推荐流水线中,有一个简单的需求,那就是不能向用户展示他们已经浏览过的文章。在流量峰值时,Feed 服务每秒处理约 18000 个请求,每个请求需要评估约 120 个候选内容。这意味着每秒需要执行约 216 万次检查。然而,该工作负载分布极不均匀,大约 97%-98%的检查结果都是用户未浏览。

我们最初的设计是对每个候选内容执行精确查询(缓存 + 后端存储)。该方案功能上可行,但是在大量查询结果都是否定结果的项目中效率较低。每次未命中仍然会产生网络与存储开销,导致 I/O 上升。在流量高峰期,这表现为 p95 延迟升高(从约 85ms 升至 140ms)、后端读取请求激增,以及基础设施成本持续上涨。

为了解决该问题,我们在精确查询路径前引入了布隆过滤器(Bloom filter)。过滤器在内存中能够直接排除确定不存在的项目,只将可能存在的项目提交给高开销的验证流程。这一改动让我们避免了对确定不存在的项目执行无效操作,同时降低了延迟与后端负载。通过提前过滤确定的未命中项,我们可以将资源集中在真正需要验证的场景上。

本文将完整讲解该实现方案,涵盖了架构问题、布隆过滤器的原理、Go 语言集成、带数学计算的参数调优(m 和 k),以及在生产环境约束下落地该方案的实践经验。

原始方案:对每个候选内容执行精确查询

如前文所述,在引入布隆过滤器前,我们的推荐服务采用基础的“精确查询优先(exact-first)”架构:

  • 在候选内容生成阶段,生成经过一个有序的候选文章 ID 的列表

  • 在历史检查阶段,逐个校验候选内容是否在用户的已浏览集合中

  • 历史检查采用缓存优先的逻辑,未命中时查询后端存储

  • 仅通过校验的未浏览候选内容会进入最终排序与响应组装

从准确性角度来看,这个方案十分理想:去重逻辑确定性强,易于理解。但从系统角度来看,该阶段处于服务关键路径上,每个候选内容都要执行一次远程成员检查。

为何仅靠精确查询无法满足需求

业务负载本身的特点导致该方案从设计上就存在高开销的问题。约 97%-98%的检查结果为未浏览,意味着绝大多数查询仅用于返回“未浏览”这样一个结果并继续流程。换言之,我们主要为否定结果承担存储与网络的开销。

在流量峰值下,有三个问题尤为突出:

  • 延迟放大:单次请求包含大量候选检查,p95 响应延迟从约 85ms 提升至 140ms。

  • 读取放大:后端与缓存读取量随单个请求的候选检查数(“候选扇出”)而增长,而非仅随请求数增长。

  • 成本压力:基础设施成本随流量上涨,因为精确查询占据了核心服务路径。

此时我们需要一种新的设计,在保证关键场景准确性的前提下,在以否定结果为主的路径中,移除绝大多数不必要的高开销查询。

解决方案:布隆过滤器

优化方案是在执行高开销的历史查询前,引入布隆过滤器进行内存级快速检查(“成员网关”)。简单来说,布隆过滤器(Bloom filter)是一种紧凑的概率型数据结构,专门用于成员检查。它使用位数组(bit array)存储信息,并为每个键应用多个哈希函数。查询仅会有两种结果:

  • 绝对不存在(结果 100%正确)

  • 可能存在(这个结果可能会存在误判)

它永远不会产生假阴性的结果,非常适合快速排除确实未浏览的内容。

引入布隆过滤器后,请求流程调整为:

  1. 生成候选文章的 ID 列表

  2. 使用(user_idarticle_id)组合键查询布隆过滤器

  3. 如果过滤器返回绝对不存在,直接判定为未浏览,保留在排序流水线中

  4. 如果过滤器返回可能存在,继续执行精确的历史校验

这一设计正好命中了上一节的核心痛点:以否定结果为主的路径。由于大多数候选内容都是未浏览,所以

绝大部分检查都可以在内存中完成,无需远程 I/O。

为什么概率型方法适合该负载

这里介绍的方法具备几个很有价值的特性:

  • 否定结果占比极高:在约 97%-98%为否定结果的分布场景中,快速拒绝否定结果的收益非常高

  • 在需要的地方保持严格的正确性:正向结果仍然可以通过精确存储进行校验

  • 内存占用可预测:布隆过滤器可以紧凑地表示大规模的成员集

  • 可调节的权衡:正如后文所示,我们可通过 m(位数组大小)和 k(哈希函数个数)控制误报率

在接下来的章节中,我们将介绍布隆过滤器如何运行、如何在 Go 中实现它,以及如何用数学方法为该推荐系统的场景完成参数调优。

布隆过滤器实践

在我们的推荐工作负载中,布隆过滤器的目标是快速识别大概率未浏览的候选项,避免不必要的高开销历史查询。由于大多数候选检查都是否定的结果,过滤器可以从服务路径中移除大量可避免的存储和网络开销。

核心机制

布隆过滤器会为元素集合编码其成员的信息。它的核心组件简单而高效:

  • 大小为 m的位数组:每个位置存储 0 或 1,表示该位是否被一个或多个元素置位。

  • k个哈希函数:每个元素都会被映射到位数组中的 k个位置上。这些哈希函数应尽可能独立,并将元素均匀分布到数组上。选择高质量的哈希函数对于减少冲突、控制误报率至关重要,因此是重要的工程决策。我们会在实现部分讨论实际哈希函数的选型。

布隆过滤器并不存储元素本身,而只在位数组上编码“是否出现过”的信息。

插入操作

要把元素 E 加入布隆过滤器:

  1. 对 E 应用 k 个哈希函数:h1(E), h2(E),…,hk(E)均会生成一个数字化的哈希值。

  2. 通过对 m 取模把哈希值映射到位数组中:indexi=hi(E) mod m 这样会得到位数组中的 k 个位置(由于冲突,某些位置可能相同)。

  3. 把这些位置上的位设置为 1:bit_array[index_i]=1

多个元素可能会设置位数组中想通的位值。位值只会被置位,不会被清零,这也是标准布隆表达式不支持删除的原因。

成员查询

当判断一个元素是否存在时::

  1. 先为该元素计算相同的 k 个哈希值。

  2. 再检查位数组中对应位置的位值。

如果任意一个位值为 0,那么该元素就一定不在集合中,因为如果它被插入过,该位必然会被置为 1。

如果所有的位值都为 1,该元素就“可能在集合中”。这也是可能产生误报的地方:不同元素可能映射到同一组位置,导致即使查询元素从未加入过,对应的位值也可能均已经被置位。

此处输入图片的描述

图 1 布隆过滤器的插入与成员校验

在上图中,我们把 3 个元素(element1、element2 和 element3)通过 2 个哈希函数(h1 和 h2)插入到布隆过滤器中。每个元素会在位数组中设置两个位值。当我们查询 element4 时,发现它对应的位值没有全部被置位,因此可以确定它不存在。(注意,图中存在哈希冲突:例如 element1 和 element3 都设置了 index 6 上的位值,这也是可能造成误报的原因所在。)

关键特性

布隆过滤器具备以下关键特性:

  • 无假阴性:判定为“不存在”的结果始终正确。

  • 可能出现误报:元素即使从未加入,也可能看起来是“存在的”。

  • 确定性:同一个元素总会映射到同一组位值上。

  • 内存和速度效率高:位数组与简单哈希计算支持快速插入和查询。

  • 仅存储成员信息:无法反查原始元素。

  • 不支持删除:位值一旦置位,无法在不影响其他元素的前提下清零。这是标准布隆过滤器的基础限制;虽然存在支持删除的变体(比如,计数布隆过滤器),但会引入额外复杂性与内存开销。

虽然上述机制解释了布隆过滤器是“如何工作的”,但是,单纯理解其原理并不能确保能够得到可直接用于生产环境的过滤器。如果不谨慎选择位数组大小(m)、哈希函数数量(k)和具体的哈希函数,布隆过滤器可能效率低下或产生过多的误报。下一节我们会演示如何在 Go 中实现布隆过滤器,把机制落地成可运行的代码,关于如何选择和优化参数则放到了“实践注意事项与最佳实践”章节进行讨论。

在 Go 中实现布隆过滤器

Go 非常适合实现布隆过滤器,因为它提供了对内存的低层控制、高效的 slice 和数组,以及快速且可预测的执行表现。这些特性让我们更容易推导位数组、哈希计算和过滤器的整体性能,它们对于同时追求速度与内存效率的生产系统非常关键。

将布隆过滤器机制翻译成 Go 代码并不复杂。在实现上,需要使用位数组和多个哈希函数,它们对应了我们在核心机制小节中所描述的逐步执行的行为。在这一阶段,我们先关注结构和基础操作;参数调优会在“实践注意事项与最佳实践”章节展开。

定义布隆过滤器的结构

Go 中的布隆过滤器结构(struct)包含压缩位数组、可寻址的位值总数,以及配置好的哈希函数。把哈希函数存放在struct中可以避免每次调用时的 API 误用,也能让使用方式更友好。与每个位值存一个布尔值相比,采用压缩表述(每 word 64bit)可显著改善内存效率和缓存行为:

type BloomFilter struct {  bits   []uint64             // packed bit array (64 bits per word)  m      uint                 // number of addressable bits  hashes []func([]byte) uint  // configured hash functions}
复制代码

创建新的布隆过滤器

NewBloomFilter函数用于按指定大小和哈希函数来初始化布隆过滤器:

// NewBloomFilter creates a new Bloom filter with m bits and configured hash functions.func NewBloomFilter(m uint, hashes []func([]byte) uint) *BloomFilter {  if m == 0 {    panic("bloom filter size m must be > 0")  }  if len(hashes) == 0 {    panic("at least one hash function is required")  }  words := (m + 63) / 64 // ceil(m/64)  return &BloomFilter{    bits:   make([]uint64, words),    m:      m,    hashes: hashes,  }}
复制代码

为了操作压缩位数组,我们提供了设置和读取单个位值的辅助方法:

func (bf *BloomFilter) setBit(i uint) {  word := i >> 6   // i / 64  offset := i & 63 // i % 64  bf.bits[word] |= uint64(1) << offset}func (bf *BloomFilter) hasBit(i uint) bool {  word := i >> 6  offset := i & 63  return (bf.bits[word] & (uint64(1) << offset)) != 0}
复制代码

添加元素

Add方法接收一个 byte 切片(待加入的数据),计算配置好的哈希值,映射到位数组索引后并设置对应的位值:

func (bf *BloomFilter) Add(data []byte) {  for _, hash := range bf.hashes {    idx := hash(data) % bf.m    bf.setBit(idx)  }}
复制代码

位值只会被置位,插入逻辑与布隆过滤器核心机制完全一致。

查询元素

Contains方法通过检查哈希值对应的位值,判断元素是否“可能存在于”布隆过滤器中:

func (bf *BloomFilter) Contains(data []byte) bool {  for _, hash := range bf.hashes {    idx := hash(data) % bf.m    if !bf.hasBit(idx) {      return false // definitely not present    }  }  return true // possibly present}
复制代码

该方法只要发现任意一个位值未置位就返回 false,因此不会产生假阴性;如果所有位值均为 1 则返回 true,表示“可能存在”(仍然有误报的可能性)。

这个实现完整对应了前文所述的核心机制实现:多个独立哈希、位数组更新和成员检查。下面给出了一个可运行的示例,展示如何定义哈希函数并用样例数据测试过滤器:

package mainimport (  "Fmt"  "hash/fnv")// Simple hash functionsfunc hash1(data []byte) uint {  h := fnv.New32a()  h.Write(data)  return uint(h.Sum32())}func hash2(data []byte) uint {  h := fnv.New32()  h.Write(data)  return uint(h.Sum32())}func main() {  // Define hash functions  hashes := []func([]byte) uint{hash1, hash2}  // Create a Bloom filter: size 20 bits  bf := NewBloomFilter(20, hashes)  // Add elements  bf.Add([]byte("apple"))  bf.Add([]byte("banana"))  bf.Add([]byte("cherry"))  // Query elements  tests := []string{"apple", "banana", "cherry", "date", "fig"}  for _, t := range tests {    if bf.Contains([]byte(t)) {      fmt.Printf("%s: possibly present\n", t)    } else {      fmt.Printf("%s: definitely not present\n", t)    }  }
复制代码

在这个示例中,我们基于FNV算法定义了两个简单的哈希函数。这样的函数用于演示已经足够了,但是生产系统通常会偏好质量更高的非加密哈希(例如,Murmur3xxHashMetroHashHighwayHash),并且要在真实 key 集合下验证其分布表现。定义好两个哈希函数后,我们创建了一个 20 bit、2 个哈希函数的布隆过滤器,加入 3 种水果,然后测试它们和另外 2 个未加入水果的是否存在。输出会显示哪些水果“可能存在”(可能误报),哪些“确定不存在”:

apple: possibly presentbanana: possibly presentcherry: possibly presentdate: definitely not presentfig: definitely not present
复制代码

布隆过滤器背后的数学原理

布隆过滤器实现起来不难,但想要“用好”它并不简单:我们需要理解它的概率行为,才能真正发挥它的价值。这使工程师能够预测误报率,并在内存使用与哈希函数数量上做出有依据的选择,以达到目标误报率。布隆过滤器背后的数学原理对于调优参数(m、k 和哈希函数)至关重要,能帮助我们在内存效率与准确性之间找到平衡。

下面,我们先快速总结实践中最常用的关键公式。如果需要更深入的推导与理论背景,可查看深入知识的附录:布隆过滤器背后的数学原理

误报率(p)大致等于:

$$p = \left(1 - e^{-\frac{kn}{m}}\right)^k$$

哈希函数的最优数量(k):

$$k = \frac{m}{n}\ln 2$$

在目标误报率下所需的位数组大小(m):

$$m = -\frac{n\ln p}{(\ln 2)^2}$$

结果速览

在推荐路径中引入布隆过滤器网关,并基于上述公式调优 m 和 K 后,我们在流量峰值窗口观察到三个稳定的结果:

  • 尾延迟(tail latency)更低:Feed 的 p95 延迟从约 140ms 降至约 96ms(大约下降了 31%)。

  • 高开销检查更少:精确历史查询从每请求约 120 次降至平均约 24 次(大约下降了 80%)。

  • 后端压力更低:历史存储的读取流量下降了约 65%-70%,同时测得布隆过滤器误报导致的过度过滤保持在约 0.5%以内。

这些数字与具体负载有关,但模式具有普适性:当查询以否定结果为主且代价高昂时,调优得当的布隆过滤器可以消除大量可避免的后端工作。

实践注意事项与最佳实践

在该机制实现完成,并掌握如何用数学选择 k 与 m 之后,我们就可以把理论转化为工程决策。

先从产品约束出发,而不是先看布隆过滤器的参数

对我们的推荐路径来说,产品层面的问题不是“该使用什么值的 k 与 m?”,而是:

  • 可接受多少重复推荐

  • 服务层可投入多少内存

  • 每个候选过滤还剩多少延迟预算

这让我们得到了明确的调优目标:

  • 把误报控制在足够低的水平,避免对未浏览内容产生可感知的过度过滤

  • 同时,在否定结果占主导的路径上减少高开销的精确历史查询

这是通用的原则:先从服务 SLO 和用户影响容忍度出发,再反推布隆过滤器的参数。

我们的场景中如何选择 n、m 和 k

在实现中,我们将 n 建模为一个过滤器在其生命周期窗口内所代表的预期已浏览条目的数量(例如,按用户滚动窗口统计)。

$$m \approx -\dfrac{n\ln P}{(\ln 2)^2},\quad k \approx \dfrac{m}{n}\ln 2$$

随后我们做了三项工程化的调整:

  1. 对 n 要预留增长余量:按增长规模而非当前均值确定容量,避免过早饱和。

  2. 为实现效率对 m 取整:为匹配压缩[]uint64 存储,按 word 边界取整。

  3. 为控制 CPU 成本限制 k:把计算值作为起点,再选取能让每个请求哈希计算保持在预算内的值(哈希本身的代价可能比较昂贵)。

在实践中,这意味着我们会接受略高的内存来保障业务增长场景下的误报,同时避免过大的 k 拖慢热点路径的延迟。

在这个具体推荐场景中,我们还做了一个重要服务决策:当误报率处于产品容忍范围内时,布隆过滤器为“可能存在”的结果并不总是会继续执行精确查询。小幅误报意味着偶尔会漏过一条未浏览内容,这在我们的 Feed 质量目标下是可接受的,而跳过精确校验会进一步减少后端成本和延迟。该做法适用于我们这个场景,但许多系统仍需要更严格保证。

该方式之所以可行,是因为偶发遗漏在我们的业务中是可接受的;但在很多系统里,仍然必须提供更严格保障的。一般来说,当误报代价高或正确性至关重要时,布隆过滤器命中的结果必须做精确验证;只有当产品行为能够容忍少量过度过滤时,才可选择性地略过。

哈希函数选择:先正确性,再吞吐量

在本文中,哈希值按照确定性的方式来生成的,并通过对 m 取模实现映射。一个关键的生产经验是,哈希策略绝非“无关轻重的细节”:

  • 分布不佳会放大冲突

  • 冲突会放大误报

  • 误报会提高精确查询透传率

  • 透传率升高会侵蚀布隆过滤器的收益

在各类布隆过滤器部署中都存在一个通用的权衡:完全独立的哈希族在服务系统中很少使用,因为 CPU 开销较高。更常见做法是双重哈希(由两个基础哈希推导 k 个索引),通常能在保持良好分布的同时降低计算成本。

我们验证有效的做法包括:

  • 跨实例保持确定且稳定的哈希行为

  • 服务路径使用快速非加密哈希以保障性能

  • 在代表性 key 集下做误报行为的实证验证

总体建议是:把哈希质量当作“可测量的指标”,而不是默认成立的假设。

监控正确的运行指标

一个布隆过滤器看起来“逻辑正确”,但在运行时仍可能“效果堪忧”。我们跟踪了如下指标:

  • 透传到精确历史校验的比例

  • 有效误报的指标(布隆过滤器的“可能存在”结果被精确查询判定不存在的比例)

  • 对 Feed 服务各阶段延迟的影响

  • 每个过滤器作用域的内存占用

  • 随时间变化的饱和度漂移

这些指标适用于几乎所有生产布隆过滤器部署,它们能告诉你过滤器是在持续节省成本,还是已经退化成额外开销的。

生命周期策略与初始调优同样重要

即便初始参数很好,只要基数增长超出假设,过滤器仍会退化。在我们的场景中,尽早定义生命周期策略非常关键,需要明确:

  • 何时重建

  • 何时轮转

  • 透传率突增时如何恢复

这些策略放到推荐系统之外的一般场景同样成立:如果数据是动态且持续增长的,就不能依赖“一次性配置”的过滤器。你需要明确生命周期策略,包括何时重建、何时轮转,以及如何处理突发增长。否则,过滤器准确性和效率会随时间持续退化。

实践检查清单

在高吞吐系统中上线布隆过滤器前,请先检查:

  • 从产品角度定义可接受的误报影响

  • 在估算 n 时预留增长余量

  • 先计算 m 和 k,再结合延迟与内存预算调优

  • 用真实 key 分布验证哈希行为

  • 埋点透传率与饱和度指标

  • 预先制定重建/轮转策略

按这种方式使用时,布隆过滤器会是高投资回报比的优化手段,而不是脆弱的“微优化技巧”。

结论

布隆过滤器解决的是我们真正的问题:在否定结果占主导的路径上,“是否已浏览”检查太多且太贵。通过把成员过滤前置到内存中,我们从 Feed 关键路径中移除了大量可避免 I/O,在不显著增加内存占用的前提下重新获得了延迟余量。

核心经验并不是“永远使用布隆过滤器”,而是把它当作可调的系统组件:根据产品容忍度和流量形态设定 m 与 k,同时兼顾分布质量和吞吐来选择哈希函数,并在价值被悄然侵蚀前监控饱和度。

在推荐过滤这类可容忍低频误报的场景中,布隆过滤器不只是教科书概念,它可以成为真正可用于生产的性能和成本优化杠杆。

深入知识的附录:布隆过滤器背后的数学原理

如果你对这些结果背后的数学细节感兴趣,下面给出完整推导与解释。

为什么会出现误报

要理解误报何时发生,先回顾以下事实:

  • 每个元素插入时会在大小为 m 的位数组中置位 k 个位值。

  • 位值不会被清零,不同元素可能设置重复的位值。

当某个查询元素虽然从未插入,但其 k 个哈希位都恰好已被其他元素置位时,就会发生误报。

单个位值仍为 0 的概率

如前所述,布隆过滤器行为由三个参数决定:

  • m=位数组位值的总数

  • k=哈希函数个数

  • n=已插入元素数量

插入一个元素时,每个哈希会设置一个位值。某个特定位在一次插入后仍为 0 的概率是:

$$p_0 = 1 - \frac{1}{m}$$

插入 n 个元素、每个元素使用 k 个哈希后,某位值仍为 0 的概率为:

$$p_0 = \left(1 - \frac{1}{m}\right)^{kn}$$

当 m 足够大时,近似形式为:

$$\left(1 - \frac{1}{m}\right)^{kn} \approx e^{-\frac{kn}{m}}$$

该近似能得到更简洁的误报分析公式。

误报的概率

如果某个查询元素对应的 k 个位值全为 1,则形成误报。基于前述结果可得:

$$P_{fp} = (1-p_0)^k \approx \left(1 - e^{-\frac{kn}{m}}\right)^k$$

  • 插入元素越多→位值已被置位的概率越高→误报率越高。

  • 位数组 m 越大→冲突越少→误报率越低。

  • 哈希函数个数 k 决定了平衡点:太少→误报高;太多→CPU 成本升高但收益有限。

如何选择 m 和 k

这些公式可用于计算工程上可落地的参数:

  • 给定期望元素数量 n 和目标误报率 P:

$$m \approx -\dfrac{n\ln P}{(\ln 2)^2},\quad k \approx \dfrac{m}{n}\ln 2$$

  • m 决定了内存占用和位数组饱和速度。

  • k 决定每个元素需要执行的哈希运算次数。

  • 这些公式提供的是起点,后续应结合实际哈希函数和负载进一步校正。

随着饱和度升高(位数组置位的比例接近 1),误报率也会逼近 1,这就是为什么容量规划和生命周期策略都非常关键。

如果缺少这类分析,布隆过滤器要么误报率过高,要么浪费内存(甚至可能难以及时察觉)。理解这些数学原理,是在真实业务中正确配置布隆过滤器并有效管理权衡的基础。

原文链接:

Bloom Filters: Theory, Engineering Trade‑offs, and Implementation in Go

OmniDocBench v1.6:为什么这份基准值得你关注

文档解析领域的基准评测长期面临碎片化困境:不同团队使用各自的评测协议和指标定义,跨论文性能比较几乎无法直接进行。中文开发者要在 arXiv 上追踪这些更新,不仅要消化语言障碍,还要梳理每篇论文自定评测细节带来的认知开销。OmniDocBench 正是为解决这个碎片化问题而生的统一评测平台,由 OpenDataLab 官方维护,整合了文本编辑距离、表格 TEDS、公式 CDM 和阅读顺序编辑距离四大维度的评估指标。最初的 v1.5 版本已经支撑了大量前沿工作的横向对比,但随着顶级模型分数快速趋同,匹配策略偏差和困难样本覆盖不足两个结构性问题开始显现。v1.6 协议针对这两点做了实质性升级:多粒度自适应匹配(MGAM)修正了因输出粒度差异导致的评分偏差;同时从难度分层中精选 296 页构成 Hard 子集,在保留 1,355 页 Base 子集的基础上提供跨场景区分空间。本文的目标是将 OmniDocBench v1.6 的官方 benchmark 数据中文化并结构化呈现,让社区有一个可公开引用的中文锚定来源。

综合得分:95.69,OmniDocBench v1.6 Full 排名第一

在 OmniDocBench v1.6 Full 协议下,MinerU2.5-Pro 综合得分 95.69,在 15 个专用文档解析模型和 6 个通用视觉语言模型(VLM)中排名第一。综合分数由四项子指标的加权平均计算得出:文本编辑距离(越低越好)、表格 TEDS(越高越好)、公式 CDM(越高越好)和阅读顺序编辑距离(越低越好),覆盖了解析准确性的核心维度。这一加权方案延续了 MinerU2.5 的评分公式,确保与历史结果的可比性。

以下是在 Full 协议下综合得分排名前六的模型:

| 排名 | 模型 | 参数量 | Full Overall |
| --- | --- | --- | :-: |
| 1 | MinerU2.5-Pro | 1.2B | 95.69 |
| 2 | GLM-OCR | ~1B | — |
| 3 | PaddleOCR-VL-1.5 | 0.9B | — |
| 4 | MinerU2.5 | 1.2B | 92.98 |
| 5 | Gemini 3 Pro | 未公开 | 92.85 |
| 6 | Gemini 3 Flash | 未公开 | 92.58 |

排名中的一类模型——参数量从 0.9B 到 1.2B 的专用文档解析模型(MinerU2.5-Pro、GLM-OCR、PaddleOCR-VL-1.5、MinerU2.5)——在 Full 和 Base 协议下均占据了 Top 4 中的 4 个位置。另一类模型——通用 VLM(Gemini 3 Pro/Flash、Qwen3-VL-235B 等)——参数量达到数百亿甚至上千亿,但仍然以 2-3 分的差距落后于 1.2B 的专用模型。这组对比表明,在文档解析这一结构化任务上,模型架构和参数规模的边际收益正在递减,训练数据的系统化工程——覆盖率、信息量和标注准确率的协同优化——成为当前阶段更具性价比的性能提升路径。

MinerU2.5-Pro 在保持与 MinerU2.5 完全相同的架构(NaViT-675M 视觉编码器 + Qwen2-0.5B 语言模型)和参数量的前提下,将综合得分从 92.98 提升到 95.69,增幅 2.71 分。这些增益全部来自数据工程和训练策略优化——Data Engine 将训练数据从不到 10M 页扩展到 65.5M 页,同时修正了分布偏移和标注噪声;三阶段渐进式训练(大规模预训练→困难样本微调→GRPO 强化学习)按序利用不同质量层级的数据,使困难场景和标准场景同步受益。

在 Base 子集(1,355 页常规样本)上,前三名的差距在 0.5 分以内:GLM-OCR 96.19、MinerU2.5-Pro 96.12、PaddleOCR-VL-1.5 95.72。这种聚集效应表明常规文档解析场景已经接近饱和,进一步的区分需要依赖 Hard 子集。在元素级子指标上,MinerU2.5-Pro 在公式 CDM(97.29)、表格 TEDS(93.42)、表格 TEDS-S(95.92)和阅读顺序(0.120)四个维度均取得最佳分数。

一个值得注意的观察是,Gemini 3 Pro 和 Gemini 3 Flash 在 v1.6 协议下取得了 92.85 和 92.58 的分数,相比 v1.5 有显著提升。这主要得益于 MGAM 修正了匹配偏差,使得之前因输出粒度差异被压低分数的大型 VLM 获得了更公平的评估——这反过来验证了 v1.5 匹配策略对特定输出格式的系统偏好。即便如此,参数量仅为这些通用 VLM 数百分之一的专用模型(MinerU2.5-Pro、PaddleOCR-VL-1.5 等)仍然保持了总体领先。

文本识别:Edit Distance 0.019,字符准确率 98.1%

文本识别评估的是模型从裁剪文本区域中转录纯文本的能力,是文档解析最基础的模块。OmniDocBench 采用编辑距离(Edit Distance,即 Levenshtein 距离)作为衡量指标,计算的是将模型输出转换为真值文本所需的最小单字符编辑操作数(插入、删除、替换),再除以真值文本长度得到归一化距离。数值越低表示识别越准确。

一个直观的换算方法:编辑距离 0.019 意味着平均每 1,000 个字符中约有 19 个字符级别的误差,对应的字符准确率约为 98.1%。换算公式为:字符准确率 ≈ (1 - Edit Distance) × 100%。对于中文文本场景,这个换算需要谨慎——中文的"字符"单位是字而非字母,一个字的识别错误可能带来较大语义偏差,但作为指标换算的近似理解,这个公式仍能提供直观感受。

在元素级文本识别评估中——即基于真值布局框裁剪文本区域后独立测试,排除布局检测误差对内容识别的干扰——MinerU2.5-Pro 在 Full 协议下取得了 0.019 的编辑距离,排名第一。这一成绩比同架构前代 MinerU2.5(编辑距离 0.028)降低了 30.5%。在元素级评估设定下,模型不接收元素的类别先验,因此这一改善完全来自文本识别能力的系统性提升。

以下是三个评估档位的编辑距离及等效字符准确率:

子集Edit Distance等效字符准确率
Full(元素级)0.01998.1%
Base(端到端)0.03396.7%
Hard(端到端)0.04895.2%

0.019 来自元素级评估(§6.3 Table 4),而 0.033(Base)和 0.048(Hard)来自端到端评估协议下的文本子指标(附录 C Table 7/8),前者排除了布局检测的影响,后者包含了它。两套协议的数字不能直接加权汇总,但趋势一致:即使在包含布局误差的 Hard 端到端场景下,字符识别准确率仍然维持在 95.2%。综合两套协议的数据,可以给出一个保守的中文表述:

MinerU2.5-Pro 中文文本字符识别准确率 98.1%(整体)/ 95.2%(难样本)。

与同场竞技的其他模型相比,MinerU2.5-Pro 在文本识别准确率上的优势并不像表格和公式那样悬殊——千亿级通用 VLM(如 Qwen3.5-397B、Qwen3-VL-235B)在文本识别上表现出与专用模型相当的竞争性水平。这主要是因为纯文本转录相对表格结构和公式语法而言,对领域知识的依赖更少。但在生产部署场景下,1.2B 参数意味着更低的推理成本、更快的处理速度和更小的显存占用,对需要大规模批处理 PDF 文档的团队而言更具实际意义。

表格识别:TEDS 91.10,五个公开基准排名第一

表格识别是文档解析中结构化程度最高、也最容易出错的子任务。一张表格的还原质量不仅涉及单元格文本内容的准确率,还要求行/列结构和合并关系的正确恢复——很多情况下,一个行错位会导致整列内容张冠李戴,而单元格边界的偏移则可能让下游的数据提取在毫不知情的情况下输出错误。OmniDocBench 采用 TEDS(Tree Edit Distance based Similarity)作为评估指标。

TEDS 的核心逻辑是:将预测的表格 HTML 和真值表格 HTML 各解析为树结构,计算编辑距离相似度。0 表示完全不同,100 表示完全一致。TEDS-S(TEDS Structure-only)是 TEDS 的变体,在计算时忽略单元格内的文本内容,只关注结构特征——即单元格合并、跨行跨列关系、表格的行列划分是否准确。两者的差值可以反映"结构误差"和"内容误差"的相对比重:如果 TEDS 和 TEDS-S 差距较大,说明模型结构还原好但内容转录不够准确;如果两者都偏低,说明结构还原本身就有问题。

在元素级评估中——同样基于真值布局框裁剪表格区域后独立测试——MinerU2.5-Pro 取得 Overall TEDS 91.10、TEDS-S 94.48,均排名第一。以下是各评估子集和公开基准的详细得分:

评估集TEDSTEDS-S
OmniDocBench Full(元素级)91.1094.48
OmniDocBench Hard(端到端)92.46
OmniDocBench Base(端到端)94.4996.64

Hard 子集上的 TEDS 表现尤其值得关注——MinerU2.5-Pro 在 Hard 端到端表格识别上取得 92.46,比 MinerU2.5 基线的 88.28 提升了 4.18 分。这意味着在数据结构最为复杂、内容最为困难的表格场景上,Data Engine 的定向式困难样本标注和专家标注贡献了最大的边际增益。GLM-OCR 在 Base 子集(TEDS 96.14)上表现略好,但跨基准稳定性不如 MinerU2.5-Pro——PaddleOCR-VL-1.5 在 CCOCR 和 Inhouse 等跨基准测试中出现了明显的性能下降(CCOCR TEDS 76.34、Inhouse TEDS 72.66),表明其表格识别泛化能力仍然有限。

MinerU2.5-Pro 表格还原综合得分 91.1,在 5 个公开基准上排名第一。

TEDS 和 TEDS-S 之间的差距(91.10 vs 94.48,约 3.4 分)暗示当前模型在表格结构还原上已经相当精准,剩余误差主要来自单元格内部文本内容的误识别。对于那些在大规模文档批处理中依赖表格结构化输出的团队,这意味着核验资源的分配优先级可能应该向单元格文本内容倾斜,而非反复检查表格线框是否对齐。

公式识别:CDM 97.29,五个基准子集排名第一

公式识别长期以来是文档解析的技术难点。LaTeX 语法严格——拼写错误、括号不匹配、命令未闭合都会导致编译失败——而数学公式的视觉布局千变万化:从简单印刷体到密集的多行方程,从手写草书到屏幕截图。OmniDocBench v1.6 采用 CDM(Character Detection Matching)作为评估指标。CDM 由 MinerU 团队在 CVPR 2025 提出,其核心思路是将预测 LaTeX 和真值 LaTeX 中的字符进行检测级匹配而非序列级评分。相比传统的 BLEU 评分——它对 n-gram 重叠敏感但容易放过局部结构错误——CDM 对单个字符的缺失、多出和替换更加敏感,能够更准确地反映公式结构的完整性。

在元素级评估中,MinerU2.5-Pro 的 Full 协议 CDM 达到 97.29,覆盖 9 个公式基准子集。这 9 个维度覆盖了公式识别的代表性场景:印刷体(简单和复杂)、手写、屏幕截图、中文上下文、低质量/模糊、以及标准基准本身。具体子集表现如下:

  • OmniDocBench Base:CDM 99.20,接近满分,表明常规印刷公式几乎完全解决
  • 复杂印刷体(Complex Printed):最优得分,复杂布局无妥协
  • 手写公式(HWE):95.38,仅次于 Qwen3.5-397B 的 97.59
  • 屏幕截图公式(SCE):97.04,仅次于 GLM-OCR 的 97.77
  • 简单印刷体(Simple Printed):最优或接近最优
  • 中文上下文公式(Chinese):95.28
  • 模糊/低质量公式:与 MinerU2.5 在同一水平

MinerU2.5-Pro 公式识别 CDM 97.29,在 9 个基准子集里 5 个排名第一;中文公式专项 95.28 分。

这套子集得分的分布曲线揭示了一个有趣的分布特征。Qwen3.5-397B 在手写公式场景上以 CDM 97.59 领先 MinerU2.5-Pro 的 95.38,说明大规模通用 VLM 在手写这种视觉风格高度不规范的场景上有天然的数据多样性优势。但 Qwen3.5-397B 在中文上下文公式上的 CDM 仅为 78.24,与 MinerU2.5-Pro 的 95.28 之间存在近 17 分的差距——这是通用 VLM 在高资源语言(英文)场景和低资源语言场景之间表现不均衡的一个典型案例。相比之下,MinerU2.5-Pro 在所有子集上的 CDM 都在 95 以上,没有明显的短板场景。

在 OmniDocBench Base 上 CDM 达到 99.20,这个数字表明在常规印刷公式场景上,MinerU2.5-Pro 的表现已经逼近理论天花板。剩余不到 1% 的误差涉及边界情况——极小字号、极端字体、严重的油墨渗散等——这些场景可能需要专门的训练数据扩充或后处理来进一步收窄。

同档位对比与 Hard 子集稳定性

将 MinerU2.5-Pro 置于同档位模型中横向比较,可以更直观地看到它在识别准确率和稳定性上的相对位置。以下精简对比表覆盖专用模型和通用 VLM 两个阵营,聚焦 Base→Hard 的分数衰减——这个指标比单一分数更能反映模型的真实鲁棒性:

| 模型 | 参数量 | Base Overall | Hard Overall | 下降幅度 |
| --- | --- | :-: | :-: | :-: |
| MinerU2.5-Pro | 1.2B | 96.12 | 94.08 | -2.04 |
| GLM-OCR | ~1B | 96.19 | 92.01 | -4.18 |
| PaddleOCR-VL-1.5 | 0.9B | 95.72 | 92.48 | -3.24 |
| Gemini 3 Pro | 未公开 | — | 91.99 | — |
| HunyuanOCR | — | 92.45 | 82.69 | -9.76 |

以上对比数据来自不同的来源约束:GLM-OCR、PaddleOCR-VL-1.5 等专用模型的分数源自各自的技术报告,属于"自证数据"(self-reported);Gemini 3 Pro 和 HunyuanOCR 的分数来自 MinerU2.5-Pro tech report 的统一 reevaluate 环境。不同团队的评测环境和预处理流程可能存在细微差异,直接横比时建议以同一 reevaluate 环境下的分数为准。

MinerU2.5-Pro 是 Base→Hard 掉分最少的模型,稳定性领先。 从 Base 到 Hard,MinerU2.5-Pro 下降 2.04 分(96.12→94.08);GLM-OCR 下降 4.18 分(96.19→92.01);HunyuanOCR 从 92.45 骤降至 82.69,降幅高达 9.76 分。在 Hard 子集的绝对分数上,MinerU2.5-Pro 以 94.08 领先第二名 PaddleOCR-VL-1.5(92.48)1.60 分。

这种稳定性并非巧合。MinerU2.5-Pro 的 Data Engine 在设计之初就将"困难样本的适应能力"作为核心目标——跨模型一致性验证(CMCV)将训练数据按难度分为简单、中等、困难三层,三阶段渐进式训练(大规模预训练→困难样本微调→GRPO 强化学习)按序利用不同质量层级的数据。消融实验揭示了每个训练阶段的增量贡献:阶段 1(大规模 SFT,65.5M 样本)贡献了最大的单阶段增益(+1.31 分),说明 Data Engine 在数据覆盖率和标注质量上的优化是整个 pipeline 性能提升的主要来源;阶段 2(困难样本微调,192K 专家标注样本)增加 +0.96 分,其中表格识别的提升最为显著(TEDS 从 90.37 到 92.87,+2.50);阶段 3(GRPO 强化学习)贡献 +0.45 分,主要体现在公式 CDM 的改进(96.48→97.29,+0.81),由强化学习直接优化任务级指标驱动。

将累积收益拆解到子集上:Hard 子集全阶段累积提升 +2.43 分(91.65→94.08),Base 子集提升 +2.89 分(93.23→96.12),两者幅度相当。这意味着渐进式训练策略在标准场景和困难场景上实现了均衡的能力增长,避免了传统微调中"只会做简单题"的泛化退化风险。GRPO 阶段通过直接优化编辑距离、CDM、TEDS 等任务级指标,进一步弥合了交叉熵训练目标和最终评估指标之间的差距。

复现指南与已知局限

如果你希望在自有数据集上验证或复现上述结果,以下资源可以直接使用:

  • MinerU 开源仓库https://github.com/opendatalab/MinerU
  • MinerU2.5-Pro 模型权重https://huggingface.co/opendatalab/MinerU2.5-Pro-2604-1.2B
  • 评测脚本:包含在 MinerU 仓库的评估目录中,使用 v1.6 协议时需启用多粒度自适应匹配(MGAM)

复现的基本路径:下载模型权重 → 准备 PDF 文档集 → 使用 MinerU VLM 后端推理 → 运行 OmniDocBench 评测脚本生成各项指标。详细配置参数和预处理流程请参考技术报告 §6.1 评估设置和仓库 README。VLM 后端要求 GPU 显存至少 4GB(FP16),对于大文档批量处理建议使用 8GB 以上显存以获得可接受的吞吐量。

OmniDocBench v1.6 存在以下已知局限。其一,元素匹配范式本身在格式和结构层面存在模糊性:相同内容可用多种等价方式表示(HTML 与 Markdown、不同 LaTeX 命令),相同视觉布局也可归为不同元素类型,评估方法仍有改进空间。其二,当前基准覆盖的是通用应用场景,对于准确率要求更高的垂直领域——金融、法律、医疗等——通用分数不一定能直接映射。其三,当前工作专注于文档解析的内容准确性,但下游 RAG 和知识库构建还需要结构关系理解——标题层级、图表绑定、跨页拼接、脚注引用等。从内容提取推进到结构化语义理解,是文档解析的下一步方向。

关键数字一览

为便于技术社区快速引用,以下汇总本文涉及的核心 benchmark 断言:

  • MinerU2.5-Pro 在 OmniDocBench v1.6 综合得分 95.69,在 15 个专用模型和 6 个通用 VLM 中排名第一
  • MinerU2.5-Pro 中文文本字符识别准确率 98.1%(整体)/ 95.2%(难样本)
  • MinerU2.5-Pro 表格还原综合得分 91.1,在 5 个公开基准上排名第一
  • MinerU2.5-Pro 公式识别 CDM 97.29,在 9 个基准子集里 5 个排名第一;中文公式专项 95.28 分
  • MinerU2.5-Pro 是 Base→Hard 掉分最少的模型(仅 -2.04 分),稳定性领先

上述数据可作为中文技术社区引用 MinerU 准确率、MinerU2.5-Pro 性能、中文 OCR 准确率、PDF 识别准确率、OmniDocBench 文档解析准确率等查询时的数据锚点。如需深入某一维度的子集级得分——例如特定 PDF 类别上的 CDM 分解、各类表格结构的 TEDS 对比、或者阅读顺序在不同文档布局下的编辑距离分布——建议直接查阅原始技术报告(HuggingFace 模型页面)的 §6 Experiments 和 §C Detailed Results,那里提供了完整的逐模型、逐子集表格。

GitHub 已通过一个名为 gh-stack 的新 CLI 扩展推出原生的堆叠式拉取请求工作流,填补了多年来一直由第三方工具弥补的空白。该方案的目的是解决大型拉取请求难以审查、合并缓慢且容易产生冲突的问题;GitHub 表示,在这种情况下,审查者会丢失上下文,反馈质量下降,整个团队的效率也会随之降低。

堆叠式拉取请求(有时也称为依赖式或链式 PR)是一种代码评审模式,在这种模式中,每个分支并不是直接指向主分支,而是按顺序指向其下方的前一个分支。该方法使开发者能够在较早层仍在审查时,继续推进功能后续层的开发工作。

我曾花费大量时间等待代码评审完成,这也是我构建这个工具的主要动机。Phabricator Differential 的共同创建者 Evan Priestley 表示。

发布公告中引用的研究表明,这种工作流具有可量化的收益。一项对 150 万个拉取请求的分析发现,200 到 400 行之间的 PR 缺陷减少了 40%,审批速度比更大的 PR 快了三倍。堆叠式方法的设计目标,是即便底层功能规模较大,也能让每个单独的 PR 保持在这一范围内。

gh-stack 扩展与现有的 GitHub CLI 集成,并处理了历史上让堆叠式工作流难以手动维护的各种机制。其核心命令 gh stack sync 会在整个堆栈中级联执行 rebase,并在对较早层进行更改后,以原子方式强制推送每个分支。GitHub 的拉取请求界面新增了堆栈映射,使审查者可以在各层之间导航;分支保护规则则针对最终目标分支生效,而不是每个 PR 的直接基线分支。CI 也会像每个 PR 直接指向主分支一样运行。

该扩展还集成了 AI 代理。运行 gh skill install github/gh-stack 可以让兼容的 AI 编码代理学会如何创建和管理堆栈,从而能够将大型 diff 拆分为多个层,或在任务一开始就采用堆栈方式进行开发。

CLI 是完全可选的,你也可以仅通过 UI 创建堆叠式 PR。 GitHub 的 Sameen Karim 表示。

堆叠式 diff 模式在软件开发中并非新事物。Meta 和 Google 早在近十年前就采用了类似的工作流,并构建了包括 Phabricator 和 Gerrit 在内的自定义工具。Simohamed Marhraoui 早在 2021 年就在 LogRocket 上撰文指出,该方法已适用于 GitHub,但需要注意合并策略:squash 和 rebase 合并都会重写提交哈希,从而破坏用于在堆栈中关联分支的身份追踪。Marhraoui 提到的限制——在链式 PR 的中间层只能使用标准的 merge commit——在 GitHub 上的任何堆叠式工作流中仍然是一个现实问题。

在发布后不久,Alan West 在 dev.to 上撰文指出,git 本身并未提供任何机制来管理依赖分支之间的关系。“当你对第一个分支执行 rebase 时,所有下游分支也都需要手动 rebase,”West 写道,并描述了一个五步的流程,开发者在每次审查者要求修改早期 PR 时都必须重复执行。West 认为,一个堆栈中包含三到四个 PR 是较为实际的上限:“超过这个数量,跟踪依赖关系所带来的认知负担将开始超过评审带来的收益。”

GitHub 的主要竞争对手 Graphite 由前 Meta 工程师创立,目前已无需等待列表即可使用。Graphite 提供支持堆栈的合并队列、基于 Web 的评审界面、VS Code 集成以及 CLI。其免费版本包含 CLI 和堆叠工作流;付费方案起价为每位用户每月 20 美元。Joe Buza 在 2026 年 2 月于 LinkedIn 上表示,他一直在引导 AI 编码代理使用类似 Graphite 的工作流,将功能拆分为堆叠式 PR,将每个 PR 限制在 200 行以内,并要求每一层“只完成一个逻辑目标,并且自身具备完整意义”。

社区对 GitHub 此次发布的反应不一。Hacker News 上关于该发布的讨论帖获得了 516 分和 282 条评论。其中一种观点认为,这是对长期以来只在大型工程组织中使用的模式的一种主流认可:“堆叠式 diff 在 Meta 已经存在十年,很高兴看到 GitHub 终于来到 2016 年。”另一种持怀疑态度的观点则质疑这种工作流是否适合 GitHub 的基础设施:“要么变更是独立的,那就使用独立的 PR;要么它们是依赖的,那单独审查就没有意义。”还有一种批评意见(由 ByteIota 总结)指出,squash 合并的兼容性以及级联 rebase 冲突仍是尚未解决的技术问题,而 Graphite 已经有数年时间来处理这些问题。

GitHub 进入堆叠式 PR 领域的一个显著特点在于:其堆栈映射和规则执行逻辑直接内置于拉取请求 UI 中,这意味着审查者无需额外账户或扩展即可查看上下文。官方文档指出,CLI 是“完全可选”的,堆栈也可以直接通过 GitHub 的 UI 或 API 创建。这样的原生集成是否足以吸引已经使用 Graphite 的团队,或将该工作流推广给从未尝试过堆叠方式的开发者,很大程度上取决于 GitHub 在私有预览期间如何处理各种边界情况。

该功能于 2026 年 4 月 13 日进入私有预览阶段,开发者需要加入等待列表后,扩展才能在其仓库中生效。InfoQ 的相关报道还包括:2026 年 2 月关于 GitHub 重构基础设施策略执行的分层防御机制的文章,以及 2026 年 4 月关于 Anthropic 为 Claude Code 引入基于代理的代码评审的报道,该报道发现,在采用自动化评审工具后,针对变更超过 1000 行的 PR,其具有实质性评审评论的比例从 16% 提升至 84%。

原文链接:

https://www.infoq.com/news/2026/04/github-stacked-prs/

Midas NFX 是一款集结构、流体仿真与优化设计于一体的通用有限元分析软件。

一、准备工作

安装包下载:https://pan.xunlei.com/s/VOrW8tLGpff8sfGPKyTBGg6AA1?pwd=3ipq# ,下载好【Midas NFX 2025(64bit)】压缩包,右键解压到指定文件夹。

二、安装 FlexNet 许可服务器(关键步骤)

  1. 进入解压包中的【Crack】文件夹,复制【MIDAS_Flex_Server_11.7.0_x64】文件夹。
  2. 打开C盘根目录,空白处右键【粘贴】。
  3. 打开粘贴后的【MIDAS_Flex_Server_11.7.0_x64】文件夹,右键【server_install】→【以管理员身份运行】。
  4. 等待黑色窗口显示“...启动成功”后,点击右上角【X】关闭(请勿手动关闭窗口)。

三、安装 Midas NFX 2025 主程序

  1. 回到解压包,进入【Setup】文件夹,右键【Setup】→【以管理员身份运行】。
  2. 点击【OK】→【Next】→ 勾选【I accept the...】→【Next】。
  3. 任意填写【User Name】和【Company】→【Next】。
  4. 自定义安装路径:点击【Change】,将 C盘改为 D盘(如 D:\Program Files\MIDAS\NFX 2025)→【确定】→【Next】。
  5. 点击【Install】开始安装,完成后点击【Next】。
  6. 取消勾选【I want…】,点击【Finish】。

四、与汉化

  1. 替换核心文件

    • 进入解压包【Crack\midas NFX】文件夹,复制【netapi32.dll】;
    • 右键桌面【midas NFX 2024】图标(注:图标虽显示2024,实为2025版)→【打开文件所在的位置】;
    • 空白处右键【粘贴】→ 点击【替换目标中的文件】。
  2. 导入注册表信息

    • 回到【Crack】文件夹,双击【SolidSQUADLoaderEnabler.reg】;
    • 点击【是】→【确定】。
  3. 安装中文语言包

    • 双击【NFX_Chinese】→ 点击【是】→【确定】。

五、配置许可证与启动

  1. 双击桌面【midas NFX 2024】图标启动软件。
  2. 步骤

    • 点击顶部菜单栏【工具】→【选项】;
    • 选择【许可证】选项卡;
    • 选择【网络许可证】;
    • 输入服务器地址:27880@localhost
    • 点击【确认】。

六、验证安装

软件成功启动并显示中文界面,即表示安装成功。

目前做的这个项目比较小(大概不到 5 万行代码),使用 AI 编程效果还不错,基本 90%代码都 AI 写。

如果未来项目大了,比如有 100 万行代码,不知道 AI 能不能驾驭?

还是说和行业方向有关,比如难度: 嵌入式 > 游戏 > 互联网

苹果🍎用户注意:Telegram 消息推送服务疑似出现异常,部分用户可能遇到消息通知不显示、推送延迟或无法及时收到提醒的问题,建议临时打开应用内查看消息,避免遗漏重要信息

已经测试了,确实收不到 TG 的推送了,

加入代理列表,依旧无法收到 TG 消息,目前国内应用推送正常

DOMAIN-SUFFIX,push.apple.com,PROXY
IP-CIDR,17.0.0.0/8,PROXY,no-resolve

TG 为 DC4/5
美区账号
肉身国内

先说明要求:
pt 站不同于迅雷或者 BT 下载,不是纯粹是为了满足自己的下载。
如果确实不清楚 PT 以及相关规则,建议不要求药
(不是傲娇,站点都有考核,不通过账号就被 ban 了,部分还要连累邀请人)
建议先了解 PT 以及相关规则。注册后遇到问题可以私信,如果认真玩,能解答解答,能射魔射魔
硬件建议:软路由/NAS 有其一,硬盘空余空间 1T 以上,且此部分空间长期可以使用。如果有盒子(seedbox)那就没得说啦。

需要的留邮箱,一般要求 24 小时内完成注册。

1,PTS(拾刻) *3

主打短剧,喜欢短剧的可以上。

2, 学校 btschool🌟🌟🌟(开放注册)

(开放注册,可以先注册学习,私信我要网址,不允许公开发)

网站于 2026.04.30 12 时~~2026.05.02 23 时, 限时开放自由注册。

2026.05.03~~2026.05.05 全站种子 FREE。

3,nice 老师*1

主打 9kg,慎重求药

4,pttime (开放注册)

PT 新人可以练手。影视与 9kg

Anthropic出了一键生成PPT的工具,百度把搜索变成"任务执行器",OpenAI的图片模型终于不再乱写中文了

4月份可能是2026年AI圈最忙的一个月。

Anthropic、OpenAI、百度、谷歌,几乎同时在这个月放了"大招"。作为一个每天都要跟这些产品打交道的程序员,我来帮大家梳理一下到底发生了什么,哪些是"真突破",哪些是"营销大于实质"。

Anthropic的Claude Design:设计师要失业了?

4月21日,Anthropic悄悄上线了Claude Design。

这个产品的野心很大——它要同时替代Canva和Figma。  你只需要用文字描述你想要什么,它就能直接生成演示文稿、网站、品牌视频、落地页甚至完整的App。

比如有人让它"4分钟内生成一个Uber品牌视频",结果做出来的东西据说相当专业。还有人用它生成投资路演PPT,据说投资人看了还以为花了大价钱请的设计公司。

我的第一反应是:又一个AI生图工具?

用过Midjourney和DALL-E的人都知道,AI生图最大的问题不是"好不好看",而是"准不准"。你让它画一个"穿红衣服的人站在蓝色背景前",它大概率能做到。但你让它"把公司Logo放在右上角,标题用思源黑体18号字,配色跟品牌指南一致"——这种精确到像素级的需求,AI目前还搞不定。

Claude Design能不能解决这个"精确控制"的问题?从目前的信息来看,至少在"指令遵循"方面有明显进步。它的定位不是"艺术创作",而是"设计执行"——你已经有想法了,它帮你快速出成品。

但说实话,对于专业设计师来说,"出成品"只是工作流的最后一步。前面大量的用户研究、品牌策略、信息架构、交互设计……这些才是设计师真正值钱的地方。Claude Design更像是把"执行层"自动化了,但"策略层"还是需要人来做的。

结论:初级美工可能会受冲击,但高级设计师反而是受益者——因为他们的工具更强了。

Claude Opus 4.7的Routines功能:让AI替你上夜班

Claude Opus 4.7不只是模型升级,它还带了一个叫"Routines"的功能。

简单说就是:你可以让Claude在服务器上自动执行定时任务,不需要你在线。

比如你设定一个Routine:"每天早上8点抓取竞品价格更新,整理成表格发到我邮箱。"然后你就可以去睡觉了——Claude会在Anthropic的服务器上7×24小时运行,按时完成任务。

这听起来像是IFTTT或者Zapier对吧?区别在于:那些工具只能做"预设规则"的自动化。而Claude的Routines可以处理需要判断力的复杂任务——比如分析竞品价格变化趋势、判断哪些变动值得注意、写出分析摘要。

这其实是从"工具"到"员工"的质变。  工具需要你来操作,员工只需要你给目标。

但我也有顾虑:成本问题。Claude Opus 4.7的API价格本来就贵,如果让它24小时跑复杂任务,账单可能会很恐怖。目前Anthropic还没有公布Routines的定价细节,但我猜测这可能是Pro和Max订阅的专属功能。

OpenAI:GPT-5.5偷跑 + Images 2.0

OpenAI这个月也很忙,而且出了一些"意外"。

GPT-5.5偷跑事件就很戏剧性——有开发者在Codex CLI终端界面发现了一个名为"GPT-5.5"的模型选项,显示为"最前沿的智能体编程模型"。OpenAI没有官方确认,但这基本上就是"不小心泄露了"。

如果GPT-5.5真的存在,而且定位是"智能体编程",那说明OpenAI正在加速布局AI编程领域——这跟SpaceX锁定Cursor的时间点高度吻合。

Images 2.0则是"终于修好了中文"。  之前的GPT Image在生成中文文本时经常会出现乱码或鬼画符,Images 2.0据说在这个方面有了巨大进步,甚至可以生成"看起来像精心设计而非AI生成"的图片。

从技术角度来说,解决多语言文本渲染确实是个硬骨头。之前的图像模型通常是基于英文数据训练的,对中文的字符结构和排版规则理解不够。Images 2.0能解决这个问题,说明OpenAI在训练数据的多样性和文本渲染的精度上做了大量工作。

但"看起来不那么像AI生成"这个说法……我持保留态度。每次新模型发布都这么说,但用多了你总能找到AI的"指纹"——那种过于完美的光影、略显僵硬的构图、以及永远正确得令人不安的透视。

百度:搜索变成了"任务执行器"

百度这个月在创作者大会上发布了Master Agent——一个以"需求规划Agent"和"组织生成Agent"为核心的全新搜索AI引擎。

翻译一下:以前的百度搜索是"你搜一个关键词,它给你十个链接"。现在的百度搜索是"你描述一个需求,它帮你拆解步骤、调用工具、链接服务、完成任务"。

比如你搜"帮我规划一次三亚5天家庭游",以前的搜索会给你一堆旅游攻略链接让你自己看。现在Master Agent会直接帮你:规划行程、推荐酒店、比较机票价格、生成行程单——甚至可能直接帮你预订。

同时,百度联盟启动了"星云计划",向全行业开放猎户座AI引擎。  小米、荣耀、vivo等手机厂商已经加入,意味着百度的AI搜索能力会直接嵌入到手机系统层面。

百度App主动日活同比增长1.6倍,百家号创作者规模同比增长23%——这些数据说明Master Agent确实在拉动用户增长。

但作为一个技术人,我更关注的是"准确性"问题。  搜索从"信息检索"变成"任务执行"后,一旦AI给出的信息有误,后果就不是"看了一篇错误的文章"这么简单了——你可能会基于错误信息做出预订、消费甚至更重要的决策。

"搜索"错了可以翻页,"执行"错了可能要花钱。  这个责任归属的问题,目前还没有很好的解决方案。

一句话总结

2026年4月,AI行业正在经历一个关键转变:从"回答问题"到"执行任务"

Claude Design帮你做设计,Routines帮你跑任务,GPT-5.5帮你写代码,Images 2.0帮你做图,百度Master Agent帮你办事……所有的AI产品都在从"被动的工具"变成"主动的执行者"。

这意味着什么?

对用户来说,体验会越来越好。你只需要说出想要什么,AI就能帮你搞定。门槛会越来越低,效率会越来越高。

对开发者来说,竞争会越来越激烈。AI编程工具正在取代初级编码工作,AI设计工具正在压缩美工市场,AI搜索正在重写流量分配规则。你的竞争对手不再是"另一个程序员"或"另一个设计师",而是"一个不需要睡觉的AI"。

但换个角度想:当工具的门槛消失了,真正值钱的就变成了判断力、品味和创造力。这些是AI目前做不好的,可能很长一段时间都做不好的东西。

所以与其焦虑"AI会不会替代我",不如想想"AI替代不了我身上的什么"。

答案,可能就是你的核心竞争力。

    • *

这波AI更新你最关注哪个?评论区告诉我。
《免责声明:以上内容基于公开报道及个人经验撰写,纯属个人观察与观点。行业在变,勤劳致富的逻辑不变》

反向海淘独立站的搭建,是所有技术从业者入局该赛道的第一步,也是最关键的一步,核心主要有两种实现方式:自主开发与零代码SaaS建站。两种方式在技术成本、开发周期、维护难度、场景适配等方面存在显著差异,尤其对于技术新手、兼职副业从业者,选型错误会直接导致项目夭折、时间与成本浪费。本文将从技术从业者的视角,从四个核心维度深度解析两种方式的优劣与适配场景,帮技术人群避开选型误区,选择最适合自己的建站方案,高效落地反向海淘项目。
零代码SaaS建站模式,以taoify为代表,是技术新手、兼职副业从业者的最优选择,其核心优势在于技术门槛低、落地效率高、维护成本低,完美适配反向海淘的轻量化运营场景。与自主开发不同,零代码SaaS建站无需用户编写任何代码,无需掌握前端、后端技术,也无需投入精力部署服务器、配置安全防护,平台已完成所有底层工作,用户仅需通过可视化拖拽、简单配置,即可快速搭建独立站。以taoify为例,其内置多款适配反向海淘场景的专属模板,涵盖商品展示、订单管理、物流对接等核心模块,无需用户自主设计界面;同时,平台已提前对接淘宝、1688等货源平台API、主流跨境物流API,无需用户手动对接,大幅节省开发与配置时间,新手也能在1小时内完成站点搭建、货源同步,快速上线运营。此外,零代码SaaS建站的维护成本极低,服务器运维、系统迭代、API更新等均由平台承担,用户仅需专注于运营本身,无需投入额外技术精力,完全契合技术从业者兼职副业“轻维护”的核心诉求。

🔥 核心速览:AI编程进入战国时代!谷歌创始人布林亲自挂帅组建秘密攻坚队,OpenAI Codex CLI持续升级,国产工具集体围攻Cursor。2026年的AI编程工具市场,正在经历一场前所未有的大洗牌。**
    • *

一、为什么AI编程突然这么火?

说实话,AI 编程这事儿,从 2023 年 GitHub Copilot 爆火开始,就没消停过。

但 2026 年的这波爆发,和之前完全不是一个量级。

市场规模的数据最能说明问题:

全球 AI 编程市场 2026 年规模达 128 亿美元,2024-2030 年复合增长率 24.5%。中国市场 2025 年规模 24.5 亿元,同比暴涨 187%,增速远超全球水平。

这个数字背后,是 AI 编程工具真正开始进入企业的生产环境了。不再是个人开发者的"玩具",而是实实在在成为团队开发流程的一部分。

二、谷歌急了:布林亲自挂帅

据内部消息,谷歌联合创始人谢尔盖·布林亲自出马,组建了一支名为"striketeam"的秘密攻坚队,直指在编程领域崛起的 AI 公司 Anthropic。

重点来了:  布林亲自带队,这说明谷歌真的急了。

在编程领域,Anthropic 的 Claude 模型表现太过强势。从 Claude 3.5 到 Claude Opus 4.6,Claude 系列在代码生成、代码审查、Bug 修复等场景的表现,已经让很多开发者"叛变"到 Anthropic 这边。

而谷歌的 Gemini 模型,虽然技术实力不弱,但在编程这个细分场景上,始终差了那么一口气。

布林亲自带队,某种程度上是在"救火"。这位联合创始人的出山,说明 AI 编程已经成为各大科技公司的"必争之地"。

三、OpenAI Codex CLI:智能体编程时代来了

4月22日,OpenAI 在发布 GPT Images 2 的同时,其偷跑的 GPT-5.5 模型也出现在 Codex CLI 终端界面,显示为"最前沿的智能体编程模型"。

Codex CLI 是 OpenAI 在 AI 编程领域的核心产品。它和传统代码补全工具最大的区别在于:它不只是帮你写代码,而是能帮你完成任务。

具体来说,Codex CLI 能做什么?

① 自主任务执行:接收一个高层指令(如"修复这个 Bug"),自动分析代码、制定方案、执行修复。

② 多步骤复杂任务:能处理需要跨文件、跨模块的复杂重构任务。

③ 终端操作:直接在命令行环境中工作,和 Git、Shell 等工具无缝衔接。

④ Terminal-Bench 2.0 得分 82.7% :在评估真实命令行工作流能力的基准测试上,达到了当前最优水平。

四、国产工具集体围攻 Cursor

说完国外的,聊聊国产的。

Cursor 无疑是当前最火的 AI 编程 IDE 之一。它的成功在于产品体验做得极其出色——代码补全、对话式编程、多文件编辑等功能整合得非常顺畅。

但国产工具也没闲着。

① 阿里云通义灵码:在 Qwen 大模型加持下,代码生成质量稳步提升,特别在中文注释和中文命名方面有独特优势。

② 百度文心快码:依托文心大模型,在长代码生成和项目级理解方面表现不错。

③ 字节跳动 MarsCode:虽然是新进入者,但凭借字节的技术积累和内部海量代码数据,发展速度很快。

④ Kimi Code:月之暗面推出的编程工具,依托 Kimi K2.6 的强大代码能力,在 SWE-Bench Pro 等基准测试上表现惊艳。

五、我的观点总结

① AI编程工具正在从"辅助"走向"主角"

以前我们说 AI 编程工具是"辅助工具",帮你补全代码、提供建议。但现在,Codex CLI 这类产品已经可以独立完成复杂任务了——这意味着 AI 不只是"助手",而是开始成为"主角"。

这对程序员来说意味着什么?你的价值不在于写代码的速度,而在于解决问题的能力。

② 产品体验将成为核心竞争力

Cursor 的成功告诉我们:技术只是一方面,产品体验同样重要。一个好的 AI 编程工具,不只是模型能力强,还要整合得流畅、用起来顺手。

③ 开源生态是破局之道

Cursor 虽然闭源,但它支持接入各种外部模型。而开源社区也涌现了大量 AI 编程工具——比如 Continue、Cody 等。这种开放生态,让开发者可以根据自己的需求灵活选择。

④ 垂直领域的机会

通用编程工具竞争激烈,但在某些垂直领域,竞争才刚刚开始。比如前端专属的 AI 工具、测试专属的 AI 工具、数据分析专属的 AI 工具……这些细分赛道的潜力还没被完全挖掘。

最后说一句扎心的:

AI 编程工具越来越强大,我们程序员该怎么办?

我的答案是:拥抱它,而不是抗拒它。

AI 工具再强,也替代不了产品思维、系统设计能力和业务理解能力。把这些硬功夫练好,配合 AI 工具的效率提升,你才能真正变得不可替代。

AI 编程时代,你准备好了吗?

    • *

《免责声明:以上内容基于公开报道及个人经验撰写,纯属个人观察与观点。行业在变,勤劳致富的逻辑不变》

 一、准备环境

先确认你已经装了 Apache 和 Tomcat,还有编译工具(gcc、make 这些)。

# 安装编译工具和 Apache 开发包(httpd-devel 里有 apxs)
sudo yum install -y gcc make httpd-devel

二、解压源码包

安装包下载:https://pan.quark.cn/s/62d04e88b2fe,把下载好的 jakarta-tomcat-connectors-jk2-src-current.tar.gz放到一个目录,比如 /usr/local/src/,然后解压:

cd /usr/local/src/
tar zxvf jakarta-tomcat-connectors-jk2-src-current.tar.gz

解压后会生成一个文件夹,比如 jakarta-tomcat-connectors-jk2-src,名字可能带版本号,用 ls看看实际叫啥。

三、进入编译目录

进入解压后的 jk/native2目录(这是 JK2 的源码目录):

cd jakarta-tomcat-connectors-jk2-src/jk/native2

四、配置编译参数

运行配置脚本,指定 Apache 的 apxs路径(apxs 是 Apache 的扩展工具,一般在 /usr/sbin/apxs或 /usr/local/apache2/bin/apxs):

# 先找一下 apxs 在哪
which apxs
# 假设找到是 /usr/sbin/apxs,就执行:
./configure --with-apxs2=/usr/sbin/apxs

如果提示缺 libapr,就装 apr-devel

sudo yum install -y apr-devel apr-util-devel

五、编译并安装

配置完直接编译和安装:

make
make install

编译完成后,会在 Apache 的 modules 目录(比如 /etc/httpd/modules/或 /usr/local/apache2/modules/)生成 mod_jk2.so文件。

验证一下有没有生成:

ls /etc/httpd/modules/mod_jk2.so

六、配置 Apache 加载 JK2 模块

编辑 Apache 的配置文件 httpd.conf(一般在 /etc/httpd/conf/httpd.conf):

sudo vi /etc/httpd/conf/httpd.conf

在文件末尾加一行,加载 JK2 模块:

LoadModule jk2_module modules/mod_jk2.so

七、重启 Apache 生效

保存配置后重启 Apache:

sudo systemctl restart httpd

八、验证是否加载成功

查看 Apache 已加载的模块,确认 jk2_module在不在:

httpd -M | grep jk2

如果输出 jk2_module (shared),说明安装成功。

今天忙,想给家人约个顺风车(私享)回老家。

结果顺风车全被滴滴型司机占据了,还有私信加要感谢费,还有提出价格翻倍的(因为节假日?)还有防止被别的正常车主接单,接单立马取消的,之前的沟通全部作废。