>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 嵌入式 安全
JavaScript

如何将任意网页喂给神经网络——无广告、无冗余 token

当你给 LLM 代理使用普通的网页抓取时,大量的导航菜单、页脚、横幅和标记墙会瞬间涌入上下文。一篇几千字的文章,代理会收到一兆字节的垃圾内容,上下文窗口被填满,token 账单也随之增长。

最近发现了 pullmd 项目。这是一个自托管服务,接收页面或文件 URL 并返回干净的 Markdown。没有额外的膨胀,文本中没有元数据重复,还具备标准解析库通常缺少的一些功能。

PullMD web interface (light and dark theme)

底层技术栈

项目作者组合了多个经过实战检验的工具。当 URL 进入时,服务首先检查 Cloudflare 的原生 Markdown。如果不存在, Mozilla Readability 和 Trafilatura 就会介入。

有时候页面完全使用 React 或 Vue 构建,裸 HTML 返回的是空模板。在这种情况下,pullmd 会启动一个 Playwright sidecar,在无头 Chromium 中渲染页面,然后从中提取内容。如果你不需要这个重量级的浏览器,可以从 docker-compose.yml 中禁用 Playwright 容器,节省约 3.7 GB 的磁盘空间。这种情况下,服务将继续通过常规静态解析工作。

所有结果都存储在本地 SQLite 数据库中。如果在一小时内请求相同的 URL,响应会从缓存中立即返回。每次转换都会分配一个永久的短标识符,因此像 /s/:id 这样的链接可以用作稳定的源。

节省时间的主要功能

Reddit 和 Hacker News 帖子

通常脚本在评论页面会遇到问题。这里的解析器专门针对 Reddit 和 Hacker News 帖子进行了训练。输出是一个结构化的评论树,保留了嵌套结构、作者和赞成票数。

通过 BM25 进行页面搜索

第三版服务中最棒的发现之一。如果在查询中传递 ?query=как настроить базу 参数,pullmd 不会返回所有多页文档。服务会将 Markdown 按标题分解为各个部分,使用 BM25 算法对它们进行排名,只提供回答问题的块。对于大页面,这可以将 token 使用量减少 70% 到 95%,显著加快代理性能。表格和代码块保持完整。

文档、视频和音频

该服务处理的不仅仅是网站。当你连接 Microsoft 的 MarkItDown sidecar 时,它可以处理 PDF、Word 文件、Excel 电子表格、PowerPoint 演示文稿和 EPUB 电子书。

如果你传递一个 YouTube 链接,服务会提取带有可点击时间戳的视频字幕——无需 API 密钥。对于图像和音频识别,你可以配置任何 OpenAI 兼容模型或 Ollama 等本地服务器的端点。

内置 MCP 服务器和集成

代理集成有多种连接选项:

  • 标准 REST API(GET /api?url=...
  • 用于 Cursor、Claude Desktop 和其他兼容客户端的 MCP 服务器
  • Claude Code 的现成插件
  • 支持直接从文件资源管理器拖放文件的 PWA Web 界面

安全性和 SSRF 防护

从任意 URL 获取数据的服务容易受到 SSRF 攻击。用户可能会向解析器提供内部网络地址或云提供商元数据。

pullmd 包含地址验证。在每个请求和每个重定向步骤中,主机的 IP 地址都会被解析。如果地址落在私有网络范围、环回、 CGNAT 或云元数据范围(如 169.254.169.254)内,请求会立即被阻止并返回 403 错误。对于有意访问内部 wiki,可以通过 PULLMD_ALLOWED_HOSTS 环境变量将地址列入白名单。

如何部署

对于基本启动,一个单独的 docker-compose.yml 文件就足够了:

mkdir pullmd && cd pullmd
curl -O https://raw.githubusercontent.com/AeternaLabsHQ/pullmd/main/docker-compose.yml
docker compose up -d

服务将在端口 3000 上启动。默认情况下身份验证是禁用的,但你可以配置它:支持单管理员模式和带注册及会话 cookie 的多用户模式。

简单 API 请求示例:

curl "http://localhost:3000/api?url=https://news.ycombinator.com/item?id=1"

要连接到 Claude Code,一条命令就足够了:

claude mcp add --transport http pullmd http://localhost:3000/mcp

适用人群

这个项目做得干净实用。GitHub 星数不到五百,但代码库看起来很成熟:清晰的模块化结构、详细的迁移文件,以及主容器中极少的外部依赖。

这个工具适合构建 RAG 管道、设置本地 AI 助手,或者只是想要一个方便的 Markdown 格式长文章阅读器的人。如果你使用 Cursor 或 Claude Code,并且经常要求它们从链接中审查文档,一个本地的 pullmd 实例会为你节省大量的上下文和精力。

相关项目