{"id":48888,"date":"2026-01-08T21:59:16","date_gmt":"2026-01-08T13:59:16","guid":{"rendered":"https:\/\/www.geobok.com\/geo-toolkit\/ai-visibility-analyzer\/"},"modified":"2026-04-03T10:46:17","modified_gmt":"2026-04-03T02:46:17","slug":"ai-visibility-analyzer","status":"publish","type":"page","link":"https:\/\/www.geobok.com\/en\/geo-toolkit\/ai-visibility-analyzer\/","title":{"rendered":"AI Visibility Analyzer"},"content":{"rendered":"\n<style>\n\/* ===== \u672c\u5de5\u5177\u7279\u6709\u6837\u5f0f\uff1a\u6f0f\u6597\u6307\u6807\u3001Lighthouse\u3001\u5207\u7247\u5c55\u793a ===== *\/\n\n\/* Lighthouse \u73af\u5f62\u56fe *\/\n.lh-container { display: grid; grid-template-columns: repeat(4, 1fr); gap: 20px; padding: 0 var(--geo-space-xl); }\n.lh-card { background: #fff; border: 1px solid var(--geo-border); border-radius: 12px; padding: 20px 10px; text-align: center; box-shadow: var(--geo-shadow-sm); }\n.lh-ring { width: 90px; height: 90px; margin: 0 auto 8px; }\n.lh-label { font-size: 13px; color: var(--geo-text-muted); font-weight: 600; }\n\n\/* \u6f0f\u6597\u6307\u6807 *\/\n.funnel-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 16px; padding: 0 var(--geo-space-xl); }\n.funnel-step { background: #fff; border: 1px solid var(--geo-border); border-radius: 12px; padding: 16px 14px; text-align: center; box-shadow: var(--geo-shadow-sm); }\n.funnel-step.highlight { background: linear-gradient(180deg,#f0f9ff,#e0f2fe); border: 1px solid #7dd3fc; box-shadow: 0 4px 10px rgba(14,165,233,0.15); }\n.funnel-label { font-size: 12px; color: var(--geo-text-muted); margin-bottom: 4px; }\n.funnel-value { font-size: 24px; font-weight: 800; color: var(--geo-text-primary); }\n.funnel-unit { font-size: 11px; color: var(--geo-text-muted); margin-top: 4px; display: block; }\n\n\/* \u4e3b\u5185\u5bb9\u53cc\u680f *\/\n.rag-main-display { display: grid; grid-template-columns: 1fr 1fr; gap: 40px; margin-top: 20px; }\n.rag-screenshot { width: 100%; border-radius: 8px; border: 1px solid var(--geo-border-strong); box-shadow: var(--geo-shadow-sm); }\n\n\/* \u84dd\u8272\u6838\u5fc3\u5207\u7247 *\/\n.valid-box { background: #f8fbff; border: 1px solid #99f6e4; border-radius: 12px; padding: 20px; }\n.chunk-item { background: #fff; border: 1px solid var(--geo-border); border-left: 4px solid #3b82f6; padding: 15px; border-radius: 6px; margin-bottom: 12px; box-shadow: var(--geo-shadow-sm); }\n.chunk-text { font-size: 13px; line-height: 1.6; color: var(--geo-text-body); text-align: justify; }\n\n\/* \u7ea2\u8272\u6ea2\u51fa\u5207\u7247 *\/\n.invalid-box { background: #fff5f5; border: 1px solid var(--geo-danger-border); border-radius: 12px; padding: 20px; margin-top: 25px; }\n.noise-item { background: #fff; border: 1px solid var(--geo-danger-border); border-left: 4px solid #ef4444; padding: 15px; border-radius: 6px; margin-bottom: 12px; }\n.noise-text { font-size: 13px; line-height: 1.6; color: var(--geo-text-body); text-decoration: line-through; text-decoration-color: #ef4444; text-align: justify; }\n\n\/* \u5185\u5bb9\u533a padding *\/\n.rag-content-area { padding: 0 var(--geo-space-xl) var(--geo-space-xl); }\n\n@media (max-width: 1024px) { .rag-main-display { grid-template-columns: 1fr; } }\n@media (max-width: 850px) {\n    .rag-content-area, .lh-container, .funnel-row { padding-left: var(--geo-space-md); padding-right: var(--geo-space-md); }\n    .lh-container { grid-template-columns: repeat(2, 1fr); }\n}\n<\/style>\n\n<div class=\"geo-card\" id=\"rag-tool-wrapper\">\n    <div class=\"geo-hero\">\n        <h2 class=\"geo-hero__title\">\ud83e\udd16 AI Visibility Analysis<\/h2>\n        <p class=\"geo-hero__desc\">Simulate how LLMs ingest your content \u2014 reveal visibility gaps and blind spots.<\/p>\n    \n<div class=\"geo-about\">\n    <details class=\"geo-about__section\">\n        <summary>\ud83d\udcd6 What can this tool do?<\/summary>\n        <div class=\"geo-about__body\">\n            <p>AI doesn't read your page like a human \u2014 it strips the HTML, tokenizes the text, discards the noise, and chunks what's left into retrievable segments. This tool walks you through every step: fetch, measure token signal-to-noise ratio, simulate RAG chunking, and show how much AI can actually work with.<\/p>\n            <p class=\"geo-about__ref\">See <em>Make AI Speak for You: The Definitive Guide to GEO<\/em>, Ch. 2.2 &amp; Ch. 3.4<\/p>\n        <\/div>\n    <\/details>\n    <details class=\"geo-about__section\">\n        <summary>\u2753 FAQ: GEO Impact<\/summary>\n        <div class=\"geo-about__body\">\n            <div class=\"geo-faq-item\"><h4>What is token signal-to-noise ratio (SNR)?<\/h4><p>The share of tokens carrying actual content vs. total raw HTML tokens. An SNR of 35% means 65% of your page tokens are noise AI discards.<\/p><\/div>\n            <div class=\"geo-faq-item\"><h4>What's a good SNR?<\/h4><p>Above 50% is solid. 30-50% needs work. Below 30% signals a structure actively hurting AI visibility.<\/p><\/div>\n            <div class=\"geo-faq-item\"><h4>How do I improve it?<\/h4><p>Simplify HTML, remove inline styles, cut redundant scripts. Wrap core content in semantic tags like article or main.<\/p><\/div>\n            <div class=\"geo-faq-item\"><h4>Why does chunk count matter?<\/h4><p>AI retrieves individual chunks, not whole pages. Too many tiny chunks fragment your message; too few dilute relevance.<\/p><\/div>\n        <\/div>\n    <\/details>\n<\/div>\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What is token signal-to-noise ratio (SNR)?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"The share of tokens carrying actual content vs. total raw HTML tokens. An SNR of 35% means 65% of your page tokens are noise AI discards.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What's a good SNR?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Above 50% is solid. 30-50% needs work. Below 30% signals a structure actively hurting AI visibility.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How do I improve it?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Simplify HTML, remove inline styles, cut redundant scripts. Wrap core content in semantic tags like article or main.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Why does chunk count matter?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"AI retrieves individual chunks, not whole pages. Too many tiny chunks fragment your message; too few dilute relevance.\"\n      }\n    }\n  ]\n}\n<\/script>\n\n<\/div>\n\n    <div class=\"geo-action\">\n        <div class=\"geo-input-row\">\n            <input type=\"url\" id=\"rag-url\" class=\"geo-input\" placeholder=\"Enter a URL to evaluate AI comprehension\" >\n            <button id=\"rag-submit\" class=\"geo-btn\">Generate AI report<\/button>\n        <\/div>\n    <\/div>\n\n    <!-- \u8fdb\u5ea6\u6761 -->\n    <div class=\"geo-progress\" id=\"rag-progress\">\n        <div class=\"geo-progress__track\"><div id=\"rag-pbar\" class=\"geo-progress__bar\"><\/div><\/div>\n        <div id=\"rag-ptext\" class=\"geo-progress__text\">\u521d\u59cb\u5316 GEO \u8bca\u65ad\u5f15\u64ce...<\/div>\n    <\/div>\n\n    <!-- Lighthouse -->\n    <div id=\"lh-section\" style=\"display:none;\">\n        <div class=\"geo-section\" style=\"margin:0 var(--geo-space-xl);\"><h3 class=\"geo-section__title\">\u26a1 GEO \u5e95\u5c42\u57fa\u5efa\u8bc4\u4f30<\/h3><span class=\"geo-section__desc\">\u8bc4\u4f30\u7ad9\u70b9\u662f\u5426\u6ee1\u8db3 AI \u722c\u866b\u7684\u6293\u53d6\u4e0e\u89e3\u6790\u6807\u51c6<\/span><\/div>\n        <div id=\"lh-results\" class=\"lh-container\" style=\"margin-top:16px;\"><\/div>\n    <\/div>\n\n    <!-- \u6f0f\u6597\u6307\u6807 -->\n    <div id=\"rag-metrics\" style=\"display:none;\">\n        <div class=\"geo-section\" style=\"margin:20px var(--geo-space-xl) 0;\"><h3 class=\"geo-section__title\">\ud83e\udde0 AI \u77e5\u8bc6\u8f6c\u5316\u6f0f\u6597<\/h3><span class=\"geo-section__desc\">\u900f\u89c6\u7f51\u9875\u5185\u5bb9\u8f6c\u5316\u4e3a\u5927\u6a21\u578b\u8bb0\u5fc6\u7684\u635f\u8017\u8def\u5f84<\/span><\/div>\n        <div class=\"funnel-row\" style=\"margin-top:16px;\">\n            <div class=\"funnel-step\"><div class=\"funnel-label\">\u539f\u59cb Token \u6d88\u8017<\/div><div class=\"funnel-value\" id=\"val-raw\">0<\/div><div class=\"funnel-unit\">Tokens<\/div><\/div>\n            <div class=\"funnel-step highlight\"><div class=\"funnel-label\">\u6709\u6548\u4fe1\u606f\u5bc6\u5ea6<\/div><div class=\"funnel-value\" id=\"val-snr\">0%<\/div><div class=\"funnel-unit\">AI \u4fe1\u53f7\u5f3a\u5ea6 (SNR)<\/div><\/div>\n            <div class=\"funnel-step\"><div class=\"funnel-label\">AI \u53ef\u8bfb\u51c0\u8377<\/div><div class=\"funnel-value\" id=\"val-clean\">0<\/div><div class=\"funnel-unit\">Tokens<\/div><\/div>\n            <div class=\"funnel-step\"><div class=\"funnel-label\">\u7a97\u53e3\u6ea2\u51fa\u4e22\u5931<\/div><div class=\"funnel-value\" id=\"val-lost\">0%<\/div><div class=\"funnel-unit\">\u8d85\u957f\u622a\u65ad\u98ce\u9669<\/div><\/div>\n            <div class=\"funnel-step\"><div class=\"funnel-label\">\u77e5\u8bc6\u5207\u7247\u6570\u91cf<\/div><div class=\"funnel-value\" id=\"val-chunks\">0<\/div><div class=\"funnel-unit\">Chunks<\/div><\/div>\n            <div class=\"funnel-step\"><div class=\"funnel-label\">\u8bed\u4e49\u5207\u7247\u7c92\u5ea6<\/div><div class=\"funnel-value\" id=\"val-density\">0<\/div><div class=\"funnel-unit\">Tokens \/ Chunk<\/div><\/div>\n        <\/div>\n    <\/div>\n\n    <!-- \u4e3b\u5185\u5bb9\u53cc\u680f -->\n    <div class=\"rag-content-area\">\n        <div class=\"rag-main-display\" id=\"rag-result-area\" style=\"display:none;\">\n            <div>\n                <div class=\"geo-section\" style=\"margin-top:0;\"><h3 class=\"geo-section__title\">\ud83d\udc41\ufe0f \u4eba\u7c7b\u89c6\u89d2<\/h3><span class=\"geo-section__desc\">\u7528\u6237\u53ef\u89c1\u7684\u9875\u9762\u7ed3\u6784<\/span><\/div>\n                <img id=\"rag-screenshot\" class=\"rag-screenshot\" alt=\"\u9875\u9762\u622a\u56fe\">\n            <\/div>\n            <div>\n                <div class=\"geo-section\" style=\"margin-top:0;\"><h3 class=\"geo-section__title\">\ud83e\udd16 AI \u591a\u6a21\u6001\u611f\u77e5<\/h3><span class=\"geo-section__desc\">\u5927\u6a21\u578b\u63d0\u53d6\u7684\u8bed\u4e49\u903b\u8f91\u4e0e\u622a\u65ad\u7ed3\u679c<\/span><\/div>\n                <div class=\"valid-box\">\n                    <div style=\"font-size:14px;font-weight:700;color:#1e40af;margin-bottom:12px;\">\ud83e\udd16 \u8bed\u4e49\u63d0\u53d6 \u2014 AI \u5b9e\u9645\u6355\u83b7\u7684\u6838\u5fc3\u77e5\u8bc6<\/div>\n                    <div id=\"valid-list\"><\/div>\n                <\/div>\n                <div class=\"invalid-box\">\n                    <div style=\"font-size:14px;font-weight:700;color:#b91c1c;margin-bottom:12px;\">\u26a0\ufe0f \u6ea2\u51fa\u622a\u65ad \u2014 \u88ab AI \u5f3a\u5236\u4e22\u5f03\u7684\u5185\u5bb9<\/div>\n                    <div id=\"invalid-list\"><\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n<script>\ndocument.addEventListener('DOMContentLoaded', function(){\n    var STATUS = [GeoAPI.t('rag.s1'),GeoAPI.t('rag.s2'),GeoAPI.t('rag.s3'),GeoAPI.t('rag.s4'),GeoAPI.t('rag.s5')];\n\n    function getCircleHtml(score, label){\n        var r=40, c=2*Math.PI*r, o=c*(1-(score\/100));\n        var col = score>=90?'#10b981':score>=50?'#f59e0b':'#ef4444';\n        return '<div class=\"lh-card\"><svg class=\"lh-ring\" viewBox=\"0 0 100 100\"><circle cx=\"50\" cy=\"50\" r=\"'+r+'\" fill=\"none\" stroke=\"#e2e8f0\" stroke-width=\"8\"\/><circle cx=\"50\" cy=\"50\" r=\"'+r+'\" fill=\"none\" stroke=\"'+col+'\" stroke-width=\"8\" stroke-dasharray=\"'+c+'\" stroke-dashoffset=\"'+o+'\" stroke-linecap=\"round\" transform=\"rotate(-90 50 50)\"\/><text x=\"50\" y=\"58\" text-anchor=\"middle\" font-size=\"22\" font-weight=\"800\" fill=\"#334155\">'+parseInt(score)+'<\/text><\/svg><div class=\"lh-label\">'+GeoAPI.escapeHtml(label)+'<\/div><\/div>';\n    }\n\n    var submitBtn = document.getElementById('rag-submit');\n    var progress = GeoAPI.initProgress(document.getElementById('rag-pbar'), document.getElementById('rag-ptext'));\n\n    submitBtn.onclick = async function(){\n        var url = document.getElementById('rag-url').value.trim();\n        if(!url.startsWith('http')){ alert('\u8bf7\u8f93\u5165\u5b8c\u6574\u7684 https:\/\/ \u5730\u5740'); return; }\n\n        GeoAPI.disableBtn(submitBtn, GeoAPI.t('rag.btn.loading'));\n        document.getElementById('lh-section').style.display='none';\n        document.getElementById('rag-metrics').style.display='none';\n        document.getElementById('rag-result-area').style.display='none';\n        progress.show(); progress.update(0,'\u521d\u59cb\u5316...');\n\n        var p=0;\n        var timer = setInterval(function(){ p=Math.min(p+1,95); progress.update(p, STATUS[Math.floor(p\/20)]||'\u6a21\u578b\u8ba1\u7b97\u4e2d...'); },150);\n\n        try {\n            var d = await GeoAPI.post('\/geo\/analyze',{url:url},{timeout:120000});\n            clearInterval(timer); progress.hide();\n            document.getElementById('rag-tool-wrapper').classList.add('geo-card--expanded');\n\n            \/\/ Lighthouse\n            document.getElementById('lh-section').style.display='block';\n            document.getElementById('lh-results').innerHTML = getCircleHtml(d.lighthouse.performance,'\u54cd\u5e94\u65f6\u6548')+getCircleHtml(d.lighthouse.accessibility,'\u8bed\u4e49\u89c4\u8303')+getCircleHtml(d.lighthouse.best_practices,'\u5408\u89c4\u4fe1\u8a89')+getCircleHtml(d.lighthouse.seo,'\u7d22\u5f15\u53d1\u73b0');\n\n            \/\/ \u6307\u6807\n            document.getElementById('val-raw').innerText = GeoAPI.formatNumber(d.raw_tokens);\n            document.getElementById('val-snr').innerText = GeoAPI.formatPercent(d.snr);\n            document.getElementById('val-clean').innerText = GeoAPI.formatNumber(d.clean_tokens);\n            document.getElementById('val-lost').innerText = GeoAPI.formatPercent(d.lost_ratio);\n            document.getElementById('val-chunks').innerText = d.total_chunks_count||0;\n            document.getElementById('val-density').innerText = d.total_chunks_count ? Math.round(d.clean_tokens\/d.total_chunks_count) : 0;\n            document.getElementById('rag-metrics').style.display='block';\n            document.getElementById('rag-result-area').style.display='grid';\n\n            if(d.screenshot_base64) document.getElementById('rag-screenshot').src='data:image\/jpeg;base64,'+d.screenshot_base64;\n\n            \/\/ \u84dd\u8272\u6838\u5fc3\u5207\u7247\n            var vList = document.getElementById('valid-list'); vList.innerHTML='';\n            (d.chunks||[]).forEach(function(c,i){\n                var div=document.createElement('div'); div.className='chunk-item';\n                div.innerHTML='<strong style=\"font-size:11px;color:#3b82f6;display:block;border-bottom:1px dashed #eee;margin-bottom:5px;\">TOP-K CHUNK #'+(i+1)+'<\/strong><div class=\"chunk-text\">'+GeoAPI.escapeHtml(c)+'<\/div>';\n                vList.appendChild(div);\n            });\n\n            \/\/ \u7ea2\u8272\u6ea2\u51fa\u5207\u7247\n            var iList = document.getElementById('invalid-list'); iList.innerHTML='';\n            var overflow = d.overflow_chunks||[], overflowTotal = d.overflow_count||0;\n            if(overflowTotal===0){\n                iList.innerHTML='<div style=\"color:var(--geo-text-faint);font-size:13px;text-align:center;padding:15px;border:1px dashed var(--geo-border);border-radius:6px;\">\u2728 \u5168\u6587\u5185\u5bb9\u5747\u5728 Top-5 \u6838\u5fc3\u7d22\u5f15\u533a\uff0c\u65e0\u6c89\u6ca1\u98ce\u9669<\/div>';\n            } else {\n                overflow.forEach(function(c,i){\n                    var div=document.createElement('div'); div.className='noise-item';\n                    div.innerHTML='<strong style=\"font-size:11px;color:#ef4444;display:block;border-bottom:1px dashed #fecaca;margin-bottom:5px;\">SUNK CHUNK #'+(5+i+1)+'<\/strong><div class=\"noise-text\">'+GeoAPI.escapeHtml(c)+'<\/div>';\n                    iList.appendChild(div);\n                });\n                if(overflowTotal > overflow.length){\n                    var more=document.createElement('div');\n                    more.style.cssText='text-align:center;color:#ef4444;font-size:12px;margin-top:10px;padding:10px;background:#fff5f5;border-radius:6px;';\n                    more.innerText='... \u8fd8\u6709 '+(overflowTotal-overflow.length)+' \u4e2a\u6c89\u6ca1\u5207\u7247\u672a\u663e\u793a ...';\n                    iList.appendChild(more);\n                }\n            }\n        } catch(e){\n            clearInterval(timer); progress.hide();\n            if (!e._geoAuthHandled) alert('\u8bca\u65ad\u5931\u8d25: '+e.message);\n        } finally { GeoAPI.enableBtn(submitBtn,'\u751f\u6210 AI \u611f\u77e5\u62a5\u544a'); }\n    };\n});\n<\/script>\n\n\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":48884,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-48888","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/pages\/48888","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/comments?post=48888"}],"version-history":[{"count":0,"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/pages\/48888\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/pages\/48884"}],"wp:attachment":[{"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/media?parent=48888"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}