Local Ollamaを使用してSEOメタタイトルとメタディスクリプションを自動生成する方法

公開準備が整った製品ページ、ドキュメントページ、ブログページが300ページもあるのに、メタデータ欄がまだ空白のまま。タイトルやメタディスクリプションを一つ一つ手作業で作成するのは時間がかかり、サイト全体に同じパターンをコピーすると同じような結果しか得られず、ローカル言語モデルに「SEOタイトル」を依頼すると、余分なコメントやでっち上げの主張、あるいは一貫性のないフォーマットが返ってくることも少なくありません。

より良いアプローチは、メタデータ生成を小規模なデータパイプラインとして扱うことです。モデルにはページ固有の証拠のみを与え、構造化された出力を要求し、コードで検証し、公開前に例外を確認します。Ollamaはhttp://localhost:11434/api、インストール後にローカルAPIが利用可能で、JSONスキーマ構造化出力をサポートしているため、このワークフローに最適です。ここで参照されているOllamaとGoogle検索のドキュメントは、2026年9月13日に確認されました。

自動SEOメタデータが誤作動する理由

ほとんどの失敗は、単一の「不適切なプロンプト」ではなく、モデルを取り巻くワークフローに起因します。一般的な原因としては、ページコンテンツの入力量が少なすぎる、モデルに自由形式の文章で回答させてしまう、すべてのURLに同じキーワード式を適用する、サイトレベルでの重複チェックを行わずに出力を公開する、などが挙げられます。

文字数制限に関する誤解も根強く残っています。Googleによると、ページの<title>要素やメタディスクリプションに固定の長さ制限はなく、タイトルリンクやスニペットは必要に応じて切り詰められ、通常はデバイスの画面幅に応じて調整されます。また、Googleのシステムが別の表現の方がより有用だと判断した場合、ページコンテンツから別のタイトルリンクやスニペットを生成することもあります。タイトルリンク、スニペット、メタディスクリプションに関するGoogleの公式ガイダンスをご覧ください。

つまり、スクリプトは一貫性を保つために編集上の文字数制限を設けることはできますが、それらの文字数をGoogleの要件として明示すべきではありません。以下の例では、タイトルの65文字と説明文の165文字はあくまで内部的な制限です。CMS、ブランド、ローカライズのニーズ、審査プロセスに合わせて変更してください。

ステップ1:Ollamaをインストールし、ローカルAPIが動作することを確認します。

Ollamaの公式クイックスタートガイドには、macOS、Windows、Linuxのサポートが記載されています。インストール後、ローカルモデルをダウンロードしてください。Ollamaの現在のドキュメントでは、gemma3APIの例として頻繁に使用されているため、このチュートリアルでは便利な中立的な例として使用できます。

ollama pull gemma3

次に、ローカルエンドポイントをテストします。

curl http://localhost:11434/api/generate -d '{"model":"gemma3","prompt":"Reply with the word ready.","stream":false}'

Ollama API のドキュメントには、ローカル API は で提供されると記載されていますhttp://localhost:11434/api。また、このアドレスへのローカル アクセスには認証は不要であるとも記載されています。ローカル サービスが実行されていない場合は、 が起動するためのドキュメントに記載されている CLI コマンドです。真のローカル推論が目的の場合は、モデルollama serveを置き換えることは避けてください。-cloud

インストール状況の確認、モデルの取得、ローカルモデルの一覧表示、およびローカルホストサービスの起動を行うためのOllamaコマンドを示すターミナルワークフロー。
セットアップ段階のターミナルワークフロー:Ollamaの検証、ローカルモデルの取得、ローカルモデルリストへの表示確認、ローカルホストでのサービスの利用可能性確認。表示されているモデル名と長さは、SEO要件ではなく、ワークフローの例として示されている値です。

お使いのハードウェアに合わせてモデルを選択してください。

この記事は、SEOメタデータに関して、どのモデルが普遍的に最適であるかを断言するものではありません。モデルの可用性やハードウェアへの適合性は時間とともに変化し、大規模なモデルはより多くのメモリを必要とし、一般的に応答速度も遅くなります。まずは、お使いのマシンで快適に動作するモデルから始め、小規模なレビューセットを生成し、数千ページを処理する前に、事実の正確性、独自性、レイテンシ、一貫性を比較検討してください。

ステップ2:散文を解析するのではなく、構造化された出力を強制する

自由形式のテキストは自動化には不向きです。「ここに3つの素晴らしい選択肢があります…」のような応答では、プログラムは実際のタイトルがどこから始まるかを推測しなければなりません。Ollamaの構造化出力に関するドキュメントでは、フィールドにJSONスキーマを渡すことがサポートされていますformat。また、このドキュメントでは、PythonのPydanticを介して再利用可能なスキーマを使用することを推奨しており、などの低温設定によって0決定性が向上する可能性があることも指摘しています。

この例で使用されている2つのPythonパッケージをインストールしてください。

python -m pip install -U ollama pydantic

次に作成しますgenerate_meta.py:

from ollama import Client
from pydantic import BaseModel, Field

MODEL = "gemma3"
client = Client(host="http://localhost:11434")

class SeoMeta(BaseModel):
    title: str = Field(min_length=10, max_length=65)
    description: str = Field(min_length=70, max_length=165)

SYSTEM = """
You create SEO metadata from the page content supplied by the user.

Rules:
- Accurately describe only what is present in the page content.
- Write a concise, descriptive title.
- Write a useful meta description that distinguishes this page from other pages.
- Do not repeat keywords unnaturally.
- Keep the same primary language as the page.
- Do not invent prices, dates, features, guarantees, statistics, or claims.
- The length bounds in the JSON schema are our editorial limits, not Google rules.
- Return only the structured result required by the schema.
"""

def generate_meta(url: str, source_title: str, h1: str, body_text: str) -> SeoMeta:
    prompt = f"""
URL: {url}
Current title: {source_title}
H1: {h1}

Page text:
{body_text[:12000]}

Create one meta title and one meta description for this page.
"""
    response = client.chat(
        model=MODEL,
        messages=[
            {"role": "system", "content": SYSTEM},
            {"role": "user", "content": prompt},
        ],
        format=SeoMeta.model_json_schema(),
        options={"temperature": 0},
    )
    return SeoMeta.model_validate_json(response.message.content)

if __name__ == "__main__":
    result = generate_meta(
        url="https://example.com/guides/clean-cast-iron",
        source_title="Cast Iron Guide",
        h1="How to Clean a Cast-Iron Skillet Without Damaging the Seasoning",
        body_text=(
            "This guide explains how to remove stuck food, wash a cast-iron "
            "skillet, dry it thoroughly, and apply a thin layer of oil..."
        ),
    )
    print(result.model_dump_json(indent=2))
Ollamaチャット呼び出し、ページコンテンツプロンプト、およびJSON形式の出力指示を備えたPython製SEOメタデータジェネレーターを示すコードエディタ。
ジェネレーターは、ページ証拠、出力フィールド、および編集上の制約について明確に説明する必要があります。本番環境では、プロンプトの文言だけに頼るよりも、OllamaのJSONスキーマ構造の出力とアプリケーション側の検証を優先してください。

プロンプトに現在のタイトルとH1が含まれる理由

Googleによると、同社のタイトルリンクシステムは、ページの<title>メインビジュアルタイトル、見出し(例:)<h1>、og:title目立つテキスト、アンカーテキスト、その他のシグナルを考慮できるとのことです。ローカルジェネレーターはGoogleのシステムを再現する必要はありませんが、ソースタイトル、H1タグ、URL、代表的な本文テキストを指定することで、提案されたメタデータを読者が実際に目にするページと一致させることができます。

無関係なキーワードリストをモデルに入力して「それらを当てはめてください」と指示しないでください。Googleは、簡潔で分かりやすいタイトルを推奨し、キーワードの詰め込みや定型文の繰り返しを避けるよう警告しています。説明文については、Googleは、説明文が正確で、人間が読みやすく、かつ多様であれば、大規模なデータベース駆動型サイトにおいてページ固有のプログラムによる生成が適切であると述べています。

ステップ3:1ページを実行して検証してからスケールアップする

スクリプトを実行します。

python generate_meta.py

成功した結果とは、Pydanticが検証できるJSONオブジェクトであるべきです。さらに重要なのは、人間のレビュー担当者がそれをソースページと比較し、次の4つの質問に迅速に答えられることです。

  • タイトルはウェブサイト全体ではなく、このページの内容を正確に表していますか?
  • 説明文には、元のコンテンツに存在しない主張、日付、価格、または特徴が含まれていないか?
  • ページ本文なしでこのメタデータを読んだ場合でも、意味は通じるだろうか?
  • それは、近隣のページですでに使用されているメタデータとは異なるものですか?
PowerShellウィンドウに、タイトルと説明を含むJSONオブジェクトを返すPythonメタデータスクリプトが表示されています。
バッチジョブを開始する前に、まず代表的なページを1つテストし、構造化された結果を検証してください。解析可能なJSONレスポンスが必要ですが、事実の正確性やページレベルでの関連性についても検証が必要です。

APIエラーだけでなく、編集上の失敗に対しても再試行機能を追加する

スキーマはデータ型や長さを制限することはできますが、文が真実であることや十分に具体的であることを保証することはできません。測定可能なチェックに基づいて再試行ロジックを構築してください。たとえば、空のフィールド、重複したタイトル、禁止されている定型文、タイトルとほぼ同じ内容の説明などを拒否します。ページに規制対象または重大な主張が含まれている場合は、信頼性を自動化しようとするのではなく、人間のレビューを必須としてください。

再試行を促すメッセージは簡潔にしましょう。「改善する」という指示で全てを再生成するのではなく、何が失敗したのかをモデルに伝えましょう。「提案されたタイトルは別のページと重複しています。H1タグ内の固有のトピックを使用して書き直し、すべての主張が提供されたコンテンツに基づいているようにしてください。」こうすることで、失敗箇所の監査が容易になります。

ステップ4:レビューと公開のためにページをCSVに一括保存する

1ページテストが信頼できるものになったら、入力データを、、、、などの列を含むCSVファイルに保存しますurl。コンテンツフィールドには、ナビゲーションメニュー、Cookie通知、または無関係なフッターリンクが何千個も含まれているのではなくsource_title、クリーンアップされたページテキストを含める必要があります。h1content

このバッチ処理ロジックをジェネレーター関数の下に追加するか、別のスクリプトに配置してください。

import csv

rows = []
seen_titles = set()

with open("pages.csv", newline="", encoding="utf-8") as f:
    for row in csv.DictReader(f):
        meta = generate_meta(
            url=row["url"],
            source_title=row.get("source_title", ""),
            h1=row.get("h1", ""),
            body_text=row["content"],
        )

        flags = []
        normalized = meta.title.casefold().strip()
        if normalized in seen_titles:
            flags.append("duplicate_title")
        seen_titles.add(normalized)

        rows.append({
            **row,
            "generated_title": meta.title,
            "generated_description": meta.description,
            "title_length": len(meta.title),
            "description_length": len(meta.description),
            "qa_flags": ",".join(flags),
        })

with open("seo_meta_output.csv", "w", newline="", encoding="utf-8") as f:
    fieldnames = list(rows[0].keys())
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerows(rows)

出力されたCSVファイルは、Excel、LibreOffice、データベースインポートツール、またはCMSワークフローで確認できます。初回実行時にライブメタデータを自動的に上書きしないでください。レビュー担当者が比較できるように、またロールバックが容易になるように、生成された提案書と元のタイトルおよび説明を併記してください。

記事タイトルが1列に、生成されたSEOメタタイトルと説明文が隣接するレビュー列に表示されるスプレッドシート形式。
スプレッドシートによるレビューキューを使用すると、一括生成の監査が容易になります。変更を公開する前に、ソースページの識別子、生成されたタイトル、生成された説明、文字数、および品質保証フラグを保持します。

バッチパイプラインをより安全にする

チェック警告すべき事項なぜそれが重要なのか
スキーマ検証入力漏れまたは無効なフィールド不正な形式の出力がCMSに入力されるのを防ぎます。
重複タイトルチェック2つのURLに同じ正規化されたタイトルページを区別しやすくするのに役立ちます。
言語チェックメタデータの言語はページの言語とは異なりますGoogleは、ページの主要言語と表記体系に合わせることを推奨しています。
証拠確認情報源に番号、価格、日付、ブランド、保証などが記載されていない虚偽の請求を減らす。
定型文チェックサイト全体で繰り返される長いフレーズGoogleは、定型文のタイトルを繰り返し使用しないよう推奨しています。
編集の長さチェック選択した住宅範囲外CMSの出力の一貫性を保つためのものであり、Googleの文字数制限ルールではありません。
人間によるレビュー戦略的、機密性、アクセス数が多い、または曖昧なページ自動化は例外を隠すのではなく、明らかにするべきである。

よくある問題、最も簡単な解決策から最も難しい解決策まで

API接続に失敗しました

まず、Ollamaが実行されており、http://localhost:11434アクセス可能であることを確認してください。公式の認証ドキュメントには、ローカルAPIでは認証は不要であると記載されています。スクリプトが誤って を指している場合はhttps://ollama.com/api、それは別のホスト型エンドポイントであり、認証が必要です。

レスポンスにはJSONを囲む文章が含まれています

自然言語でJSONだけを要求するのではなく、スキーマを通して出力してくださいformat=SeoMeta.model_json_schema()。構造化された出力は、本番環境のパイプラインにとって適切な制御層です。

タイトルはどれも同じように聞こえる

ページ固有のH1テキストと意味のある本文コンテンツを入力し、グローバルなナビゲーションノイズを除去し、ページ固有の説明を明示的に要求します。その後、ページ間の重複と類似性のチェックを実行します。繰り返しは、モデルの問題である前に、入力の問題であることが多いのです。

このモデルは特徴量や統計量を考案する

入力内容を信頼できるページテキストに限定し、根拠となるルールを強化します。提供されたコンテンツ以外の事実に関する主張は行わないでください。重要なページについては、生成されたアサーションを承認前に構造化されたソースフィールドと比較します。ソース自体が曖昧な場合は、モデルに繰り返し推測させるのではなく、行を人間のレビューに回してください。

このモデルは数千ページを処理するには遅すぎる。

アーキテクチャを変更する前に測定を行いましょう。ページごとの生成時間、入力サイズ、モデル名、および失敗率を記録します。無関係な本文を切り捨て、安定したページセクションを処理し、品質が許容範囲内であれば、より小さなローカルモデルをテストします。メタデータによってレビュー作業が削減されるよりも増えるのであれば、最速のモデルは役に立ちません。

オプション:既存のOpenAIスタイルの統合を使用する

既にOpenAI互換クライアント用のコードをお持ちの場合は、Ollamaのドキュメント(OpenAI APIの部分的な互換性について)http://localhost:11434/v1/を参照してください。これにより、移行作業を軽減できます。ローカル専用の新しいメタデータツールの場合は、OllamaのネイティブPythonクライアントの方がシンプルで、Ollamaのドキュメントに構造化出力の例が直接記載されています。

完成したシステムの自己点検方法

自動化が完了したと判断する前に、短い記事、長いガイド、製品ページ、カテゴリページ、数値を含むページ、およびサポートされているすべての言語のページなど、さまざまな種類のコンテンツを含むレビューセットを作成します。それらすべてに対して同じモデルとプロンプトを実行し、次のチェックリストを確認します。

  • ローカルエンドポイントは でありlocalhost、選択されたモデルはローカルモデルであり、クラウドタグ付きモデルではありません。
  • すべてのレスポンスは、手動によるJSONのクリーンアップなしに、スキーマに対して検証されます。
  • 生成されたタイトルは、レビューセット全体で重複していません。
  • 事実に関する主張はすべて、提供されたページコンテンツに記載されています。
  • メタデータは、ページと同じ主要言語と表記体系を使用します。
  • タイトルは内容を的確に表しており、キーワードの重複もなく簡潔である。
  • この説明は、サイト全体ではなく、特定のページについて要約したものです。
  • 内部の長さ制限は、Googleの要件ではなく、編集上のルールとして扱われます。
  • 古いメタデータ、生成された提案、QAフラグ、モデル名、およびプロンプトバージョンは、監査およびロールバックのために保存されます。
  • 査読者は、公開前に手動承認が必要なフラグを把握している。

最後に、自動化で制御できるものとできないものを覚えておきましょう。優れた<title>メタディスクリプションは検索エンジンに役立つページレベルのシグナルを提供しますが、Googleは他のページコンテンツからタイトルリンクやスニペットを生成できます。したがって、特定の検索結果の表示を強制することが目的ではありません。目的は、正確で明確かつ有用なメタデータを大規模に生成しつつ、本番環境に到達する前に間違いを検出するための十分な検証とレビューを維持することです。

コメントを残す

Local Ollamaを使用してSEOメタタイトルとメタディスクリプションを自動生成する方法

Local Ollamaを使用してSEOメタタイトルとメタディスクリプションを自動生成する方法

構造化されたSEOタイトルとメタディスクリプションを一括生成し、出力を検証し、人間によるレビューが必要な結果をフラグ付けする、ローカルなOllamaワークフローを構築します。

Modern Real Estate Listing Presentation PowerPoint Template Free: A Practical Seller-Ready Slide Blueprint

Modern Real Estate Listing Presentation PowerPoint Template Free: A Practical Seller-Ready Slide Blueprint

Use this free modern real estate listing presentation PowerPoint blueprint to organize pricing, marketing, property prep, agent value, and seller next steps.

Excel用印刷可能建設工事見積書テンプレート:小規模請負業者向けの実用的な設定

Excel用印刷可能建設工事見積書テンプレート:小規模請負業者向けの実用的な設定

明確な労務費、材料費、計算式、利益率、除外項目、印刷可能な顧客合計金額を含む、印刷可能な建設工事見積書テンプレートをExcelで作成します。

How to Generate Cinematic Lighting Prompts for Luma Dream Machine

How to Generate Cinematic Lighting Prompts for Luma Dream Machine

Build stronger Luma Dream Machine video prompts with a practical cinematic lighting formula, reusable recipes, examples, and a fast troubleshooting checklist.

Minimalist Investor Pitch Deck PowerPoint Template for Tech Startups: What to Include and How to Structure It

Minimalist Investor Pitch Deck PowerPoint Template for Tech Startups: What to Include and How to Structure It

Build a minimalist tech startup investor pitch deck in PowerPoint with the right slide order, clear design rules, traction metrics, and investor-ready appendix.

Excelが数値を日付に自動的に変換するのを止める方法

Excelが数値を日付に自動的に変換するのを止める方法

Excelがコード、ID、分数を日付に変換しないようにするには、テキスト形式、アポストロフィ、インポート制御、および最新のMicrosoft 365オプションを使用してください。

ComfyUIでSDXLワークフローのレンダリング時間を短縮する方法

ComfyUIでSDXLワークフローのレンダリング時間を短縮する方法

サンプリング作業の削減、解像度とバッチサイズの制御、ノードの簡素化、キャッシュの使用、VRAMとアテンションの安全な調整により、ComfyUI SDXLのレンダリング速度を向上させます。

Free Rental Property Expense & Income Tracker Excel Template: Simple Landlord Workbook

Free Rental Property Expense & Income Tracker Excel Template: Simple Landlord Workbook

Build a practical rental property income and expense tracker in Excel with clear categories, formulas, monthly summaries, and tax-ready recordkeeping guidance.

個人文書用のプライベートなローカルAI知識ベースを設定する方法

個人文書用のプライベートなローカルAI知識ベースを設定する方法

Ollama、AnythingLLM、ローカル埋め込み、RAGを使用して、プライベートなローカルAI知識ベースを構築します。4つのステップからなるセットアップ、プライバシーチェック、テスト、バックアップについて学びましょう。

重要な証拠を失うことなく、長文文書分析で「コンテキストウィンドウを超過しました」エラーを修正する方法

重要な証拠を失うことなく、長文文書分析で「コンテキストウィンドウを超過しました」エラーを修正する方法

長文文書解析におけるコンテキストウィンドウエラーを修正するには、入力データのトリミング、ファイルの分割、検索機能の利用、そして最終的な回答が元の文書を網羅しているかどうかの検証を行う。