
品牌AI可见度监测需要定期向多个大模型平台发起查询,采集品牌在AI回答中的提及情况。这类系统面临任务量大、平台接口不稳定、模型响应超时等工程挑战。本文从任务调度与重试角度,介绍如何设计可靠的任务队列、调度策略和重试机制,并说明监控告警的搭建方法。适合需要构建或优化AI监测系统的后端工程师和架构师。
品牌AI可见度监测的核心任务是:定期向多个大模型(如腾讯混元、GPT等)提交预设问题,收集回答,并解析其中是否提及目标品牌。一个典型的监测系统需要管理数百个品牌、数千个问题,每天执行数万次查询。
实际约束包括:
初期采用简单的定时任务+同步调用方式,每天凌晨启动一个脚本,循环调用各平台接口。问题很快暴露:
根本原因在于:
方案 | 优点 | 缺点 |
|---|---|---|
基于Redis的延迟队列 | 轻量、性能高、支持延迟 | 需要自行实现持久化和ACK |
基于RabbitMQ/消息队列 | 成熟、支持死信队列 | 运维成本较高 |
基于数据库轮询 | 简单、与业务耦合低 | 性能瓶颈、不适合高并发 |
基于云服务(如腾讯云CMQ) | 免运维、高可用 | 依赖云厂商 |
综合考虑团队技术栈和运维能力,选择基于Redis的有序集合(Sorted Set)实现延迟队列,配合数据库记录任务状态。
每个任务包含以下字段:
任务入队时,将task_id作为member,next_execute_time作为score存入Redis Sorted Set。
调度器(Dispatcher)每隔1秒从Redis中取出score小于当前时间戳的任务,批量取出(每次最多100个),更新状态为running,并提交到工作线程池执行。
工作线程池大小根据平台QPS限制动态配置,例如腾讯混元限制20 QPS,则对应线程池最大20个。
当任务执行失败时,根据失败原因决定是否重试:
重试时更新next_execute_time,重新入队。
使用Prometheus + Grafana监控以下指标:
告警规则:
以下是Redis延迟队列的核心实现片段(Go语言示例伪代码):
// 任务入队
func EnqueueTask(task Task) error {
score := float64(task.NextExecuteTime.Unix())
member := task.TaskID
err := redisClient.ZAdd(ctx, "task_queue", &redis.Z{Score: score, Member: member}).Err()
if err != nil {
return err
}
// 同时将任务详情存入Hash,方便查询
err = redisClient.HSet(ctx, "task_details", task.TaskID, serialize(task)).Err()
return err
}
// 调度器取出到期任务
func DequeueTasks(ctx context.Context, batchSize int) ([]Task, error) {
now := float64(time.Now().Unix())
members, err := redisClient.ZRangeByScore(ctx, "task_queue", &redis.ZRangeBy{
Min: "0",
Max: strconv.FormatFloat(now, 'f', 0, 64),
Offset: 0,
Count: int64(batchSize),
}).Result()
if err != nil {
return nil, err
}
// 从ZSet中移除这些member(原子操作)
redisClient.ZRem(ctx, "task_queue", members)
// 从Hash中获取详情
tasks := []Task{}
for _, member := range members {
data, err := redisClient.HGet(ctx, "task_details", member).Result()
if err != nil {
continue
}
task := deserialize(data)
tasks = append(tasks, task)
}
return tasks, nil
}代码说明:
EnqueueTask 将任务加入延迟队列,score为执行时间戳。DequeueTasks 取出所有score小于当前时间的任务,并原子移除,避免重复消费。在模拟环境中,使用100个品牌、500个问题、3个平台(每个平台QPS限制20),运行24小时:
注意:以上数据基于模拟环境,实际生产环境可能因平台波动和网络状况有所不同。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。