构建跨Telegram频道与机器人的全球语义搜索系统
一位开发者通过抓取和处理数据,构建了一个包含数百万个Telegram账号的数据库,用于语义搜索。该项目采用14个微服务架构,专为中高级工程师设计。核心功能是跨描述、消息和头像的混合搜索,无需配置过滤规则。
仅用一周时间,在家用电脑上通过流式处理,从Common Crawl(16TB索引)中收集了超过250万个唯一用户名。最终有效结果包括:80万条频道、12.4万个群组、9.4万个机器人。额外数据通过公开目录和描述中的链接进行补充。
数据抓取
使用轮换代理抓取合法用户名(基于正则表达式)。存储的数据包括:
- 昵称、描述、头像(CDN链接已缓存)。
- 最近10–15条消息(无分页),包含消息类型、文本内容;平均长度为530字符。
转发消息将进入队列等待处理。消息类型统计如下:
- 纯文本。
- 图片带说明。
- 极少情况:发票、联系人信息。
针对机器人:通过MTProto(grammers)调用ResolveUsername + GetFullUser获取描述和命令列表。需注意,ResolveUsername存在频率限制,使用时请谨慎。
异常情况处理:
- 头像CDN返回500错误(如 @magiskcnshare)——尝试3次后跳过。
- 空消息(如 @vlad_shoky_drum_school)。
- 大尺寸头像(3.5MB,如 @vip_labels)——将Axum限制提升至4MB。
图像处理
对头像进行语义搜索,采用图像描述生成技术(基于文本而非多模态嵌入,用于实验性验证)。
100万张图片的选项与成本对比:
| 模型 | 价格(美元) | 每图token数 | 状态 |
|-------|-----------|--------------|--------|
| 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
暂无评论。