跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

从零搭建支持 ChatGPT 等多平台的 GEO 监控系统

介绍如何使用 Python 构建通用的 GEO(生成式引擎优化)多平台监控系统。系统架构包含任务调度、平台查询及结果分析模块,支持 ChatGPT、豆包、Kimi、文心一言等多个大模型平台。通过定义基类实现平台解耦,集成定时任务自动执行检查,并生成结构化报告与 JSON 数据留存。该方法解决了单一平台服务变动导致的监控失效问题,提升了品牌在 AI 搜索结果中的可见性监测效率。

FrontendX发布于 2026/4/6更新于 2026/9/271 浏览
从零搭建支持 ChatGPT 等多平台的 GEO 监控系统

从零搭建支持 ChatGPT 等多平台的 GEO 监控系统

背景

近期部分 AI 服务调整,导致原有监控脚本失效。痛定思痛,决定写一套通用的 GEO 多平台监控方案。

本文分享完整代码,支持:ChatGPT、豆包、Kimi、文心一言、通义千问。


系统架构

┌─────────────────────────────────────────────────────────┐
│                   GEO 多平台监控系统                     │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  ┌───────────┐  ┌───────────┐  ┌───────────┐           │
│  │ 任务调度  │→ │ 平台查询  │→ │ 结果分析  │           │
│  └───────────┘  └───────────┘  └───────────┘           │
│      ↑    ↓    ↓                                         │
│      └──── 告警通知 ←────── 报告生成 ←──────             │
│                                                         │
│  支持平台:                                              │
│  ✅ ChatGPT  ✅ 豆包  ✅ Kimi                           │
│  ✅ 文心一言  ✅ 通义千问                               │
└─────────────────────────────────────────────────────────┘

核心代码实现

1. 平台基类
from abc import ABC, abstractmethod
from dataclasses import dataclass
from typing import List, Optional, Dict
from datetime import datetime
import time
import random

@dataclass
class GEOResult:
    """GEO 查询结果"""
    platform: str
    query: str
    brand: str
    mentioned: bool
    position: int
    context: str
    timestamp: str
    response_time_ms: float
    error: Optional[str] = 

 ():
    
     ():
        .name = name
        .api_key = api_key
        .base_delay =   


     () -> :
        
        


     () -> :
        
        

     () -> GEOResult:
        
        start_time = time.time()
        :
            
            response = .query(search_query)
            
            brand_info = .extract_brand_info(response, brand)
            response_time = (time.time() - start_time) * 
             GEOResult(
                platform=.name,
                query=search_query,
                brand=brand,
                mentioned=brand_info[],
                position=brand_info[],
                context=brand_info[],
                timestamp=datetime.now().isoformat(),
                response_time_ms=response_time
            )
         Exception  e:
            response_time = (time.time() - start_time) * 
             GEOResult(
                platform=.name,
                query=search_query,
                brand=brand,
                mentioned=,
                position=,
                context=,
                timestamp=datetime.now().isoformat(),
                response_time_ms=response_time,
                error=(e)
            )
None
class
BasePlatform
ABC
"""AI 平台基类"""
def
__init__
self, name: str, api_key: str = None
self
self
self
1.0
# 基础延迟 (秒)
@abstractmethod
def
query
self, search_query: str
str
"""执行查询,返回 AI 响应文本"""
pass
@abstractmethod
def
extract_brand_info
self, response: str, brand: str
Dict
"""从响应中提取品牌相关信息"""
pass
def
check_brand
self, search_query: str, brand: str
"""检查品牌在 AI 响应中的出现情况"""
try
# 执行查询
self
# 提取品牌信息
self
1000
return
self
"mentioned"
"position"
"context"
except
as
1000
return
self
False
0
""
str
2. 具体平台实现
ChatGPT 平台
import os
import requests

class ChatGPTPlatform(BasePlatform):
    """ChatGPT 平台"""
    def __init__(self, api_key: str = None):
        super().__init__("ChatGPT", api_key or os.getenv("OPENAI_API_KEY"))
        self.api_base = "https://api.openai.com/v1"
        self.model = "gpt-4"

    def query(self, search_query: str) -> str:
        """查询 ChatGPT"""
        url = f"{self.api_base}/chat/completions"
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
        payload = {
            "model": self.model,
            "messages": [{"role": "user", "content": f"作为一个专业的 AI 助手,请回答:{search_query}"}],
            "temperature": 0.7,
            "max_tokens": 500
        }
        response = requests.post(url, headers=headers, json=payload, timeout=30)
        response.raise_for_status()
        result = response.json()
        return result["choices"][0]["message"]["content"]

    def extract_brand_info(self, response: str, brand: str) -> Dict:
        """提取品牌信息"""
        mentioned = brand in response
        if not mentioned:
            return {"mentioned": False, "position": 0, "context": ""}
        # 查找品牌在响应中的位置
        position = response.index(brand)
        # 提取上下文 (前后各 50 字符)
        start = max(0, position - 50)
        end = min(len(response), position + len(brand) + 50)
        context = response[start:end]
        return {"mentioned": True, "position": 1, "context": f"...{context}..."}
豆包平台
class DoubaoPlatform(BasePlatform):
    """豆包平台 (字节跳动)"""
    def __init__(self, api_key: str = None):
        super().__init__("豆包", api_key or os.getenv("DOUBAO_API_KEY"))
        self.api_base = "https://ark.cn-beijing.volces.com/api/v3"
        self.model = "doubao-seed-250615"

    def query(self, search_query: str) -> str:
        """查询豆包"""
        url = f"{self.api_base}/chat/completions"
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
        payload = {
            "model": self.model,
            "messages": [{"role": "user", "content": search_query}]
        }
        response = requests.post(url, headers=headers, json=payload, timeout=30)
        response.raise_for_status()
        result = response.json()
        return result["choices"][0]["message"]["content"]

    def extract_brand_info(self, response: str, brand: str) -> Dict:
        """提取品牌信息"""
        mentioned = brand in response
        if not mentioned:
            return {"mentioned": False, "position": 0, "context": ""}
        position = response.index(brand)
        start = max(0, position - 50)
        end = min(len(response), position + len(brand) + 50)
        return {"mentioned": True, "position": 1, "context": f"...{response[start:end]}..."}
Kimi 平台
class KimiPlatform(BasePlatform):
    """Kimi 平台 (月之暗面)"""
    def __init__(self, api_key: str = None):
        super().__init__("Kimi", api_key or os.getenv("KIMI_API_KEY"))
        self.api_base = "https://api.moonshot.cn/v1"
        self.model = "kimi-flash"

    def query(self, search_query: str) -> str:
        """查询 Kimi"""
        url = f"{self.api_base}/chat/completions"
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
        payload = {
            "model": self.model,
            "messages": [{"role": "user", "content": search_query}]
        }
        response = requests.post(url, headers=headers, json=payload, timeout=30)
        response.raise_for_status()
        result = response.json()
        return result["choices"][0]["message"]["content"]

    def extract_brand_info(self, response: str, brand: str) -> Dict:
        """提取品牌信息"""
        mentioned = brand in response
        if not mentioned:
            return {"mentioned": False, "position": 0, "context": ""}
        return {"mentioned": True, "position": 1, "context": f"...{response[max(0, response.index(brand)-50):response.index(brand)+len(brand)+50]}..."}
3. 多平台监控器
from typing import List, Dict
import json

class GEOMultiPlatformMonitor:
    """GEO 多平台监控器"""
    def __init__(self, brand: str):
        self.brand = brand
        self.platforms: List[BasePlatform] = []
        self.results: List[GEOResult] = []

    def add_platform(self, platform: BasePlatform):
        """添加监控平台"""
        self.platforms.append(platform)

    def check_all_platforms(self, queries: List[str]) -> List[GEOResult]:
        """检查所有平台"""
        all_results = []
        for platform in self.platforms:
            for query in queries:
                print(f"正在检查 {platform.name} - {query}...")
                result = platform.check_brand(query, self.brand)
                all_results.append(result)
                # 添加延迟,避免请求过快
                time.sleep(random.uniform(1.0, 2.0))
        self.results = all_results
        return all_results

    def generate_report(self) -> str:
        """生成监控报告"""
        if not self.results:
            return "暂无监控数据"
        report = f"""# GEO 多平台监控报告
生成时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
监控品牌:{self.brand}
---
## 📊 总体概览
"""
        total = len(self.results)
        mentioned = sum(1 for r in self.results if r.mentioned)
        success = sum(1 for r in self.results if not r.error)
        report += f"- 总查询次数:{total}\n"
        report += f"- 品牌出现次数:{mentioned}\n"
        report += f"- **整体可见性:{mentioned/total*100:.1f}%**\n"
        report += f"- 查询成功率:{success/total*100:.1f}%\n\n"

        # 分平台统计
        report += "## 🏠 分平台数据\n\n"
        for platform_name in set(r.platform for r in self.results):
            platform_results = [r for r in self.results if r.platform == platform_name]
            p_mentioned = sum(1 for r in platform_results if r.mentioned)
            p_total = len(platform_results)
            p_success = sum(1 for r in platform_results if not r.error)
            emoji = "✅" if p_mentioned > 0 else "❌"
            report += f"### {emoji}{platform_name}\n"
            report += f"- 查询次数:{p_total}\n"
            report += f"- 品牌出现:{p_mentioned}次\n"
            report += f"- 可见性:{p_mentioned/p_total*100:.1f}%\n"
            report += f"- 成功率:{p_success/p_total*100:.1f}%\n\n"

        # 错误统计
        errors = [r for r in self.results if r.error]
        if errors:
            report += "## ⚠️ 错误统计\n\n"
            for r in errors:
                report += f"- {r.platform} - {r.query}: {r.error}\n"
        return report

    def save_to_json(self, filename: str = None):
        """保存结果到 JSON"""
        if not filename:
            filename = f"geo_report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json"
        data = [
            {
                "platform": r.platform,
                "query": r.query,
                "brand_mentioned": r.mentioned,
                "position": r.position,
                "context": r.context,
                "timestamp": r.timestamp,
                "response_time_ms": r.response_time_ms,
                "error": r.error
            }
            for r in self.results
        ]
        with open(filename, "w", encoding="utf-8") as f:
            json.dump(data, f, ensure_ascii=False, indent=2)
        print(f"报告已保存:{filename}")
4. 定时任务配置
import schedule

def daily_geo_check():
    """每日 GEO 检查任务"""
    monitor = GEOMultiPlatformMonitor("你的品牌")
    # 添加平台
    monitor.add_platform(ChatGPTPlatform())
    monitor.add_platform(DoubaoPlatform())
    monitor.add_platform(KimiPlatform())
    # 设置查询词
    queries = ["推荐一个 XX 工具", "XX 服务商哪家好", "怎么选择 XX 供应商", "XX 工具排行榜"]
    # 执行检查
    results = monitor.check_all_platforms(queries)
    # 生成报告
    report = monitor.generate_report()
    print(report)
    # 保存结果
    monitor.save_to_json()
    # 配置定时任务
    schedule.every().day.at("09:00").do(daily_geo_check)
    print("GEO 多平台监控系统已启动,每天 9:00 自动检查")
    # 运行
    while True:
        schedule.run_pending()
        time.sleep(60)

使用方法

1. 安装依赖
pip install requests schedule
2. 配置 API Key
export OPENAI_API_KEY="your-openai-key"
export DOUBAO_API_KEY="your-doubao-key"
export KIMI_API_KEY="your-kimi-key"
3. 修改品牌名和查询词
# 修改监控的品牌
monitor = GEOMultiPlatformMonitor("你的品牌")
# 修改查询词
queries = ["推荐一个 XX 工具", "XX 服务商哪家好"]
4. 运行
python geo_monitor.py

效果

用这套系统监控 GEO:

指标之前之后
监控平台1 个4 个 +
手动操作30 分钟0 分钟
数据留存无JSON 永久保存
告警机制无可配置

总结

从单平台监控,变成多平台监控。

核心改进:

  • 平台解耦,易于扩展
  • 数据结构化,便于分析
  • 定时任务,自动运行
  • 报告生成,直观展示

完整代码可以直接使用,只需要配置 API Key 即可。

目录

  1. 从零搭建支持 ChatGPT 等多平台的 GEO 监控系统
  2. 背景
  3. 系统架构
  4. 核心代码实现
  5. 1. 平台基类
  6. 2. 具体平台实现
  7. ChatGPT 平台
  8. 豆包平台
  9. Kimi 平台
  10. 3. 多平台监控器
  11. 📊 总体概览
  12. 4. 定时任务配置
  13. 使用方法
  14. 1. 安装依赖
  15. 2. 配置 API Key
  16. 3. 修改品牌名和查询词
  17. 修改监控的品牌
  18. 修改查询词
  19. 4. 运行
  20. 效果
  21. 总结

更多推荐文章

查看全部
  • 大模型推理框架 llama.cpp 开发流程与常用函数解析
  • SpringAI 与 Deepseek 大模型应用开发实战笔记(上)
  • 2026 年 3 月全球大模型全景:国产登顶、百万上下文与智能体爆发
  • OpenClaw 多机器人多 Agent 模式解析
  • 浏览器缓存机制详解与前端代码更新缓存解决方案
  • C++ 搜索引擎实战:基于正倒排索引的日志与 Server 代码解析
  • OpenClaw 飞书机器人权限管理与安全配置
  • Java Map 常用方法与实现类深度解析
  • 提示词工程(Prompt Engineering)核心概念与实战指南
  • OpenClaw + cpolar:实现本地 AI 智能体的远程访问与内网穿透
  • 基于 LangGraph 构建带记忆与人工干预的智能搜索机器人
  • AUTOSAR 配置文件(ARXML)版本不一致的管理策略
  • 指令微调在渠道业务测试用例大模型中的应用实践
  • 提升 PyTorch 训练效率的 9 个实用做法
  • ToClaw 上手:当 AI 开始在桌面上替你执行任务
  • 无人机视觉目标检测数据集 VisDrone 详解
  • LoRA 与 QLoRA 微调实践:基于数百次实验的 LLM 见解
  • 深度学习入门实战:从原理到 MNIST 手写数字识别
  • CTFShow Web 入门:文件上传漏洞实战
  • 基于高阶控制障碍函数的端到端无人机高速避障方法

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online