简介这是一套面向企业营销人员、SEO优化师和站长的GEO生成式引擎优化全开源源码系统用于抢抓AI搜索流量、优化品牌语义信息使品牌更容易被大模型优先引用和推荐。系统支持自用与商用压缩包仅8.44MB共1178个文件以760个PHP核心逻辑文件为主辅以JS交互脚本、HTML展示页面、PNG/JPG图片素材以及JSON/config等配置文件结构完整便于二次开发或直接部署。包内附带教程能帮助使用者理解GEO优化原理、搭建运行环境并快速上线低成本提升品牌曝光与口碑。目前已有201人学习下载适合想低成本切入AI搜索流量、建立品牌语义优势的中小企业及开发者。1. GEO不是玄学开源AI排名优化系统能解决什么现在的搜索流量正在肉眼可见地从传统搜索框流向AI问答应用。GEOGenerative Engine Optimization生成引擎优化这个缩写看起来陌生但做内容的人应该都感觉到了同样的变化你在搜索引擎里排第一不代表AI会在回答里引用你。这套全开源GEO系统就是把关键词挖掘、内容生成、引用评分、排名回采四条链路合到一起的工程化方案。它不是那种设置完关键词就完事的插件而是一套可以自己改源码、自己训练评分权重的免费开源系统内附教程覆盖每个模块支持自用也支持商用。适合正在做内容增长、品牌声量的团队也适合想把手头内容资产激活的独立开发者。下面的内容我会按部署、配置、内容产出、避坑的顺序把实际使用这套系统时该注意的东西全部拆开讲。2. GEO排名优化的核心逻辑从关键词到被AI引用的可见度链路2.1 为什么传统SEO套路在AI搜索上失效传统SEO优化的目标是让网页在搜索结果页排到前面。手段也无外乎关键词密度、外链数量、页面权重。这些在传统搜索引擎里仍然有效但在AI生成引擎里排名逻辑发生了根本变化——AI不是按“网页重要性”排序而是按“内容被引用的概率”排序。生成引擎会把候选网页拆段、抽实体、判断主题覆盖率再拼成答案。如果你的页面结构混乱、观点没有来源、作者信息缺失哪怕关键词密度做满了AI也可能完全不引用你。我把这套系统的源码拆开看最大的感触是它把传统SEO里最玄学的那部分做成了可计算的东西。“内容质量”在传统SEO里靠人工判断在GEO逻辑里被拆成四项指标主题覆盖率、权威引用数、实体一致性、数据可支撑性。每一项都有对应的评分函数最后合成一个0到100的GEO Score。这个分数就是整个系统的黑匣子。好在源码包是全开源的你可以直接打开评分器源码去查每一项的权重怎么算的不必靠猜。2.2 可见度链路拆解GEO优化不是单点动作是一条完整链路。这套系统把链路分成五个环节问题挖掘、语义匹配、内容生成、引用评分、排名回采。问题挖掘负责从搜索下拉、问答社区、站内日志里收集目标用户会真实问出的问题语义匹配负责把问题和现有内容做覆盖度比对找出哪些问题还没有被回答到位内容生成负责把缺口问题补成结构化文本引用评分负责模拟AI引擎的筛选逻辑给内容打分排名回采负责定期再次检查AI答案里是否出现了你的内容。这个链路的优势在于闭环。我实际用的时候习惯先把问题挖掘的结果直接丢给语义匹配给旧内容先打一遍分再决定是改写还是新写。源码支持一键跑完五个环节也支持单独跑某一个环节这样定位瓶颈就不会被其他模块的日志干扰。想要定位某个问题的内容缺口可以单独跑分析模块python main.py --mode analyze --question GEO优化多长时间能见效输出会列出当前问题下的已有内容来源以及missing_subtopics列表这个列表就是还没人写到位的子话题我经常把它直接当作下一批内容的选题清单。2.3 源码包的模块划分与选型理由拿到源码包之后先别急着执行花十分钟看一下目录结构能省下后面大半天的定位时间。系统整体按功能拆成五个模块模块主要文件职责采集crawler/采集问题源头、搜索日志、问答列表分析analyzer/实体抽取、主题聚类、语义匹配生成generator/调用LLM接口生成或改写内容评分scorer/计算GEO Score与引用概率监控monitor/定时回采AI答案生成报告选型上这套系统做了几个很务实的决定全Python代码任何一台服务器都能跑数据落SQLite单人研究规模完全够用LLM接入层做了统一接口换模型服务商时不用改动业务代码。下面这段代码展示了main.py里五模块的串联方式我简化掉了异常处理只保留主干# main.py -- 五模块串联主流程已简化 from crawler import QuestionCollector from analyzer import SemanticMatcher from generator import ContentGenerator from scorer import GeoScorer from monitor import CitationMonitor def run_pipeline(start_urls, keywords): collector QuestionCollector(start_urlsstart_urls, keywordskeywords) questions collector.collect(max_count200) matcher SemanticMatcher() gaps matcher.find_gaps(questions, existing_articles) generator ContentGenerator(model_namecfg.model_name) drafts generator.generate_by_gaps(gaps, templatecfg.prompt_template) scorer GeoScorer() scored scorer.score(drafts) monitor CitationMonitor() monitor.register(scored, schedulecfg.recheck_schedule)逻辑说明第4行到第7行完成问题采集max_count200控制每个关键词采集的问题数第9到第10行做语义匹配找到内容缺口第12到第13行生成草稿第15到第16行给草稿评分第18到第19行把合格内容登记到回采队列。model_name指定生成使用的模型在配置文件里改字符串即可切换recheck_schedule是回采频率我一般设置成7天太频繁容易打扰数据源。给新手的建议第一次跑别直接全量执行先把采集和评分两个模块单独跑通确认数据流动正常再开生成不然报错时根本分不清是哪个模块断了。3. 部署与配置把全开源GEO系统跑起来的完整步骤3.1 环境准备与依赖安装这套系统对服务器要求不高普通4核8G的云主机跑完全够用。依赖是Python 3.10以上建议先用一条命令确认环境省得装到一半被语法错误拦下来python3 --version # 低于 3.10 时先升级系统 Python或用 conda 新建隔离环境代码目录拿到之后先解压或克隆到本地工作区我习惯把项目放在/opt/geo-system这种不带空格的路径下避免后续脚本解析路径出问题。教程文档在docs/目录建议先看第一篇“环境准备”再动手。接着创建虚拟环境并安装依赖cd geo-system python3 -m venv venv source venv/bin/activate pip install -r requirements.txt这里venv是Python虚拟环境把依赖和系统环境隔离。requirements.txt锁定了全部第三方库版本其中必须的几个是requests、beautifulsoup4、sqlalchemy、yaml。装完后用一行命令做自检比对着文档一个个确认靠谱python -c import requests, bs4, sqlalchemy, yaml; print(依赖检查通过)如果某个包缺失会出现 ImportError直接pip install 包名补装。这里有个教训不要用系统自带的Python直接跑也别贪方便用--user安装不同项目混在一起后面前进到依赖升级就是一场灾难。3.2 配置文件逐项说明源码包里自带config.example.yaml先复制一份改成config.yaml再改。保留原始示例文件等哪天参数改乱了还能翻回去对照。核心配置分四块采集、生成、评分、监控。下面这套参数是我实践后的结果直接抄也可以但建议根据自己的语料规模调crawler: start_urls: - https://example-source.com/questions keywords: [内容营销, GEO优化, AI排名] max_count: 200 timeout: 15 concurrency: 3 user_agent: Mozilla/5.0 (compatible; GEOResearchBot/1.0) generator: provider: your_llm_provider model_name: your_model_name temperature: 0.7 max_tokens: 1200 prompt_template: prompts/geo_writer.txt scorer: weights: topic_coverage: 0.35 authority_citation: 0.25 entity_consistency: 0.20 data_support: 0.20 threshold: 70 monitor: recheck_schedule: 7d report_format: markdown几个容易踩的参数单独说明。concurrency是采集并发数默认3已经算保守有些数据源对并发很敏感调高到5以上就容易触发验证码。temperature控制生成内容的发散程度做事实型内容建议0.7以下太高模型会开始编造数据。threshold是内容通过发布的GEO Score门槛普通内容站建议70垂直专业站可以设到75以上宁缺毋滥。scorer.weights里topic_coverage权重最高说明这套系统最看重的是否把问题的几个子话题都覆盖到这个权重在不同行业可以按经验调但一次只调一个维度否则评分波动根本不知道是谁引起的。提示threshold不要低于60低于这个值意味着AI引擎引用你的概率很低发布后基本是无效供给。3.3 初始化数据库与启动初始化SQLite数据库是独立一条命令源码包里的init_db.py会自动建表并写入初始配置python init_db.py python main.py --mode test--mode test会跑一组内置样例验证采集、生成、评分三段是否畅通。如果测试通过说明环境没有问题再正式跑全量python main.py --mode all --keywords GEO优化 --limit 100输出会落到output/目录按日期分文件夹每篇文章一个markdown文件命名规则是日期_关键词_问题id.md。如果当天跑完发现logs/error.log里有 WARNING 级别日志先看清楚堆栈再决定要不要处理很多WARNING只是单个问题源超时不影响整体任务。我自己第一次跑的时候看到一串红字就以为是失败后来才发现是某个页面结构改动导致的选择器匹配不到重跑后一切正常所以别被日志吓住关键是看最终产出目录里有没有文件。4. 内容优化流水线批量产出GEO友好内容的正确姿势4.1 关键词与问题采集脚本很多用户翻车是因为拿到手直接--mode all挂上就跑结果产出一堆泛泛而谈的通行证文章。正确的姿势是先跑采集把问题列表洗一遍再做内容。下面是我常用的采集脚本from crawler import QuestionCollector collector QuestionCollector( sources[search_suggest, community_questions], keywords[GEO优化, AI排名优化], languagezh-CN, time_window30d, ) questions collector.collect(max_count500) collector.export_to_csv(data/questions.csv, columns[question, source, timestamp])逻辑说明sources指定问题来源search_suggest对应搜索下拉联想community_questions对应问答社区的标题time_window30d表示只取最近30天的问题GEO内容的时效性很强太旧的问题不值得做max_count500是候选池上限不是写作数量。导出CSV之后要人工瞟一眼把明显是广告词、无意义的问题删掉再进下一步聚类。4.2 生成规则与提示词模板系统内置的提示词模板在prompts/geo_writer.txt结构会影响生成结果方向值得逐行改。下面是我在这套模板基础上调整过的版本你是一名资深内容策略分析师。请针对以下问题写一篇结构化回答 问题{question} 目标读者{persona} 写作要求 1. 第一段直接给出结论不要铺垫。 2. 每个观点必须附数据、案例或可验证来源。 3. 使用小标题把问题拆成3-5个子话题小标题要能独立回答问题。 4. 结尾给出下一步操作建议不要写空话。 5. 全文不超过800字信息密度优先。 参考数据源{reference_sources}这里的{persona}我一般填“正在企业里负责内容增长的运营人员”不要面向所有人写内容越聚焦越容易被AI判定为“对这个问题真的有了解”。{reference_sources}由采集模块提供用来给生成模型提供可引用的素材这一步能显著提升GEO Score。提示词里刻意要求“第一段直接给结论”这是AI引擎最喜欢的文本结构和传统SEO里强调的“先铺垫关键词再展开”的写法正好反过来。4.3 批量生成与质量控制批量生成不能只跑生成器要接上评分器做门槛筛选。下面是我在项目里实际使用的批量流程from generator import ContentGenerator from scorer import GeoScorer import pandas as pd gen ContentGenerator(model_namecfg.generator.model_name) scorer GeoScorer() df pd.read_csv(data/questions.csv) accepted, rejected [], [] for _, row in df.iterrows(): draft gen.generate(questionrow[question], persona企业内容运营人员) score scorer.score_text(draft, questionrow[question]) if score 70: accepted.append((row[question], draft, score)) else: rejected.append((row[question], draft, score)) with open(output/accepted_articles.md, w, encodingutf-8) as f: for q, art, s in accepted: f.write(f## {q}\n\n{art}\n\n!-- GEO Score: {s} --\n)逻辑说明循环里每一篇初稿先生成再进scorer.score_text()评分score_text需要同时传入正文和问题上下文只传正文会让评分结果明显偏低。accepted列表保存通过的内容rejected列表保存淘汰内容。淘汰区不要直接删那是重写清单等换新模型、改提示词后可以集中重新生成一轮。每次批量生成之后我会按10%比例人工抽检看生成结果有没有出现明显事实错误这个步骤虽然不自动化但能避免评分器漏掉的低质量内容上线。4.4 发布前的文件整理系统不内置CMS发布功能导出目录可以直接对接静态站点生成器。我的习惯是保留output/里的markdown原文件再用一条脚本统一注入front-matter补上生成日期、来源、GEO Score和审核状态。这部分脚本简单但能直接保证后续监控回采时每篇文章都可以从文件名反查到问题ID少走很多弯路。5. 部署避坑指南五个高频翻车点与解决路径5.1 采集阶段空手而归现象运行采集模块后CSV文件是空的日志里反复出现WARNING: no data after retry。原因最常见的是目标数据源更新了页面结构源码包里的CSS选择器匹配不到元素其次是请求频率太快触发了反爬机制。解决先把concurrency降到1timeout调到30再跑一次如果还是空打开crawler/parser.py把里面写死的页面class名替换成当前实际页面里的class名。选择器维护本来就是采集工具的日常源码包里的选择器过几个月失效是正常现象不是项目坏了。5.2 生成内容全是正确的废话现象产出的文章结构完整、语言通顺但读完之后没有任何信息增量GEO Score稳定在60以下。原因提示词里{reference_sources}为空数组模型没有素材可用只能凭训练数据泛泛而谈或者temperature设得过高模型为了流畅牺牲了具体事实。解决确保采集阶段导出了reference_sources字段并在调用generate()时把素材列表传进去。同时把temperature调到0.5到0.7之间保留一定多样性又不容易编数据。5.3 评分结果忽高忽低同一篇文章两次分差大现象同一天两次评分同一篇内容分数相差十分以上难以判断优化是否有效。原因评分器内部的实体抽取和相似度计算部分依赖在线词向量服务服务有波动导致输出不稳定。解决打开scorer.cache配置让第一次的抽取结果落到SQLite缓存里后续评分直接读缓存。调权重时一次只动一个维度改完跑一遍固定测试集记录分数变化不要同时改多个权重否则分不清是哪个参数引起的波动。5.4 生成过程中接口频繁报错中断现象批量生成跑到几十条就超时或限流整个任务退出前面生成的成果也没存。原因生成接口有频率限制循环里没有重试机制也没有断点续跑。解决给生成循环加重试和进度保存。我习惯每成功十条写一次progress.json失败时指数退避重试三次三次仍然失败就把问题ID写进failed_questions.csv下次启动时自动加载续跑。这个机制在源码示例里没有内置需要自己补一个小函数但补完之后晚上挂机跑批量任务就再也不用来回盯终端了。5.5 商用前的合规边界现象有人把系统生成的内容直接发布到商业站点被用户或数据源方质疑内容来源。原因系统本身开源可商用但采集的问题素材和生成结果需要保持可追溯性引用他人观点时要保留出处。解决发布前保留完整的生成记录问题来源、参考素材、生成时间、审核状态。我的做法是每篇文章meta区写一段元数据注释发布时再决定是否向读者展示。另外确认使用的模型服务商条款是否允许商用输出这一步需要自己查对应文档。6. 效果验证与复盘一周内确认GEO优化是否真的起效6.1 离线回归测试把系统生成的高分内容放进固定的测试问题池每周跑一次离线回归统计“被AI引用命中率”。AI引擎的答案会变单看一篇文章是否上榜没有意义要看在一个固定问题池里的整体命中率变化。6.2 线上回采运行监控模块让系统每7天自动抓取目标AI引擎的回答把“是否出现你的内容、以什么形式出现”记录到SQLite。注意命中形式有直接引用链接、提到站点名、改写你的观点三种全部计入微弱命中。连续观察两周命中率保持增长说明改动有效。6.3 复盘固定动作这里给你一套我每周一固定执行的复盘动作先看离线回归命中率再看AI答案里新增引用的内容类型最后找出GEO Score低于80的旧文排队重写。这套系统最值钱的地方不是一键生成爆款而是把优化变成了可回归、可重复的过程。从那以后我每次改提示词或调整评分权重都会强制走一遍离线回归再上线这个习惯帮我避开了很多次盲目更新引发的翻车。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?