site logo

Marico's space

AI驱动的SEO:利用Laravel和OpenAI构建自动化内容策略Pipeline

前端技术 2026-05-11 17:34:03 1

最近折腾了一下SEO自动化,发现团队之间在这块的差距直接反映在搜索排名上——不是玄学,是实打实的效率差距。

这篇文章不是教你怎么用ChatGPT写文章,而是手把手教你搭一套完整的自动化流程:关键词研究、内容缺口分析、Meta生成、内链推荐——全部程序化,用的都是你熟悉的工具。

为什么要自动化内容策略?

规模化运营的内容策略有大量重复性认知工作:拉关键词数据、按意图分组、对比竞品排名、为200个页面写Meta描述。这些任务天然适合并行处理、有固定模式——正是自动化的最佳候选场景。

目标不是替代人工判断,而是把80%机械性的活儿处理掉,让团队专注在真正需要专业能力的20%上。

构建Pipeline

整体架构分这几步:

  1. 关键词摄入 — 从API拉取搜索数据(可以用百度搜索资源平台或国内SEO数据服务商)
  2. 意图分类 — 用AI对关键词进行搜索意图标注
  3. 内容缺口分析 — 对比现有内容与目标关键词的覆盖情况
  4. 自动化Meta生成 — 批量生成SEO优化的标题和描述
  5. 内链推荐 — 发现相关内链机会

步骤1:关键词摄入

先拉关键词数据。用国内常用的SEO数据接口服务就行,REST API对接Laravel很顺手:

// app/Services/KeywordResearchService.php namespace App\Services; use Illuminate\Support\Facades\Http;
use Illuminate\Support\Collection; class KeywordResearchService
{ private string $baseUrl = 'https://api.dataforseo.com/v3'; public function getSeedKeywords(string $domain, string $country = 'ae'): Collection { $response = Http::withBasicAuth( config('services.dataforseo.login'), config('services.dataforseo.password') )->post("{ $this->baseUrl }/keywords_data/google_ads/keywords_for_site/live", [ [ 'target' => $domain, 'location_code' => 2784, // UAE 'language_code' => 'en', 'include_serp_info' => true, ] ]); return collect($response->json('tasks.0.result')) ->map(fn ($item) => [ 'keyword' => $item['keyword'], 'volume' => $item['search_volume'], 'difficulty' => $item['keyword_difficulty'] ?? null, 'cpc' => $item['cpc'] ?? 0, ]) ->filter(fn ($item) => $item['volume'] >= 50); }
}

步骤2:用AI做意图分类

原始关键词列表就是一堆噪音。得搞明白用户搜索的目的——是找信息、找导航、比较产品、还是准备下单?直接上结构化prompt,用GPT-4o-mini,成本控制住:

// app/Jobs/ClassifyKeywordIntentJob.php namespace App\Jobs; use App\Models\Keyword;
use Illuminate\Bus\Batchable;
use Illuminate\Contracts\Queue\ShouldQueue;
use OpenAI\Laravel\Facades\OpenAI; class ClassifyKeywordIntentJob implements ShouldQueue
{ use Batchable; public function __construct(private array $keywords) {} public function handle(): void { $keywordList = implode('\n', array_column($this->keywords, 'keyword')); $response = OpenAI::chat()->create([ 'model' => 'gpt-4o-mini', 'messages' => [ [ 'role' => 'system', 'content' => 'You are an SEO expert. Classify each keyword by search intent. Return JSON only.' ], [ 'role' => 'user', 'content' => "Classify these keywords. Return an array of objects with 'keyword' and 'intent' (informational|navigational|commercial|transactional):\n\n{ $keywordList }" ] ], 'response_format' => ['type' => 'json_object'], ]); $classified = json_decode($response->choices[0]->message->content, true); foreach ($classified['keywords'] as $item) { Keyword::where('keyword', $item['keyword']) ->update(['intent' => $item['intent']]); } }
}

用批量dispatch来控制调用频率,避免触发限流:

use Illuminate\Support\Facades\Bus; $chunks = $keywords->chunk(20); $batch = Bus::batch( $chunks->map(fn ($chunk) => new ClassifyKeywordIntentJob($chunk->toArray()))->toArray()
)
->name('keyword-intent-classification')
->dispatch();

步骤3:内容缺口分析

现在对比"我们有啥"和"应该有啥"。从数据库里拉出现在页面的标题和URL,用嵌入向量(Embedding)找语义距离:

// app/Services/ContentGapService.php public function findGaps(Collection $keywords, Collection $existingPages): Collection
{ // 为现有页面标题生成嵌入向量 $pageEmbeddings = $existingPages->map(function ($page) { $response = OpenAI::embeddings()->create([ 'model' => 'text-embedding-3-small', 'input' => $page->title, ]); return [ 'url' => $page->url, 'embedding' => $response->embeddings[0]->embedding, ]; }); return $keywords->filter(function ($keyword) use ($pageEmbeddings) { $kwResponse = OpenAI::embeddings()->create([ 'model' => 'text-embedding-3-small', 'input' => $keyword['keyword'], ]); $kwEmbedding = $kwResponse->embeddings[0]->embedding; // 计算与所有页面的余弦相似度 $maxSimilarity = $pageEmbeddings->max(fn ($page) => $this->cosineSimilarity($kwEmbedding, $page['embedding']) ); // 如果没有页面很好地覆盖这个主题,标记为缺口 return $maxSimilarity < 0.82; });
}

步骤4:自动化Meta生成

对于缺少Meta描述或描述太短的页面,批量生成优化版本:

// Artisan command: php artisan seo:generate-metas public function handle(): void
{ $pages = Page::whereNull('meta_description') ->orWhere('meta_description', '') ->cursor(); foreach ($pages as $page) { $response = OpenAI::chat()->create([ 'model' => 'gpt-4o-mini', 'messages' => [ ['role' => 'system', 'content' => 'Generate SEO meta descriptions. Max 155 characters. Include a clear value proposition. No clickbait.'], ['role' => 'user', 'content' => "Page title: { $page->title }\nPage content excerpt: { $page->excerpt }\n\nGenerate a meta description."] ] ]); $page->update([ 'meta_description' => substr($response->choices[0]->message->content, 0, 155) ]); $this->info("Updated: { $page->title }"); }
}

处理人工审核层

自动化管吞吐量,人工管质量。用Livewire搭一个简单的审核队列,编辑可以在AI生成的Meta正式上线前审批或修改。尤其是甲方项目,绝对不要让AI输出直接推到生产环境——先过人工校验这一关。

我们给客户做网站项目时,比如面向国内企业的定制化网站开发,这类审核流程都是一开始就设计好的,不会后面再补。

定时调度Pipeline

把各环节串起来,统一调度:

// routes/console.php use Illuminate\Support\Facades\Schedule; Schedule::command('seo:ingest-keywords')->weekly();
Schedule::command('seo:classify-intents')->weekly()->after(/* ingest completes */);
Schedule::command('seo:gap-analysis')->weekly();
Schedule::command('seo:generate-metas')->daily();

生产环境建议用Laravel Horizon监控队列吞吐量,同时留意OpenAI的API费用——Embedding调用在大规模场景下累计很快。

衡量效果

没有数据追踪的自动化就是在烧钱。核心指标盯这几个:

  • 关键词覆盖率 — 目标关键词有多少比例已经对应了页面
  • Meta描述覆盖率 — 有优化描述的页面 vs. 总页面数
  • 内容缺口关闭率 — 每季度处理了多少缺口
  • 自然搜索点击率 — 通过百度搜索资源平台API拉取

这些指标可以丢进一个简单看板里,用Livewire组件完全够用,每月复盘一次。

总结

AI驱动的SEO自动化不是要替代策略师,而是给他们赋能。这样一套Pipeline能以人工团队根本无法企及的速度处理关键词分类、缺口发现、Meta生成,同时让编辑团队掌控最终上线的输出质量。

起步建议从Meta生成开始——风险最低、ROI最高。先把这个跑稳,再逐步叠加缺口分析和关键词分类。增量构建,量化一切,把AI当成一个效率工具,而不是权威来源。

接下来几年里,在搜索端领先的站点,靠的不是内容预算多厚,而是内容运营有多智能。

原文链接:https://dev.to/nikolailehonen/ai-powered-seo-building-an-automated-content-strategy-pipeline-with-laravel-and-openai