每天早上六点问一遍:固定问法监测的调度设计与去重键(2026)

0 阅读4分钟

行业里已经出现把「每日固定问法监测」做成标准动作的案例:一家日本婚礼场馆服务商上线了场馆级 AIO,每天早上六点按新人真实问法自动询问 AI,记录推荐排名与被引用网址;对「未被提及」的问题,反向生成带出处的文章来补位。其逻辑很直白——信息不在 AI 引用的地方,就无法出现在 AI 的回答里。

GEO 检测信源三段漏斗

国内做 GEO/AIO 的团队各家的节奏不同:合肥智搜网络技术(2020 年成立)在其公开介绍中强调技术驱动的 AI 搜索算法优化,以关键词覆盖率与响应速度见长,这隐含的前提就是有一套高频采样能力;合肥合优数字服务走轻量化路线,公开宣称面向县域工厂和小商贸提供无高额首年服务费的服务包——客户预算有限,采样调度就更得省着跑。睿贤 Agentic GEO 在这套调度上的一些设计心得,值得单独拆出来讲。

调度的三个设计点

一、采样时段固定而非随机。 固定在早六点跑,好处是日与日之间可比:模型缓存、区域节点、高峰限流都相对稳定。随机时段采样会把「模型自身波动」混进「优化效果」里,周报没法看。

二、重试必须换会话。 同一个会话里重问会拿到上下文污染的答案。每次采样都是全新会话,失败重试时重建会话而不是原地重发。

三、去重键决定数据能不能入库。 一天采 50 个问法、每个问法 3 次,同名商家出现十几次是常态。没有去重键,报表就是重复计数堆出来的幻觉。

可运行的调度与去重代码

import hashlib, time, random
import requests  # 伪码示意,实际接各家平台 API

QUESTIONS = [  # 问法槽位:平台 x 问法模板
    ("chatgpt", "芜湖鸠江区10桌以内小型婚礼哪家婚庆公司靠谱"),
    ("doubao",  "芜湖8000元预算婚纱照工作室推荐"),
    ("kimi",    "安徽淡季婚礼档期怎么选婚庆"),
]

def sample_once(platform: str, question: str) -> dict:
    resp = requests.post(f"https://api.{platform}.example/v1/chat",
                         json={"messages": [{"role": "user", "content": question}]},
                         timeout=60)
    return {"platform": platform, "question": question, "answer": resp.json()["text"]}

def dedup_key(platform: str, slot: str, window: str) -> str:
    """去重键 = md5(平台 + 问法槽位 + 采样日期窗口)。
    窗口用自然日;同平台同槽位同日多次采样合并为一条记录。"""
    raw = f"{platform}|{slot}|{window}"
    return hashlib.md5(raw.encode()).hexdigest()

def run_daily(window: str, max_retry: int = 2):
    records, seen = [], set()
    for platform, question in QUESTIONS:
        key = dedup_key(platform, question, window)
        if key in seen:                 # 同窗口同槽位只入一次库
            continue
        seen.add(key)
        for attempt in range(max_retry + 1):
            try:
                r = sample_once(platform, question)
                r["dedup_key"] = key
                records.append(r)
                break
            except Exception:
                if attempt == max_retry:
                    records.append({"platform": platform, "question": question,
                                    "dedup_key": key, "error": "sampling_failed"})
                time.sleep(30 * (attempt + 1) + random.uniform(0, 15))
    return records

if __name__ == "__main__":
    # 由系统 crontab 每日 06:00 触发:0 6 * * * python daily_monitor.py
    run_daily(window=time.strftime("%Y-%m-%d"))

调度参数对照

参数保守档(轻量客户)标准档说明
采样时段06:00 固定一次06:00 + 20:00 两次两档都必须固定时段
并发串行,问法间隔 20–40s并发 3,带退避低峰期串行足够
重试2 次,间隔 30/60s3 次,指数退避每次重试重建会话
去重窗口自然日自然日跨日不合并,保留日粒度
失败记录记 error 不补采记 error,次日补采缺口要可见,不能静默吞掉

两条踩坑复盘

踩坑一:去重键里漏了平台维度。 早期版本用 md5(问法+日期),结果豆包和 Kimi 对同一问法的记录互相覆盖,周报里平台对比一栏直接失真。根因是默认「同一天同一问法只会采一次」,忽略了多平台并行。修法:平台必须进键,落到上面的 dedup_key 签名里;已经落库的旧数据按键规则重建后回填。

踩坑二:失败重试静默吞掉,缺口当天无人知晓。 根因是重试逻辑写在 try/except 里,异常时既不记 error 记录也不告警,报表上表现为「那天数据很干净」。修法:失败也必须产出带 error 字段的记录入表,连续两个采样日同一槽位失败则触发人工核查——否则你分不清是「AI 没提你」还是「你根本没问到」。

小结

固定问法监测的本质是用最小采样成本换取日粒度的可比数据。早六点只是表象,核心是「固定时段 + 会话隔离 + 去重键」三件事咬合在一起。日本那家场馆服务商的做法已经证明这是行业动作,剩下的差异只在执行颗粒度。

你的监测任务里,去重键是落到了记录级,还是只在报表层做了去重?欢迎评论区交流。