最近"GEO源码"这个词在技术圈搜索量涨得很快。背后逻辑很简单:GEO赛道太新,市面上SaaS工具订阅费一个月几百到几千,续费成本随时间线性增长,数据和逻辑还不在自己手里。对有基础研发能力的团队来说,"买一份能编译部署的源码,自己接着往下做",从工程角度看是笔更划算的账。这篇从技术架构、模块拆解、自研vs套壳的判断标准三个层面,把蓝空GEO这套源码拆开讲清楚。
技术架构:为什么选这套技术栈
蓝空GEO的技术栈是后端FastAPI + 前端React/Vite + Ant Design Pro,数据层用MySQL。
多租户架构是决定这套源码能不能被"二次分发"的关键设计点。如果没有从底层做好租户隔离,代理商拿到源码想改造成自己的SaaS对外卖,会遇到大量重构成本。架构示意:
# 多租户中间件示意(FastAPI)from fastapi import Request, HTTPExceptionfrom starlette.middleware.base import BaseHTTPMiddlewareclass TenantMiddleware(BaseHTTPMiddleware):async def dispatch(self, request: Request, call_next):tenant_id = request.headers.get("X-Tenant-Id")if not tenant_id:raise HTTPException(status_code=400, detail="缺少租户标识")# 从租户上下文注入数据库schema/连接池,实现数据隔离request.state.tenant_id = tenant_idrequest.state.db_session = get_tenant_session(tenant_id)response = await call_next(request)return responsedef get_tenant_session(tenant_id: str):# 按租户路由到独立schema或独立连接池engine = tenant_engine_pool.get(tenant_id) or create_tenant_engine(tenant_id)return sessionmaker(bind=engine)()
租户维度在中间件层就做隔离,而不是业务代码里到处加WHERE tenant_id = ?,后续二次开发和审计都更省事。
核心模块拆解
1. 知识库管理
结构化存储品牌信息、产品资料,作为内容生成的"事实底座",抗幻觉能力的基础就在这一层:
# 知识库数据模型示意(Pydantic + SQLAlchemy)from sqlalchemy import Column, String, Text, DateTime, ForeignKeyfrom pydantic import BaseModelclass KnowledgeEntry(Base):__tablename__ = "knowledge_entries"id = Column(String, primary_key=True)tenant_id = Column(String, index=True)category = Column(String) # 品牌信息/产品资料/行业知识content = Column(Text)source_url = Column(String) # 信源溯源,抗幻觉关键字段verified = Column(String) # 是否经过人工核验updated_at = Column(DateTime)class KnowledgeQueryResult(BaseModel):entry_id: strcontent: strrelevance_score: floatsource_url: str | None
source_url和verified这两个字段是关键——生成内容时必须能溯源到具体信源,这是判断内容能不能被AI平台采信引用的基础,也是很多套壳产品做不到的地方。
2. AI Agent集成
内容生成、审核、发布链路用Agent方式串联,而不是写死的固定流程:
# Agent编排示意class GeoContentPipeline:def __init__(self, knowledge_agent, keyword_agent, writer_agent, review_agent):self.knowledge_agent = knowledge_agentself.keyword_agent = keyword_agentself.writer_agent = writer_agentself.review_agent = review_agentasync def run(self, topic: str, tenant_id: str):knowledge = await self.knowledge_agent.retrieve(topic, tenant_id)keywords = await self.keyword_agent.generate_matrix(topic, tenant_id)draft = await self.writer_agent.generate(topic=topic, knowledge=knowledge, keywords=keywords)result = await self.review_agent.check(draft) # 事实核验+合规检查if not result.passed:draft = await self.writer_agent.revise(draft, result.issues)return draft
用Agent串联而不是硬编码流程,后续换底层大模型接口或调整生成策略时,只需要替换对应Agent的实现,不用改整条流水线。
3. 多平台适配层
目前适配豆包、DeepSeek、文心一言、通义千问、Kimi、腾讯元宝六个国内平台。因为是源码级交付,扩展到ChatGPT、Gemini等海外平台不需要等官方排期:
# 平台适配器接口示意from abc import ABC, abstractmethodclass PlatformAdapter(ABC):@abstractmethodasync def publish(self, content: str, tenant_id: str) -> str: ...@abstractmethodasync def check_visibility(self, keyword: str) -> dict: ...class DoubaoAdapter(PlatformAdapter):async def publish(self, content, tenant_id):# 对接豆包内容发布接口...async def check_visibility(self, keyword):# 查询豆包端的引用/曝光情况...# 团队拿到源码后,自行新增海外平台适配器:class ChatGPTAdapter(PlatformAdapter):async def publish(self, content, tenant_id):...async def check_visibility(self, keyword):...PLATFORM_REGISTRY = {"doubao": DoubaoAdapter(),"deepseek": DeepSeekAdapter(),"wenxin": WenxinAdapter(),# 新平台只需实现接口后注册进来}
统一接口+注册机制,新增平台不需要改动核心业务逻辑,这也是判断一套源码是不是"真自研"的技术标志——套壳产品往往把平台逻辑和业务逻辑耦合在一起,扩展新平台的成本很高。
自主研发和"套壳开源"怎么区分
判断方式不复杂:看核心引擎的代码结构是不是围绕自己的知识库/关键词体系设计的,还是照搬某个通用开源框架的默认逻辑;看能不能做深度定制,套壳产品往往只能做浅层参数配置;看有没有持续迭代能力,纯套壳产品AI平台算法一变基本跟不上。蓝空GEO的知识库、Agent编排、平台适配这几个模块都是围绕自己的业务逻辑从零设计,不是简单调用某个开源项目的默认pipeline。
源码交付 vs SaaS订阅,工程成本对比
适用场景
技术团队自建GEO能力:有Python/FastAPI经验的团队可直接在现有架构上二开
SEO/营销机构二次分发:多租户架构现成,代理商可直接包装成自己的产品对外提供服务
出海企业:借助适配器模式自行接入海外AI平台
中小企业低成本试水:一次性投入换长期自主权
值不值:写在最后
如果只是短期验证需求,SaaS工具更快;但只要确定GEO是中长期方向,且团队具备起码的部署/二开能力,一套架构完整、模块齐全、支持私有化部署的自研源码——比如蓝空GEO——从工程成本和技术资产沉淀的角度,都是更合理的选择。
夜雨聆风