尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

2026年GEO内容优化器:用LLM API把普通文章一键改写成AI友好版(附完整代码)

2026年GEO内容优化器:用LLM API把普通文章一键改写成AI友好版(附完整代码) 2026年GEO内容优化器用LLM API把普通文章一键改写成AI友好版附完整代码 目录一、工具设计三步优化流水线二、完整代码geo_optimizer.py三、运行方式四、改写效果示例before → after五、关键参考链接建议收藏六、进阶批量优化 接入发布流程6.1 批量处理一个目录6.2 接入 CI每次发稿前自动体检优化建议七、诚实的局限必读八、总结发布时间2026-08-10标签GEO、内容优化、LLM、Python、OpenAI兼容、实用工具、提示词工程阅读时长约 17 分钟难度中级先说一个真实困境你是不是也遇到过这种情况文章写完了结构也不错发出去却几乎不被任何 AI 引用。去查原因有人说加 Schema有人说写 FAQ有人说事实密度要高——道理都懂但真要改一句句改到崩溃。我自己的解决办法是写了一个GEO 内容优化器。把原始文章丢进去它做三件事预检用规则找出AI 不友好的具体位置改写调用 LLMDeepSeek / Kimi / 豆包 / OpenAI 都行按 GEO 规则重写成 AI 友好版本出报告告诉你改了什么、为什么改、预期效果今天把完整代码和提示词开源你接个 API key 就能用。一、工具设计三步优化流水线┌──────────────────────────────────────────────────────────┐ │ GeoContentOptimizer 流水线 │ ├──────────────────────────────────────────────────────────┤ │ STEP 1 规则预检 PreChecker │ │ → 事实密度 / 段落独立性 / FAQ缺失 / 标题问题 │ │ → 输出问题清单喂给 LLM │ │ │ │ STEP 2 LLM 改写 optimize() │ │ → 系统提示词内置 GEO 规则 │ │ → 输入原文 问题清单 │ │ → 输出改写后 Markdown │ │ │ │ STEP 3 报告生成 build_report() │ │ → before/after 对比 改动点清单 │ └──────────────────────────────────────────────────────────┘依赖pipinstallopenai本文用的openaiSDK 是兼容接口——DeepSeek、KimiMoonshot、豆包火山方舟、OpenAI 全部兼容同一套调用方式换base_url和model即可代码不用改。二、完整代码geo_optimizer.py geo_optimizer.py GEO 内容优化器把普通文章改写为 AI 友好版本 依赖pip install openai 支持DeepSeek / Kimi / 豆包(火山方舟) / OpenAI均兼容 OpenAI 接口 importreimportjsonfromopenaiimportOpenAIfromdataclassesimportdataclass,fieldfromtypingimportList,Dict,Optional# # 多平台配置仅改 base_url model 即可切换# PROVIDERS{deepseek:{base_url:https://api.deepseek.com,model:deepseek-chat,doc:https://platform.deepseek.com/api-docs/,},kimi:{base_url:https://api.moonshot.cn/v1,model:moonshot-v1-8k,doc:https://platform.moonshot.cn/docs/,},doubao:{# 豆包(火山方舟)需先在控制台创建推理接入点填 endpoint idbase_url:https://ark.cn-beijing.volces.com/api/v3,model:你的-endpoint-id,doc:https://www.volcengine.com/docs/82379/,},openai:{base_url:https://api.openai.com/v1,model:gpt-4o-mini,doc:https://platform.openai.com/docs/,},}# # STEP 1规则预检找出要改的点# classPreChecker:在不调用 LLM 的前提下用规则找出文章的 GEO 问题点classmethoddefcheck(cls,text:str)-Dict:issues[]# 1. 事实密度每千字事实点数量fact_patterns[r\d(?:\.\d)?%,# 百分比r(?:19|20)\d{2}[-/年.],# 年份r[¥$€£]\s?\d,# 金额r\d(?:\.\d)?\s?(?:m³/h|dB|㎡|mm|kg|Mbps|ms),# 参数]fact_countsum(len(re.findall(p,text))forpinfact_patterns)densityfact_count/max(len(text)/1000,1)ifdensity8:issues.append(f事实密度偏低{density:.1f}个/千字AI 难以提取可引用数据建议每段补充具体数字/日期/参数)# 2. 段落独立性H2 首段是否结论前置headingsre.findall(r^#{1,3}\s(.)$,text,re.M)first_parasre.findall(r^#{1,3}\s.\n((?:.\n)?)(?^#{1,3}\s|\Z),text,re.M)weak_headings0forhpinfirst_paras:first_linehp.strip().split(\n)[0]iflen(first_line)120orfirst_line.endswith((,?,,:)):weak_headings1ifweak_headings0:issues.append(f有{weak_headings}个小节首句过长或为铺垫句AI 切分检索时可能抓不到结论建议每个 H2 首句即结论)# 3. FAQ 缺失ifnotre.search(r常见问答|FAQ|常见问题|Q[1-9]|问[:],text,re.I):issues.append(未检测到 FAQ 模块建议文末增加 3~5 个问答对并用 FAQPage Schema 标注参考 https://schema.org/FAQPage)# 4. 标题/元信息粗略title_matchre.search(r^#\s(.)$,text,re.M)iftitle_match:ttitle_match.group(1)iflen(t)30:issues.append(f主标题偏长{len(t)}字建议压缩到 30 字内并前置核心词)return{issue_count:len(issues),issues:issues,fact_density:round(density,1),}# # GEO 系统提示词核心# GEO_SYSTEM_PROMPT你是一位资深的 GEO生成式引擎优化专家擅长把普通文章改写成AI 友好、易被大模型引用的版本。 改写必须遵守以下规则 1. 【结论前置】每个 H2 小节的第一句话直接给出结论不铺垫、不绕弯。 2. 【事实密度】在关键论点后补充具体数据、日期、参数或对比让 AI 能提取可引用事实点每千字至少 8 个事实点。 3. 【段落独立】每个小节自成一体单独抽出来也能被理解避免跨段依赖。 4. 【结构清晰】用 H2/H3 明确分段列表项用短句避免大段文字墙。 5. 【增加 FAQ】文末补充 3~5 个用户最可能问的问题及简洁答案带数据/判断标准不说空话。 6. 【保持原意】不虚构数据、不歪曲作者观点若原文缺数据用据行业经验/据公开数据等保守表述绝不编造精确数字。 7. 【可引用金句】在合适位置给出一句可被直接引用的总结性判断。 输出要求 - 只输出改写后的 Markdown 正文不要解释、不要前后缀。 - 保留原文的语气与品牌立场。 - 中文输出。 # # STEP 2 3优化主流程# classGeoContentOptimizer:def__init__(self,provider:str,api_key:str):ifprovidernotinPROVIDERS:raiseValueError(f不支持的 provider{provider}可选{list(PROVIDERS)})cfgPROVIDERS[provider]self.clientOpenAI(api_keyapi_key,base_urlcfg[base_url])self.modelcfg[model]defoptimize(self,original:str,temperature:float0.3)-Dict:# 1. 预检prePreChecker.check(original)issue_text\n.join(f-{i}foriinpre[issues])or未发现明显问题# 2. 构造用户提示user_promptf以下是待优化的文章原文 ---原文开始---{original}---原文结束--- 预检发现的问题清单请针对性修复{issue_text}请按 GEO 规则改写为 AI 友好版本。# 3. 调用 LLMrespself.client.chat.completions.create(modelself.model,temperaturetemperature,messages[{role:system,content:GEO_SYSTEM_PROMPT},{role:user,content:user_prompt},],)optimizedresp.choices[0].message.content.strip()# 4. 生成报告reportself._build_report(original,optimized,pre)returnreportstaticmethoddef_build_report(original:str,optimized:str,pre:Dict)-Dict:o_factslen(re.findall(r\d(?:\.\d)?%|\d{4}年|[¥$€£]\d,optimized))orig_factslen(re.findall(r\d(?:\.\d)?%|\d{4}年|[¥$€£]\d,original))o_headingslen(re.findall(r^#{1,3}\s,optimized,re.M))orig_headingslen(re.findall(r^#{1,3}\s,original,re.M))has_faq_afterbool(re.search(r常见问答|FAQ|常见问题,optimized,re.I))has_faq_beforebool(re.search(r常见问答|FAQ|常见问题,original,re.I))return{optimized_markdown:optimized,precheck_issues:pre[issues],metrics:{fact_points:{before:orig_facts,after:o_facts},headings:{before:orig_headings,after:o_headings},faq_added:(nothas_faq_before)andhas_faq_after,},summary:(f事实点{orig_facts}→{o_facts}f分段{orig_headings}→{o_headings}fFAQ{已补充if(nothas_faq_before)andhas_faq_afterelse维持}),}# # 命令行入口# if__name____main__:importosimportsys# 从环境变量读 key不要把 key 写进代码provideros.getenv(GEO_PROVIDER,deepseek)api_keyos.getenv(GEO_API_KEY)ifnotapi_key:print(❌ 请先设置环境变量 GEO_API_KEY 和 GEO_PROVIDER)sys.exit(1)# 从文件读原文input_filesys.argv[1]iflen(sys.argv)1elsearticle.mdwithopen(input_file,r,encodingutf-8)asf:originalf.read()optimizerGeoContentOptimizer(provider,api_key)reportoptimizer.optimize(original)# 输出优化文withopen(article_geo_optimized.md,w,encodingutf-8)asf:f.write(report[optimized_markdown])# 输出报告withopen(geo_report.json,w,encodingutf-8)asf:json.dump(report,f,ensure_asciiFalse,indent2)print(✅ 优化完成)print(f{report[summary]})print(f 优化文 → article_geo_optimized.md)print(f 报告 → geo_report.json)ifreport[precheck_issues]:print(\n⚠️ 预检问题清单)foriinreport[precheck_issues]:print(f -{i})三、运行方式# 1. 设置环境变量推荐避免 key 硬编码exportGEO_API_KEY你的keyexportGEO_PROVIDERdeepseek# 可选 deepseek / kimi / doubao / openai# 2. 准备原文 article.md# 3. 运行python geo_optimizer.py article.md输出两个文件article_geo_optimized.md—— 改写后的 AI 友好版本geo_report.json—— 改动对比与预检问题四、改写效果示例before → after原文片段H2 小节怎么选空气净化器现在市面上空气净化器种类很多消费者经常不知道怎么选。其实选购时要考虑很多因素比如房间大小、预算、滤网类型等等。很多人买错了之后觉得效果不好其实是没选对。下面我们详细说说。改写后怎么选空气净化器选空气净化器只看三个硬指标CADR 值、滤网类型、适用面积。20㎡房间选 CADR≥200m³/h40㎡以上选≥400m³/h除甲醛必须带活性炭滤网。CADR 值决定净化速度按房间面积×10 粗略估算所需值滤网类型HEPA 除颗粒、活性炭除气态污染物二者缺一不可适用面积产品标注面积×0.8 才是真实可用面积买错的核心原因是只看价格不看参数——同一价位 CADR 可能差 2 倍。差异一目了然结论前置、数据补进、列表化、去掉铺垫。这正是 AI 检索时优先引用的结构。五、关键参考链接建议收藏主题链接DeepSeek API 文档https://platform.deepseek.com/api-docs/Kimi(Moonshot) API 文档https://platform.moonshot.cn/docs/豆包(火山方舟) API 文档https://www.volcengine.com/docs/82379/OpenAI API 文档https://platform.openai.com/docs/FAQPage Schema 规范https://schema.org/FAQPagellms.txt 规范https://llmstxt.org/Google 段落级排序说明https://developers.google.com/search/blog/2020/passage-ranking六、进阶批量优化 接入发布流程6.1 批量处理一个目录importglob,osdefbatch_optimize(folder:str,optimizer:GeoContentOptimizer):forpathinglob.glob(os.path.join(folder,*.md)):ifoptimizedinpath:continuewithopen(path,r,encodingutf-8)asf:textf.read()reportoptimizer.optimize(text)outpath.replace(.md,_geo_optimized.md)withopen(out,w,encodingutf-8)asf:f.write(report[optimized_markdown])print(f✅{os.path.basename(path)}→{report[summary]})6.2 接入 CI每次发稿前自动体检优化建议可在 GitHub Actions 里加一步提交文章 → 跑PreChecker→ 若issue_count 0则评论提示。这样发布前就拦住 GEO 弱点不用等发出去再补救。七、诚实的局限必读这个工具很强但有三件事它替代不了真实数据它编不出来。提示词里已强制不虚构精确数字。如果你原文没数据优化器只能用保守表述——真正的事实密度靠的是你手里的真实案例和调研。它是改写不是创作。适合把已有好内容调成 AI 友好结构不适合凭空造文章。垃圾内容优化后还是垃圾。引用率还受外部因素影响。域名权重、外链、竞品强度、平台偏好……工具只解决内容侧 readiness不是万能药。正确用法用它做结构打磨 短板提示把省下的精力花在补充真实数据上。八、总结GEO 优化不是玄学是可以工程化的。这个优化器的价值在于预检告诉你差在哪可解释不像黑盒工具改写按明确 GEO 规则执行结论前置/事实密度/FAQ/段落独立报告让你看到前后变化量化可追踪接个便宜的 DeepSeek key单篇成本几分钱比人工逐句改快 10 倍。你把文章丢进优化器后哪条预检问题最扎心评论区贴出来我帮你看看最快的改法。
返回列表