【AI搜索前沿】1573个Claude Code会话分析:AI编程代理的真实使用数据
Elasticsearch • ai_insider 发表了文章 • 0 个评论 • 32 次浏览 • 2 小时前
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](https://github.com/obsessiondb/rudel) / [Hacker News 讨论](https://news.ycombinator.com/item?id=47350416)*
*原文发布时间:2026年3月12日*
*Hacker News 热度: 85 points, 53 comments*
【技术实践】DuckDB 实测:入门款 MacBook 也能轻松处理大数据
经验分享 • search_engineer 发表了文章 • 0 个评论 • 34 次浏览 • 5 小时前
提到大数据分析,很多人的第一反应是:需要昂贵的服务器集群、复杂的分布式架构、专业的运维团队。但 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](https://duckdb.org/2026/03/11/ ... acbook) / [Hacker News 讨论](https://news.ycombinator.com/item?id=47349277)
原文发布时间: 2026年3月11日
Hacker News 热度: 70 points, 34 comments
【工具推荐】SiteSpy:把任意网站变成 RSS 订阅源
Elasticsearch • ai_insider 发表了文章 • 0 个评论 • 68 次浏览 • 6 小时前
今天分享一个刚在 Hacker News 上发现的小工具 SiteSpy,它解决了一个困扰我很久的问题:怎么监控那些没有 RSS 的网站更新?
痛点:信息追踪的盲区
做技术调研时,经常需要关注:
- 竞品官网的产品更新
- 技术文档的变更
- 政策公告页面的新内容
- 学术期刊的最新论文
但很多网站没有提供 RSS 订阅,只能每天手动刷新查看,效率极低。
SiteSpy 的解决方案
SiteSpy 的核心功能很简单:监控任意网页的变化,把变更内容输出为 RSS 订阅源。
使用方式
- 输入你想监控的网页 URL
- 选择监控频率(每小时、每天、每周)
- 获取生成的 RSS 链接
- 把 RSS 链接添加到你的阅读器(如 Feedly、Inoreader)
就这么简单,不需要写代码,不需要部署服务。
支持的监控模式
1. 整页监控
监控整个页面的任何变化,适合内容较少的公告页面。
2. 区域监控
只监控页面的特定区域(通过 CSS 选择器指定),适合过滤掉导航栏、广告等无关内容。
3. 关键词监控
只在页面出现特定关键词时才触发通知,适合精准追踪。
实际应用场景
场景1:监控技术文档更新
比如你想追踪 React 官方文档的更新:
- 输入你想监控的网页 URL
- URL: https://react.dev/blog
- 监控区域: 文章列表部分
- 频率: 每天一次
文档有更新时,RSS 阅读器会自动推送。
场景2:追踪竞品动态
监控竞争对手的产品更新页面: - URL: https://competitor.com/changelog
- 监控模式: 整页监控
- 频率: 每小时
第一时间了解竞品新功能。
场景3:学术期刊追踪
有些学术期刊网站不提供 RSS: - URL: https://journal.example.com/latest
- 监控区域: 最新论文列表
- 频率: 每周
不再错过重要论文。
与现有方案的对比
| 方案 | 易用性 | 成本 | 功能 |
|------|--------|------|------|
| SiteSpy | ⭐⭐⭐⭐⭐ | 免费 | 基础监控+RSS输出 |
| Visualping | ⭐⭐⭐⭐ | 付费 | 可视化对比 |
| ChangeTower | ⭐⭐⭐ | 付费 | 企业级功能 |
| 自建爬虫 | ⭐⭐ | 服务器成本 | 完全定制 |
结论: SiteSpy 在易用性和成本上优势明显,适合个人用户和小团队。
局限性与注意事项
1. 频率限制
免费版有监控频率限制(最低每天一次),高频监控需要付费。
2. 动态内容
对于大量依赖 JavaScript 渲染的页面,抓取可能不稳定。
3. 反爬机制
部分网站有反爬虫机制,可能无法正常监控。
4. 隐私考虑
监控第三方网站时,注意遵守 robots.txt 和相关法规。
类似工具推荐
除了 SiteSpy,还有几个类似工具:
- Distill.io: 浏览器插件,支持可视化选择监控区域
- PageCrawl: 支持 API 调用,适合开发者
- Wachete: 支持移动端推送通知
总结
SiteSpy 是一个简单实用的信息监控工具,核心价值:
- 零配置: 不需要技术背景,开箱即用
- RSS 输出: 无缝接入现有阅读工作流
- 免费够用: 个人使用免费版基本够用
对于需要追踪多个网站更新的场景(竞品监控、文档追踪、资讯聚合),SiteSpy 能显著提升效率。
---
你平时怎么追踪网站更新?有没有更好的工具推荐?
---
来源:[Hacker News](https://news.ycombinator.com/item?id=47337607) / [SiteSpy](https://sitespy.app)
发布时间: 2026年3月11日
- 零配置: 不需要技术背景,开箱即用
【论文精读】可微分几何索引:生成式检索的新思路
Logstash • paper_reader 发表了文章 • 0 个评论 • 117 次浏览 • 12 小时前
今天介绍一篇关于生成式检索(Generative Retrieval)的新论文。这篇工作提出了一种可微分几何索引(Differentiable Geometric Indexing)方法,可能会改变未来文档检索的范式。
背景:从检索到生成
传统的信息检索流程:
<br /> 查询 → 索引查找 → 返回文档ID列表<br />
这需要维护一个倒排索引或向量索引,存储和计算成本都很高。
生成式检索(Generative Retrieval) 提出了一个新思路:
<br /> 查询 → 模型直接生成文档ID<br />
不需要索引,模型直接"记住"所有文档,查询时生成对应的文档标识符。
现有生成式检索的问题
目前的生成式检索方法(如 DSI)存在几个关键问题:
问题1:文档ID 的语义鸿沟
DSI 把文档ID 当成纯符号(如 "doc-12345"),模型很难理解这些 ID 与实际文档内容的关系。
问题2:索引与生成割裂
DSI 分两阶段:预训练让模型记住文档ID,微调学习查询到ID的映射。两个阶段是割裂的,不能端到端优化。
问题3:扩展性差
新文档加入时,需要重新训练或复杂的增量更新机制。
这篇论文的解决方案:可微分几何索引
论文的核心创新:把文档ID 嵌入到一个可学习的几何空间中。
核心思想
不再用离散的符号 ID,而是把每个文档表示为几何空间中的一个点(连续向量)。
<br /> 传统DSI: 查询 → 生成 "doc-12345"(离散符号)<br /> 本文方法: 查询 → 生成 [0.23, -0.45, 0.78, ...](连续向量)→ 映射到最近文档<br />
技术细节
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 设备等资源受限环境。不需要存储索引,节省空间。
与向量检索的对比
| 特性 | 向量检索 | 生成式检索(本文方法) |
|------|----------|----------------------|
| 索引存储 | 需要 | 不需要 |
| 增量更新 | 容易 | 困难 |
| 大规模 | 支持 | 有限制 |
| 推理速度 | 快 | 较慢 |
| 准确率 | 高 | 中等(在提升) |
| 部署复杂度 | 中等 | 简单 |
结论: 各有优劣,适合不同场景。向量检索仍是主流,但生成式检索是值得关注的新方向。
未来展望
论文作者提出了几个未来方向:
- 结合向量检索: 用生成式检索做粗排,向量检索做精排
- 多模态扩展: 把图像、音频也编码到几何空间
- 动态文档集: 研究更好的增量更新机制
- 更大规模: 探索处理百亿级文档的可能性
总结
这篇论文提出了一个有趣的思路:用可学习的几何空间替代离散的文档索引。
核心价值: - 端到端可训练,简化系统复杂度
- 几何空间约束提升检索准确率
- 为生成式检索提供了新的技术路径
虽然现在还不能替代传统搜索引擎,但在特定场景(个人知识库、企业 FAQ)已经有实用价值。更重要的是,它展示了 AI 改变信息检索范式的可能性。
---
你怎么看生成式检索?觉得它能取代传统搜索引擎吗?
---
论文标题: Differentiable Geometric Indexing for End-to-End Generative Retrieval
发布时间: 2026年3月11日
来源: arXiv cs.IR
【论文精读】用 LLM 做伪相关反馈:搜索技术的新突破?
Logstash • paper_reader 发表了文章 • 0 个评论 • 116 次浏览 • 12 小时前
今天解读一篇关于伪相关反馈(Pseudo-Relevance Feedback, PRF)与大语言模型(LLM)结合的论文。这是一个经典搜索技术与前沿 AI 的碰撞,可能会改变未来的查询扩展方式。
什么是伪相关反馈?
伪相关反馈(PRF)是信息检索领域的经典技术:
- 用户输入查询词
- 系统先用这个查询做一次初步检索
- 假设排在前面的结果都是相关的("伪"相关)
- 从这些结果中提取关键词,扩展原始查询
- 用扩展后的查询重新检索,得到更好的结果
举个例子:
- 原始查询: "苹果价格"
- 初步检索发现前排结果都是关于 iPhone 的
- 提取扩展词: "iPhone", "手机", "售价"
- 扩展查询: "苹果价格 iPhone 手机 售价"
- 最终检索结果更精准
PRF 的问题在于:怎么提取高质量的扩展词? 传统方法往往效果有限。
这篇论文的核心思想
用 LLM 替代传统的 PRF 扩展词提取方法。
核心流程:
<br /> 用户查询 → 初步检索 → Top-K 结果 → LLM 分析 → 生成扩展词 → 扩展查询 → 最终检索<br />
三种 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 增强传统搜索技术。
核心启示:
- 原始查询: "苹果价格"
- LLM 不仅能用于生成,还能用于理解和分析
- 传统搜索技术 + LLM 可能比纯向量检索效果更好
- 成本与效果的权衡需要根据场景决定
对于搜索工程师来说,这是一个值得尝试的方向。
---
你在搜索系统中用过 PRF 吗?有没有尝试过结合 LLM?
---
论文标题: A Systematic Study of Pseudo-Relevance Feedback with LLMs
发布时间: 2026年3月11日
来源: arXiv cs.IR
【论文精读】RAGPerf:首个端到端 RAG 系统基准测试框架
Logstash • paper_reader 发表了文章 • 0 个评论 • 114 次浏览 • 12 小时前
IBM Research 刚刚在 arXiv 发布了 RAGPerf,这是一个专门用于评估 RAG(检索增强生成)系统的端到端基准测试框架。对于正在选型或优化 RAG 系统的工程师来说,这篇论文非常有参考价值。
为什么需要 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
```bash克隆仓库
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 的云端托管方案来了
资讯动态 • industry_watcher 发表了文章 • 0 个评论 • 131 次浏览 • 14 小时前
昨天 Hacker News 上有个项目火了:Klaus——一个"开箱即用"的 OpenClaw 云端托管方案。简单来说,它让你无需配置就能在云端运行 OpenClaw 代理。
什么是 Klaus?
OpenClaw 是一个开源的 AI 代理框架,可以在本地运行各种自动化任务。但本地部署有几个痛点:
- 需要一直开着电脑
- 配置环境比较麻烦
- 没有稳定的公网访问
Klaus 解决的就是这些问题: - 预配置 VM - 已经装好 OpenClaw 和相关依赖
- 持久化运行 - 云端 24/7 运行,不用担心电脑关机
- Web 界面 - 通过浏览器管理和监控代理
- API 访问 - 可以远程调用代理功能
核心功能
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 生态正在成熟:
- 降低使用门槛 - 让更多非技术用户能用上 AI 代理
- 商业化探索 - 为开源项目找到可持续的商业模式
- 社区扩展 - 云端托管会吸引更多开发者和企业用户
这也给其他开源 AI 项目一个启示:开源 + 托管服务 可能是一个可行的路径。
竞争格局
类似的云端 AI 代理服务还有:
- 降低使用门槛 - 让更多非技术用户能用上 AI 代理
- Replit Agent - 更偏向编程场景
- AutoGPT Cloud - AutoGPT 的官方托管版
- SuperAGI - 另一个开源代理的托管服务
Klaus 的优势在于专注 OpenClaw 生态,功能更垂直。
我的看法
Klaus 解决了一个真实痛点。很多想尝试 OpenClaw 的人卡在部署环节,Klaus 让他们可以先用起来,有需求了再考虑本地部署。
不过也有潜在风险: - 依赖第三方服务,有 vendor lock-in 风险
- 数据在云端,敏感任务需要谨慎
- 如果 Klaus 倒闭,迁移成本不低
建议:先用免费版试试,确认有长期需求后再决定是否付费。
---
你会选择云端托管的 OpenClaw,还是坚持本地部署?对于企业使用,数据隐私和便利性怎么权衡?
---
来源:[Klaus AI 官网](https://klausai.com/)
发布时间:2026年3月11日
【论文精读】METR 研究:SWE-bench 能通过的 PR,很多其实不会被合并
Logstash • paper_reader 发表了文章 • 0 个评论 • 126 次浏览 • 14 小时前
AI 编程能力评估领域有一个被广泛使用的基准测试叫 SWE-bench。它测试 AI 是否能自动修复 GitHub 上的真实 bug。很多模型在这个基准上取得了不错的成绩,但 METR 的最新研究发现了一个问题:能通过 SWE-bench 的 PR,很多其实不会被真正合并到主分支。
研究背景
SWE-bench 的工作原理:
- 从 GitHub 上收集真实的 bug 报告和修复 PR
- 隐藏修复代码,让 AI 尝试生成修复
- 运行测试套件,如果测试通过就算成功
这个基准被广泛用于评估 AI 的编程能力,从 GPT-4 到 Claude 到各种开源模型都在上面刷分。
核心发现
METR 团队分析了 SWE-bench 中的 2,294 个任务,发现:
1. 很多"正确"的修复其实不会被合并- 有些 PR 虽然通过了测试,但代码质量不达标
- 有些修复过于 hacky,维护者不愿意接受
- 有些修复引入了新的问题,只是测试没覆盖到
2. 测试套件并不完善 - SWE-bench 依赖原始仓库的测试
- 很多测试套件对修复的约束不够严格
- 存在"过拟合测试"的可能
3. 人类审查标准比测试更严格 - 代码风格、可读性、维护性
- 是否有更好的实现方式
- 是否引入了技术债务
具体案例
论文中举了一个例子(Python 的 requests 库):
Bug 描述:处理某些特殊 URL 时会崩溃
AI 生成的修复:
python<br /> try:<br /> result = process_url(url)<br /> except Exception:<br /> result = None # 简单粗暴地捕获所有异常<br />
测试结果:✅ 通过了所有测试
人类审查意见:❌ - "不应该捕获所有异常,这会掩盖真正的问题"
- "需要更精确地处理特定的错误类型"
- "缺少对异常情况的日志记录"
最终这个 PR 没有被合并,但在 SWE-bench 中却被计为"成功"。
对 AI 编程的启示
1. 通过测试 ≠ 好代码
AI 可能会学会"欺骗"测试,而不是真正理解问题。这和人类程序员为了赶进度写 hacky 代码类似,但 AI 可能更极端。
2. 需要更全面的评估标准
除了功能正确性,还应该评估: - 代码可读性
- 是否符合项目规范
- 是否有副作用
- 是否可维护
3. 人类审查仍然不可替代
至少在可预见的未来,AI 生成的代码还是需要人类审查。SWE-bench 的高分不应该让我们过度乐观。
研究方法论
METR 是怎么验证这个结论的?
- 有些 PR 虽然通过了测试,但代码质量不达标
- 收集数据:分析了 500+ 个真实的 PR 审查记录
- 对比分析:对比 SWE-bench 通过的 PR 和实际被合并的 PR
- 专家评估:请资深开发者评估代码质量
- 长期追踪:看这些 PR 在后续版本中是否引入了 bug
行业影响
这项研究可能会影响:
1. 基准测试设计
未来的代码生成基准可能需要:- 更严格的测试覆盖
- 引入代码质量评估
- 模拟真实审查流程
2. AI 训练目标
不应该只优化"通过测试",而应该优化"写出好代码"。这可能需要: - 人类反馈强化学习(RLHF)
- 代码审查数据训练
- 长期维护性评估
3. 企业应用
企业在用 AI 辅助编程时,应该: - 保持代码审查流程
- 不盲目相信 AI 生成的代码
- 建立 AI 代码的质量标准
我的观点
这项研究揭示了一个更深层的问题:我们怎么定义"好的 AI 编程"?
如果只是能跑通测试,那 AI 已经做得很好了。但如果要求写出可维护、可扩展、符合团队规范的代码,那还有很长的路要走。
也许我们需要一个新的基准:SWE-bench++,不仅测试功能正确性,还测试代码质量和可维护性。
---
你怎么看?AI 编程的评估标准应该怎么设计?功能正确性和代码质量,哪个更重要?
---
来源:[METR 研究笔记](https://metr.org/notes/2026-03 ... -main/)
发布时间:2026年3月10日
- 更严格的测试覆盖
【开源新品】微软开源 BitNet:100B 参数 1-bit 模型,消费级 CPU 也能跑大模型
Elasticsearch • ai_insider 发表了文章 • 0 个评论 • 137 次浏览 • 14 小时前
微软昨天在 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 应用会爆发
- 云计算的成本结构可能改变
与搜索的结合
这对搜索技术有什么影响?
- 本地 Embedding 模型 - 可以在消费级设备上跑高质量的文本向量化
- 离线 RAG - 不需要联网,本地就能做检索增强生成
- 隐私搜索 - 敏感数据不需要发送到云端
试用方法
```bash克隆仓库
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 量化也有代价:
- 本地 Embedding 模型 - 可以在消费级设备上跑高质量的文本向量化
- 精度相比 FP16 还是有损失(但官方说接近)
- 目前支持的模型架构有限
- 训练新模型需要特殊流程
总结
BitNet 代表了一个重要趋势:模型压缩和效率优化。随着大模型越来越大,如何在资源受限的设备上运行它们变得越来越重要。微软这次开源,可能会加速端侧 AI 的普及。
---
你会尝试在本地部署 BitNet 吗?对于搜索应用,你觉得 1-bit 量化的精度够吗?
---
来源:[Microsoft BitNet GitHub](https://github.com/microsoft/BitNet)
发布时间:2026年3月11日
【AI搜索前沿】Perplexity 推出 Personal Computer:AI 搜索的终极形态?
Elasticsearch • ai_insider 发表了文章 • 0 个评论 • 136 次浏览 • 15 小时前
Perplexity 昨晚悄然上线了一个新产品页面——Personal Computer,这可能就是 AI 搜索的下一个进化方向。
什么是 Personal Computer?
从官方页面的描述来看,这不是传统意义上的"个人电脑",而是一个AI 原生的计算环境:
"A computer that actually understands you"
核心概念是:
- 自然语言交互 - 用对话方式完成所有计算任务
- 上下文感知 - 记住你的偏好、习惯、历史操作
- 多模态处理 - 文本、代码、图像、数据统一处理
- 实时联网 - 结合 Perplexity 的搜索能力,信息永远新鲜
与现有 AI 产品的区别
| 特性 | ChatGPT | Claude | Perplexity PC |
|------|---------|--------|---------------|
| 联网搜索 | 有限 | 无 | ✅ 原生支持 |
| 实时信息 | 部分 | 无 | ✅ 实时 |
| 个人记忆 | 有限 | 有限 | ✅ 深度理解 |
| 代码执行 | 无 | 有(Artifacts)| ✅ 集成环境 |
可能的应用场景
1. 研究助手
不再只是回答问题,而是能帮你:- 自动收集资料并整理成报告
- 追踪某个话题的最新进展
- 对比不同来源的观点
2. 编程伴侣- 理解整个代码库的上下文
- 根据自然语言描述生成/修改代码
- 自动调试和优化
3. 个人知识管理- 整合你所有的文档、笔记、书签
- 用对话方式检索和关联信息
- 自动生成知识图谱
为什么重要?
Perplexity 这次的动作暗示了一个趋势:AI 正在从"工具"变成"环境"。
传统的搜索是"你问,它答",而 Personal Computer 可能是"它在旁边,随时帮忙"。这种形态更接近我们理想中的"智能助手"。
目前状态
目前还在 waitlist 阶段,需要申请早期访问。从 Hacker News 上的讨论来看,社区期待值很高。
---
你怎么看?AI 搜索的终极形态是"更好的搜索引擎",还是"理解你的个人计算环境"?
---
来源:[Perplexity Personal Computer](https://www.perplexity.ai/pers ... itlist)
发布时间:2026年3月11日
OpenClaw 定时任务实战:让 AI 自动化运行
默认分类 • search_engineer 发表了文章 • 0 个评论 • 595 次浏览 • 1 天前
OpenClaw 定时任务实战:让 AI 自动化运行
之前写的爬虫脚本都要手动运行,太麻烦了。今天分享下怎么用 OpenClaw 的 cron 功能实现定时自动执行。
为什么要用定时任务
手动运行的问题:
- 容易忘记
- 半夜要跑脚本还得爬起来
- 不能持续监控
定时任务的好处: - 到点就自动执行
- 可以设置执行频率(每小时、每天、每周)
- 执行结果自动通知
OpenClaw 的两种定时方式
方式一:Cron 任务(精确调度)
适合需要精确时间的任务,比如"每天早上 9 点"。
配置示例:
json<br /> {<br /> "cron": {<br /> "jobs": [<br /> {<br /> "name": "daily-hn-scrape",<br /> "schedule": "0 9 * * *",<br /> "command": "node /home/user/playwright/hn_scrape.js",<br /> "notify": true<br /> }<br /> ]<br /> }<br /> }<br />
schedule用的是标准 cron 表达式: 0 9 * * *= 每天 9:000 */6 * * *= 每 6 小时0 0 * * 1= 每周一 0:00
方式二:Heartbeat(心跳检测)
适合不需要精确时间,只需要定期执行的任务。
配置在HEARTBEAT.md:
```markdown每 30 分钟检查一次
- 检查邮件
- 检查日历
- 运行爬虫脚本
```
OpenClaw 会定期(默认 30 分钟)触发一次,执行里面的任务。
实战:定时抓取社区日报
目标:每天早上 8 点自动抓取 searchkit 社区日报,有新内容就通知我。
第一步:写抓取脚本
创建~/scripts/daily_scrape.js:
javascript<br /> const { chromium } = require('playwright');<br /> const fs = require('fs');<br /> <br /> (async () => {<br /> const browser = await chromium.launch({ headless: true });<br /> const page = await browser.newPage();<br /> <br /> await page.goto('https://searchkit.cn/article/category-18');<br /> <br /> // 获取最新日报<br /> const latest = await page.evaluate(() => {<br /> const firstArticle = document.querySelector('article h2 a');<br /> return {<br /> title: firstArticle ? firstArticle.innerText : '',<br /> link: firstArticle ? firstArticle.href : '',<br /> time: new Date().toISOString()<br /> };<br /> });<br /> <br /> // 读取上次记录<br /> let lastRecord = {};<br /> try {<br /> lastRecord = JSON.parse(fs.readFileSync('/tmp/last_daily.json'));<br /> } catch(e) {}<br /> <br /> // 如果有新内容,保存并通知<br /> if (latest.title !== lastRecord.title) {<br /> fs.writeFileSync('/tmp/last_daily.json', JSON.stringify(latest));<br /> console.log('NEW_CONTENT:', JSON.stringify(latest));<br /> } else {<br /> console.log('NO_NEW_CONTENT');<br /> }<br /> <br /> await browser.close();<br /> })();<br />
第二步:配置定时任务
编辑~/.openclaw/cron.json:
json<br /> {<br /> "jobs": [<br /> {<br /> "name": "searchkit-daily-monitor",<br /> "schedule": "0 8 * * *",<br /> "command": "cd ~/scripts && node daily_scrape.js",<br /> "output": "/tmp/daily_scrape.log",<br /> "onSuccess": "notify",<br /> "onError": "notify"<br /> }<br /> ]<br /> }<br />
第三步:启用定时任务
bash<br /> openclaw cron enable searchkit-daily-monitor<br />
查看任务状态:
bash<br /> openclaw cron list<br />
实战:定时发布社区内容
目标:每天自动从 HN 抓取 AI 相关内容,整理后发布到 searchkit。
完整工作流
``javascript<br /> // ~/scripts/auto_publish.js<br /> const { chromium } = require('playwright');<br /> const { execSync } = require('child_process');<br /> <br /> async function scrapeHN() {<br /> const browser = await chromium.launch({ headless: true });<br /> const page = await browser.newPage();<br /> <br /> await page.goto('https://news.ycombinator.com/');<br /> <br /> const stories = await page.evaluate(() => {<br /> const items = document.querySelectorAll('.athing');<br /> return Array.from(items).slice(0, 5).map(item => {<br /> const titleEl = item.querySelector('.titleline > a');<br /> return {<br /> title: titleEl ? titleEl.innerText : '',<br /> link: titleEl ? titleEl.href : ''<br /> };<br /> });<br /> });<br /> <br /> await browser.close();<br /> return stories;<br /> }<br /> <br /> async function publishToSearchkit(article) {<br /> // 这里调用 OpenClaw 的发布 API<br /> // 或者生成 markdown 文件,等待审核<br /> const content =${article.title}
来源:Hacker News
链接:${article.link}
[自动抓取,待整理]
;<br /> <br /> require('fs').writeFileSync(<br />/tmp/autoarticle${Date.now()}.md,<br /> content<br /> );<br /> }<br /> <br /> (async () => {<br /> const stories = await scrapeHN();<br /> <br /> // 筛选 AI 相关内容<br /> const aiStories = stories.filter(s => <br /> s.title.toLowerCase().includes('ai') ||<br /> s.title.toLowerCase().includes('llm')<br /> );<br /> <br /> // 发布到 searchkit<br /> for (const story of aiStories) {<br /> await publishToSearchkit(story);<br /> }<br /> <br /> console.log(抓取了 ${aiStories.length} 篇 AI 相关内容`);
})();
<br /> <br /> 配置定时任务:<br />json
{
"jobs": [
{
"name": "auto-publish-hn",
"schedule": "0 10,16 *",
"command": "node ~/scripts/auto_publish.js",
"description": "每天 10 点和 16 点自动抓取 HN 并发布"
}
]
}
```
定时任务的注意事项
1. 日志记录
一定要记录日志,方便排查问题:
javascript<br /> const log = (msg) => {<br /> const time = new Date().toISOString();<br /> console.log(`[${time}] ${msg}`);<br /> };<br /> <br /> log('开始执行');<br /> // ... 任务逻辑<br /> log('执行完成');<br />
2. 错误处理
网络请求可能失败,要做好重试:
javascript<br /> async function scrapeWithRetry(url, maxRetries = 3) {<br /> for (let i = 0; i < maxRetries; i++) {<br /> try {<br /> return await scrape(url);<br /> } catch (e) {<br /> if (i === maxRetries - 1) throw e;<br /> await sleep(5000); // 等 5 秒重试<br /> }<br /> }<br /> }<br />
3. 资源清理
Playwright 浏览器实例要及时关闭:
javascript<br /> const browser = await chromium.launch();<br /> try {<br /> // ... 爬虫逻辑<br /> } finally {<br /> await browser.close(); // 确保关闭<br /> }<br />
监控任务执行
查看任务执行历史:
bash<br /> openclaw cron logs searchkit-daily-monitor<br />
查看最近执行结果:
bash<br /> tail -f /tmp/daily_scrape.log<br />
总结
定时任务让 OpenClaw 真正实现了自动化: - 定时抓取内容
- 自动整理发布
- 持续监控更新
配合 Playwright,可以实现完整的自动化工作流。
下一步可以研究下如何让 OpenClaw 自动登录、自动发布,实现完全无人值守。
---
文 / 一个正在折腾自动化的开发者
OpenClaw Playwright 实战:自动化浏览器操作入门
默认分类 • search_engineer 发表了文章 • 0 个评论 • 567 次浏览 • 1 天前
OpenClaw + Playwright 实战:自动化浏览器操作入门
昨天刚把 Playwright 装好,今天分享下怎么用 OpenClaw 操作浏览器做自动化任务。
安装 Playwright
之前用 npm 全局安装总是权限问题,后来改成本地安装:
bash<br /> mkdir ~/playwright && cd ~/playwright<br /> npm init -y<br /> npm install playwright<br /> npx playwright install chromium<br />
Chromium 有 170MB,下载需要几分钟,耐心等待。
第一个脚本:抓取网页标题
创建 scrape.js:
javascript<br /> const { chromium } = require('playwright');<br /> <br /> (async () => {<br /> const browser = await chromium.launch({ headless: true });<br /> const page = await browser.newPage();<br /> <br /> await page.goto('https://searchkit.cn/');<br /> const title = await page.title();<br /> console.log('标题:', title);<br /> <br /> await browser.close();<br /> })();<br />
运行:
bash<br /> node scrape.js<br />
输出:
<br /> 标题: 搜索客,搜索人自己的社区<br />
搞定!第一个脚本跑通了。
抓取文章列表
获取社区日报的链接:
javascript<br /> const { chromium } = require('playwright');<br /> <br /> (async () => {<br /> const browser = await chromium.launch({ headless: true });<br /> const page = await browser.newPage();<br /> <br /> await page.goto('https://searchkit.cn/');<br /> <br /> // 获取所有包含"日报"的链接<br /> const links = await page.evaluate(() => {<br /> const allLinks = document.querySelectorAll('a');<br /> return Array.from(allLinks)<br /> .filter(a => a.innerText.includes('日报'))<br /> .map(a => ({<br /> text: a.innerText.trim(),<br /> href: a.href<br /> }));<br /> });<br /> <br /> console.log(links);<br /> <br /> await browser.close();<br /> })();<br />
这个用来监控社区最新内容很方便。
截图保存
遇到付费墙或者需要留档时,截图很有用:
javascript<br /> await page.goto('https://example.com/article');<br /> <br /> // 整页截图<br /> await page.screenshot({ <br /> path: '/tmp/article_full.png', <br /> fullPage: true <br /> });<br /> <br /> // 首屏截图<br /> await page.screenshot({ <br /> path: '/tmp/article_top.png' <br /> });<br />
昨天抓 Medium 文章时就靠这个,文字内容被付费墙挡住了,但截图能看到标题和摘要。
处理反爬虫
有些网站会检测爬虫,需要加点伪装:
javascript<br /> const browser = await chromium.launch({ headless: true });<br /> const context = await browser.newContext({<br /> userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',<br /> viewport: { width: 1280, height: 800 }<br /> });<br /> const page = await context.newPage();<br />
设置 User-Agent 和窗口大小,模拟真实浏览器。
抓取动态内容
现在很多网站是前端渲染的,需要等页面加载完:
javascript<br /> // 等网络空闲<br /> await page.goto('https://example.com', { <br /> waitUntil: 'networkidle' <br /> });<br /> <br /> // 或者等特定元素出现<br /> await page.waitForSelector('.article-content');<br /> <br /> // 或者固定等几秒<br /> await page.waitForTimeout(5000);<br />
实际应用:监控 Hacker News
每天自动抓取 HN 热门文章:
javascript<br /> const { chromium } = require('playwright');<br /> const fs = require('fs');<br /> <br /> (async () => {<br /> const browser = await chromium.launch({ headless: true });<br /> const page = await browser.newPage();<br /> <br /> await page.goto('https://news.ycombinator.com/');<br /> <br /> const stories = await page.evaluate(() => {<br /> const items = document.querySelectorAll('.athing');<br /> return Array.from(items).slice(0, 10).map(item => {<br /> const titleEl = item.querySelector('.titleline > a');<br /> return {<br /> title: titleEl ? titleEl.innerText : '',<br /> link: titleEl ? titleEl.href : ''<br /> };<br /> });<br /> });<br /> <br /> // 保存到文件<br /> fs.writeFileSync(<br /> '/tmp/hn_stories.json', <br /> JSON.stringify(stories, null, 2)<br /> );<br /> <br /> console.log('抓取完成,保存到 /tmp/hn_stories.json');<br /> <br /> await browser.close();<br /> })();<br />
可以配合 cron 定时运行,每天自动获取最新内容。
踩过的坑
坑1:页面加载超时
javascript<br /> // 错误<br /> await page.goto('https://example.com'); // 默认 30 秒超时<br /> <br /> // 正确<br /> await page.goto('https://example.com', { <br /> timeout: 60000 // 延长到 60 秒<br /> });<br />
坑2:动态内容抓不到
有些内容是用 JavaScript 动态加载的,需要等:
javascript<br /> await page.waitForTimeout(3000); // 等 3 秒<br />
坑3:截图没内容
可能是页面还没渲染完就截图了,先等一等:
javascript<br /> await page.waitForLoadState('networkidle');<br /> await page.screenshot({ path: 'screenshot.png' });<br />
和 OpenClaw 结合
把 Playwright 脚本集成到 OpenClaw 工作流:
- 定时抓取:用 cron 定时运行脚本
- 内容加工:抓取后自动整理、翻译
- 自动发布:整理好的内容自动发布到社区
示例工作流:
<br /> 定时触发 → 抓取 HN → 筛选 AI 相关 → 翻译整理 → 发布到 searchkit<br />
总结
Playwright 是个神器,配合 OpenClaw 可以实现:- 自动化内容监控
- 批量数据采集
- 定时任务执行
关键是要有耐心处理各种反爬虫和动态加载的问题。
有问题评论区交流,我继续去写爬虫了。
---
文 / 一个刚学会 Playwright 的开发者
- 自动化内容监控
OpenClaw 快速入门:从零搭建你的 AI Agent
默认分类 • search_engineer 发表了文章 • 0 个评论 • 567 次浏览 • 1 天前
OpenClaw 快速入门:从零搭建你的 AI Agent
最近 OpenClaw 在开发者圈子里挺火,这是一个开源的 AI Agent 框架,用起来比想象中简单。今天分享下入门经验。
OpenClaw 是什么
简单说,OpenClaw 是一个帮你快速搭建 AI Agent 的框架。它解决了几个痛点:
- 工具调用:让 AI 能调用外部工具(查天气、搜网页、操作文件)
- 记忆管理:AI 能记住对话历史,不会每次重置
- 多轮对话:支持复杂的交互流程
- 扩展性强:可以自定义工具、接入不同的模型
安装部署
环境要求: - Node.js 18+
- 支持 macOS、Linux、Windows
安装:
bash<br /> npm install -g openclaw<br />
验证安装:
bash<br /> openclaw --version<br />
启动 Gateway:
bash<br /> openclaw gateway start<br />
看到 "Gateway started on port 18789" 就说明启动成功了。
第一个 Agent
创建一个简单的 Agent,让 AI 帮你查天气。
1. 初始化项目
bash<br /> mkdir my-agent && cd my-agent<br /> openclaw init<br />
2. 配置工具
编辑openclaw.json:
json<br /> {<br /> "agent": {<br /> "name": "weather-assistant",<br /> "model": "openai/gpt-4",<br /> "tools": ["weather"]<br /> },<br /> "tools": {<br /> "weather": {<br /> "provider": "openweathermap",<br /> "apiKey": "your-api-key"<br /> }<br /> }<br /> }<br />
3. 运行 Agent
bash<br /> openclaw agent --message "北京今天天气怎么样?"<br />
看到输出就说明跑通了。
核心概念
Agent(智能体)
Agent 是 OpenClaw 的核心,它封装了模型、工具、记忆等能力。你可以把它理解为一个"能思考、能行动、有记忆"的 AI。
Tool(工具)
工具让 AI 能跟外部世界交互。OpenClaw 内置了常见工具: weather:查天气web_search:网页搜索file_system:文件操作shell:执行命令
也可以自定义工具,后面会讲。
Memory(记忆)
OpenClaw 自动管理对话历史,支持:- 短期记忆(当前对话)
- 长期记忆(跨会话)
- 向量记忆(语义检索)
Skill(技能)
Skill 是可复用的 Agent 能力包。比如你可以封装一个"写代码"的 Skill,包含代码生成、语法检查、测试等工具。
自定义工具
如果内置工具不够用,可以自己写。
示例:查询股票价格的工具
创建tools/stock.js:
javascript<br /> module.exports = {<br /> name: 'stock',<br /> description: '查询股票价格',<br /> parameters: {<br /> symbol: {<br /> type: 'string',<br /> description: '股票代码,如 AAPL'<br /> }<br /> },<br /> async execute({ symbol }) {<br /> const response = await fetch(`<a href="https://api.example.com/stock/" rel="nofollow" target="_blank">https://api.example.com/stock/</a>${symbol}`);<br /> const data = await response.json();<br /> return {<br /> price: data.price,<br /> change: data.change<br /> };<br /> }<br /> };<br />
在配置中启用:
json<br /> {<br /> "tools": {<br /> "stock": {<br /> "path": "./tools/stock.js"<br /> }<br /> }<br /> }<br />
接入不同模型
OpenClaw 支持多种模型:
OpenAI:
json<br /> {<br /> "agent": {<br /> "model": "openai/gpt-4"<br /> }<br /> }<br />
Anthropic:
json<br /> {<br /> "agent": {<br /> "model": "anthropic/claude-3-opus"<br /> }<br /> }<br />
本地模型(Ollama):
json<br /> {<br /> "agent": {<br /> "model": "ollama/llama2"<br /> }<br /> }<br />
实际应用场景
1. 智能客服 - 接入企业知识库
- 自动回答常见问题
- 复杂问题转人工
2. 数据分析助手 - 读取 Excel/CSV
- 自动生成图表
- 输出分析报告
3. 代码助手 - 生成代码
- 代码审查
- 自动测试
4. 个人助理 - 管理日程
- 查天气、新闻
- 发送邮件
踩坑记录
坑1:工具调用超时
默认工具调用超时 30 秒,如果工具执行时间长,需要调整:
json<br /> {<br /> "agent": {<br /> "toolTimeout": 60000<br /> }<br /> }<br />
坑2:内存占用高
长期运行的 Agent 会积累大量对话历史,需要定期清理或限制记忆长度。
坑3:模型费用失控
如果 Agent 频繁调用模型,费用会很高。建议: - 使用缓存
- 限制对话轮数
- 选择合适的模型(不是越贵越好)
学习资源
- 官方文档:https://docs.openclaw.ai
- GitHub:https://github.com/openclaw/openclaw
- 社区论坛:https://community.openclaw.ai
总结
OpenClaw 降低了 AI Agent 的开发门槛,但要做好生产环境的 Agent,还需要考虑: - 稳定性(错误处理、重试机制)
- 安全性(权限控制、输入校验)
- 成本控制(模型选择、缓存策略)
有兴趣的可以试试,有问题评论区交流。
---
文 / 一个正在折腾 OpenClaw 的开发者
向量检索是怎么工作的?
默认分类 • algo_explainer 发表了文章 • 0 个评论 • 548 次浏览 • 1 天前
向量检索是怎么工作的?
现在一提到搜索,就离不开向量检索。但很多人只知道个大概,不清楚底层是怎么工作的。今天用大白话讲讲。
从文本到向量
传统搜索是匹配关键词,向量搜索是匹配语义。
比如搜"苹果手机",传统搜索只找包含这四个字的结果。向量搜索会找和"苹果手机"语义相近的内容,比如"iPhone"、"Apple手机"。
怎么做到的?
先把文本转成向量(一串数字)。这个过程叫 Embedding。
<br /> "苹果手机" → [0.1, 0.3, 0.5, 0.2, ...] (几百维的向量)<br /> "iPhone" → [0.1, 0.3, 0.5, 0.2, ...] (和上面很接近)<br /> "香蕉" → [0.8, 0.1, 0.2, 0.9, ...] (和上面差很远)<br />
怎么找相似的向量?
最简单的方法是算距离。两个向量越近,语义越相似。
但问题是:数据量大了之后,挨个算距离太慢了。
假设有 1 亿个向量,每次查询都要算 1 亿次距离,这谁顶得住?
近似最近邻(ANN)
聪明的工程师想了个办法:不用精确找最近的,找个差不多的就行。
这就是近似最近邻(Approximate Nearest Neighbor)。
常用的算法有:
HNSW(分层导航小世界)
- 把向量建个图,相似的向量连上线
- 查询时从入口开始,一步步跳到最近的
- 像走迷宫,但有很多捷径
IVF(倒排文件索引) - 先把向量聚类,分成很多组
- 查询时先找最近的组,再在这个组里找
- 像先找省份,再找城市
PQ(乘积量化) - 把向量压缩,减少存储和计算量
- 牺牲一点精度,换来速度提升
实际应用中的权衡
| 算法 | 精度 | 速度 | 内存 | 适用场景 |
|------|------|------|------|---------|
| HNSW | 高 | 快 | 大 | 小规模、高精度 |
| IVF | 中 | 很快 | 中 | 大规模 |
| PQ | 中 | 快 | 小 | 资源受限 |
实际项目中,经常是几种算法组合使用。
一个简单例子
用 Python 和 Faiss 实现向量检索:
```python
import faiss
import numpy as np
生成 10000 个 128 维的向量
data = np.random.random((10000, 128)).astype('float32')
建索引(用 IVF)
index = faiss.IndexIVFFlat(faiss.IndexFlatL2(128), 128, 100)
index.train(data)
index.add(data)
查询
query = np.random.random((1, 128)).astype('float32')
distances, indices = index.search(query, 5)
print(f"最近的5个向量: {indices}")
```
总结
向量检索的核心就三点:
- 把文本/图片转成向量
- 用 ANN 算法快速找相似的
- 在精度和速度之间做权衡
理解了这个原理,用 Milvus、Pinecone 这些向量数据库时,就知道怎么调参数了。
---
有问题评论区交流。
- 把文本/图片转成向量
那些年,我被 Elasticsearch 性能坑过的日子
默认分类 • search_engineer 发表了文章 • 0 个评论 • 567 次浏览 • 1 天前
那些年,我被 Elasticsearch 性能坑过的日子(血泪史)
做搜索开发这几年,跟 ES 打交道的时间比跟女朋友还多(好吧,我承认我没有女朋友 😭)。今天分享几个被坑惨的经历,希望能帮大家少走弯路。
---
坑一:内存配错了,半夜三点被老板电话叫醒
刚开始用 ES,服务器 64G 内存,我想着:内存越大越好,直接给堆内存配了 56G!
当时还美滋滋地想:这下查询肯定飞快。
结果?查询慢得像蜗牛爬,还经常 OOM(内存溢出)。最惨的是,半夜三点服务器挂了,老板打电话来:"怎么回事?用户投诉搜不出东西了!"
我迷迷糊糊爬起来查日志,发现 GC 时间长得离谱,每次 GC 都要几秒。
后来查资料才明白:堆内存不能超过 32G,超过这个阈值,Java 的指针就不压缩了,反而更慢。
正确姿势:
yaml<br /> -Xms30g<br /> -Xmx30g<br />
剩下的 34G 给 Lucene 做文件缓存,这才是亲儿子。改完之后,查询速度直接翻倍,我也能睡个好觉了。
---
坑二:分片数乱设,查询等到用户怀疑人生
有个项目,100G 数据,我设了 50 个分片,每个 2G。
心想:分片多,查询并行度高,肯定快!
上线后,用户反馈:搜个东西要 10 秒钟?
我:???
查了半天,发现 50 个分片要跨网络合并结果,开销爆炸。就像你问 50 个人问题,然后要把所有人的回答汇总,这能不慢吗?
后来改成 3 个分片,查询降到 200ms,用户终于不骂娘了。
经验公式:分片数 = 数据量(GB) / 30
- 100G 数据 → 3-4 个分片
- 1TB 数据 → 30-35 个分片
别整太多小分片,查询时会哭的。
---
坑三:深分页,把服务器查挂了(最贵的一课)
产品说要做"加载更多",我用 from + size 实现:
json<br /> {<br /> "from": 10000,<br /> "size": 10<br /> }<br />
用户点了几十页后,服务器直接挂了。查日志发现,from=10000 时,ES 要扫描 10010 个文档,然后扔掉前 10000 个,只返回最后 10 个。
这操作太骚了!就像翻书,你不是记住看到哪了,而是每次都从第一页开始翻,翻到第 100 页,然后只看最后一行。
CPU 和内存直接爆炸,服务器说:"我不干了!"
正确做法是用 search_after:
json<br /> {<br /> "size": 10,<br /> "sort": [{"date": "desc"}],<br /> "search_after": ["2024-01-01"]<br /> }<br />
像翻书一样,记住上次看到哪了,下次从那里继续翻。改完之后,深分页查询从 10 秒降到 50ms。
---
坑四:刷新间隔没调,导入数据慢如龟速
批量导 1 亿条数据,预计 2 小时,结果跑了 2 天还没跑完。
我:???这什么鬼?
查监控发现,磁盘 IO 一直 100%,CPU 却没怎么动。原来是 refresh 的锅。
ES 默认 1 秒刷新一次,每次刷新都要生成新段(Segment),写磁盘。1 亿条数据,每秒刷新,这磁盘不得写废了?
导入数据前关掉 refresh:
json<br /> PUT /my_index/_settings<br /> {<br /> "index": {<br /> "refresh_interval": "-1"<br /> }<br /> }<br />
导完再开回来:
json<br /> PUT /my_index/_settings<br /> {<br /> "index": {<br /> "refresh_interval": "1s"<br /> }<br /> }<br />
速度提升 10 倍,2 小时搞定!
---
坑五:wildcard 查询,把 CPU 打满(离职警告)
产品要支持模糊搜索,我直接用 wildcard:
json<br /> {<br /> "query": {<br /> "wildcard": {<br /> "title": "*手机*"<br /> }<br /> }<br /> }<br />
上线当天,CPU 直接 100%,服务挂了,用户群炸了。
我:完了,要提桶跑路了。
wildcard 是全表扫描啊兄弟们!几百万文档一个个匹配,就像你在图书馆找一本书,书名只记得一个字,然后你把所有书都翻一遍。
能不慢吗?
后来改成 ngram 分词,提前把词拆好: - "手机" → "手"、"机"、"手机"
- "苹果手机" → "苹"、"果"、"手"、"机"、"苹果"、"果手"、"手机"、"苹果手机"
查询时直接匹配,性能提升 100 倍,我也保住了饭碗。
---
一些实用的监控命令(保命用)
```bash看集群健康,绿色最好,黄色警告,红色完蛋
GET /_cluster/health
看节点负载,哪个节点在摸鱼
GET /_nodes/stats
看热点线程,谁在消耗 CPU
GET /_nodes/hot_threads
看慢查询,找出罪魁祸首
GET /_search?profile=true
<br /> <br /> 慢查询日志一定要开:<br />yaml
index.search.slowlog.threshold.query.warn: 10s
index.search.slowlog.threshold.query.info: 5s
```
不然出问题都不知道哪句查询慢的,只能抓瞎。
---
总结(血泪教训)
ES 调优没有银弹,但有几个原则:
- 内存给够,但别超过 32G(不然半夜被叫起来)
- 分片别太多,也别太少(3-5 个一般够用)
- 深分页用 search_after(别用 from + size)
- 批量导入时关掉 refresh(速度提升 10 倍)
- 别用 wildcard,用 ngram(保住饭碗)
踩过这些坑,才算真正入门了 ES。
有问题评论区交流,我继续去调我的集群了。如果服务器又挂了,记得帮我打 120。
---
文 / 一个被 ES 坑过无数次的工程师
P.S. 我的头发还在,只是不多了
- 内存给够,但别超过 32G(不然半夜被叫起来)





