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

GEO 多平台 AI 监控系统实战:支持 ChatGPT、豆包等

一套通用的 GEO(生成式引擎优化)多平台监控系统。系统采用模块化设计,包含任务调度、平台查询及结果分析模块,支持 ChatGPT、豆包、Kimi、文心一言等多个 AI 平台。核心代码实现了平台基类与具体平台适配器,通过定时任务自动执行监控并生成报告。方案解决了单平台依赖风险,实现了数据结构化留存与自动化告警,便于后续分析与扩展。

并发大师发布于 2026/4/6更新于 2026/9/972 浏览
GEO 多平台 AI 监控系统实战:支持 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. GEO 多平台 AI 监控系统实战
  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. 总结

更多推荐文章

查看全部
  • 使用 OpenClaw 集成飞书构建专属 AI 机器人指南
  • 安卓手机使用 Termux 部署 AstrBot 与 NapCat 搭建 QQ 机器人
  • 激光雷达点云滤波:5 种主流算法对比与选型指南
  • Python 实现图像像素化特效
  • Python 面试核心知识点汇总:装饰器与数据结构
  • Python 临床知识问答与检索项目落地实践
  • llama.cpp 多 GPU 分布式计算优化实践指南
  • GitHub 身份验证方式 PAT 和 SSH 详解
  • Sudachi 模拟器架构解析与跨平台实现
  • Amazon DocumentDB Serverless 架构特性与弹性扩缩容指南
  • Ubuntu 22.04 环境下 ROS2 Humble 复现 FAST-LIVO2 实战指南
  • Anaconda 安装与环境配置教程
  • 基于 LVM 部署 MinIO 分布式高可用集群
  • 卷积神经网络进阶:经典架构解析与实战开发
  • PX4 无人机 MID360 激光雷达 FAST-LIO 室内定位与定点悬停配置
  • C++ 高效碰撞检测实现与物理引擎性能优化
  • C++ string 类详解与模拟实现
  • .NET 集成 GoView 低代码可视化大屏实战指南
  • ToolkenGPT:利用工具嵌入增强大型语言模型
  • LLaMA-Factory 大语言模型微调框架实战指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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