GEO监测实战:用API自动化追踪品牌在DeepSeek、Kimi、豆包等6大AI平台的可见度【附代码】
标签: GEO监测 大模型品牌监测 DeepSeek品牌监测 AI可见度追踪 Python自动化
一、背景:为什么我要做这个系统
最近在做一个品牌的GEO优化项目,甲方每周都会问同一个问题:
“我们发了这么多内容,DeepSeek到底有没有推荐我们?”
一开始我们是手动查的——打开 DeepSeek、Kimi、豆包逐个提问,截图,整理成表格发给客户。大约 20 个关键词 × 6 个平台 = 120 次手动操作,每周至少半天时间。
后来关键词扩展到 80 个,这条路彻底走不通了。于是我花了两周时间,用 Python 搭了一套自动化的 GEO 监测系统,本文记录完整的技术方案和踩坑经验。
二、系统整体架构
整个大模型品牌监测系统分四个核心模块:
| 模块 | 功能 | 技术选型 |
|---|---|---|
| 关键词配置 | 管理品牌词、行业词、场景词 | YAML 配置文件 |
| 多平台并发请求 | 向各 AI 平台发起提问,采集回答 | 各平台官方 API + asyncio |
| 命中检测与截图 | 关键词匹配 + 自动截图存档 | 正则匹配 |
| 数据看板 | 收录比统计、趋势图、报告导出 | SQLite + ECharts |
核心流程:读取关键词配置 → 多平台并发提问 → 采集完整回答 → 命中检测 → 截图存档 → 汇总数据看板
三、各平台 API 接入方式详解
这是整个系统最核心的部分,也是坑最多的地方。6 个平台的接入方式差异很大。
3.1 各平台接入方式总览
| 平台 | 接入方式 | 申请难度 | 稳定性 | 备注 |
|---|---|---|---|---|
| DeepSeek | 官方 API(OpenAI 兼容格式) | ⭐ 注册即用 | ★★★★★ | 最易接入,首选 |
| Kimi | 官方 API(Moonshot AI) | ⭐ 注册即用 | ★★★★☆ | 支持长上下文 |
| 千问 | 官方 API(阿里云 DashScope) | ⭐⭐ 需开通 | ★★★★☆ | 有免费额度 |
| 文心一言 | 官方 API(百度智能云) | ⭐⭐⭐ 需审核 | ★★★☆☆ | 审核周期较长 |
| 豆包 | 官方 API(火山引擎) | ⭐⭐⭐ 企业认证 | ★★★★☆ | 个人开发者受限 |
| 元宝 | 暂无公开 API | — 不适用 | — | 需网页自动化,本文不展开 |
3.2 DeepSeek API 接入
DeepSeek 提供兼容 OpenAI 格式的 API,接入成本最低,是整个系统最稳定的数据源,建议首先接入。
# DeepSeek API 接入示例
import requests
DEEPSEEK_API_KEY = 'your_api_key_here'
DEEPSEEK_URL = 'https://api.deepseek.com/v1/chat/completions'
def query_deepseek(prompt: str) -> str:
headers = {
'Authorization': f'Bearer {DEEPSEEK_API_KEY}',
'Content-Type': 'application/json'
}
payload = {
'model': 'deepseek-chat',
'messages': [{'role': 'user', 'content': prompt}],
'temperature': 0.7,
'max_tokens': 2000
}
resp = requests.post(DEEPSEEK_URL, json=payload, headers=headers, timeout=30)
resp.raise_for_status()
return resp.json()['choices'][0]['message']['content']
💡 注意: temperature 建议设置 0.5~0.8。过低会导致回答过于固定,无法反映真实的推荐概率分布;过高则回答质量下降。
3.3 Kimi(Moonshot AI)API 接入
Kimi 的 API 同样兼容 OpenAI 格式,只需替换 base_url 和 model 参数,代码改动极小。
# Kimi API 接入示例
from openai import OpenAI
kimi_client = OpenAI(
api_key='your_moonshot_api_key',
base_url='https://api.moonshot.cn/v1'
)
def query_kimi(prompt: str) -> str:
completion = kimi_client.chat.completions.create(
model='moonshot-v1-8k', # 可选 8k / 32k / 128k
messages=[{'role': 'user', 'content': prompt}],
temperature=0.7
)
return completion.choices[0].message.content
💡 注意: Kimi 对长文本处理能力强,回答中经常包含来源引用。GEO 监测时要注意:Kimi 引用了你的内容但没有直接提及品牌名,这种情况需要单独处理。
3.4 千问(通义)API 接入
千问通过阿里云 DashScope 接入,需要先在阿里云控制台开通灵积模型服务,有一定免费额度。
# 千问 API 接入示例
# 需先安装:pip install dashscope
import dashscope
from dashscope import Generation
dashscope.api_key = 'your_dashscope_api_key'
def query_qianwen(prompt: str) -> str:
response = Generation.call(
model='qwen-turbo', # 可选 qwen-turbo / qwen-plus / qwen-max
messages=[{'role': 'user', 'content': prompt}],
result_format='message'
)
if response.status_code == 200:
return response.output.choices[0].message.content
else:
raise Exception(f'千问请求失败: {response.code} - {response.message}')
3.5 文心一言 API 接入
文心一言通过百度智能云接入,需要先创建应用获取 API Key 和 Secret Key,再换取 access_token。
# 文心一言 API 接入示例
import requests
WENXIN_API_KEY = 'your_api_key'
WENXIN_SECRET_KEY = 'your_secret_key'
def get_wenxin_token() -> str:
url = 'https://aip.baidubce.com/oauth/2.0/token'
params = {
'grant_type': 'client_credentials',
'client_id': WENXIN_API_KEY,
'client_secret': WENXIN_SECRET_KEY
}
return requests.post(url, params=params).json()['access_token']
def query_wenxin(prompt: str) -> str:
token = get_wenxin_token()
url = 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro'
url += f'?access_token={token}'
payload = {'messages': [{'role': 'user', 'content': prompt}]}
resp = requests.post(url, json=payload, timeout=30)
return resp.json()['result']
⚠️ 注意: 文心一言的 access_token 有效期为 30 天,建议加入 token 缓存和自动刷新机制,避免系统某天突然失效。
3.6 豆包 API 接入
豆包通过火山引擎接入,个人开发者需要企业认证。接入后同样兼容 OpenAI 格式。
# 豆包 API 接入示例(火山引擎)
from openai import OpenAI
doubao_client = OpenAI(
api_key='your_volc_api_key',
base_url='https://ark.cn-beijing.volces.com/api/v3'
)
def query_doubao(prompt: str) -> str:
completion = doubao_client.chat.completions.create(
model='your_endpoint_id', # 火山引擎控制台创建的推理接入点ID
messages=[{'role': 'user', 'content': prompt}],
temperature=0.7
)
return completion.choices[0].message.content
💡 注意: 豆包需要在火山引擎控制台先创建推理接入点(Endpoint),model 参数填入接入点 ID 而不是模型名称,这是和其他平台最大的区别。
四、多平台并发请求实现
5 个平台同步请求,如果串行执行效率极低。使用 ThreadPoolExecutor 实现并发,时间可以压缩到单个请求的耗时。
# 多平台并发请求核心逻辑
import concurrent.futures
from typing import Dict
PLATFORMS = {
'deepseek': query_deepseek,
'kimi': query_kimi,
'qianwen': query_qianwen,
'wenxin': query_wenxin,
'doubao': query_doubao,
}
def query_all_platforms(prompt: str) -> Dict[str, str]:
results = {}
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
futures = {
executor.submit(func, prompt): name
for name, func in PLATFORMS.items()
}
for future in concurrent.futures.as_completed(futures, timeout=60):
name = futures[future]
try:
results[name] = future.result()
except Exception as e:
results[name] = f'ERROR: {str(e)}'
return results
# 使用示例
answers = query_all_platforms('AI营销工具哪家比较好用?')
for platform, answer in answers.items():
print(f'[{platform}] {answer[:100]}...')
五、命中检测与截图取证
5.1 关键词命中检测
# 命中检测逻辑
import re
from typing import List
def check_hit(answer: str, brand_variants: List[str]) -> bool:
"""
检测AI回答中是否包含品牌名称或其变体
brand_variants: 品牌名称变体列表,如 ['某品牌', '某品牌科技', 'MouPinPai']
"""
answer_lower = answer.lower()
for variant in brand_variants:
# 精确匹配(不区分大小写)
if variant.lower() in answer_lower:
return True
# 正则匹配(处理标点分隔等情况)
pattern = re.compile(re.escape(variant), re.IGNORECASE)
if pattern.search(answer):
return True
return False
5.2 截图存档方案
命中之后,将完整的 AI 回答截图存档,作为不可篡改的取证凭证。
# 截图存档示例
# 需先安装:pip install playwright && playwright install chromium
from playwright.sync_api import sync_playwright
import hashlib, time, os
def save_screenshot(answer: str, keyword: str, platform: str) -> str:
ts = int(time.time())
hash_id = hashlib.md5(f'{keyword}{platform}{ts}'.encode()).hexdigest()[:8]
filename = f'screenshots/{platform}_{ts}_{hash_id}.png'
os.makedirs('screenshots', exist_ok=True)
html = f'''
<html><body style="font-family:Arial;padding:20px;max-width:800px">
<div style="color:#666;font-size:12px">
平台: {platform} | 关键词: {keyword} | 时间: {ts}
</div>
<hr>
<div style="line-height:1.8">{answer.replace(chr(10), "<br>")}</div>
</body></html>
'''
with sync_playwright() as pw:
browser = pw.chromium.launch()
page = browser.new_page(viewport={'width': 900, 'height': 600})
page.set_content(html)
page.screenshot(path=filename, full_page=True)
browser.close()
return filename
六、踩坑经验总结
坑1:AI 回答不稳定导致数据波动
同一个问题在不同时间提问,AI 的回答可能完全不同。这不是 Bug,是 LLM 的正常特性。
解决方案: 对同一关键词每天运行 3 次取平均值,而不是单次结果。同时设置合理的 temperature 值(0.6~0.8)。
坑2:各平台的速率限制
高并发时容易触发 429 错误。
# 带重试的请求封装
import time, random
def query_with_retry(func, prompt: str, max_retries: int = 3) -> str:
for attempt in range(max_retries):
try:
time.sleep(random.uniform(0.5, 2.0)) # 随机延迟
return func(prompt)
except Exception as e:
if '429' in str(e) and attempt < max_retries - 1:
wait = (2 ** attempt) + random.uniform(0, 1) # 指数退避
print(f'触发速率限制,等待 {wait:.1f}s 后重试...')
time.sleep(wait)
else:
raise
raise Exception('超过最大重试次数')
坑3:文心一言 token 过期
文心一言的 access_token 每 30 天过期一次,没有处理好会导致系统某天突然失效。
解决方案: 在数据库中存储 token 和过期时间,每次请求前检查是否需要刷新,提前 1 天自动续期。
坑4:回答内容截断问题
部分平台在回答较长时会截断输出,影响命中检测准确率。
解决方案: 设置合理的 max_tokens(建议 2000~4000),对回答末尾做完整性验证,不完整的回答触发补充请求。
七、用 GEO 监测验证优化效果
搭建系统的最终目的,是验证 GEO 优化效果。具体步骤:
- 建立基线:优化前跑一轮完整监测,记录各平台各关键词的初始收录率
- 执行优化:发布内容、优化语料、提升权威来源覆盖
- 持续监测:优化后连续监测 2~4 周,观察收录率变化趋势
- 截图存档交付:将优化前后对比数据 + 关键命中截图整理成报告
从实际项目来看,不同平台的 GEO 优化见效周期差异明显:
| 平台 | 见效周期 | 主要影响因素 |
|---|---|---|
| DeepSeek | 3~6 周 | 高质量技术内容、权威来源引用 |
| Kimi | 2~4 周 | 长文本内容质量、来源可信度 |
| 千问 | 3~5 周 | 结构化内容、实体关联 |
| 文心一言 | 4~8 周 | 百度系内容生态覆盖度 |
| 豆包 | 2~4 周 | 字节系平台内容分发 |
八、总结
搭建这套 GEO 监测系统之后,我们把每周的人工查询时间从半天压缩到了几乎为零,同时监测关键词从 20 个扩展到了 200 个,覆盖率提升了 10 倍。
整个系统的核心难点:
- 各平台 API 接入方式的差异处理
- AI 回答不稳定性的统计学处理
- 截图存档方案的工程化落地
- 数据看板的可视化交付设计
如果你也在做 GEO 优化,强烈建议先把监测系统搭起来,没有数据就没有优化方向。
如果不想自己搭建,我们项目中使用的是 我们用的是**昊观传媒(Foresight Media)**的 AIV Monitor,支持六大平台自动监测、命中截图存档、数据可交付,感兴趣可以自行搜索了解。,支持 6 大平台自动监测 + 截图取证 + 数据看板,可以直接使用。
本文为技术实践记录,代码仅供参考,请遵守各平台用户协议和 API 使用规范。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)