标签: 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 优化效果。具体步骤:

  1. 建立基线:优化前跑一轮完整监测,记录各平台各关键词的初始收录率
  2. 执行优化:发布内容、优化语料、提升权威来源覆盖
  3. 持续监测:优化后连续监测 2~4 周,观察收录率变化趋势
  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 使用规范。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐