【实战】从零搭建GEO多平台监控系统:支持ChatGPT、豆包、Kimi、文心一言

【实战】从零搭建GEO多平台监控系统:支持ChatGPT、豆包、Kimi、文心一言

【实战】从零搭建GEO多平台监控系统:支持ChatGPT、豆包、Kimi、文心一言

背景

Sora死了。

我的第一反应不是"AI完了",而是"我的监控代码要不要改"。

因为之前我专门写了Sora的监控脚本。

Sora一关,代码废了。

痛定思痛,我决定写一套通用的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 @dataclassclassGEOResult:"""GEO查询结果""" platform:str query:str brand:str mentioned:bool position:int context:str timestamp:str response_time_ms:float error: Optional[str]=NoneclassBasePlatform(ABC):"""AI平台基类"""def__init__(self, name:str, api_key:str=None): self.name = name self.api_key = api_key self.base_delay =1.0# 基础延迟(秒)@abstractmethoddefquery(self, search_query:str)->str:"""执行查询,返回AI响应文本"""pass@abstractmethoddefextract_brand_info(self, response:str, brand:str)-> Dict:"""从响应中提取品牌相关信息"""passdefcheck_brand(self, search_query:str, brand:str)-> GEOResult:"""检查品牌在AI响应中的出现情况""" start_time = time.time()try:# 执行查询 response = self.query(search_query)# 提取品牌信息 brand_info = self.extract_brand_info(response, brand) response_time =(time.time()- start_time)*1000return GEOResult( platform=self.name, query=search_query, brand=brand, mentioned=brand_info["mentioned"], position=brand_info["position"], context=brand_info["context"], timestamp=datetime.now().isoformat(), response_time_ms=response_time )except Exception as e: response_time =(time.time()- start_time)*1000return GEOResult( platform=self.name, query=search_query, brand=brand, mentioned=False, position=0, context="", timestamp=datetime.now().isoformat(), response_time_ms=response_time, error=str(e))

2. 具体平台实现

ChatGPT平台
import os import requests classChatGPTPlatform(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"defquery(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"]defextract_brand_info(self, response:str, brand:str)-> Dict:"""提取品牌信息""" mentioned = brand in response ifnot 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,# 简化:出现即为位置1"context":f"...{context}..."}
豆包平台
classDoubaoPlatform(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"defquery(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"]defextract_brand_info(self, response:str, brand:str)-> Dict:"""提取品牌信息""" mentioned = brand in response ifnot 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平台
classKimiPlatform(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"defquery(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"]defextract_brand_info(self, response:str, brand:str)-> Dict:"""提取品牌信息""" mentioned = brand in response ifnot 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 classGEOMultiPlatformMonitor:"""GEO多平台监控器"""def__init__(self, brand:str): self.brand = brand self.platforms: List[BasePlatform]=[] self.results: List[GEOResult]=[]defadd_platform(self, platform: BasePlatform):"""添加监控平台""" self.platforms.append(platform)defcheck_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 defgenerate_report(self)->str:"""生成监控报告"""ifnot self.results:return"暂无监控数据" report =f"""# GEO多平台监控报告 生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} 监控品牌: {self.brand} --- ## 📊 总体概览 """ total =len(self.results) mentioned =sum(1for r in self.results if r.mentioned) success =sum(1for r in self.results ifnot 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 inset(r.platform for r in self.results): platform_results =[r for r in self.results if r.platform == platform_name] p_mentioned =sum(1for r in platform_results if r.mentioned) p_total =len(platform_results) p_success =sum(1for r in platform_results ifnot r.error) emoji ="✅"if p_mentioned >0else"❌" 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 defsave_to_json(self, filename:str=None):"""保存结果到JSON"""ifnot 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 ]withopen(filename,"w", encoding="utf-8")as f: json.dump(data, f, ensure_ascii=False, indent=2)print(f"报告已保存: {filename}")

4. 定时任务配置

import schedule defdaily_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自动检查")# 运行whileTrue: schedule.run_pending() time.sleep(60)

使用方法

1. 安装依赖

pip install requests schedule 

2. 配置API Key

# 设置环境变量exportOPENAI_API_KEY="your-openai-key"exportDOUBAO_API_KEY="your-doubao-key"exportKIMI_API_KEY="your-kimi-key"

3. 修改品牌名和查询词

# 修改监控的品牌 monitor = GEOMultiPlatformMonitor("你的品牌")# 修改查询词 queries =["推荐一个XX工具","XX服务商哪家好"]

4. 运行

python geo_monitor.py 

效果

用这套系统监控GEO:

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

总结

Sora死了,但监控代码升级了。

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

核心改进:

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

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


有问题欢迎评论区交流。

#Python #GEO #多平台监控 #ChatGPT #Kimi #豆包

Read more

RISC-V五级流水线CPU的Xilinx FPGA移植操作指南

手把手教你把 RISC-V 五级流水线 CPU 移植到 Xilinx FPGA 你有没有想过,自己写一个 CPU?不是买现成的芯片,而是从零开始用 Verilog 搭建一个真正能跑程序的处理器——哪怕只是一个教学级的五级流水线架构。听起来很酷,对吧? 更进一步:把这个 CPU 下载到一块 Xilinx FPGA 开发板上,让它点亮 LED、打印“Hello World”,甚至执行你自己编译的 C 程序。这不仅是计算机体系结构课的经典实验,更是理解现代 CPU 工作原理最直接的方式。 本文不讲空泛理论,也不堆砌术语。我们将以 实战视角 ,带你完整走通 RISC-V 五级流水线 CPU 在 Xilinx FPGA 上的移植全流程 。你会看到每一个关键决策背后的“为什么”

项目介绍 MATLAB实现基于强制导向函数法(PFA)进行无人机三维路径规划的详细项目实例(含模型描述及部分示例代码)还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢

项目介绍 MATLAB实现基于强制导向函数法(PFA)进行无人机三维路径规划的详细项目实例(含模型描述及部分示例代码)还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢

MATLAB实现基于强制导向函数法(PFA)进行无人机三维路径规划的详细项目实例 更多详细内容可直接联系博主本人  或者访问对应标题的完整博客或者文档下载页面(含完整的程序,GUI设计和代码详解) 无人机(UAV)技术的迅猛发展正在深刻变革着军事侦察、环境监测、农业巡检、物流配送等多个领域。随着无人机应用场景的复杂性和多样性的提升,对其自主飞行能力提出了更高要求,尤其是在三维空间中的路径规划问题变得尤为关键。三维路径规划旨在为无人机生成一条安全、高效、可行的飞行路径,避开各种动态或静态障碍物,实现任务目标的最优完成。路径规划的核心难题是如何在复杂环境中实时计算满足无人机运动学与动力学约束的路径,同时保证路径的平滑性和安全性。 强制导向函数法(Potential Field Approach, PFA)是一种经典的路径规划方法,因其算法结构简单、计算速度快且适合实时应用而受到广泛关注。PFA通过将目标点视为吸引力源,障碍物视为斥力源,使无人机在吸引力和斥力的综合作用下自然避开障碍,趋向目标。然而,传统PFA存在局部极小值陷阱、路径震荡等问题,限制了其在复杂三维环境中的实际应用。

吃透 AM32 无人机电调:从源码架构到工作原理的全方位解析(附实践指南)(上)

开篇:为什么要深度剖析 AM32 电调? 作为多旋翼无人机的 “动力心脏”,电调(电子调速器)的性能直接决定了无人机的飞行稳定性、响应速度和续航能力。而 AM32 系列电调凭借开源性、高性价比、适配性强三大优势,成为了开源无人机社区的热门选择 —— 从入门级的 2204 电机到专业级的 2306 电机,从 3S 锂电池到 6S 高压电池,AM32 都能稳定驱动。 但很多开发者和爱好者在接触 AM32 源码时,常会陷入 “看得懂代码,看不懂逻辑” 的困境:为什么 FOC 算法要做坐标变换?DShot 协议的脉冲怎么解析?保护机制是如何实时触发的? 这篇博客将从硬件基础→源码架构→模块解析→工作原理→实践操作五个维度,逐行拆解 AM32 电调固件源码,帮你彻底搞懂

2026年低代码软件开发工具推荐合集

2026年低代码软件开发工具推荐合集

预算三万、工期三周、没有程序员——这就是小企业数字化的“死亡三角”。传统外包听到需求就报价十五万,时间排期半年起步;低代码的AI软件开发工具却用大语言模型把死亡三角变成黄金三角:业务人员输入需求→获取PRD→获取原型图&界面设计→同步获得前端代码,Saas、电商、餐饮平台三天上线。本文针对5款热门低代码AI开发工具做了横向对比,帮你快速找到契合自身需求的工具。 1.UXbot 核心优势:主打 “AI 原型设计+ 低代码”,不用懂技术,输入文字描述就能生成完整应用。不管是想做 APP、网页还是平板端只要说清需求(比如 “设计医疗Saas管理系统,包在线医生咨询系统、预约挂号、提醒与通知等”),AI 会自动生成可视化PRD,支持拖拽修改,删减,软件交互逻辑和内容板块,确定好后,UXbot直接生成多页面可交互的原型+设计,颜色、布局、组件都能自定义,还能补全页面跳转逻辑。 最重要的是,UXbot支持把高保真界面转换成Web前端代码,