返回首页

Telegram 语义搜索:抓取和嵌入

本文描述了覆盖数百万 Telegram 账户的语义搜索创建。使用抓取 Common Crawl、Gemma 3 4B 为头像生成描述和 ParadeDB 进行混合搜索。该项目包括用于机器人的 MTProto 和 bge-m3 嵌入。

Telegram 上的全球语义搜索:2.5M 账户
Advertisement 728x90

构建跨Telegram频道与机器人的全球语义搜索系统

一位开发者通过抓取和处理数据,构建了一个包含数百万个Telegram账号的数据库,用于语义搜索。该项目采用14个微服务架构,专为中高级工程师设计。核心功能是跨描述、消息和头像的混合搜索,无需配置过滤规则。

仅用一周时间,在家用电脑上通过流式处理,从Common Crawl(16TB索引)中收集了超过250万个唯一用户名。最终有效结果包括:80万条频道、12.4万个群组、9.4万个机器人。额外数据通过公开目录和描述中的链接进行补充。

数据抓取

使用轮换代理抓取合法用户名(基于正则表达式)。存储的数据包括:

Google AdInline article slot
  • 昵称、描述、头像(CDN链接已缓存)。
  • 最近10–15条消息(无分页),包含消息类型、文本内容;平均长度为530字符。

转发消息将进入队列等待处理。消息类型统计如下:

  • 纯文本。
  • 图片带说明。
  • 极少情况:发票、联系人信息。

针对机器人:通过MTProto(grammers)调用ResolveUsername + GetFullUser获取描述和命令列表。需注意,ResolveUsername存在频率限制,使用时请谨慎。

异常情况处理:

Google AdInline article slot
  • 头像CDN返回500错误(如 @magiskcnshare)——尝试3次后跳过。
  • 空消息(如 @vlad_shoky_drum_school)。
  • 大尺寸头像(3.5MB,如 @vip_labels)——将Axum限制提升至4MB。

图像处理

对头像进行语义搜索,采用图像描述生成技术(基于文本而非多模态嵌入,用于实验性验证)。

100万张图片的选项与成本对比:

| 模型 | 价格(美元) | 每图token数 | 状态 |

Google AdInline article slot

|-------|-----------|--------------|--------|

| GPT-4o mini(低分辨率) | 138 | 85 | 成本高昂 |

| Gemini 2.5 Flash-Lite | 26 | 低 | 批量API不稳定 |

| Gemma 3 4B(vast.ai) | ~0.24/天 | - | 已选:RTX 4090,100万张图像24小时内完成 |

Gemma 3 4B(Roboflow图像描述排行榜第7名)——开源模型,支持本地运行。可通过OpenRouter重新生成(每百万张15美元)。

数据库与搜索

测试方案包括:

  • Postgres + pg_vector:熟悉度高,但手动实现混合搜索较复杂。
  • Elasticsearch:功能强大,但内存占用高(依赖Java)。

最终选择:ParadeDB(基于Postgres 18的类Elastic搜索)。在更新Docker镜像时遇到问题:唯一索引重复导致备份失败。解决方案:回滚至每日pg_dump备份。

混合搜索:关键词匹配 + 向量(语义)搜索。

嵌入向量生成

测试了text-embedding-3-large(每百万token 0.13美元),但对100万条文档(每条4000字符)成本过高(超130美元)。改用bge-m3(多语言,MTEB基准领先)。

使用OpenAI API生成1.2万条嵌入向量:0.03美元。扩展至百万级时,借助OpenRouter实现。

关键收获:

  • 超过80万条频道已按语义上下文索引,涵盖描述与消息内容。
  • Gemma 3 4B图像描述准确率高且成本极低。
  • ParadeDB无需Java栈即可实现混合搜索。
  • MTProto用于机器人数据获取(存在使用条款风险,但仅访问公开信息)。
  • 通过转发消息持续扩展数据规模。

该项目完整呈现了端到端流程:抓取 → 处理 → 向量搜索。非常适合用于作品集展示(大规模大数据处理,百万级记录场景)。

— Editorial Team

Advertisement 728x90

继续阅读