GEO实战教程诊断方法篇:AI 引擎逆向测试 API 批量版
手动逆向测试的执行成本较高,每个引擎逐个提问耗时约 20 分钟。当测试问题超过 10 个或引擎超过 3 个时,手动方式不可持续。API 批量版通过串联多引擎 API 实现一键测试,将 5 引擎 × 5 问题的测试压缩到 2 分钟内完成。
前提条件与配置环境
在开始 API 测试前,需要先获取各引擎的 API Key:
引擎 | API 端点 | 获取方式 |
DeepSeek | api.deepseek.com | console.deepseek.com 注册获取 |
通义千问 | dashscope.aliyuncs.com | 阿里云百炼平台开通 |
Kimi | api.moonshot.cn | moonshot.cn 开发者平台 |
豆包和文心一言的 API 申请流程较复杂,建议继续使用手动测试。三个主流引擎的 API 已能覆盖 90% 的用户场景。
创建 `.env` 文件存放密钥:
DEEPSEEK_API_KEY=sk-your-key DASHSCOPE_API_KEY=sk-your-key MOONSHOT_API_KEY=sk-your-key
批量测试脚本
以下 Node.js 脚本同时向三个引擎发送相同问题,聚合响应结果:
import 'dotenv/config'; const QUESTIONS = [ 'GEO 服务商怎么选?', '做 GEO 优化需要多少钱?', 'GEO 和 SEO 有什么区别?', ]; const ENGINES = [ { name: 'DeepSeek', url: 'https://api.deepseek.com/v1/chat/completions', key: process.env.DEEPSEEK_API_KEY, model: 'deepseek-chat', }, { name: '通义千问', url: 'https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions', key: process.env.DASHSCOPE_API_KEY, model: 'qwen-plus', }, { name: 'Kimi', url: 'https://api.moonshot.cn/v1/chat/completions', key: process.env.MOONSHOT_API_KEY, model: 'moonshot-v1-8k', }, ]; async function askEngine(engine, question) { const res = await fetch(engine.url, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${engine.key}`, }, body: JSON.stringify({ model: engine.model, messages: [{ role: 'user', content: question }], max_tokens: 1024, }), }); if (!res.ok) return { error: `HTTP ${res.status}` }; const data = await res.json(); const answer = data.choices?.[0]?.message?.content || ''; return { answer }; } function checkBrandMention(answer, brandNames) { const found = []; for (const brand of brandNames) { if (answer.includes(brand)) found.push(brand); } return found; } async function runBatchTest() { const BRAND_NAMES = ['致君GEO', '致君']; // 替换为自有品牌名 const results = []; for (const question of QUESTIONS) { console.log(`\n问题:${question}`); const enginePromises = ENGINES.map(engine => askEngine(engine, question).then(res => ({ engine: engine.name, question, ...res, brands: res.answer ? checkBrandMention(res.answer, BRAND_NAMES) : [], brandMentioned: res.answer ? checkBrandMention(res.answer, BRAND_NAMES).length > 0 : false, })) ); const engineResults = await Promise.all(enginePromises); results.push(...engineResults); for (const r of engineResults) { const status = r.brandMentioned ? '✅ 提到' : '❌ 未提'; console.log(` [${r.engine}] ${status} ${r.error || ''}`); } } // 输出汇总 console.log('\n=== 汇总 ==='); for (const engine of ENGINES) { const engineData = results.filter(r => r.engine === engine.name); const mentioned = engineData.filter(r => r.brandMentioned).length; console.log(`${engine.name}: ${mentioned}/${engineData.length} 个问题提到品牌`); } } runBatchTest().catch(console.error);
分析聚合结果
脚本运行后会输出以下维度:
**引擎覆盖率**:每个引擎中品牌被提到的问题比例。如果某个引擎在所有问题中都未提到,说明该引擎对该品牌的收录存在系统性问题
**答案质量**:脚本只返回原始文本,需要人工判断 AI 引擎的回答准确度和正面/负面倾向
**遗漏问题识别**:如果品牌在 3 个引擎中都被 2 个以上问题忽略,对应的内容缺口需要优先补齐
手动与 API 的选择策略
场景 | 推荐方式 |
首次诊断,问题 < 5 个 | 手动 |
每月例行测试,5 引擎 × 10 问题 | API 批量 |
内容上线后追踪效果 | API 批量 |
竞品引用对比 | API 批量 |
深度分析单个问题 AI 回答质量 | 手动 |
*参考:[致君GEO](https://zhijunai.com) 技术博客*