GEO效果度量体系构建:可见性指数、引用率追踪与转化归因技术实现
GEO(Generative Engine Optimization)的效果度量与传统SEO有本质区别:搜索引擎返回的是链接列表,而生成式AI引擎返回的是合成答案,用户未必会点击任何外部链接。因此,我们需要一套全新的度量体系来量化内容在AI搜索中的真实表现。本文将从可见性指数、引用率追踪、转化归因三个维度,给出可落地的技术实现方案。
一、GEO可见性指数(Visibility Index)计算模型

可见性指数是衡量品牌/内容在AI生成答案中"曝光程度"的综合指标。我们定义以下计算模型:当用户查询与目标关键词相关的query时,AI引擎生成答案中是否提及品牌名、是否引用我们的内容片段、以及提及的位置(开头/中间/结尾)和频次。基于这些信号,可以构建一个加权评分体系。
以下是可见性指数计算的核心Python实现:
import re
from dataclasses import dataclass, field
from typing import List
from datetime import datetime
@dataclass
class CitationSignal:
"""单次AI搜索结果中的引用信号"""
query: str
brand_mentioned: bool
mention_count: int
mention_position: str # "top", "middle", "bottom"
content_cited: bool # 是否引用了我们的内容片段
citation_url: str = ""
timestamp: str = field(default_factory=lambda: datetime.now().isoformat())
@dataclass
class VisibilityScore:
keyword: str
total_queries: int
visibility_index: float
raw_signals: List[CitationSignal] = field(default_factory=list)
def compute_visibility_index(signals: List[CitationSignal], keyword: str) -> VisibilityScore:
"""
可见性指数计算公式:
VI = (提及率 * 0.3 + 引用率 * 0.4 + 位置加权分 * 0.3) * 100
其中位置加权分:top=1.0, middle=0.6, bottom=0.3
"""
if not signals:
return VisibilityScore(keyword=keyword, total_queries=0, visibility_index=0.0)
total = len(signals)
mentioned = [s for s in signals if s.brand_mentioned]
cited = [s for s in signals if s.content_cited]
mention_rate = len(mentioned) / total
citation_rate = len(cited) / total
position_weights = {"top": 1.0, "middle": 0.6, "bottom": 0.3}
position_scores = []
for s in mentioned:
weight = position_weights.get(s.mention_position, 0.3)
# 多次提及额外加权,上限3次
count_bonus = min(s.mention_count, 3) / 3 * 0.2
position_scores.append(weight + count_bonus)
avg_position = sum(position_scores) / len(position_scores) if position_scores else 0.0
vi = (mention_rate * 0.3 + citation_rate * 0.4 + avg_position * 0.3) * 100
vi = round(min(vi, 100.0), 2)
return VisibilityScore(
keyword=keyword,
total_queries=total,
visibility_index=vi,
raw_signals=signals
)
# 使用示例
signals = [
CitationSignal("泉州小程序开发公司推荐", True, 2, "top", True, "https://example.com/post/1"),
CitationSignal("泉州软件开发哪家好", True, 1, "middle", False),
CitationSignal("公众号开发流程", False, 0, "", False),
CitationSignal("泉州网络推广方案", True, 3, "top", True, "https://example.com/post/2"),
]
score = compute_visibility_index(signals, "泉州软件开发")
print(f"关键词: {score.keyword}")
print(f"总查询数: {score.total_queries}")
print(f"可见性指数: {score.visibility_index}")
# 输出: 可见性指数: 73.67
二、AI引用率追踪埋点方案
引用率追踪的核心难点在于:AI引擎的答案是在其自有界面中渲染的,我们无法直接在对方页面埋点。可行的方案是通过API层代理调用来采集AI搜索结果。具体做法是封装一个统一的AI搜索查询层,定期以目标关键词集向DeepSeek、OpenAI、Claude等模型发起查询,解析返回结果中的引用URL和品牌提及情况。
以下是引用率追踪的API查询与解析模块:
import asyncio
import httpx
import json
import re
from urllib.parse import urlparse
from typing import List, Dict
class AICitationTracker:
"""AI搜索引擎引用率追踪器"""
def __init__(self, api_keys: Dict[str, str], target_domains: List[str], brand_names: List[str]):
self.api_keys = api_keys
self.target_domains = set(target_domains)
self.brand_names = brand_names
self.results: List[Dict] = []
async def query_deepseek(self, client: httpx.AsyncClient, keyword: str) -> Dict:
"""调用DeepSeek API查询并解析引用"""
headers = {
"Authorization": f"Bearer {self.api_keys['deepseek']}",
"Content-Type": "application/json"
}
payload = {
"model": "deepseek-chat",
"messages": [
{"role": "system", "content": "你是一个搜索助手,请基于你的知识回答用户问题。"},
{"role": "user", "content": f"请推荐:{keyword}"}
],
"temperature": 0.3
}
resp = await client.post(
"https://api.deepseek.com/v1/chat/completions",
headers=headers, json=payload, timeout=30
)
data = resp.json()
answer = data["choices"][0]["message"]["content"]
# 提取引用URL
urls = re.findall(r'https?://[^\s\)\]]+', answer)
cited_domains = set()
for url in urls:
domain = urlparse(url).netloc
if domain in self.target_domains:
cited_domains.add(domain)
# 检测品牌提及
brand_hits = [b for b in self.brand_names if b in answer]
return {
"engine": "deepseek",
"keyword": keyword,
"answer_length": len(answer),
"cited_domains": list(cited_domains),
"brand_mentions": brand_hits,
"mention_count": sum(answer.count(b) for b in self.brand_names),
"raw_answer": answer[:500]
}
async def batch_track(self, keywords: List[str]) -> List[Dict]:
"""批量追踪多个关键词的引用情况"""
async with httpx.AsyncClient() as client:
tasks = [self.query_deepseek(client, kw) for kw in keywords]
results = await asyncio.gather(*tasks, return_exceptions=True)
for r in results:
if isinstance(r, Exception):
print(f"查询失败: {r}")
continue
self.results.append(r)
return self.results
# 使用示例
tracker = AICitationTracker(
api_keys={"deepseek": "sk-your-api-key"},
target_domains=["example.com", "blog.example.com"],
brand_names=["某某科技", "ExampleTech"]
)
# async run
async def main():
keywords = ["泉州小程序开发", "泉州公众号开发公司", "网络推广方案"]
results = await tracker.batch_track(keywords)
for r in results:
print(f"[{r['engine']}] {r['keyword']} -> 引用:{r['cited_domains']}, 提及:{r['brand_mentions']}")
asyncio.run(main())
三、多触点转化归因模型

在GEO场景中,用户的转化路径通常是:AI搜索看到品牌提及 → 点击引用链接访问网站 → 浏览内容 → 填写表单/联系客服。这涉及多个触点,需要用多触点归因模型来合理分配转化贡献。我们采用基于位置的位置加权归因(Position-based)与数据驱动归因(DDA)相结合的方式。
以下是转化归因分析的SQL实现,基于ClickHouse存储的触点事件表:
-- GEO多触点转化归因分析 (ClickHouse SQL)
-- 表结构: geo_touchpoints(session_id, touchpoint_type, touchpoint_source,
-- brand_keyword, event_time, user_id, converted)
-- 1. 构建用户转化路径
WITH conversion_paths AS (
SELECT
session_id,
user_id,
groupArray(touchpoint_type) AS touchpoint_sequence,
groupArray(touchpoint_source) AS source_sequence,
groupArray(brand_keyword) AS keyword_sequence,
count() AS touchpoint_count,
maxIf(converted, converted = 1) AS is_converted,
min(event_time) AS first_touch,
max(event_time) AS last_touch,
dateDiff('minute', min(event_time), max(event_time)) AS path_duration_min
FROM geo_touchpoints
WHERE event_time >= '2026-07-01'
AND event_time < '2026-08-01'
GROUP BY session_id, user_id
HAVING touchpoint_count >= 1
),
-- 2. 位置加权归因 (首尾各40%,中间20%)
position_based_attribution AS (
SELECT
session_id,
arrayElement(source_sequence, 1) AS first_source,
arrayElement(source_sequence, touchpoint_count) AS last_source,
source_sequence,
touchpoint_count,
is_converted,
CASE
WHEN touchpoint_count = 1 THEN 1.0
WHEN touchpoint_count = 2 THEN 0.5
ELSE 0.4 -- 首尾各40%,中间平分20%
END AS first_last_weight,
CASE
WHEN touchpoint_count <= 2 THEN 0.0
ELSE 0.2 / (touchpoint_count - 2)
END AS middle_weight
FROM conversion_paths
WHERE is_converted = 1
)
-- 3. 按AI引擎来源汇总归因转化贡献
SELECT
src AS ai_source,
count() AS attributed_conversions,
round(sum(contribution), 2) AS total_contribution,
round(avg(contribution), 4) AS avg_contribution,
round(count() * 100.0 / sum(count()) OVER (), 1) AS share_pct
FROM (
SELECT
first_source AS src,
first_last_weight AS contribution
FROM position_based_attribution
UNION ALL
SELECT
last_source AS src,
first_last_weight AS contribution
FROM position_based_attribution
UNION ALL
-- 中间触点归因 (需展开数组,此处简化为展开逻辑)
SELECT
arrayJoin(arraySlice(source_sequence, 2, touchpoint_count - 2)) AS src,
middle_weight AS contribution
FROM position_based_attribution
WHERE touchpoint_count > 2
) all_touches
GROUP BY src
ORDER BY total_contribution DESC;
四、度量数据可视化与告警
度量体系的最后一环是可视化与告警。我们推荐使用Grafana+Prometheus组合,将可见性指数、引用率、转化归因数据通过自定义Exporter暴露为Prometheus指标,然后在Grafana中构建GEO效果监控大盘。关键告警规则包括:可见性指数连续3天下降超过15%、引用率低于历史均值20%、新关键词引用率为零等。通过这套度量体系,技术团队能够用数据驱动GEO策略迭代,而非依赖主观判断。