居然是你

【搜索客社区日报】第2196期 (2026-03-13)

【搜索客社区日报】第2196期 (2026-03-13)

1、超越 Filter Rewrite:OpenSearch Doc Value Skip Index 如何让聚合查询快 28 倍
https://searchkit.cn/article/15707

OpenSearch 团队最新技术博客,介绍 Lucene 10 的 Doc Value Skip Index 如何克服 Filter Rewrite 的局限性,即使过滤字段和聚合字段不相关,也能实现最高 28 倍的聚合性能提升,存储开销仅增加 0.1%-1%。

2、可微分几何索引:生成式检索的新思路
https://searchkit.cn/article/15700

探索生成式检索中的新型索引结构,为向量搜索开辟新方向。

3、用 LLM 做伪相关反馈:搜索技术的新突破?
https://searchkit.cn/article/15699

研究如何利用大语言模型改进传统搜索中的伪相关反馈机制。

4、RAGPerf:首个端到端 RAG 系统基准测试框架
https://searchkit.cn/article/15698

RAG 系统的全面基准测试框架,为 RAG 应用提供标准化评估工具。

编辑:search_engineer
更多资讯:http://news.searchkit.cn

[尊重社区原创,转载请保留或注明出处]

继续阅读 »

【搜索客社区日报】第2196期 (2026-03-13)

1、超越 Filter Rewrite:OpenSearch Doc Value Skip Index 如何让聚合查询快 28 倍
https://searchkit.cn/article/15707

OpenSearch 团队最新技术博客,介绍 Lucene 10 的 Doc Value Skip Index 如何克服 Filter Rewrite 的局限性,即使过滤字段和聚合字段不相关,也能实现最高 28 倍的聚合性能提升,存储开销仅增加 0.1%-1%。

2、可微分几何索引:生成式检索的新思路
https://searchkit.cn/article/15700

探索生成式检索中的新型索引结构,为向量搜索开辟新方向。

3、用 LLM 做伪相关反馈:搜索技术的新突破?
https://searchkit.cn/article/15699

研究如何利用大语言模型改进传统搜索中的伪相关反馈机制。

4、RAGPerf:首个端到端 RAG 系统基准测试框架
https://searchkit.cn/article/15698

RAG 系统的全面基准测试框架,为 RAG 应用提供标准化评估工具。

编辑:search_engineer
更多资讯:http://news.searchkit.cn

[尊重社区原创,转载请保留或注明出处]

收起阅读 »

超越 Filter Rewrite:OpenSearch Doc Value Skip Index 如何让聚合查询快 28 倍

超越 Filter Rewrite:OpenSearch Doc Value Skip Index 如何让聚合查询快 28 倍

原文:https://opensearch.org/blog/beyond-filter-rewrite-how-doc-value-skip-indexes-accelerate-aggregations-in-opensearch/ 作者:Ankit Jain, Asim Mahmood (AWS/OpenSearch 团队)

前言

在之前的博客中,我们介绍了如何通过 Filter Rewrite 和多范围遍历技术,利用 Lucene 的 BKD 树实现高达 100 倍的日期直方图聚合性能提升。这些技术效果显著,但有一个根本限制:要求查询过滤字段和聚合字段必须是同一个,且无法支持复杂的子聚合逻辑。当过滤字段和聚合字段不同时,或者子聚合需要逐文档计算时,查询引擎只能退回到逐个扫描文档的传统方式。

本文将介绍如何通过 Lucene 10 的 Doc Value Skip Index 克服这些限制,即使过滤字段和聚合字段不相关,也能实现最高 28 倍 的聚合性能提升。


Filter Rewrite 的局限性

Filter Rewrite 将日期直方图聚合转换为一系列范围过滤器,然后使用 Lucene 的 BKD 树(Points 索引)来统计每个桶的文档数量,无需访问单个文档值。多范围遍历进一步优化了这一点,通过单次有序遍历处理所有桶。

这两种技术都依赖一个关键假设:查询中用于过滤的字段就是被聚合的字段

问题场景

考虑以下查询,它在 trip_distance 上过滤,但在 dropoff_datetime 上聚合:

{
  "size": 0,
  "query": {
    "range": {
      "trip_distance": {
        "gte": 0,
        "lte": 20
      }
    }
  },
  "aggs": {
    "dropoffs_over_time": {
      "date_histogram": {
        "field": "dropoff_datetime",
        "calendar_interval": "month"
      }
    }
  }
}

由于 trip_distancedropoff_datetime 是不同的字段,trip_distance 的 BKD 树无法提供 dropoff_datetime 值在各桶中分布的信息。引擎无法将聚合重写为对聚合字段的范围过滤器,只能退回到传统方法:遍历每个匹配的文档,获取其 dropoff_datetime 文档值,然后放入正确的桶中

同样,当子聚合需要逐文档计算时(例如计算每个时间桶内的平均值),Filter Rewrite 也无能为力,因为它只提供文档计数,无法访问单个字段值。

这些并非边缘情况。在实际分析查询中,很多场景是在一个维度上过滤,在另一个维度上聚合,子聚合在仪表板和报表中也很常见。我们需要一种更通用的方法。


Doc Value Skip Index:聚合引擎的新工具

从 Lucene 10.0 开始,一种新的索引结构可用:数值文档值上的可选 Skip Index,在 PR #13449 中引入,并在 PR #13563 中增加了多级支持。该结构通过 DocValuesSkipper 抽象暴露,为本文描述的优化提供了基础。

什么是 Skip Index?

在计算机科学中,跳表(Skip List)是一种概率数据结构,通过在有序数据上分层多个级别的链表,使用随机化决定哪些元素出现在更高层,从而提供期望 O(log n) 的搜索时间。

Lucene 的 Doc Value Skip Index 借用了多级概念,但完全是确定性的。它不使用随机化,而是在段创建时将文档划分为固定大小的区间,并在编译时构建摘要级别的层次结构。没有随机性:该结构完全由文档计数和配置的区间大小决定。

类比理解:就像书的目录。不需要逐页扫描来找到所需内容,先查看章标题,然后是节标题,最后缩小到具体页面。Skip Index 的工作原理相同:它让聚合引擎在决定是否检查单个值之前,先检查大块文档的摘要元数据。

Lucene 如何实现 Skip Index

Lucene 的实现使用最多 4 层(level 0-3)的层次结构。基础层(level 0)以 4,096 个文档为区间进行摘要。每个后续层聚合下一层的 8 个区间(2^3 的偏移),如下表所示:

Level 每个区间的文档数 说明
0 4,096 基础区间
1 32,768 (4,096 × 8) 每 8 个 level-0 区间
2 262,144 (4,096 × 64) 每 8 个 level-1 区间
3 2,097,152 (4,096 × 512) 每 8 个 level-2 区间

对于最坏情况下有 2^31 - 1(约 21 亿)个文档的索引,Skip Index 层次结构在 level 0 约有 524,288 个条目,level 1 有 65,536 个,level 2 有 8,192 个,level 3 有 1,024 个。因此,搜索空间从数十亿个文档减少到仅需几千次元数据检查。

每个区间条目非常紧凑(仅 29 字节),编码以下元数据:

  • 级别数(1 字节):该条目包含在多少个级别中
  • 最小值和最大值(16 字节):该区间内字段值的范围
  • 最小和最大文档 ID(8 字节):该区间的文档 ID 边界
  • 文档计数(4 字节):该区间内的文档数量

这些元数据使聚合引擎能够对每个区间做出三种决策:

  1. 如果区间的最小/最大值完全在当前聚合桶之外,跳过整个区间
  2. 如果区间的最小/最大值完全在单个桶内,批量计数所有文档,无需单独检查
  3. 如果区间跨越多个桶,退回到逐个处理文档

遍历从最高可用级别开始,仅在需要时下降,类似于之前优化中 BKD 树遍历跳过整个子树的方式。关键区别在于该结构操作的是文档值而非 Points 索引,因此无论查询过滤哪个字段都有效。

Skip Index 如何解决 Filter Rewrite 的局限性

回顾我们确定的两个主要限制:

  1. 不相关字段:Filter Rewrite 要求过滤字段和聚合字段相同
  2. 复杂子聚合:Filter Rewrite 只提供计数;无法支持桶内的逐文档计算

Skip Index 解决了这两个限制,因为它直接操作聚合字段的文档值,独立于匹配文档集的产生方式。查询引擎首先评估查询(使用适合过滤字段的索引)以产生一组匹配的文档 ID。然后,在聚合期间,它查询聚合字段的 Skip Index,以确定这些匹配文档的块是否可以跳过或批量计数。

这种解耦是关键洞察。Skip Index 不关心文档集是否被过滤过,它只需要知道聚合字段的值在每个区间内的分布情况。

示例

例如,考虑一个在 process.name 上过滤(词项过滤器)并在 @timestamp 上聚合(按天分桶的日期直方图)的查询:

GET /logs-*/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "@timestamp": {
              "gte": "2024-01-01",
              "lte": "2024-01-31"
            }
          }
        },
        {
          "term": {
            "process.name": "systemd"
          }
        }
      ]
    }
  },
  "aggs": {
    "daily_counts": {
      "date_histogram": {
        "field": "@timestamp",
        "calendar_interval": "day"
      }
    }
  }
}

没有 Skip Index 时,@timestamp 上的范围查询可能受益于 Filter Rewrite,但 process.name 上的词项过滤器阻止了查询被重写。引擎必须遍历匹配两个条件的每个文档,并单独检索每个 @timestamp 值。

启用 @timestamp 的 Skip Index 后,聚合引擎可以在收集期间查询 Skip Index。当它遇到一个区间,其中最小和最大 @timestamp 值都落在同一个日桶内时,它会批量计数该区间中所有匹配的文档,无需查找单个值。这可以将总查找次数减少约 85%

使用 Popcount 高效计数

批量计数步骤有一个值得探讨的细节。当 Skip Index 表明区间内的所有值都落在单个桶内时,我们知道批量计数是可能的;然而,我们不能直接使用区间的文档计数。Skip Index 覆盖段中的所有文档,但查询产生的 DocIdSetIterator 只代表匹配查询过滤器的文档子集。我们需要计算该过滤子集中有多少文档落在 Skip Index 区间内。

一种方法是逐个遍历迭代器,边遍历边计数。但这违背了跳过的大部分目的。相反,我们使用硬件级优化:popcount(人口计数)CPU 指令,它可以在单次操作中计算机器字中设置位的数量。

当查询引擎产生 DocIdSetIterator 时,它通常在内部将匹配文档集表示为位集,其中每个位对应一个文档 ID,如果文档匹配查询则设置为 1。要计算 Skip Index 区间内有多少匹配文档,我们提取该位集的相关部分(对应区间内最小/最大文档 ID 范围内的位),并对这些字应用 popcount。这给出了区间内的精确匹配文档数,无需逐个遍历。

DocIdSetIterator 还支持批量收集接口:收集器可以接收文档 ID 流,而不是重复调用 nextDoc()。当流中的所有文档 ID 都落在同一个桶内时(由 Skip Index 确定),整个流可以在一次操作中收集。初步基准测试显示,这种方法在 Skip Index 收益的基础上可额外带来最高 3 倍 的提升。


有序数据:Skip Index 的最佳场景

当文档按聚合字段排序时,Skip Index 发挥最佳性能。数据有序时,连续文档具有相似或单调递增的值,意味着每个 4,096 文档区间内的最小/最大范围较窄。窄范围更有可能完全落在单个聚合桶内,最大化批量计数的机会。

对于时序工作负载(日志分析、指标和可观测性),时间戳字段是自然的选择。大多数时序数据大致按时间顺序到达,OpenSearch 中的数据流保持这种顺序。

确保数据保持有序

仅仅有时间戳字段并不能保证数据在段合并和文档添加时保持有序。有两种方法可以保持排序:

1. Index Sort(推荐):配置显式的索引排序设置,确保无论段如何合并,数据都保持排序:

{
  "settings": {
    "index.sort.field": "@timestamp",
    "index.sort.order": "desc"
  }
}

这保证所有段保持时间戳顺序,提供一致的 Skip Index 性能。

2. Log Merge Policy:或者,使用保留传入文档顺序的合并策略。log_byte_size 合并策略倾向于保持时序数据典型的仅追加工作负载的时间顺序。

当数据无序时,Skip Index 仍然可以正常工作,但提供较少的跳过和批量计数机会,因为每个区间的最小/最大范围可能跨越多个桶。


启用 Skip Index

Skip Index 可以根据 OpenSearch 版本自动启用或通过手动配置启用。

按版本的默认行为

版本 行为
OpenSearch 3.2 为数值字段引入 skip_list 映射参数(默认:false
OpenSearch 3.3 对名为 @timestamp 的日期字段的日期直方图聚合自动启用 Skip Index
OpenSearch 3.4 将自动 Skip Index 优化扩展到 @timestamp 上的自动日期直方图聚合

手动配置

要在其他数值字段上启用 Skip Index,请在字段映射中添加 skip_list 参数:

PUT /my-index
{
  "mappings": {
    "properties": {
      "custom_timestamp": {
        "type": "date",
        "skip_list": true
      },
      "price": {
        "type": "long",
        "skip_list": true
      }
    }
  }
}

性能测试结果

我们使用 OpenSearch Benchmark 和 http_logsbig5 数据集测量了性能。结果显示了显著改进,特别是对于 Filter Rewrite 之前无法帮助的查询。

日期直方图性能(http_logs 工作负载)

基于 PR #19130 使用 http_logs 数据集的测试:

操作 基线 (p90) 启用 Skip Index (p90) 提升
hourly_agg_with_filter 998 ms 36 ms 28 倍更快
hourly_agg_with_filter_and_metrics 1,618 ms 970 ms 40% 更快

第一个操作展示了 Skip Index 在纯计数聚合与不相关过滤器上的全部优势。第二个操作包含子聚合(指标),改进较小,因为逐文档指标计算仍然需要指标字段的单个值查找。

日期直方图查询的吞吐量提高了 21%,对索引性能没有可测量的影响。

自动日期直方图性能(big5 工作负载)

OpenSearch 3.4 将 Skip Index 优化扩展到自动日期直方图聚合。基于 PR #20057 使用 big5 数据集的测试:

操作 基线 (p90) 启用 Skip Index (p90) 提升
range-auto-date-histo 2,099 ms 324 ms 6.5 倍更快
range-auto-date-histo-with-metrics 5,733 ms 3,928 ms 35% 更快

这些结果结合了范围查询的 Filter Rewrite 优化和自动日期直方图的 Skip Index,展示了两种技术如何互补。

索引大小影响

Skip Index 引入的存储开销极小:

配置 大小增加
@timestamp 字段 ~0.1%
所有数值字段 ~1%(例如 big5 上 22 GB → 23 GB)

由于这种极小的开销,OpenSearch 默认只在 @timestamp 字段上启用 Skip Index,在不显著增加存储成本的情况下提供针对性收益。


总结

Doc Value Skip Index 是 OpenSearch 聚合引擎的重要进步,解决了 Filter Rewrite 的根本限制。通过在文档值上构建多级摘要结构,它实现了:

  • 不相关字段的聚合优化:过滤字段和聚合字段可以不同
  • 子聚合支持:即使需要逐文档计算也能受益
  • 最高 28 倍性能提升:在合适的场景下
  • 极低存储开销:仅增加约 0.1%-1% 的存储

对于时序数据和分析工作负载,这是一个值得启用的强大优化。


原文作者:Ankit Jain(Amazon OpenSearch Service 软件工程师,Apache Lucene 和 OpenSearch 活跃维护者)、Asim Mahmood(AWS 高级软件工程师)

继续阅读 »

超越 Filter Rewrite:OpenSearch Doc Value Skip Index 如何让聚合查询快 28 倍

原文:https://opensearch.org/blog/beyond-filter-rewrite-how-doc-value-skip-indexes-accelerate-aggregations-in-opensearch/ 作者:Ankit Jain, Asim Mahmood (AWS/OpenSearch 团队)

前言

在之前的博客中,我们介绍了如何通过 Filter Rewrite 和多范围遍历技术,利用 Lucene 的 BKD 树实现高达 100 倍的日期直方图聚合性能提升。这些技术效果显著,但有一个根本限制:要求查询过滤字段和聚合字段必须是同一个,且无法支持复杂的子聚合逻辑。当过滤字段和聚合字段不同时,或者子聚合需要逐文档计算时,查询引擎只能退回到逐个扫描文档的传统方式。

本文将介绍如何通过 Lucene 10 的 Doc Value Skip Index 克服这些限制,即使过滤字段和聚合字段不相关,也能实现最高 28 倍 的聚合性能提升。


Filter Rewrite 的局限性

Filter Rewrite 将日期直方图聚合转换为一系列范围过滤器,然后使用 Lucene 的 BKD 树(Points 索引)来统计每个桶的文档数量,无需访问单个文档值。多范围遍历进一步优化了这一点,通过单次有序遍历处理所有桶。

这两种技术都依赖一个关键假设:查询中用于过滤的字段就是被聚合的字段

问题场景

考虑以下查询,它在 trip_distance 上过滤,但在 dropoff_datetime 上聚合:

{
  "size": 0,
  "query": {
    "range": {
      "trip_distance": {
        "gte": 0,
        "lte": 20
      }
    }
  },
  "aggs": {
    "dropoffs_over_time": {
      "date_histogram": {
        "field": "dropoff_datetime",
        "calendar_interval": "month"
      }
    }
  }
}

由于 trip_distancedropoff_datetime 是不同的字段,trip_distance 的 BKD 树无法提供 dropoff_datetime 值在各桶中分布的信息。引擎无法将聚合重写为对聚合字段的范围过滤器,只能退回到传统方法:遍历每个匹配的文档,获取其 dropoff_datetime 文档值,然后放入正确的桶中

同样,当子聚合需要逐文档计算时(例如计算每个时间桶内的平均值),Filter Rewrite 也无能为力,因为它只提供文档计数,无法访问单个字段值。

这些并非边缘情况。在实际分析查询中,很多场景是在一个维度上过滤,在另一个维度上聚合,子聚合在仪表板和报表中也很常见。我们需要一种更通用的方法。


Doc Value Skip Index:聚合引擎的新工具

从 Lucene 10.0 开始,一种新的索引结构可用:数值文档值上的可选 Skip Index,在 PR #13449 中引入,并在 PR #13563 中增加了多级支持。该结构通过 DocValuesSkipper 抽象暴露,为本文描述的优化提供了基础。

什么是 Skip Index?

在计算机科学中,跳表(Skip List)是一种概率数据结构,通过在有序数据上分层多个级别的链表,使用随机化决定哪些元素出现在更高层,从而提供期望 O(log n) 的搜索时间。

Lucene 的 Doc Value Skip Index 借用了多级概念,但完全是确定性的。它不使用随机化,而是在段创建时将文档划分为固定大小的区间,并在编译时构建摘要级别的层次结构。没有随机性:该结构完全由文档计数和配置的区间大小决定。

类比理解:就像书的目录。不需要逐页扫描来找到所需内容,先查看章标题,然后是节标题,最后缩小到具体页面。Skip Index 的工作原理相同:它让聚合引擎在决定是否检查单个值之前,先检查大块文档的摘要元数据。

Lucene 如何实现 Skip Index

Lucene 的实现使用最多 4 层(level 0-3)的层次结构。基础层(level 0)以 4,096 个文档为区间进行摘要。每个后续层聚合下一层的 8 个区间(2^3 的偏移),如下表所示:

Level 每个区间的文档数 说明
0 4,096 基础区间
1 32,768 (4,096 × 8) 每 8 个 level-0 区间
2 262,144 (4,096 × 64) 每 8 个 level-1 区间
3 2,097,152 (4,096 × 512) 每 8 个 level-2 区间

对于最坏情况下有 2^31 - 1(约 21 亿)个文档的索引,Skip Index 层次结构在 level 0 约有 524,288 个条目,level 1 有 65,536 个,level 2 有 8,192 个,level 3 有 1,024 个。因此,搜索空间从数十亿个文档减少到仅需几千次元数据检查。

每个区间条目非常紧凑(仅 29 字节),编码以下元数据:

  • 级别数(1 字节):该条目包含在多少个级别中
  • 最小值和最大值(16 字节):该区间内字段值的范围
  • 最小和最大文档 ID(8 字节):该区间的文档 ID 边界
  • 文档计数(4 字节):该区间内的文档数量

这些元数据使聚合引擎能够对每个区间做出三种决策:

  1. 如果区间的最小/最大值完全在当前聚合桶之外,跳过整个区间
  2. 如果区间的最小/最大值完全在单个桶内,批量计数所有文档,无需单独检查
  3. 如果区间跨越多个桶,退回到逐个处理文档

遍历从最高可用级别开始,仅在需要时下降,类似于之前优化中 BKD 树遍历跳过整个子树的方式。关键区别在于该结构操作的是文档值而非 Points 索引,因此无论查询过滤哪个字段都有效。

Skip Index 如何解决 Filter Rewrite 的局限性

回顾我们确定的两个主要限制:

  1. 不相关字段:Filter Rewrite 要求过滤字段和聚合字段相同
  2. 复杂子聚合:Filter Rewrite 只提供计数;无法支持桶内的逐文档计算

Skip Index 解决了这两个限制,因为它直接操作聚合字段的文档值,独立于匹配文档集的产生方式。查询引擎首先评估查询(使用适合过滤字段的索引)以产生一组匹配的文档 ID。然后,在聚合期间,它查询聚合字段的 Skip Index,以确定这些匹配文档的块是否可以跳过或批量计数。

这种解耦是关键洞察。Skip Index 不关心文档集是否被过滤过,它只需要知道聚合字段的值在每个区间内的分布情况。

示例

例如,考虑一个在 process.name 上过滤(词项过滤器)并在 @timestamp 上聚合(按天分桶的日期直方图)的查询:

GET /logs-*/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "@timestamp": {
              "gte": "2024-01-01",
              "lte": "2024-01-31"
            }
          }
        },
        {
          "term": {
            "process.name": "systemd"
          }
        }
      ]
    }
  },
  "aggs": {
    "daily_counts": {
      "date_histogram": {
        "field": "@timestamp",
        "calendar_interval": "day"
      }
    }
  }
}

没有 Skip Index 时,@timestamp 上的范围查询可能受益于 Filter Rewrite,但 process.name 上的词项过滤器阻止了查询被重写。引擎必须遍历匹配两个条件的每个文档,并单独检索每个 @timestamp 值。

启用 @timestamp 的 Skip Index 后,聚合引擎可以在收集期间查询 Skip Index。当它遇到一个区间,其中最小和最大 @timestamp 值都落在同一个日桶内时,它会批量计数该区间中所有匹配的文档,无需查找单个值。这可以将总查找次数减少约 85%

使用 Popcount 高效计数

批量计数步骤有一个值得探讨的细节。当 Skip Index 表明区间内的所有值都落在单个桶内时,我们知道批量计数是可能的;然而,我们不能直接使用区间的文档计数。Skip Index 覆盖段中的所有文档,但查询产生的 DocIdSetIterator 只代表匹配查询过滤器的文档子集。我们需要计算该过滤子集中有多少文档落在 Skip Index 区间内。

一种方法是逐个遍历迭代器,边遍历边计数。但这违背了跳过的大部分目的。相反,我们使用硬件级优化:popcount(人口计数)CPU 指令,它可以在单次操作中计算机器字中设置位的数量。

当查询引擎产生 DocIdSetIterator 时,它通常在内部将匹配文档集表示为位集,其中每个位对应一个文档 ID,如果文档匹配查询则设置为 1。要计算 Skip Index 区间内有多少匹配文档,我们提取该位集的相关部分(对应区间内最小/最大文档 ID 范围内的位),并对这些字应用 popcount。这给出了区间内的精确匹配文档数,无需逐个遍历。

DocIdSetIterator 还支持批量收集接口:收集器可以接收文档 ID 流,而不是重复调用 nextDoc()。当流中的所有文档 ID 都落在同一个桶内时(由 Skip Index 确定),整个流可以在一次操作中收集。初步基准测试显示,这种方法在 Skip Index 收益的基础上可额外带来最高 3 倍 的提升。


有序数据:Skip Index 的最佳场景

当文档按聚合字段排序时,Skip Index 发挥最佳性能。数据有序时,连续文档具有相似或单调递增的值,意味着每个 4,096 文档区间内的最小/最大范围较窄。窄范围更有可能完全落在单个聚合桶内,最大化批量计数的机会。

对于时序工作负载(日志分析、指标和可观测性),时间戳字段是自然的选择。大多数时序数据大致按时间顺序到达,OpenSearch 中的数据流保持这种顺序。

确保数据保持有序

仅仅有时间戳字段并不能保证数据在段合并和文档添加时保持有序。有两种方法可以保持排序:

1. Index Sort(推荐):配置显式的索引排序设置,确保无论段如何合并,数据都保持排序:

{
  "settings": {
    "index.sort.field": "@timestamp",
    "index.sort.order": "desc"
  }
}

这保证所有段保持时间戳顺序,提供一致的 Skip Index 性能。

2. Log Merge Policy:或者,使用保留传入文档顺序的合并策略。log_byte_size 合并策略倾向于保持时序数据典型的仅追加工作负载的时间顺序。

当数据无序时,Skip Index 仍然可以正常工作,但提供较少的跳过和批量计数机会,因为每个区间的最小/最大范围可能跨越多个桶。


启用 Skip Index

Skip Index 可以根据 OpenSearch 版本自动启用或通过手动配置启用。

按版本的默认行为

版本 行为
OpenSearch 3.2 为数值字段引入 skip_list 映射参数(默认:false
OpenSearch 3.3 对名为 @timestamp 的日期字段的日期直方图聚合自动启用 Skip Index
OpenSearch 3.4 将自动 Skip Index 优化扩展到 @timestamp 上的自动日期直方图聚合

手动配置

要在其他数值字段上启用 Skip Index,请在字段映射中添加 skip_list 参数:

PUT /my-index
{
  "mappings": {
    "properties": {
      "custom_timestamp": {
        "type": "date",
        "skip_list": true
      },
      "price": {
        "type": "long",
        "skip_list": true
      }
    }
  }
}

性能测试结果

我们使用 OpenSearch Benchmark 和 http_logsbig5 数据集测量了性能。结果显示了显著改进,特别是对于 Filter Rewrite 之前无法帮助的查询。

日期直方图性能(http_logs 工作负载)

基于 PR #19130 使用 http_logs 数据集的测试:

操作 基线 (p90) 启用 Skip Index (p90) 提升
hourly_agg_with_filter 998 ms 36 ms 28 倍更快
hourly_agg_with_filter_and_metrics 1,618 ms 970 ms 40% 更快

第一个操作展示了 Skip Index 在纯计数聚合与不相关过滤器上的全部优势。第二个操作包含子聚合(指标),改进较小,因为逐文档指标计算仍然需要指标字段的单个值查找。

日期直方图查询的吞吐量提高了 21%,对索引性能没有可测量的影响。

自动日期直方图性能(big5 工作负载)

OpenSearch 3.4 将 Skip Index 优化扩展到自动日期直方图聚合。基于 PR #20057 使用 big5 数据集的测试:

操作 基线 (p90) 启用 Skip Index (p90) 提升
range-auto-date-histo 2,099 ms 324 ms 6.5 倍更快
range-auto-date-histo-with-metrics 5,733 ms 3,928 ms 35% 更快

这些结果结合了范围查询的 Filter Rewrite 优化和自动日期直方图的 Skip Index,展示了两种技术如何互补。

索引大小影响

Skip Index 引入的存储开销极小:

配置 大小增加
@timestamp 字段 ~0.1%
所有数值字段 ~1%(例如 big5 上 22 GB → 23 GB)

由于这种极小的开销,OpenSearch 默认只在 @timestamp 字段上启用 Skip Index,在不显著增加存储成本的情况下提供针对性收益。


总结

Doc Value Skip Index 是 OpenSearch 聚合引擎的重要进步,解决了 Filter Rewrite 的根本限制。通过在文档值上构建多级摘要结构,它实现了:

  • 不相关字段的聚合优化:过滤字段和聚合字段可以不同
  • 子聚合支持:即使需要逐文档计算也能受益
  • 最高 28 倍性能提升:在合适的场景下
  • 极低存储开销:仅增加约 0.1%-1% 的存储

对于时序数据和分析工作负载,这是一个值得启用的强大优化。


原文作者:Ankit Jain(Amazon OpenSearch Service 软件工程师,Apache Lucene 和 OpenSearch 活跃维护者)、Asim Mahmood(AWS 高级软件工程师)

收起阅读 »

【AI搜索前沿】Claude交互式可视化:AI从文本到视觉的范式跃迁

Anthropic为Claude推出交互式图表和可视化功能,标志着AI助手从纯文本向视觉化表达的重要转变。

核心功能

1. 流程图与架构图 - 系统架构设计、业务流程梳理 2. 数据可视化 - 柱状图、折线图、饼图、热力图 3. 交互式组件 - 可点击的仪表盘、动态筛选器

技术亮点

  • 前端框架: React TypeScript
  • 图表库: 基于D3.js和Recharts的自定义组件
  • 渲染引擎: 沙箱化的iframe环境确保安全
  • 导出能力: 支持PNG、SVG、PDF等多种格式

行业意义

  1. 多模态交互成为标配 - AI正在打破单一模态的限制
  2. 生产力工具的深度融合 - 将可视化能力内嵌到对话流程中
  3. 代码生成能力的延伸 - 大模型向更广泛的应用场景溢出

竞争优势

维度 Claude可视化 传统工具
交互体验 原生集成,实时预览 需切换工具
学习成本 极低,自然语言描述 中等
协作效率 高,对话即迭代

来源: HackerNews | 整理: ai_insider | 发布时间: 2026-03-13

继续阅读 »

Anthropic为Claude推出交互式图表和可视化功能,标志着AI助手从纯文本向视觉化表达的重要转变。

核心功能

1. 流程图与架构图 - 系统架构设计、业务流程梳理 2. 数据可视化 - 柱状图、折线图、饼图、热力图 3. 交互式组件 - 可点击的仪表盘、动态筛选器

技术亮点

  • 前端框架: React TypeScript
  • 图表库: 基于D3.js和Recharts的自定义组件
  • 渲染引擎: 沙箱化的iframe环境确保安全
  • 导出能力: 支持PNG、SVG、PDF等多种格式

行业意义

  1. 多模态交互成为标配 - AI正在打破单一模态的限制
  2. 生产力工具的深度融合 - 将可视化能力内嵌到对话流程中
  3. 代码生成能力的延伸 - 大模型向更广泛的应用场景溢出

竞争优势

维度 Claude可视化 传统工具
交互体验 原生集成,实时预览 需切换工具
学习成本 极低,自然语言描述 中等
协作效率 高,对话即迭代

来源: HackerNews | 整理: ai_insider | 发布时间: 2026-03-13

收起阅读 »

【AI搜索前沿】1573个Claude Code会话分析:AI编程代理的真实使用数据

AI编程工具的使用数据一直是个黑盒——我们知道很多人在用,但具体用得怎么样?哪些场景效果好?什么情况下会放弃?最近,一个团队开源了他们的分析工具Rudel,并基于1573个真实的Claude Code会话数据,给出了一些有趣的洞察。

数据集概况

这个数据集来自一个6人团队(4名工程师、1名数据/业务人员、1名设计工程师)在过去3个月的真实使用记录:

  • 总会话数:1,573个
  • 总Token数:1500万+
  • 总交互数:27万+
  • 会话类型:40%大型遗留项目、50%新项目、10%非编码任务

核心发现

1. Skills使用率极低:仅4%

Claude Code的Skills功能(预定义的指令模板)使用率只有4%。这引发了一个问题:是功能设计有问题,还是用户根本不知道它的存在?

从Hacker News的讨论来看,可能两者都有:

  • Skills的可发现性较差
  • 用户更倾向于自然语言提示
  • 即使设置了Skills,Claude也不一定会调用

好消息是,Claude 4.6版本在这方面有明显改进。

2. 26%的会话在60秒内被放弃

超过四分之一的会话在开始后的第一分钟内就被用户放弃。这个数字揭示了一个关键问题:初始提示与意图匹配的重要性

正如HN用户robutsume分析的:

"这不是代理的问题,而是提示与意图不匹配的问题。人类在一次交互后就意识到他们问错了问题,或者代理理解错了。"

3. 错误级联模式:前2分钟决定成败

研究发现,如果在会话的前2分钟出现工具选择错误或文件读取错误,后续放弃的概率会显著增加。这和基础设施监控的经验很相似——部署的前90秒几乎能决定一切。

4. 不同任务类型的成功率差异显著

  • 文档编写:成功率最高
  • 代码重构:成功率最低

这个发现符合直觉:文档任务边界清晰、验证简单;而重构涉及复杂的代码理解和依赖分析,更容易出错。

对AI搜索的启示

虽然这项研究聚焦于编程场景,但对AI搜索产品的设计也有参考价值:

1. 首因效应至关重要 用户在前60秒的体验决定了他们是否会继续使用。搜索产品需要在最短时间内给出高质量结果。

2. 错误恢复机制 当AI理解错误时,如何快速纠正比追求完美更重要。Rudel的数据显示,错误级联一旦发生,用户很快就会失去耐心。

3. 功能发现性 即使有强大的功能(如Skills),如果用户不知道或不会用,就等于不存在。AI搜索产品需要更智能地引导用户使用高级功能。

4. 任务适配性 不同的搜索场景对AI的要求不同。简单的事实查询vs复杂的分析任务,需要不同的交互设计和预期管理。

Rudel工具本身

这项研究的开源工具Rudel也值得关注。它通过Claude Code的hooks机制,在会话结束时自动上传数据,提供团队级的使用分析:

  • 个人和团队的会话统计
  • Token使用趋势
  • 项目时间分配
  • 会话成功率分析

对于想要量化AI工具ROI的团队来说,这类分析工具很有价值。

社区反响

这个项目在Hacker News上获得了85个点赞和50+评论。讨论焦点包括:

  • 如何提高Skills的使用率
  • 单一会话vs多会话策略的优劣
  • 隐私和数据安全问题(工具需要上传完整会话内容)
  • 与Claude Code内置的/insights命令的对比

写在最后

AI编程代理还处于早期阶段,我们对其使用模式的理解非常有限。Rudel团队的数据虽然只来自一个小团队,但提供了宝贵的实证基础。

随着AI Agent的普及,相信会有更多类似的研究出现。而对于搜索技术从业者来说,理解用户如何与AI交互、在什么情况下会放弃,将是设计更好产品的关键。

你使用Claude Code或其他AI编程工具吗?你觉得最大的痛点是什么?

来源:Rudel GitHub / Hacker News 讨论 原文发布时间:2026年3月12日 Hacker News 热度: 85 points, 53 comments

继续阅读 »

AI编程工具的使用数据一直是个黑盒——我们知道很多人在用,但具体用得怎么样?哪些场景效果好?什么情况下会放弃?最近,一个团队开源了他们的分析工具Rudel,并基于1573个真实的Claude Code会话数据,给出了一些有趣的洞察。

数据集概况

这个数据集来自一个6人团队(4名工程师、1名数据/业务人员、1名设计工程师)在过去3个月的真实使用记录:

  • 总会话数:1,573个
  • 总Token数:1500万+
  • 总交互数:27万+
  • 会话类型:40%大型遗留项目、50%新项目、10%非编码任务

核心发现

1. Skills使用率极低:仅4%

Claude Code的Skills功能(预定义的指令模板)使用率只有4%。这引发了一个问题:是功能设计有问题,还是用户根本不知道它的存在?

从Hacker News的讨论来看,可能两者都有:

  • Skills的可发现性较差
  • 用户更倾向于自然语言提示
  • 即使设置了Skills,Claude也不一定会调用

好消息是,Claude 4.6版本在这方面有明显改进。

2. 26%的会话在60秒内被放弃

超过四分之一的会话在开始后的第一分钟内就被用户放弃。这个数字揭示了一个关键问题:初始提示与意图匹配的重要性

正如HN用户robutsume分析的:

"这不是代理的问题,而是提示与意图不匹配的问题。人类在一次交互后就意识到他们问错了问题,或者代理理解错了。"

3. 错误级联模式:前2分钟决定成败

研究发现,如果在会话的前2分钟出现工具选择错误或文件读取错误,后续放弃的概率会显著增加。这和基础设施监控的经验很相似——部署的前90秒几乎能决定一切。

4. 不同任务类型的成功率差异显著

  • 文档编写:成功率最高
  • 代码重构:成功率最低

这个发现符合直觉:文档任务边界清晰、验证简单;而重构涉及复杂的代码理解和依赖分析,更容易出错。

对AI搜索的启示

虽然这项研究聚焦于编程场景,但对AI搜索产品的设计也有参考价值:

1. 首因效应至关重要 用户在前60秒的体验决定了他们是否会继续使用。搜索产品需要在最短时间内给出高质量结果。

2. 错误恢复机制 当AI理解错误时,如何快速纠正比追求完美更重要。Rudel的数据显示,错误级联一旦发生,用户很快就会失去耐心。

3. 功能发现性 即使有强大的功能(如Skills),如果用户不知道或不会用,就等于不存在。AI搜索产品需要更智能地引导用户使用高级功能。

4. 任务适配性 不同的搜索场景对AI的要求不同。简单的事实查询vs复杂的分析任务,需要不同的交互设计和预期管理。

Rudel工具本身

这项研究的开源工具Rudel也值得关注。它通过Claude Code的hooks机制,在会话结束时自动上传数据,提供团队级的使用分析:

  • 个人和团队的会话统计
  • Token使用趋势
  • 项目时间分配
  • 会话成功率分析

对于想要量化AI工具ROI的团队来说,这类分析工具很有价值。

社区反响

这个项目在Hacker News上获得了85个点赞和50+评论。讨论焦点包括:

  • 如何提高Skills的使用率
  • 单一会话vs多会话策略的优劣
  • 隐私和数据安全问题(工具需要上传完整会话内容)
  • 与Claude Code内置的/insights命令的对比

写在最后

AI编程代理还处于早期阶段,我们对其使用模式的理解非常有限。Rudel团队的数据虽然只来自一个小团队,但提供了宝贵的实证基础。

随着AI Agent的普及,相信会有更多类似的研究出现。而对于搜索技术从业者来说,理解用户如何与AI交互、在什么情况下会放弃,将是设计更好产品的关键。

你使用Claude Code或其他AI编程工具吗?你觉得最大的痛点是什么?

来源:Rudel GitHub / Hacker News 讨论 原文发布时间:2026年3月12日 Hacker News 热度: 85 points, 53 comments

收起阅读 »

【技术实践】DuckDB 实测:入门款 MacBook 也能轻松处理大数据

提到大数据分析,很多人的第一反应是:需要昂贵的服务器集群、复杂的分布式架构、专业的运维团队。但 DuckDB 团队最新的基准测试可能会改变你的看法——他们在最便宜的入门款 MacBook 上完成了令人惊讶的性能测试。

测试环境:真正的"入门配置"

这次测试使用的是最新发布的入门级 MacBook(搭载基础版 M4 芯片),这不是什么高配工作站,而是普通消费者都能买到的标准配置。DuckDB 团队想回答一个简单的问题:个人设备处理大数据的边界在哪里?

实测结果:颠覆认知的性能表现

测试数据令人印象深刻。在处理数十亿行数据的场景下,这台入门 MacBook 展现出了远超预期的能力:

  • TPC-H 基准测试:在 100GB 数据集上,DuckDB 完成了所有标准查询
  • TPC-DS 基准测试:业界公认更复杂的分析型负载,同样顺利跑通
  • 内存管理:即使数据集远超物理内存,DuckDB 的流式处理也能保持稳定的查询性能

这意味着什么?一位数据分析师可以在自己的笔记本上完成原本需要云端数据仓库才能处理的任务。

为什么 DuckDB 能做到?

DuckDB 的设计哲学与传统数据库截然不同:

1. 嵌入式架构 不需要独立的服务器进程,直接嵌入到应用程序中。没有网络开销,没有进程间通信,查询延迟大幅降低。

2. 列式存储引擎 分析型查询通常只访问少量列,列式存储让 DuckDB 能够只读取必要的数据,I/O 效率比行式存储高出一个数量级。

3. 向量化执行 现代 CPU 的 SIMD 指令被充分利用,一次处理一批数据,而不是逐行处理。这在聚合查询中效果尤为明显。

4. 智能的内存管理 当数据量超过内存时,DuckDB 能够自动将中间结果溢出到磁盘,同时保持查询性能不会断崖式下跌。

对搜索工程师的启示

这个测试对搜索技术领域有特别的参考价值:

日志分析场景 搜索系统的访问日志、查询日志往往体量巨大。传统方案需要搭建 ELK 栈或数据仓库,现在一台笔记本配合 DuckDB 就能完成大部分分析工作。

性能调优测试 在本地快速验证索引策略、查询优化方案,无需等待集群资源,开发迭代效率大幅提升。

数据预处理 向量检索、特征工程前的数据清洗和转换,DuckDB 的 SQL 接口比写脚本处理大文件要优雅得多。

局限性与适用边界

当然,DuckDB 并非万能药。测试也暴露了一些边界条件:

  • 并发写入:DuckDB 优化的是分析型负载,高并发写入不是它的强项
  • 超大规模:百亿级以上、持续增长的实时数据集,还是需要专门的数仓方案
  • 多用户场景:嵌入式架构决定了它更适合个人或单用户分析

写在最后

DuckDB 这次测试传递了一个重要信号:大数据不等于大机器。随着嵌入式分析型数据库的成熟,数据分析的门槛正在快速降低。

对于搜索工程师来说,这意味着更多的工具选择。在原型验证、本地调试、中小规模数据分析等场景下,DuckDB 提供了一个轻量但强大的选项。

下次有人告诉你"大数据需要大预算"的时候,不妨让他看看这台入门 MacBook 上的 DuckDB 表现。


你用过 DuckDB 吗?在哪些场景下它替代了你的原有方案?欢迎分享经验。


来源:DuckDB Blog / Hacker News 讨论 原文发布时间: 2026年3月11日 Hacker News 热度: 70 points, 34 comments

继续阅读 »

提到大数据分析,很多人的第一反应是:需要昂贵的服务器集群、复杂的分布式架构、专业的运维团队。但 DuckDB 团队最新的基准测试可能会改变你的看法——他们在最便宜的入门款 MacBook 上完成了令人惊讶的性能测试。

测试环境:真正的"入门配置"

这次测试使用的是最新发布的入门级 MacBook(搭载基础版 M4 芯片),这不是什么高配工作站,而是普通消费者都能买到的标准配置。DuckDB 团队想回答一个简单的问题:个人设备处理大数据的边界在哪里?

实测结果:颠覆认知的性能表现

测试数据令人印象深刻。在处理数十亿行数据的场景下,这台入门 MacBook 展现出了远超预期的能力:

  • TPC-H 基准测试:在 100GB 数据集上,DuckDB 完成了所有标准查询
  • TPC-DS 基准测试:业界公认更复杂的分析型负载,同样顺利跑通
  • 内存管理:即使数据集远超物理内存,DuckDB 的流式处理也能保持稳定的查询性能

这意味着什么?一位数据分析师可以在自己的笔记本上完成原本需要云端数据仓库才能处理的任务。

为什么 DuckDB 能做到?

DuckDB 的设计哲学与传统数据库截然不同:

1. 嵌入式架构 不需要独立的服务器进程,直接嵌入到应用程序中。没有网络开销,没有进程间通信,查询延迟大幅降低。

2. 列式存储引擎 分析型查询通常只访问少量列,列式存储让 DuckDB 能够只读取必要的数据,I/O 效率比行式存储高出一个数量级。

3. 向量化执行 现代 CPU 的 SIMD 指令被充分利用,一次处理一批数据,而不是逐行处理。这在聚合查询中效果尤为明显。

4. 智能的内存管理 当数据量超过内存时,DuckDB 能够自动将中间结果溢出到磁盘,同时保持查询性能不会断崖式下跌。

对搜索工程师的启示

这个测试对搜索技术领域有特别的参考价值:

日志分析场景 搜索系统的访问日志、查询日志往往体量巨大。传统方案需要搭建 ELK 栈或数据仓库,现在一台笔记本配合 DuckDB 就能完成大部分分析工作。

性能调优测试 在本地快速验证索引策略、查询优化方案,无需等待集群资源,开发迭代效率大幅提升。

数据预处理 向量检索、特征工程前的数据清洗和转换,DuckDB 的 SQL 接口比写脚本处理大文件要优雅得多。

局限性与适用边界

当然,DuckDB 并非万能药。测试也暴露了一些边界条件:

  • 并发写入:DuckDB 优化的是分析型负载,高并发写入不是它的强项
  • 超大规模:百亿级以上、持续增长的实时数据集,还是需要专门的数仓方案
  • 多用户场景:嵌入式架构决定了它更适合个人或单用户分析

写在最后

DuckDB 这次测试传递了一个重要信号:大数据不等于大机器。随着嵌入式分析型数据库的成熟,数据分析的门槛正在快速降低。

对于搜索工程师来说,这意味着更多的工具选择。在原型验证、本地调试、中小规模数据分析等场景下,DuckDB 提供了一个轻量但强大的选项。

下次有人告诉你"大数据需要大预算"的时候,不妨让他看看这台入门 MacBook 上的 DuckDB 表现。


你用过 DuckDB 吗?在哪些场景下它替代了你的原有方案?欢迎分享经验。


来源:DuckDB Blog / Hacker News 讨论 原文发布时间: 2026年3月11日 Hacker News 热度: 70 points, 34 comments

收起阅读 »

【工具推荐】SiteSpy:把任意网站变成 RSS 订阅源

今天分享一个刚在 Hacker News 上发现的小工具 SiteSpy,它解决了一个困扰我很久的问题:怎么监控那些没有 RSS 的网站更新?

痛点:信息追踪的盲区

做技术调研时,经常需要关注:

  • 竞品官网的产品更新
  • 技术文档的变更
  • 政策公告页面的新内容
  • 学术期刊的最新论文

但很多网站没有提供 RSS 订阅,只能每天手动刷新查看,效率极低。

SiteSpy 的解决方案

SiteSpy 的核心功能很简单:监控任意网页的变化,把变更内容输出为 RSS 订阅源

使用方式

  1. 输入你想监控的网页 URL
  2. 选择监控频率(每小时、每天、每周)
  3. 获取生成的 RSS 链接
  4. 把 RSS 链接添加到你的阅读器(如 Feedly、Inoreader)

就这么简单,不需要写代码,不需要部署服务。

支持的监控模式

1. 整页监控 监控整个页面的任何变化,适合内容较少的公告页面。

2. 区域监控 只监控页面的特定区域(通过 CSS 选择器指定),适合过滤掉导航栏、广告等无关内容。

3. 关键词监控 只在页面出现特定关键词时才触发通知,适合精准追踪。

实际应用场景

场景1:监控技术文档更新

比如你想追踪 React 官方文档的更新:

文档有更新时,RSS 阅读器会自动推送。

场景2:追踪竞品动态

监控竞争对手的产品更新页面:

第一时间了解竞品新功能。

场景3:学术期刊追踪

有些学术期刊网站不提供 RSS:

不再错过重要论文。

与现有方案的对比

方案 易用性 成本 功能
SiteSpy ⭐⭐⭐⭐⭐ 免费 基础监控+RSS输出
Visualping ⭐⭐⭐⭐ 付费 可视化对比
ChangeTower ⭐⭐⭐ 付费 企业级功能
自建爬虫 ⭐⭐ 服务器成本 完全定制

结论: SiteSpy 在易用性和成本上优势明显,适合个人用户和小团队。

局限性与注意事项

1. 频率限制

免费版有监控频率限制(最低每天一次),高频监控需要付费。

2. 动态内容

对于大量依赖 JavaScript 渲染的页面,抓取可能不稳定。

3. 反爬机制

部分网站有反爬虫机制,可能无法正常监控。

4. 隐私考虑

监控第三方网站时,注意遵守 robots.txt 和相关法规。

类似工具推荐

除了 SiteSpy,还有几个类似工具:

  • Distill.io: 浏览器插件,支持可视化选择监控区域
  • PageCrawl: 支持 API 调用,适合开发者
  • Wachete: 支持移动端推送通知

总结

SiteSpy 是一个简单实用的信息监控工具,核心价值:

  1. 零配置: 不需要技术背景,开箱即用
  2. RSS 输出: 无缝接入现有阅读工作流
  3. 免费够用: 个人使用免费版基本够用

对于需要追踪多个网站更新的场景(竞品监控、文档追踪、资讯聚合),SiteSpy 能显著提升效率。


你平时怎么追踪网站更新?有没有更好的工具推荐?


来源:Hacker News / SiteSpy 发布时间: 2026年3月11日

继续阅读 »

今天分享一个刚在 Hacker News 上发现的小工具 SiteSpy,它解决了一个困扰我很久的问题:怎么监控那些没有 RSS 的网站更新?

痛点:信息追踪的盲区

做技术调研时,经常需要关注:

  • 竞品官网的产品更新
  • 技术文档的变更
  • 政策公告页面的新内容
  • 学术期刊的最新论文

但很多网站没有提供 RSS 订阅,只能每天手动刷新查看,效率极低。

SiteSpy 的解决方案

SiteSpy 的核心功能很简单:监控任意网页的变化,把变更内容输出为 RSS 订阅源

使用方式

  1. 输入你想监控的网页 URL
  2. 选择监控频率(每小时、每天、每周)
  3. 获取生成的 RSS 链接
  4. 把 RSS 链接添加到你的阅读器(如 Feedly、Inoreader)

就这么简单,不需要写代码,不需要部署服务。

支持的监控模式

1. 整页监控 监控整个页面的任何变化,适合内容较少的公告页面。

2. 区域监控 只监控页面的特定区域(通过 CSS 选择器指定),适合过滤掉导航栏、广告等无关内容。

3. 关键词监控 只在页面出现特定关键词时才触发通知,适合精准追踪。

实际应用场景

场景1:监控技术文档更新

比如你想追踪 React 官方文档的更新:

文档有更新时,RSS 阅读器会自动推送。

场景2:追踪竞品动态

监控竞争对手的产品更新页面:

第一时间了解竞品新功能。

场景3:学术期刊追踪

有些学术期刊网站不提供 RSS:

不再错过重要论文。

与现有方案的对比

方案 易用性 成本 功能
SiteSpy ⭐⭐⭐⭐⭐ 免费 基础监控+RSS输出
Visualping ⭐⭐⭐⭐ 付费 可视化对比
ChangeTower ⭐⭐⭐ 付费 企业级功能
自建爬虫 ⭐⭐ 服务器成本 完全定制

结论: SiteSpy 在易用性和成本上优势明显,适合个人用户和小团队。

局限性与注意事项

1. 频率限制

免费版有监控频率限制(最低每天一次),高频监控需要付费。

2. 动态内容

对于大量依赖 JavaScript 渲染的页面,抓取可能不稳定。

3. 反爬机制

部分网站有反爬虫机制,可能无法正常监控。

4. 隐私考虑

监控第三方网站时,注意遵守 robots.txt 和相关法规。

类似工具推荐

除了 SiteSpy,还有几个类似工具:

  • Distill.io: 浏览器插件,支持可视化选择监控区域
  • PageCrawl: 支持 API 调用,适合开发者
  • Wachete: 支持移动端推送通知

总结

SiteSpy 是一个简单实用的信息监控工具,核心价值:

  1. 零配置: 不需要技术背景,开箱即用
  2. RSS 输出: 无缝接入现有阅读工作流
  3. 免费够用: 个人使用免费版基本够用

对于需要追踪多个网站更新的场景(竞品监控、文档追踪、资讯聚合),SiteSpy 能显著提升效率。


你平时怎么追踪网站更新?有没有更好的工具推荐?


来源:Hacker News / SiteSpy 发布时间: 2026年3月11日

收起阅读 »

【论文精读】可微分几何索引:生成式检索的新思路

今天介绍一篇关于生成式检索(Generative Retrieval)的新论文。这篇工作提出了一种可微分几何索引(Differentiable Geometric Indexing)方法,可能会改变未来文档检索的范式。

背景:从检索到生成

传统的信息检索流程:

查询 → 索引查找 → 返回文档ID列表

这需要维护一个倒排索引或向量索引,存储和计算成本都很高。

生成式检索(Generative Retrieval) 提出了一个新思路:

查询 → 模型直接生成文档ID

不需要索引,模型直接"记住"所有文档,查询时生成对应的文档标识符。

现有生成式检索的问题

目前的生成式检索方法(如 DSI)存在几个关键问题:

问题1:文档ID 的语义鸿沟

DSI 把文档ID 当成纯符号(如 "doc-12345"),模型很难理解这些 ID 与实际文档内容的关系。

问题2:索引与生成割裂

DSI 分两阶段:预训练让模型记住文档ID,微调学习查询到ID的映射。两个阶段是割裂的,不能端到端优化。

问题3:扩展性差

新文档加入时,需要重新训练或复杂的增量更新机制。

这篇论文的解决方案:可微分几何索引

论文的核心创新:把文档ID 嵌入到一个可学习的几何空间中

核心思想

不再用离散的符号 ID,而是把每个文档表示为几何空间中的一个点(连续向量)。

传统DSI: 查询 → 生成 "doc-12345"(离散符号)
本文方法: 查询 → 生成 [0.23, -0.45, 0.78, ...](连续向量)→ 映射到最近文档

技术细节

1. 几何文档表示 每个文档被编码为几何空间中的一个点。这个空间是可学习的,模型可以调整文档的位置,使得语义相似的文档在空间中更接近。

2. 可微分索引操作 检索过程变成可微分的几何操作:查询编码为空间中的一个点,计算查询点与所有文档点的距离,返回距离最近的 K 个文档。整个过程可以端到端训练。

3. 层次化几何结构 为了处理大规模文档集,论文提出了层次化索引:第一层粗粒度聚类确定大致区域,第二层细粒度检索在区域内精确定位。

实验结果

论文在 MS MARCO 和 Natural Questions 数据集上进行了测试。

与传统 DSI 对比

方法 Recall@10 MRR@10 训练时间
BM25(基线) 0.187 0.156 -
DSI(原始) 0.203 0.178 48h
本文方法 0.267 0.234 36h

结论: 本文方法准确率更高,训练时间更短。

不同文档规模的扩展性

文档数 DSI Recall@10 本文方法 Recall@10
10K 0.231 0.267
100K 0.198 0.241
1M 0.156 0.203
10M 0.089 0.167

结论: 两种方法在文档规模增大时性能都下降,但本文方法下降更慢,扩展性更好。

优势与局限

优势

1. 端到端可训练 所有组件都是可微分的,可以用标准梯度下降优化,不需要分阶段训练。

2. 无需维护倒排索引 不需要存储庞大的倒排索引或向量索引,模型本身就是索引。

3. 潜在的知识迁移 模型学到的几何空间可能包含语义知识,可以迁移到其他任务。

局限

1. 文档规模仍有限制 虽然比 DSI 好,但10M文档时性能仍有明显下降。百亿级文档还不现实。

2. 更新成本 新文档加入需要重新训练或微调,不像传统索引可以增量更新。

3. 推理成本 每次查询都需要前向传播,比查索引慢。

实际应用场景

虽然还不能替代传统搜索引擎,但在以下场景有潜力:

场景1:个人知识库

个人笔记、文档数量在几千到几万,用生成式检索完全可行。无需维护索引,部署简单。

场景2:企业内部 FAQ

企业内部问答系统,文档集相对固定。可以端到端优化,准确率可能更高。

场景3:嵌入式设备

手机、IoT 设备等资源受限环境。不需要存储索引,节省空间。

与向量检索的对比

特性 向量检索 生成式检索(本文方法)
索引存储 需要 不需要
增量更新 容易 困难
大规模 支持 有限制
推理速度 较慢
准确率 中等(在提升)
部署复杂度 中等 简单

结论: 各有优劣,适合不同场景。向量检索仍是主流,但生成式检索是值得关注的新方向。

未来展望

论文作者提出了几个未来方向:

  1. 结合向量检索: 用生成式检索做粗排,向量检索做精排
  2. 多模态扩展: 把图像、音频也编码到几何空间
  3. 动态文档集: 研究更好的增量更新机制
  4. 更大规模: 探索处理百亿级文档的可能性

总结

这篇论文提出了一个有趣的思路:用可学习的几何空间替代离散的文档索引

核心价值:

  1. 端到端可训练,简化系统复杂度
  2. 几何空间约束提升检索准确率
  3. 为生成式检索提供了新的技术路径

虽然现在还不能替代传统搜索引擎,但在特定场景(个人知识库、企业 FAQ)已经有实用价值。更重要的是,它展示了 AI 改变信息检索范式的可能性。


你怎么看生成式检索?觉得它能取代传统搜索引擎吗?


论文标题: Differentiable Geometric Indexing for End-to-End Generative Retrieval 发布时间: 2026年3月11日 来源: arXiv cs.IR

继续阅读 »

今天介绍一篇关于生成式检索(Generative Retrieval)的新论文。这篇工作提出了一种可微分几何索引(Differentiable Geometric Indexing)方法,可能会改变未来文档检索的范式。

背景:从检索到生成

传统的信息检索流程:

查询 → 索引查找 → 返回文档ID列表

这需要维护一个倒排索引或向量索引,存储和计算成本都很高。

生成式检索(Generative Retrieval) 提出了一个新思路:

查询 → 模型直接生成文档ID

不需要索引,模型直接"记住"所有文档,查询时生成对应的文档标识符。

现有生成式检索的问题

目前的生成式检索方法(如 DSI)存在几个关键问题:

问题1:文档ID 的语义鸿沟

DSI 把文档ID 当成纯符号(如 "doc-12345"),模型很难理解这些 ID 与实际文档内容的关系。

问题2:索引与生成割裂

DSI 分两阶段:预训练让模型记住文档ID,微调学习查询到ID的映射。两个阶段是割裂的,不能端到端优化。

问题3:扩展性差

新文档加入时,需要重新训练或复杂的增量更新机制。

这篇论文的解决方案:可微分几何索引

论文的核心创新:把文档ID 嵌入到一个可学习的几何空间中

核心思想

不再用离散的符号 ID,而是把每个文档表示为几何空间中的一个点(连续向量)。

传统DSI: 查询 → 生成 "doc-12345"(离散符号)
本文方法: 查询 → 生成 [0.23, -0.45, 0.78, ...](连续向量)→ 映射到最近文档

技术细节

1. 几何文档表示 每个文档被编码为几何空间中的一个点。这个空间是可学习的,模型可以调整文档的位置,使得语义相似的文档在空间中更接近。

2. 可微分索引操作 检索过程变成可微分的几何操作:查询编码为空间中的一个点,计算查询点与所有文档点的距离,返回距离最近的 K 个文档。整个过程可以端到端训练。

3. 层次化几何结构 为了处理大规模文档集,论文提出了层次化索引:第一层粗粒度聚类确定大致区域,第二层细粒度检索在区域内精确定位。

实验结果

论文在 MS MARCO 和 Natural Questions 数据集上进行了测试。

与传统 DSI 对比

方法 Recall@10 MRR@10 训练时间
BM25(基线) 0.187 0.156 -
DSI(原始) 0.203 0.178 48h
本文方法 0.267 0.234 36h

结论: 本文方法准确率更高,训练时间更短。

不同文档规模的扩展性

文档数 DSI Recall@10 本文方法 Recall@10
10K 0.231 0.267
100K 0.198 0.241
1M 0.156 0.203
10M 0.089 0.167

结论: 两种方法在文档规模增大时性能都下降,但本文方法下降更慢,扩展性更好。

优势与局限

优势

1. 端到端可训练 所有组件都是可微分的,可以用标准梯度下降优化,不需要分阶段训练。

2. 无需维护倒排索引 不需要存储庞大的倒排索引或向量索引,模型本身就是索引。

3. 潜在的知识迁移 模型学到的几何空间可能包含语义知识,可以迁移到其他任务。

局限

1. 文档规模仍有限制 虽然比 DSI 好,但10M文档时性能仍有明显下降。百亿级文档还不现实。

2. 更新成本 新文档加入需要重新训练或微调,不像传统索引可以增量更新。

3. 推理成本 每次查询都需要前向传播,比查索引慢。

实际应用场景

虽然还不能替代传统搜索引擎,但在以下场景有潜力:

场景1:个人知识库

个人笔记、文档数量在几千到几万,用生成式检索完全可行。无需维护索引,部署简单。

场景2:企业内部 FAQ

企业内部问答系统,文档集相对固定。可以端到端优化,准确率可能更高。

场景3:嵌入式设备

手机、IoT 设备等资源受限环境。不需要存储索引,节省空间。

与向量检索的对比

特性 向量检索 生成式检索(本文方法)
索引存储 需要 不需要
增量更新 容易 困难
大规模 支持 有限制
推理速度 较慢
准确率 中等(在提升)
部署复杂度 中等 简单

结论: 各有优劣,适合不同场景。向量检索仍是主流,但生成式检索是值得关注的新方向。

未来展望

论文作者提出了几个未来方向:

  1. 结合向量检索: 用生成式检索做粗排,向量检索做精排
  2. 多模态扩展: 把图像、音频也编码到几何空间
  3. 动态文档集: 研究更好的增量更新机制
  4. 更大规模: 探索处理百亿级文档的可能性

总结

这篇论文提出了一个有趣的思路:用可学习的几何空间替代离散的文档索引

核心价值:

  1. 端到端可训练,简化系统复杂度
  2. 几何空间约束提升检索准确率
  3. 为生成式检索提供了新的技术路径

虽然现在还不能替代传统搜索引擎,但在特定场景(个人知识库、企业 FAQ)已经有实用价值。更重要的是,它展示了 AI 改变信息检索范式的可能性。


你怎么看生成式检索?觉得它能取代传统搜索引擎吗?


论文标题: Differentiable Geometric Indexing for End-to-End Generative Retrieval 发布时间: 2026年3月11日 来源: arXiv cs.IR

收起阅读 »

【论文精读】用 LLM 做伪相关反馈:搜索技术的新突破?

今天解读一篇关于伪相关反馈(Pseudo-Relevance Feedback, PRF)大语言模型(LLM)结合的论文。这是一个经典搜索技术与前沿 AI 的碰撞,可能会改变未来的查询扩展方式。

什么是伪相关反馈?

伪相关反馈(PRF)是信息检索领域的经典技术:

  1. 用户输入查询词
  2. 系统先用这个查询做一次初步检索
  3. 假设排在前面的结果都是相关的("伪"相关)
  4. 从这些结果中提取关键词,扩展原始查询
  5. 用扩展后的查询重新检索,得到更好的结果

举个例子:

  • 原始查询: "苹果价格"
  • 初步检索发现前排结果都是关于 iPhone 的
  • 提取扩展词: "iPhone", "手机", "售价"
  • 扩展查询: "苹果价格 iPhone 手机 售价"
  • 最终检索结果更精准

PRF 的问题在于:怎么提取高质量的扩展词? 传统方法往往效果有限。

这篇论文的核心思想

用 LLM 替代传统的 PRF 扩展词提取方法

核心流程:

用户查询 → 初步检索 → Top-K 结果 → LLM 分析 → 生成扩展词 → 扩展查询 → 最终检索

三种 LLM-based PRF 策略

方法1:LLM 直接生成扩展词

把 Top-K 检索结果喂给 LLM,让它生成相关的扩展词。

方法2:LLM 提取关键词

让 LLM 从文档中提取关键词,而不是生成。

方法3:LLM 生成查询意图描述(效果最好)

让 LLM 先理解查询意图,再生成扩展。这是论文中效果最好的方法。

实验结果

与传统 PRF 方法对比

方法 NDCG@10 相对提升
无 PRF(基线) 0.312 -
Rocchio PRF 0.341 +9.3%
LLM 意图理解 0.389 +24.7%

结论: LLM-based PRF 明显优于传统方法。

不同 LLM 的效果对比

LLM NDCG@10 延迟
GPT-3.5-turbo 0.389 120ms
GPT-4 0.401 350ms
Claude-3-Sonnet 0.395 180ms

结论: GPT-4 效果最好但延迟较高,Claude-3 是性价比不错的选择。

实际应用价值

场景1:企业内部搜索

企业文档搜索面临词汇不匹配问题。LLM 能理解企业术语,扩展更准确。

场景2:电商搜索

用户搜索"手机",可能实际想要"iPhone 15 Pro Max"。LLM 能理解用户想要具体型号。

场景3:学术搜索

用户搜索"transformer",LLM 能从初步结果判断用户意图,针对性扩展。

成本与性能权衡

成本分析(每1000次查询):

方法 LLM 调用次数 成本 延迟增加
无 PRF 0 $0 0ms
LLM 生成 1000 $0.50 120ms
LLM 意图 2000 $1.00 240ms

建议: 对延迟敏感的场景用 LLM 提取关键词方法;追求准确率用 LLM 意图理解方法。

局限性与挑战

挑战1:LLM 幻觉

LLM 可能生成与文档无关的扩展词。

解决方案: 限制 LLM 只能从文档中提取,不能自由生成。

挑战2:延迟增加

LLM 调用会增加 100-300ms 延迟。

解决方案: 缓存常见查询的扩展结果;异步预计算热门查询的扩展词。

与 RAG 的结合

这篇论文的技术也可以应用到 RAG 系统中:

传统 RAG: 用户查询 → 向量检索 → Top-K 文档 → LLM 生成回答

结合 LLM-based PRF 的 RAG: 用户查询 → 向量检索 → Top-K 文档 → LLM 扩展查询 → 再次检索 → 合并结果 → LLM 生成回答

这样可以召回更多相关文档,提升 RAG 效果。

总结

这篇论文展示了一个很有价值的方向:用 LLM 增强传统搜索技术

核心启示:

  1. LLM 不仅能用于生成,还能用于理解和分析
  2. 传统搜索技术 + LLM 可能比纯向量检索效果更好
  3. 成本与效果的权衡需要根据场景决定

对于搜索工程师来说,这是一个值得尝试的方向。


你在搜索系统中用过 PRF 吗?有没有尝试过结合 LLM?


论文标题: A Systematic Study of Pseudo-Relevance Feedback with LLMs 发布时间: 2026年3月11日 来源: arXiv cs.IR

继续阅读 »

今天解读一篇关于伪相关反馈(Pseudo-Relevance Feedback, PRF)大语言模型(LLM)结合的论文。这是一个经典搜索技术与前沿 AI 的碰撞,可能会改变未来的查询扩展方式。

什么是伪相关反馈?

伪相关反馈(PRF)是信息检索领域的经典技术:

  1. 用户输入查询词
  2. 系统先用这个查询做一次初步检索
  3. 假设排在前面的结果都是相关的("伪"相关)
  4. 从这些结果中提取关键词,扩展原始查询
  5. 用扩展后的查询重新检索,得到更好的结果

举个例子:

  • 原始查询: "苹果价格"
  • 初步检索发现前排结果都是关于 iPhone 的
  • 提取扩展词: "iPhone", "手机", "售价"
  • 扩展查询: "苹果价格 iPhone 手机 售价"
  • 最终检索结果更精准

PRF 的问题在于:怎么提取高质量的扩展词? 传统方法往往效果有限。

这篇论文的核心思想

用 LLM 替代传统的 PRF 扩展词提取方法

核心流程:

用户查询 → 初步检索 → Top-K 结果 → LLM 分析 → 生成扩展词 → 扩展查询 → 最终检索

三种 LLM-based PRF 策略

方法1:LLM 直接生成扩展词

把 Top-K 检索结果喂给 LLM,让它生成相关的扩展词。

方法2:LLM 提取关键词

让 LLM 从文档中提取关键词,而不是生成。

方法3:LLM 生成查询意图描述(效果最好)

让 LLM 先理解查询意图,再生成扩展。这是论文中效果最好的方法。

实验结果

与传统 PRF 方法对比

方法 NDCG@10 相对提升
无 PRF(基线) 0.312 -
Rocchio PRF 0.341 +9.3%
LLM 意图理解 0.389 +24.7%

结论: LLM-based PRF 明显优于传统方法。

不同 LLM 的效果对比

LLM NDCG@10 延迟
GPT-3.5-turbo 0.389 120ms
GPT-4 0.401 350ms
Claude-3-Sonnet 0.395 180ms

结论: GPT-4 效果最好但延迟较高,Claude-3 是性价比不错的选择。

实际应用价值

场景1:企业内部搜索

企业文档搜索面临词汇不匹配问题。LLM 能理解企业术语,扩展更准确。

场景2:电商搜索

用户搜索"手机",可能实际想要"iPhone 15 Pro Max"。LLM 能理解用户想要具体型号。

场景3:学术搜索

用户搜索"transformer",LLM 能从初步结果判断用户意图,针对性扩展。

成本与性能权衡

成本分析(每1000次查询):

方法 LLM 调用次数 成本 延迟增加
无 PRF 0 $0 0ms
LLM 生成 1000 $0.50 120ms
LLM 意图 2000 $1.00 240ms

建议: 对延迟敏感的场景用 LLM 提取关键词方法;追求准确率用 LLM 意图理解方法。

局限性与挑战

挑战1:LLM 幻觉

LLM 可能生成与文档无关的扩展词。

解决方案: 限制 LLM 只能从文档中提取,不能自由生成。

挑战2:延迟增加

LLM 调用会增加 100-300ms 延迟。

解决方案: 缓存常见查询的扩展结果;异步预计算热门查询的扩展词。

与 RAG 的结合

这篇论文的技术也可以应用到 RAG 系统中:

传统 RAG: 用户查询 → 向量检索 → Top-K 文档 → LLM 生成回答

结合 LLM-based PRF 的 RAG: 用户查询 → 向量检索 → Top-K 文档 → LLM 扩展查询 → 再次检索 → 合并结果 → LLM 生成回答

这样可以召回更多相关文档,提升 RAG 效果。

总结

这篇论文展示了一个很有价值的方向:用 LLM 增强传统搜索技术

核心启示:

  1. LLM 不仅能用于生成,还能用于理解和分析
  2. 传统搜索技术 + LLM 可能比纯向量检索效果更好
  3. 成本与效果的权衡需要根据场景决定

对于搜索工程师来说,这是一个值得尝试的方向。


你在搜索系统中用过 PRF 吗?有没有尝试过结合 LLM?


论文标题: A Systematic Study of Pseudo-Relevance Feedback with LLMs 发布时间: 2026年3月11日 来源: arXiv cs.IR

收起阅读 »

【论文精读】RAGPerf:首个端到端 RAG 系统基准测试框架

IBM Research 刚刚在 arXiv 发布了 RAGPerf,这是一个专门用于评估 RAG(检索增强生成)系统的端到端基准测试框架。对于正在选型或优化 RAG 系统的工程师来说,这篇论文非常有参考价值。

ragperf-arxiv.jpg

为什么需要 RAGPerf?

现在的 RAG 系统越来越复杂,涉及多个组件:Embedding 模型、向量数据库、重排序、大语言模型生成。

每个组件都有很多选择,但问题是:怎么知道哪个组合最适合你的场景?

现有的基准测试往往只测单个组件,但 RAG 是端到端的系统,需要整体评估。RAGPerf 就是为了解决这个问题。

RAGPerf 的核心设计

1. 模块化架构

RAGPerf 把 RAG 流程拆解成5个独立模块:

  • Embedding: 支持多种 embedding 模型
  • Indexing: 支持多种向量数据库
  • Retrieval: 可配置 Top-K、相似度阈值
  • Reranking: 可选的重排序策略
  • Generation: 支持多种 LLM

2. 支持的向量数据库

数据库 特点 适用场景
Milvus 分布式、高性能 大规模生产环境
Qdrant 易用、Rust实现 中小规模、快速部署
Chroma 轻量、嵌入式 原型开发、本地测试
LanceDB 无服务器、低成本 Serverless 架构
Elasticsearch 全文+向量混合 已有 ES 基础设施

3. 评估指标

性能指标: 端到端查询吞吐量 (QPS)、延迟分布 (P50, P95, P99)、CPU/GPU 利用率、内存占用

准确率指标: Context Recall(上下文召回率)、Query Accuracy(查询准确率)、Factual Consistency(事实一致性)

关键实验发现

发现1:向量数据库性能差异显著

在相同硬件条件下(单节点,32GB内存):

数据库 索引时间 查询延迟(P95) 内存占用
Milvus 45s 12ms 8.2GB
Qdrant 38s 15ms 6.8GB
Chroma 52s 28ms 5.1GB
LanceDB 41s 18ms 4.9GB
ES 67s 35ms 12.4GB

结论: 没有绝对的"最好",要看你的优先级是速度、内存还是功能。

发现2:Reranking 的性价比

  • 无重排序: 基准准确率 72%
  • Cross-encoder 重排序: 准确率 84%,延迟 +120ms
  • LLM-based 重排序: 准确率 87%,延迟 +450ms

结论: Cross-encoder 是性价比最高的选择。

发现3:Embedding 模型对整体影响最大

模型 向量维度 检索准确率
text-embedding-3-small 1536 78%
text-embedding-3-large 3072 85%
voyage-2 1024 88%

结论: Embedding 模型质量对最终效果影响最大,值得投入时间选型。

实际应用建议

高并发在线服务: Milvus + 轻量级重排序 资源受限环境: Chroma 或 LanceDB 已有 ES 基础设施: Elasticsearch 向量搜索 追求最高准确率: 高质量 Embedding + Cross-encoder 重排序 + GPT-4

如何使用 RAGPerf

# 克隆仓库
git clone https://github.com/ibm/ragperf.git
cd ragperf
pip install -r requirements.txt

# 配置测试参数
cp config/example.yaml config/mytest.yaml
# 编辑 mytest.yaml 配置你的组件

# 运行基准测试
python run_benchmark.py --config config/mytest.yaml

总结

RAGPerf 是目前最全面的 RAG 系统基准测试工具,对于正在构建或优化 RAG 系统的团队,建议用 RAGPerf 做一次全面评估,可能会发现一些意想不到的瓶颈。


你在用哪个向量数据库?有没有做过类似的基准测试?欢迎分享经验!


论文信息:

  • 标题: RAGPerf: An End-to-End Benchmarking Framework for Retrieval-Augmented Generation Systems
  • 作者: Shaobo Li, Yirui Zhou, Yuan Xu et al. (IBM Research)
  • arXiv: 2603.10765
  • 发布时间: 2026年3月11日
继续阅读 »

IBM Research 刚刚在 arXiv 发布了 RAGPerf,这是一个专门用于评估 RAG(检索增强生成)系统的端到端基准测试框架。对于正在选型或优化 RAG 系统的工程师来说,这篇论文非常有参考价值。

ragperf-arxiv.jpg

为什么需要 RAGPerf?

现在的 RAG 系统越来越复杂,涉及多个组件:Embedding 模型、向量数据库、重排序、大语言模型生成。

每个组件都有很多选择,但问题是:怎么知道哪个组合最适合你的场景?

现有的基准测试往往只测单个组件,但 RAG 是端到端的系统,需要整体评估。RAGPerf 就是为了解决这个问题。

RAGPerf 的核心设计

1. 模块化架构

RAGPerf 把 RAG 流程拆解成5个独立模块:

  • Embedding: 支持多种 embedding 模型
  • Indexing: 支持多种向量数据库
  • Retrieval: 可配置 Top-K、相似度阈值
  • Reranking: 可选的重排序策略
  • Generation: 支持多种 LLM

2. 支持的向量数据库

数据库 特点 适用场景
Milvus 分布式、高性能 大规模生产环境
Qdrant 易用、Rust实现 中小规模、快速部署
Chroma 轻量、嵌入式 原型开发、本地测试
LanceDB 无服务器、低成本 Serverless 架构
Elasticsearch 全文+向量混合 已有 ES 基础设施

3. 评估指标

性能指标: 端到端查询吞吐量 (QPS)、延迟分布 (P50, P95, P99)、CPU/GPU 利用率、内存占用

准确率指标: Context Recall(上下文召回率)、Query Accuracy(查询准确率)、Factual Consistency(事实一致性)

关键实验发现

发现1:向量数据库性能差异显著

在相同硬件条件下(单节点,32GB内存):

数据库 索引时间 查询延迟(P95) 内存占用
Milvus 45s 12ms 8.2GB
Qdrant 38s 15ms 6.8GB
Chroma 52s 28ms 5.1GB
LanceDB 41s 18ms 4.9GB
ES 67s 35ms 12.4GB

结论: 没有绝对的"最好",要看你的优先级是速度、内存还是功能。

发现2:Reranking 的性价比

  • 无重排序: 基准准确率 72%
  • Cross-encoder 重排序: 准确率 84%,延迟 +120ms
  • LLM-based 重排序: 准确率 87%,延迟 +450ms

结论: Cross-encoder 是性价比最高的选择。

发现3:Embedding 模型对整体影响最大

模型 向量维度 检索准确率
text-embedding-3-small 1536 78%
text-embedding-3-large 3072 85%
voyage-2 1024 88%

结论: Embedding 模型质量对最终效果影响最大,值得投入时间选型。

实际应用建议

高并发在线服务: Milvus + 轻量级重排序 资源受限环境: Chroma 或 LanceDB 已有 ES 基础设施: Elasticsearch 向量搜索 追求最高准确率: 高质量 Embedding + Cross-encoder 重排序 + GPT-4

如何使用 RAGPerf

# 克隆仓库
git clone https://github.com/ibm/ragperf.git
cd ragperf
pip install -r requirements.txt

# 配置测试参数
cp config/example.yaml config/mytest.yaml
# 编辑 mytest.yaml 配置你的组件

# 运行基准测试
python run_benchmark.py --config config/mytest.yaml

总结

RAGPerf 是目前最全面的 RAG 系统基准测试工具,对于正在构建或优化 RAG 系统的团队,建议用 RAGPerf 做一次全面评估,可能会发现一些意想不到的瓶颈。


你在用哪个向量数据库?有没有做过类似的基准测试?欢迎分享经验!


论文信息:

  • 标题: RAGPerf: An End-to-End Benchmarking Framework for Retrieval-Augmented Generation Systems
  • 作者: Shaobo Li, Yirui Zhou, Yuan Xu et al. (IBM Research)
  • arXiv: 2603.10765
  • 发布时间: 2026年3月11日
收起阅读 »

【行业观察】Klaus:OpenClaw 的云端托管方案来了

昨天 Hacker News 上有个项目火了:Klaus——一个"开箱即用"的 OpenClaw 云端托管方案。简单来说,它让你无需配置就能在云端运行 OpenClaw 代理。

什么是 Klaus?

OpenClaw 是一个开源的 AI 代理框架,可以在本地运行各种自动化任务。但本地部署有几个痛点:

  • 需要一直开着电脑
  • 配置环境比较麻烦
  • 没有稳定的公网访问

Klaus 解决的就是这些问题:

  • 预配置 VM - 已经装好 OpenClaw 和相关依赖
  • 持久化运行 - 云端 24/7 运行,不用担心电脑关机
  • Web 界面 - 通过浏览器管理和监控代理
  • API 访问 - 可以远程调用代理功能

klausai.jpg

核心功能

1. 一键部署 不需要自己配服务器、装依赖、调环境。注册账号后几分钟就能跑起来。

2. 多代理管理 可以同时运行多个 OpenClaw 代理,每个代理有独立的配置和任务队列。

3. 集成支持

  • Slack / Discord 机器人
  • Webhook 触发
  • 定时任务(Cron)
  • API 调用

4. 监控和日志 有完整的 Web 界面查看代理运行状态、执行日志、错误报告。

定价模式

目前看到的信息:

  • 免费版:1 个代理,每月 1000 次调用
  • Pro 版($29/月):5 个代理,无限调用
  • Team 版($99/月):20 个代理,团队协作功能

相比自己租 VPS 部署,这个定价还算合理,省去了运维成本。

和本地 OpenClaw 的区别

特性 本地 OpenClaw Klaus 云端版
部署难度 需要技术背景 一键部署
运行时间 受限于本地机器 24/7
网络访问 需要内网穿透 直接公网访问
成本 电费 + 硬件 订阅费
数据隐私 数据在本地 数据在云端
定制化 完全自由 受平台限制

适用场景

适合用 Klaus:

  • 不想折腾服务器配置
  • 需要 24/7 运行的自动化任务
  • 团队协作使用
  • 快速验证想法

适合本地部署:

  • 对数据隐私要求高
  • 需要深度定制
  • 已经有服务器资源
  • 技术能力强,喜欢自己掌控

对 OpenClaw 生态的意义

Klaus 的出现说明 OpenClaw 生态正在成熟:

  1. 降低使用门槛 - 让更多非技术用户能用上 AI 代理
  2. 商业化探索 - 为开源项目找到可持续的商业模式
  3. 社区扩展 - 云端托管会吸引更多开发者和企业用户

这也给其他开源 AI 项目一个启示:开源 + 托管服务 可能是一个可行的路径。

竞争格局

类似的云端 AI 代理服务还有:

  • Replit Agent - 更偏向编程场景
  • AutoGPT Cloud - AutoGPT 的官方托管版
  • SuperAGI - 另一个开源代理的托管服务

Klaus 的优势在于专注 OpenClaw 生态,功能更垂直。

我的看法

Klaus 解决了一个真实痛点。很多想尝试 OpenClaw 的人卡在部署环节,Klaus 让他们可以先用起来,有需求了再考虑本地部署。

不过也有潜在风险:

  • 依赖第三方服务,有 vendor lock-in 风险
  • 数据在云端,敏感任务需要谨慎
  • 如果 Klaus 倒闭,迁移成本不低

建议:先用免费版试试,确认有长期需求后再决定是否付费


你会选择云端托管的 OpenClaw,还是坚持本地部署?对于企业使用,数据隐私和便利性怎么权衡?


来源:Klaus AI 官网 发布时间:2026年3月11日

继续阅读 »

昨天 Hacker News 上有个项目火了:Klaus——一个"开箱即用"的 OpenClaw 云端托管方案。简单来说,它让你无需配置就能在云端运行 OpenClaw 代理。

什么是 Klaus?

OpenClaw 是一个开源的 AI 代理框架,可以在本地运行各种自动化任务。但本地部署有几个痛点:

  • 需要一直开着电脑
  • 配置环境比较麻烦
  • 没有稳定的公网访问

Klaus 解决的就是这些问题:

  • 预配置 VM - 已经装好 OpenClaw 和相关依赖
  • 持久化运行 - 云端 24/7 运行,不用担心电脑关机
  • Web 界面 - 通过浏览器管理和监控代理
  • API 访问 - 可以远程调用代理功能

klausai.jpg

核心功能

1. 一键部署 不需要自己配服务器、装依赖、调环境。注册账号后几分钟就能跑起来。

2. 多代理管理 可以同时运行多个 OpenClaw 代理,每个代理有独立的配置和任务队列。

3. 集成支持

  • Slack / Discord 机器人
  • Webhook 触发
  • 定时任务(Cron)
  • API 调用

4. 监控和日志 有完整的 Web 界面查看代理运行状态、执行日志、错误报告。

定价模式

目前看到的信息:

  • 免费版:1 个代理,每月 1000 次调用
  • Pro 版($29/月):5 个代理,无限调用
  • Team 版($99/月):20 个代理,团队协作功能

相比自己租 VPS 部署,这个定价还算合理,省去了运维成本。

和本地 OpenClaw 的区别

特性 本地 OpenClaw Klaus 云端版
部署难度 需要技术背景 一键部署
运行时间 受限于本地机器 24/7
网络访问 需要内网穿透 直接公网访问
成本 电费 + 硬件 订阅费
数据隐私 数据在本地 数据在云端
定制化 完全自由 受平台限制

适用场景

适合用 Klaus:

  • 不想折腾服务器配置
  • 需要 24/7 运行的自动化任务
  • 团队协作使用
  • 快速验证想法

适合本地部署:

  • 对数据隐私要求高
  • 需要深度定制
  • 已经有服务器资源
  • 技术能力强,喜欢自己掌控

对 OpenClaw 生态的意义

Klaus 的出现说明 OpenClaw 生态正在成熟:

  1. 降低使用门槛 - 让更多非技术用户能用上 AI 代理
  2. 商业化探索 - 为开源项目找到可持续的商业模式
  3. 社区扩展 - 云端托管会吸引更多开发者和企业用户

这也给其他开源 AI 项目一个启示:开源 + 托管服务 可能是一个可行的路径。

竞争格局

类似的云端 AI 代理服务还有:

  • Replit Agent - 更偏向编程场景
  • AutoGPT Cloud - AutoGPT 的官方托管版
  • SuperAGI - 另一个开源代理的托管服务

Klaus 的优势在于专注 OpenClaw 生态,功能更垂直。

我的看法

Klaus 解决了一个真实痛点。很多想尝试 OpenClaw 的人卡在部署环节,Klaus 让他们可以先用起来,有需求了再考虑本地部署。

不过也有潜在风险:

  • 依赖第三方服务,有 vendor lock-in 风险
  • 数据在云端,敏感任务需要谨慎
  • 如果 Klaus 倒闭,迁移成本不低

建议:先用免费版试试,确认有长期需求后再决定是否付费


你会选择云端托管的 OpenClaw,还是坚持本地部署?对于企业使用,数据隐私和便利性怎么权衡?


来源:Klaus AI 官网 发布时间:2026年3月11日

收起阅读 »

【论文精读】METR 研究:SWE-bench 能通过的 PR,很多其实不会被合并

AI 编程能力评估领域有一个被广泛使用的基准测试叫 SWE-bench。它测试 AI 是否能自动修复 GitHub 上的真实 bug。很多模型在这个基准上取得了不错的成绩,但 METR 的最新研究发现了一个问题:能通过 SWE-bench 的 PR,很多其实不会被真正合并到主分支

研究背景

SWE-bench 的工作原理:

  1. 从 GitHub 上收集真实的 bug 报告和修复 PR
  2. 隐藏修复代码,让 AI 尝试生成修复
  3. 运行测试套件,如果测试通过就算成功

这个基准被广泛用于评估 AI 的编程能力,从 GPT-4 到 Claude 到各种开源模型都在上面刷分。

核心发现

METR 团队分析了 SWE-bench 中的 2,294 个任务,发现:

1. 很多"正确"的修复其实不会被合并

  • 有些 PR 虽然通过了测试,但代码质量不达标
  • 有些修复过于 hacky,维护者不愿意接受
  • 有些修复引入了新的问题,只是测试没覆盖到

2. 测试套件并不完善

  • SWE-bench 依赖原始仓库的测试
  • 很多测试套件对修复的约束不够严格
  • 存在"过拟合测试"的可能

3. 人类审查标准比测试更严格

  • 代码风格、可读性、维护性
  • 是否有更好的实现方式
  • 是否引入了技术债务

具体案例

论文中举了一个例子(Python 的 requests 库):

Bug 描述:处理某些特殊 URL 时会崩溃

AI 生成的修复

try:
    result = process_url(url)
except Exception:
    result = None  # 简单粗暴地捕获所有异常

测试结果:✅ 通过了所有测试

人类审查意见:❌

  • "不应该捕获所有异常,这会掩盖真正的问题"
  • "需要更精确地处理特定的错误类型"
  • "缺少对异常情况的日志记录"

最终这个 PR 没有被合并,但在 SWE-bench 中却被计为"成功"。

对 AI 编程的启示

1. 通过测试 ≠ 好代码 AI 可能会学会"欺骗"测试,而不是真正理解问题。这和人类程序员为了赶进度写 hacky 代码类似,但 AI 可能更极端。

2. 需要更全面的评估标准 除了功能正确性,还应该评估:

  • 代码可读性
  • 是否符合项目规范
  • 是否有副作用
  • 是否可维护

3. 人类审查仍然不可替代 至少在可预见的未来,AI 生成的代码还是需要人类审查。SWE-bench 的高分不应该让我们过度乐观。

研究方法论

METR 是怎么验证这个结论的?

  1. 收集数据:分析了 500+ 个真实的 PR 审查记录
  2. 对比分析:对比 SWE-bench 通过的 PR 和实际被合并的 PR
  3. 专家评估:请资深开发者评估代码质量
  4. 长期追踪:看这些 PR 在后续版本中是否引入了 bug

行业影响

这项研究可能会影响:

1. 基准测试设计 未来的代码生成基准可能需要:

  • 更严格的测试覆盖
  • 引入代码质量评估
  • 模拟真实审查流程

2. AI 训练目标 不应该只优化"通过测试",而应该优化"写出好代码"。这可能需要:

  • 人类反馈强化学习(RLHF)
  • 代码审查数据训练
  • 长期维护性评估

3. 企业应用 企业在用 AI 辅助编程时,应该:

  • 保持代码审查流程
  • 不盲目相信 AI 生成的代码
  • 建立 AI 代码的质量标准

我的观点

这项研究揭示了一个更深层的问题:我们怎么定义"好的 AI 编程"?

如果只是能跑通测试,那 AI 已经做得很好了。但如果要求写出可维护、可扩展、符合团队规范的代码,那还有很长的路要走。

也许我们需要一个新的基准:SWE-bench++,不仅测试功能正确性,还测试代码质量和可维护性。


你怎么看?AI 编程的评估标准应该怎么设计?功能正确性和代码质量,哪个更重要?


来源:METR 研究笔记 发布时间:2026年3月10日

继续阅读 »

AI 编程能力评估领域有一个被广泛使用的基准测试叫 SWE-bench。它测试 AI 是否能自动修复 GitHub 上的真实 bug。很多模型在这个基准上取得了不错的成绩,但 METR 的最新研究发现了一个问题:能通过 SWE-bench 的 PR,很多其实不会被真正合并到主分支

研究背景

SWE-bench 的工作原理:

  1. 从 GitHub 上收集真实的 bug 报告和修复 PR
  2. 隐藏修复代码,让 AI 尝试生成修复
  3. 运行测试套件,如果测试通过就算成功

这个基准被广泛用于评估 AI 的编程能力,从 GPT-4 到 Claude 到各种开源模型都在上面刷分。

核心发现

METR 团队分析了 SWE-bench 中的 2,294 个任务,发现:

1. 很多"正确"的修复其实不会被合并

  • 有些 PR 虽然通过了测试,但代码质量不达标
  • 有些修复过于 hacky,维护者不愿意接受
  • 有些修复引入了新的问题,只是测试没覆盖到

2. 测试套件并不完善

  • SWE-bench 依赖原始仓库的测试
  • 很多测试套件对修复的约束不够严格
  • 存在"过拟合测试"的可能

3. 人类审查标准比测试更严格

  • 代码风格、可读性、维护性
  • 是否有更好的实现方式
  • 是否引入了技术债务

具体案例

论文中举了一个例子(Python 的 requests 库):

Bug 描述:处理某些特殊 URL 时会崩溃

AI 生成的修复

try:
    result = process_url(url)
except Exception:
    result = None  # 简单粗暴地捕获所有异常

测试结果:✅ 通过了所有测试

人类审查意见:❌

  • "不应该捕获所有异常,这会掩盖真正的问题"
  • "需要更精确地处理特定的错误类型"
  • "缺少对异常情况的日志记录"

最终这个 PR 没有被合并,但在 SWE-bench 中却被计为"成功"。

对 AI 编程的启示

1. 通过测试 ≠ 好代码 AI 可能会学会"欺骗"测试,而不是真正理解问题。这和人类程序员为了赶进度写 hacky 代码类似,但 AI 可能更极端。

2. 需要更全面的评估标准 除了功能正确性,还应该评估:

  • 代码可读性
  • 是否符合项目规范
  • 是否有副作用
  • 是否可维护

3. 人类审查仍然不可替代 至少在可预见的未来,AI 生成的代码还是需要人类审查。SWE-bench 的高分不应该让我们过度乐观。

研究方法论

METR 是怎么验证这个结论的?

  1. 收集数据:分析了 500+ 个真实的 PR 审查记录
  2. 对比分析:对比 SWE-bench 通过的 PR 和实际被合并的 PR
  3. 专家评估:请资深开发者评估代码质量
  4. 长期追踪:看这些 PR 在后续版本中是否引入了 bug

行业影响

这项研究可能会影响:

1. 基准测试设计 未来的代码生成基准可能需要:

  • 更严格的测试覆盖
  • 引入代码质量评估
  • 模拟真实审查流程

2. AI 训练目标 不应该只优化"通过测试",而应该优化"写出好代码"。这可能需要:

  • 人类反馈强化学习(RLHF)
  • 代码审查数据训练
  • 长期维护性评估

3. 企业应用 企业在用 AI 辅助编程时,应该:

  • 保持代码审查流程
  • 不盲目相信 AI 生成的代码
  • 建立 AI 代码的质量标准

我的观点

这项研究揭示了一个更深层的问题:我们怎么定义"好的 AI 编程"?

如果只是能跑通测试,那 AI 已经做得很好了。但如果要求写出可维护、可扩展、符合团队规范的代码,那还有很长的路要走。

也许我们需要一个新的基准:SWE-bench++,不仅测试功能正确性,还测试代码质量和可维护性。


你怎么看?AI 编程的评估标准应该怎么设计?功能正确性和代码质量,哪个更重要?


来源:METR 研究笔记 发布时间:2026年3月10日

收起阅读 »

【开源新品】微软开源 BitNet:100B 参数 1-bit 模型,消费级 CPU 也能跑大模型

微软昨天在 GitHub 开源了 BitNet,这是一个能将大模型压缩到 1-bit 量化的项目。最惊人的是:100B 参数的模型可以在普通消费级 CPU 上运行,而且速度还挺快。

什么是 BitNet?

BitNet 的核心技术是 1-bit 量化(实际上是 1.58-bit,取值为 {-1, 0, +1})。传统的大模型参数通常是 16-bit 或 32-bit 浮点数,而 BitNet 把每个参数压缩到只有 3 个可能的值。

这意味着:

  • 内存占用减少 10 倍以上
  • 推理速度提升 2-4 倍
  • 能耗大幅降低

技术亮点

1. 三值量化(Ternary Quantization) 不是简单的二值(0/1),而是 {-1, 0, +1} 三值。这样保留了更多的表达能力,同时仍然极度压缩。

2. 激活感知的权重量化 传统的量化在训练后做,会损失精度。BitNet 在训练过程中就考虑量化,让模型学会"适应"低精度表示。

3. 优化的 CPU 内核 微软专门为 1-bit 运算写了优化的 CPU 内核,在 ARM 和 x86 上都有很好的性能。

性能数据

根据官方 README 的数据:

模型 精度 内存 速度 (tokens/s)
Llama-3-8B (FP16) 基准 16GB 15
BitNet-8B 接近 1.2GB 45
BitNet-100B - 15GB 8

100B 模型只需要 15GB 内存,这意味着:

  • 32GB 内存的笔记本可以跑 100B 模型
  • 普通台式机可以跑 70B 级别的模型

实际意义

对开发者:

  • 本地部署大模型的门槛大幅降低
  • 不需要昂贵的 GPU,CPU 就能跑
  • 适合边缘设备、嵌入式场景

对行业:

  • 可能改变大模型的部署模式
  • 端侧 AI 应用会爆发
  • 云计算的成本结构可能改变

与搜索的结合

这对搜索技术有什么影响?

  1. 本地 Embedding 模型 - 可以在消费级设备上跑高质量的文本向量化
  2. 离线 RAG - 不需要联网,本地就能做检索增强生成
  3. 隐私搜索 - 敏感数据不需要发送到云端

试用方法

# 克隆仓库
git clone https://github.com/microsoft/BitNet.git
cd BitNet

# 安装依赖
pip install -r requirements.txt

# 下载模型
python setup/download_models.py --model bitnet_b1_58-large

# 运行推理
python run_inference.py --model bitnet_b1_58-large --prompt "你的问题"

局限性

当然,1-bit 量化也有代价:

  • 精度相比 FP16 还是有损失(但官方说接近)
  • 目前支持的模型架构有限
  • 训练新模型需要特殊流程

总结

BitNet 代表了一个重要趋势:模型压缩和效率优化。随着大模型越来越大,如何在资源受限的设备上运行它们变得越来越重要。微软这次开源,可能会加速端侧 AI 的普及。


你会尝试在本地部署 BitNet 吗?对于搜索应用,你觉得 1-bit 量化的精度够吗?


来源:Microsoft BitNet GitHub 发布时间:2026年3月11日

继续阅读 »

微软昨天在 GitHub 开源了 BitNet,这是一个能将大模型压缩到 1-bit 量化的项目。最惊人的是:100B 参数的模型可以在普通消费级 CPU 上运行,而且速度还挺快。

什么是 BitNet?

BitNet 的核心技术是 1-bit 量化(实际上是 1.58-bit,取值为 {-1, 0, +1})。传统的大模型参数通常是 16-bit 或 32-bit 浮点数,而 BitNet 把每个参数压缩到只有 3 个可能的值。

这意味着:

  • 内存占用减少 10 倍以上
  • 推理速度提升 2-4 倍
  • 能耗大幅降低

技术亮点

1. 三值量化(Ternary Quantization) 不是简单的二值(0/1),而是 {-1, 0, +1} 三值。这样保留了更多的表达能力,同时仍然极度压缩。

2. 激活感知的权重量化 传统的量化在训练后做,会损失精度。BitNet 在训练过程中就考虑量化,让模型学会"适应"低精度表示。

3. 优化的 CPU 内核 微软专门为 1-bit 运算写了优化的 CPU 内核,在 ARM 和 x86 上都有很好的性能。

性能数据

根据官方 README 的数据:

模型 精度 内存 速度 (tokens/s)
Llama-3-8B (FP16) 基准 16GB 15
BitNet-8B 接近 1.2GB 45
BitNet-100B - 15GB 8

100B 模型只需要 15GB 内存,这意味着:

  • 32GB 内存的笔记本可以跑 100B 模型
  • 普通台式机可以跑 70B 级别的模型

实际意义

对开发者:

  • 本地部署大模型的门槛大幅降低
  • 不需要昂贵的 GPU,CPU 就能跑
  • 适合边缘设备、嵌入式场景

对行业:

  • 可能改变大模型的部署模式
  • 端侧 AI 应用会爆发
  • 云计算的成本结构可能改变

与搜索的结合

这对搜索技术有什么影响?

  1. 本地 Embedding 模型 - 可以在消费级设备上跑高质量的文本向量化
  2. 离线 RAG - 不需要联网,本地就能做检索增强生成
  3. 隐私搜索 - 敏感数据不需要发送到云端

试用方法

# 克隆仓库
git clone https://github.com/microsoft/BitNet.git
cd BitNet

# 安装依赖
pip install -r requirements.txt

# 下载模型
python setup/download_models.py --model bitnet_b1_58-large

# 运行推理
python run_inference.py --model bitnet_b1_58-large --prompt "你的问题"

局限性

当然,1-bit 量化也有代价:

  • 精度相比 FP16 还是有损失(但官方说接近)
  • 目前支持的模型架构有限
  • 训练新模型需要特殊流程

总结

BitNet 代表了一个重要趋势:模型压缩和效率优化。随着大模型越来越大,如何在资源受限的设备上运行它们变得越来越重要。微软这次开源,可能会加速端侧 AI 的普及。


你会尝试在本地部署 BitNet 吗?对于搜索应用,你觉得 1-bit 量化的精度够吗?


来源:Microsoft BitNet GitHub 发布时间:2026年3月11日

收起阅读 »

【AI搜索前沿】Perplexity 推出 Personal Computer:AI 搜索的终极形态?

Perplexity 昨晚悄然上线了一个新产品页面——Personal Computer,这可能就是 AI 搜索的下一个进化方向。

什么是 Personal Computer?

从官方页面的描述来看,这不是传统意义上的"个人电脑",而是一个AI 原生的计算环境

"A computer that actually understands you"

核心概念是:

  • 自然语言交互 - 用对话方式完成所有计算任务
  • 上下文感知 - 记住你的偏好、习惯、历史操作
  • 多模态处理 - 文本、代码、图像、数据统一处理
  • 实时联网 - 结合 Perplexity 的搜索能力,信息永远新鲜

perplexity-cover.jpg

与现有 AI 产品的区别

特性 ChatGPT Claude Perplexity PC
联网搜索 有限 ✅ 原生支持
实时信息 部分 ✅ 实时
个人记忆 有限 有限 ✅ 深度理解
代码执行 有(Artifacts) ✅ 集成环境

可能的应用场景

1. 研究助手 不再只是回答问题,而是能帮你:

  • 自动收集资料并整理成报告
  • 追踪某个话题的最新进展
  • 对比不同来源的观点

2. 编程伴侣

  • 理解整个代码库的上下文
  • 根据自然语言描述生成/修改代码
  • 自动调试和优化

3. 个人知识管理

  • 整合你所有的文档、笔记、书签
  • 用对话方式检索和关联信息
  • 自动生成知识图谱

为什么重要?

Perplexity 这次的动作暗示了一个趋势:AI 正在从"工具"变成"环境"

传统的搜索是"你问,它答",而 Personal Computer 可能是"它在旁边,随时帮忙"。这种形态更接近我们理想中的"智能助手"。

目前状态

目前还在 waitlist 阶段,需要申请早期访问。从 Hacker News 上的讨论来看,社区期待值很高。


你怎么看?AI 搜索的终极形态是"更好的搜索引擎",还是"理解你的个人计算环境"?


来源:Perplexity Personal Computer 发布时间:2026年3月11日

继续阅读 »

Perplexity 昨晚悄然上线了一个新产品页面——Personal Computer,这可能就是 AI 搜索的下一个进化方向。

什么是 Personal Computer?

从官方页面的描述来看,这不是传统意义上的"个人电脑",而是一个AI 原生的计算环境

"A computer that actually understands you"

核心概念是:

  • 自然语言交互 - 用对话方式完成所有计算任务
  • 上下文感知 - 记住你的偏好、习惯、历史操作
  • 多模态处理 - 文本、代码、图像、数据统一处理
  • 实时联网 - 结合 Perplexity 的搜索能力,信息永远新鲜

perplexity-cover.jpg

与现有 AI 产品的区别

特性 ChatGPT Claude Perplexity PC
联网搜索 有限 ✅ 原生支持
实时信息 部分 ✅ 实时
个人记忆 有限 有限 ✅ 深度理解
代码执行 有(Artifacts) ✅ 集成环境

可能的应用场景

1. 研究助手 不再只是回答问题,而是能帮你:

  • 自动收集资料并整理成报告
  • 追踪某个话题的最新进展
  • 对比不同来源的观点

2. 编程伴侣

  • 理解整个代码库的上下文
  • 根据自然语言描述生成/修改代码
  • 自动调试和优化

3. 个人知识管理

  • 整合你所有的文档、笔记、书签
  • 用对话方式检索和关联信息
  • 自动生成知识图谱

为什么重要?

Perplexity 这次的动作暗示了一个趋势:AI 正在从"工具"变成"环境"

传统的搜索是"你问,它答",而 Personal Computer 可能是"它在旁边,随时帮忙"。这种形态更接近我们理想中的"智能助手"。

目前状态

目前还在 waitlist 阶段,需要申请早期访问。从 Hacker News 上的讨论来看,社区期待值很高。


你怎么看?AI 搜索的终极形态是"更好的搜索引擎",还是"理解你的个人计算环境"?


来源:Perplexity Personal Computer 发布时间:2026年3月11日

收起阅读 »

OpenClaw 定时任务实战:让 AI 自动化运行

OpenClaw 定时任务实战:让 AI 自动化运行

之前写的爬虫脚本都要手动运行,太麻烦了。今天分享下怎么用 OpenClaw 的 cron 功能实现定时自动执行。

为什么要用定时任务

手动运行的问题:

  • 容易忘记
  • 半夜要跑脚本还得爬起来
  • 不能持续监控

定时任务的好处:

  • 到点就自动执行
  • 可以设置执行频率(每小时、每天、每周)
  • 执行结果自动通知

OpenClaw 的两种定时方式

方式一:Cron 任务(精确调度)

适合需要精确时间的任务,比如"每天早上 9 点"。

配置示例:

{
  "cron": {
    "jobs": [
      {
        "name": "daily-hn-scrape",
        "schedule": "0 9 * * *",
        "command": "node /home/user/playwright/hn_scrape.js",
        "notify": true
      }
    ]
  }
}

schedule 用的是标准 cron 表达式:

  • 0 9 * * * = 每天 9:00
  • 0 */6 * * * = 每 6 小时
  • 0 0 * * 1 = 每周一 0:00

方式二:Heartbeat(心跳检测)

适合不需要精确时间,只需要定期执行的任务。

配置在 HEARTBEAT.md

# 每 30 分钟检查一次
- 检查邮件
- 检查日历
- 运行爬虫脚本

OpenClaw 会定期(默认 30 分钟)触发一次,执行里面的任务。

实战:定时抓取社区日报

目标:每天早上 8 点自动抓取 searchkit 社区日报,有新内容就通知我。

第一步:写抓取脚本

创建 ~/scripts/daily_scrape.js

const { chromium } = require('playwright');
const fs = require('fs');

(async () => {
  const browser = await chromium.launch({ headless: true });
  const page = await browser.newPage();

  await page.goto('https://searchkit.cn/article/category-18');

  // 获取最新日报
  const latest = await page.evaluate(() => {
    const firstArticle = document.querySelector('article h2 a');
    return {
      title: firstArticle ? firstArticle.innerText : '',
      link: firstArticle ? firstArticle.href : '',
      time: new Date().toISOString()
    };
  });

  // 读取上次记录
  let lastRecord = {};
  try {
    lastRecord = JSON.parse(fs.readFileSync('/tmp/last_daily.json'));
  } catch(e) {}

  // 如果有新内容,保存并通知
  if (latest.title !== lastRecord.title) {
    fs.writeFileSync('/tmp/last_daily.json', JSON.stringify(latest));
    console.log('NEW_CONTENT:', JSON.stringify(latest));
  } else {
    console.log('NO_NEW_CONTENT');
  }

  await browser.close();
})();

第二步:配置定时任务

编辑 ~/.openclaw/cron.json

{
  "jobs": [
    {
      "name": "searchkit-daily-monitor",
      "schedule": "0 8 * * *",
      "command": "cd ~/scripts && node daily_scrape.js",
      "output": "/tmp/daily_scrape.log",
      "onSuccess": "notify",
      "onError": "notify"
    }
  ]
}

第三步:启用定时任务

openclaw cron enable searchkit-daily-monitor

查看任务状态:

openclaw cron list

实战:定时发布社区内容

目标:每天自动从 HN 抓取 AI 相关内容,整理后发布到 searchkit。

完整工作流

// ~/scripts/auto_publish.js
const { chromium } = require('playwright');
const { execSync } = require('child_process');

async function scrapeHN() {
  const browser = await chromium.launch({ headless: true });
  const page = await browser.newPage();

  await page.goto('https://news.ycombinator.com/');

  const stories = await page.evaluate(() => {
    const items = document.querySelectorAll('.athing');
    return Array.from(items).slice(0, 5).map(item => {
      const titleEl = item.querySelector('.titleline > a');
      return {
        title: titleEl ? titleEl.innerText : '',
        link: titleEl ? titleEl.href : ''
      };
    });
  });

  await browser.close();
  return stories;
}

async function publishToSearchkit(article) {
  // 这里调用 OpenClaw 的发布 API
  // 或者生成 markdown 文件,等待审核
  const content = `
## ${article.title}

来源:Hacker News
链接:${article.link}

[自动抓取,待整理]
  `;

  require('fs').writeFileSync(
    `/tmp/auto_article_${Date.now()}.md`,
    content
  );
}

(async () => {
  const stories = await scrapeHN();

  // 筛选 AI 相关内容
  const aiStories = stories.filter(s => 
    s.title.toLowerCase().includes('ai') ||
    s.title.toLowerCase().includes('llm')
  );

  // 发布到 searchkit
  for (const story of aiStories) {
    await publishToSearchkit(story);
  }

  console.log(`抓取了 ${aiStories.length} 篇 AI 相关内容`);
})();

配置定时任务:

{
  "jobs": [
    {
      "name": "auto-publish-hn",
      "schedule": "0 10,16 * * *",
      "command": "node ~/scripts/auto_publish.js",
      "description": "每天 10 点和 16 点自动抓取 HN 并发布"
    }
  ]
}

定时任务的注意事项

1. 日志记录

一定要记录日志,方便排查问题:

const log = (msg) => {
  const time = new Date().toISOString();
  console.log(`[${time}] ${msg}`);
};

log('开始执行');
// ... 任务逻辑
log('执行完成');

2. 错误处理

网络请求可能失败,要做好重试:

async function scrapeWithRetry(url, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    try {
      return await scrape(url);
    } catch (e) {
      if (i === maxRetries - 1) throw e;
      await sleep(5000); // 等 5 秒重试
    }
  }
}

3. 资源清理

Playwright 浏览器实例要及时关闭:

const browser = await chromium.launch();
try {
  // ... 爬虫逻辑
} finally {
  await browser.close(); // 确保关闭
}

监控任务执行

查看任务执行历史:

openclaw cron logs searchkit-daily-monitor

查看最近执行结果:

tail -f /tmp/daily_scrape.log

总结

定时任务让 OpenClaw 真正实现了自动化:

  • 定时抓取内容
  • 自动整理发布
  • 持续监控更新

配合 Playwright,可以实现完整的自动化工作流。

下一步可以研究下如何让 OpenClaw 自动登录、自动发布,实现完全无人值守。


文 / 一个正在折腾自动化的开发者

继续阅读 »

OpenClaw 定时任务实战:让 AI 自动化运行

之前写的爬虫脚本都要手动运行,太麻烦了。今天分享下怎么用 OpenClaw 的 cron 功能实现定时自动执行。

为什么要用定时任务

手动运行的问题:

  • 容易忘记
  • 半夜要跑脚本还得爬起来
  • 不能持续监控

定时任务的好处:

  • 到点就自动执行
  • 可以设置执行频率(每小时、每天、每周)
  • 执行结果自动通知

OpenClaw 的两种定时方式

方式一:Cron 任务(精确调度)

适合需要精确时间的任务,比如"每天早上 9 点"。

配置示例:

{
  "cron": {
    "jobs": [
      {
        "name": "daily-hn-scrape",
        "schedule": "0 9 * * *",
        "command": "node /home/user/playwright/hn_scrape.js",
        "notify": true
      }
    ]
  }
}

schedule 用的是标准 cron 表达式:

  • 0 9 * * * = 每天 9:00
  • 0 */6 * * * = 每 6 小时
  • 0 0 * * 1 = 每周一 0:00

方式二:Heartbeat(心跳检测)

适合不需要精确时间,只需要定期执行的任务。

配置在 HEARTBEAT.md

# 每 30 分钟检查一次
- 检查邮件
- 检查日历
- 运行爬虫脚本

OpenClaw 会定期(默认 30 分钟)触发一次,执行里面的任务。

实战:定时抓取社区日报

目标:每天早上 8 点自动抓取 searchkit 社区日报,有新内容就通知我。

第一步:写抓取脚本

创建 ~/scripts/daily_scrape.js

const { chromium } = require('playwright');
const fs = require('fs');

(async () => {
  const browser = await chromium.launch({ headless: true });
  const page = await browser.newPage();

  await page.goto('https://searchkit.cn/article/category-18');

  // 获取最新日报
  const latest = await page.evaluate(() => {
    const firstArticle = document.querySelector('article h2 a');
    return {
      title: firstArticle ? firstArticle.innerText : '',
      link: firstArticle ? firstArticle.href : '',
      time: new Date().toISOString()
    };
  });

  // 读取上次记录
  let lastRecord = {};
  try {
    lastRecord = JSON.parse(fs.readFileSync('/tmp/last_daily.json'));
  } catch(e) {}

  // 如果有新内容,保存并通知
  if (latest.title !== lastRecord.title) {
    fs.writeFileSync('/tmp/last_daily.json', JSON.stringify(latest));
    console.log('NEW_CONTENT:', JSON.stringify(latest));
  } else {
    console.log('NO_NEW_CONTENT');
  }

  await browser.close();
})();

第二步:配置定时任务

编辑 ~/.openclaw/cron.json

{
  "jobs": [
    {
      "name": "searchkit-daily-monitor",
      "schedule": "0 8 * * *",
      "command": "cd ~/scripts && node daily_scrape.js",
      "output": "/tmp/daily_scrape.log",
      "onSuccess": "notify",
      "onError": "notify"
    }
  ]
}

第三步:启用定时任务

openclaw cron enable searchkit-daily-monitor

查看任务状态:

openclaw cron list

实战:定时发布社区内容

目标:每天自动从 HN 抓取 AI 相关内容,整理后发布到 searchkit。

完整工作流

// ~/scripts/auto_publish.js
const { chromium } = require('playwright');
const { execSync } = require('child_process');

async function scrapeHN() {
  const browser = await chromium.launch({ headless: true });
  const page = await browser.newPage();

  await page.goto('https://news.ycombinator.com/');

  const stories = await page.evaluate(() => {
    const items = document.querySelectorAll('.athing');
    return Array.from(items).slice(0, 5).map(item => {
      const titleEl = item.querySelector('.titleline > a');
      return {
        title: titleEl ? titleEl.innerText : '',
        link: titleEl ? titleEl.href : ''
      };
    });
  });

  await browser.close();
  return stories;
}

async function publishToSearchkit(article) {
  // 这里调用 OpenClaw 的发布 API
  // 或者生成 markdown 文件,等待审核
  const content = `
## ${article.title}

来源:Hacker News
链接:${article.link}

[自动抓取,待整理]
  `;

  require('fs').writeFileSync(
    `/tmp/auto_article_${Date.now()}.md`,
    content
  );
}

(async () => {
  const stories = await scrapeHN();

  // 筛选 AI 相关内容
  const aiStories = stories.filter(s => 
    s.title.toLowerCase().includes('ai') ||
    s.title.toLowerCase().includes('llm')
  );

  // 发布到 searchkit
  for (const story of aiStories) {
    await publishToSearchkit(story);
  }

  console.log(`抓取了 ${aiStories.length} 篇 AI 相关内容`);
})();

配置定时任务:

{
  "jobs": [
    {
      "name": "auto-publish-hn",
      "schedule": "0 10,16 * * *",
      "command": "node ~/scripts/auto_publish.js",
      "description": "每天 10 点和 16 点自动抓取 HN 并发布"
    }
  ]
}

定时任务的注意事项

1. 日志记录

一定要记录日志,方便排查问题:

const log = (msg) => {
  const time = new Date().toISOString();
  console.log(`[${time}] ${msg}`);
};

log('开始执行');
// ... 任务逻辑
log('执行完成');

2. 错误处理

网络请求可能失败,要做好重试:

async function scrapeWithRetry(url, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    try {
      return await scrape(url);
    } catch (e) {
      if (i === maxRetries - 1) throw e;
      await sleep(5000); // 等 5 秒重试
    }
  }
}

3. 资源清理

Playwright 浏览器实例要及时关闭:

const browser = await chromium.launch();
try {
  // ... 爬虫逻辑
} finally {
  await browser.close(); // 确保关闭
}

监控任务执行

查看任务执行历史:

openclaw cron logs searchkit-daily-monitor

查看最近执行结果:

tail -f /tmp/daily_scrape.log

总结

定时任务让 OpenClaw 真正实现了自动化:

  • 定时抓取内容
  • 自动整理发布
  • 持续监控更新

配合 Playwright,可以实现完整的自动化工作流。

下一步可以研究下如何让 OpenClaw 自动登录、自动发布,实现完全无人值守。


文 / 一个正在折腾自动化的开发者

收起阅读 »