直接回答:自建 GEO 平台的架构可以概括为四层——内容层(要优化什么)、采集与分析层(怎么获取和判断)、服务层(对外提供什么能力)、存储与运维层(怎么跑得住)。技术选型的核心原则是:在满足需求的前提下,尽量减少需要长期维护的组件数量。

先明确要解决的问题

我在动手之前列了一张需求清单,按优先级排:

  1. 给定一批主题词和问题集,能自动检查目标站点是否被 AI 引用。
  2. 能抓取并解析目标站点的内容,判断它是否具备被引用的条件。
  3. 能把我自己的内容资产结构化,方便复用和改写。
  4. 能定期出报告,告诉我"哪些页面被引用了、哪些没有、原因是什么"。
  5. 全流程跑在一台服务器上,不引入需要专职运维的组件。

第 5 条是硬约束。它直接决定了后面所有的技术选型。

整体架构

GEO 平台整体架构图:内容层、采集与分析层、服务层、存储与运维层

四层各自的职责:

负责什么 关键点
内容层 主题词库、问题集、内容资产、模板规范 数据质量决定整个平台的上限
采集与分析层 抓取、切分、向量化、引用采样 最耗时、最容易出稳定性问题
服务层 诊断 API、任务调度、报告生成 保持无状态,方便重启和扩容
存储与运维层 数据库、对象存储、容器编排 组件越少越好

关键选型一:为什么是 pgvector 而不是专用向量库

这是被问得最多的一个问题。先看数据:

方案 部署成本 100 万片段检索耗时 运维复杂度
pgvector(HNSW) 随 Postgres 一起部署 约 20-60 ms 低,复用现有数据库
专用向量库 独立集群 约 10-30 ms 高,需单独备份、监控、扩容

在 100 万条以内,两者的延迟差距对交互式体验没有实质影响。而省掉一套独立集群,意味着少一套备份策略、少一套监控告警、少一个半夜可能挂掉的组件。

真正需要专用向量库的临界点,通常是千万级向量加上高并发检索。 中小型 GEO 平台很难触达这个量级。

性能够用的判断也可以量化:单次检索延迟在 100 ms 以内、写入吞吐能跟上增量更新、备份和恢复流程能在半小时内跑完——三条都满足,就没有换的必要。

关键选型二:服务层怎么切

服务层我切成三个独立进程,而不是做成一个大单体:

1
2
3
geo-diagnose   无状态 HTTP 服务   ← 接收 URL / 站点,返回诊断结果
geo-scheduler 定时任务 ← 抓取、采样、生成报告
geo-reporter 事件驱动 ← 监听采样结果,产出报告与通知

切分的依据是变更频率:诊断逻辑每周都在调,调度周期很稳定,报告格式经常改。放在一起会导致每次改报告都要重启整个服务。

三者通过数据库和消息表通信,不引入独立的消息队列——对当前规模来说,一个带状态的表加轮询完全够用,而且更容易排查问题。

关键选型三:抓取环节的取舍

抓取是整个平台最不可控的部分。我的处理方式:

问题 处理方式
目标站点屏蔽爬虫 尊重 robots.txt,不绕过;改用手动提交 URL
动态渲染页面 优先解析 HTML;确实需要渲染时用无头浏览器,但限制并发
频繁重抓浪费资源 last-modified 与内容哈希做增量判断
大量超时拖慢队列 单域名并发限制为 2,超时 15 秒,失败三次降级跳过

一个实测数据:在 4 核 8G 的 ECS 上,单进程抓取 200 个站点的首页与核心页面,总耗时约 12 分钟,峰值内存 900 MB。瓶颈在网络带宽而不是 CPU。

存储与运维

1
2
3
4
5
PostgreSQL 16 + pgvector   结构化数据 + 向量索引
对象存储 抓取快照、报告附件
Redis 缓存与限流计数
Docker Compose 全部服务的编排
Nginx 反向代理与 HTTPS

整套东西用一份 docker-compose.yml 管起来,docker compose up -d 就能跑。备份用一个 nightly 的 pg_dump 加对象存储同步,恢复演练每季度做一次。

这套架构的边界

坦白说,这套设计有几处明确的取舍,如果规模变化需要重新考虑:

  • 数据量超过 500 万片段,需要把向量检索拆出去,或者对数据分片。
  • 同时监测的站点超过 20 个,需要把调度从单进程改为分布式队列,否则任务会排队。
  • 需要实时反馈(用户点一下等 3 秒出结果),需要给诊断接口单独做缓存层,当前是分钟级。

写清楚边界比写清楚优势更有用——知道什么情况下它会失效,才能判断它适不适合你的场景。

常见问题(FAQ)

为什么不用专用的向量数据库?

在数据量小于 100 万条片段时,pgvector 的性能和专用向量库差距不明显,但省掉了一整套运维成本。真正需要专用向量库的临界点通常是千万级向量加上高并发检索,中小型 GEO 平台很难触达。

一台 4 核 8G 的服务器能撑住吗?

能。本站的平台在 4 核 8G 的阿里云 ECS 上运行,覆盖约 200 个站点的抓取与 50 万条片段的检索,日常 CPU 占用在 20% 以下。瓶颈通常出现在抓取阶段的网络带宽,而不是计算。

平台需要接入多少个大模型?

建议至少两个。一个用于便宜、量大的内容分析任务,另一个用于质量要求高的判断任务。同时接入多个平台用于引用采样,也能避免单一模型的偏差。

下一篇

架构确定之后,最难的部分是内容采集与结构化流水线《自建 GEO 平台(二):内容采集与结构化流水线》


如果你也在搭类似的东西,或者在选型上纠结,欢迎到留言板聊聊——我很想知道别人是怎么权衡的。

站内搜索

没有找到内容!