CLAUDE LABEN
MODEL — Claude Fable 5が6/9に一般提供開始。100万トークン文脈・常時アダプティブ思考・128K出力を備えますPLATFORM — Developer Platformにcode execution・MCP connector・Files API・最大1時間のプロンプトキャッシュが追加されましたMCP — 管理者がOkta経由で組織全体にMCPコネクタをプロビジョニング可能に。初回ログインでゼロタッチ接続できますSANDBOX — Claude Managed Agentsが自前サンドボックス+プライベートMCPサーバー接続に対応しましたCODING — Opus 4.8はSWE-bench 72.5%・Terminal-bench 43.2%。長時間の連続作業に強みがありますLINEUP — 主力はOpus 4.8・Sonnet 4.6・Haiku 4.5。用途に応じて使い分けられますMODEL — Claude Fable 5が6/9に一般提供開始。100万トークン文脈・常時アダプティブ思考・128K出力を備えますPLATFORM — Developer Platformにcode execution・MCP connector・Files API・最大1時間のプロンプトキャッシュが追加されましたMCP — 管理者がOkta経由で組織全体にMCPコネクタをプロビジョニング可能に。初回ログインでゼロタッチ接続できますSANDBOX — Claude Managed Agentsが自前サンドボックス+プライベートMCPサーバー接続に対応しましたCODING — Opus 4.8はSWE-bench 72.5%・Terminal-bench 43.2%。長時間の連続作業に強みがありますLINEUP — 主力はOpus 4.8・Sonnet 4.6・Haiku 4.5。用途に応じて使い分けられます
記事一覧/Cowork
Cowork/2026-06-23上級

無人の記事生成タスクが『ほぼ同じ記事』を二度書く前に止める重複検出ゲート

Cowork のスケジュールタスクで毎日記事を生成していると、無人ゆえに数日前と中身がほぼ重なる記事を作ってしまいます。公開直前に slug の類似度と当日ログを照合して重複を止めるゲートを、実際に誤公開を防いだ実装とともにお届けします。

Cowork26スケジュールタスク11重複検出自動化57Python16SEO2コンテンツ運用

プレミアム記事

今朝、Cowork のスケジュールタスクがプロンプトキャッシュの TTL を 5 分から 1 時間へ延ばす設計、という題材で記事を書き始めようとしていました。手が滑って公開していたら、半年前に出した claude-api-prompt-cache-5m-1h-two-tier-ttl-design とほぼ同じ内容が、別 URL でもう一本増えていたはずです。

無人で毎日記事を生成していて一番こわいのは、エラーで止まることではありません。エラーは止まればログに残り、翌日気づけます。本当にこわいのは、止まらずに「数日前と中身がほぼ重なる記事」を淡々と公開し続けることです。一本ずつ見れば破綻していないので、人間がレビューしない限り気づけません。そして Google から見れば、これは薄い記事を量産しているサイトの典型的な挙動です。

私はこの半年、4 サイトを無人のスケジュールタスクで回してきて、この「静かな重複」が検索評価をじわじわ削る最大の要因だと感じています。今日はその対策として、記事を公開する前に slug の近さと当日ログを照合し、重複しそうなら公開を止めるゲートの作り方を、実際に動いているコードでお伝えします。

なぜ「件数チェック」だけでは重複を防げないのか

多くの自動投稿パイプラインは、push 直前に日本語版と英語版の件数一致を確認します。これは 404 を防ぐためには必須ですが、重複検出には何の役にも立ちません。件数が揃っていても、中身が数日前と重なっていれば、それは「正しく数えられた重複記事」が一本増えるだけです。

タイトルの完全一致チェックも役に立ちません。無人タスクは毎回少しずつ違う言い回しでタイトルを作るので、「プロンプトキャッシュの TTL 設計」と「キャッシュ有効期限を延ばすコスト設計」は文字列としては一致せず、すり抜けます。

重複を捉えるには、表記ではなく「その記事がどの概念について書いているか」を比較する必要があります。そして幸い、私たちは概念を要約した短い文字列をすでに持っています。slug です。slug はハイフン区切りの英単語列で、記事の主題語がそのまま並んでいます。これをトークンの集合として比較すれば、表記ゆれに強い重複判定ができます。

slug をトークン集合にして Jaccard 類似度で測る

考え方はシンプルです。候補記事の slug と既存記事の slug をそれぞれハイフンで分割し、単語の集合にします。二つの集合がどれだけ重なっているかを Jaccard 係数(積集合のサイズ ÷ 和集合のサイズ)で測り、しきい値を超えたら「同一概念の疑いあり」と判定します。

#!/usr/bin/env python3
"""dup_gate.py — 候補 slug が既存記事と概念的に重複していないか検査する。
使い方:
  python3 dup_gate.py <repo> <category> <candidate-slug>
終了コード:
  0  重複なし(公開してよい)
  1  重複の疑いあり(角度を変えるか加筆昇格に切り替える)
"""
import sys
from pathlib import Path
 
# slug を主題語の集合に変換する。ノイズ語は主題ではないので落とす。
STOPWORDS = {
    "claude", "api", "sdk", "cli", "guide", "the", "a", "to", "for",
    "with", "and", "of", "in", "on", "how", "your", "cowork",
}
 
def slug_tokens(slug: str) -> set:
    parts = [p for p in slug.lower().split("-") if p]
    return {p for p in parts if p not in STOPWORDS and len(p) > 1}
 
def jaccard(a: set, b: set) -> float:
    if not a or not b:
        return 0.0
    return len(a & b) / len(a | b)
 
def main():
    repo, category, candidate = sys.argv[1], sys.argv[2], sys.argv[3]
    cand = slug_tokens(candidate)
    ja_dir = Path(repo) / "content" / "articles" / "ja" / category
    hits = []
    for mdx in ja_dir.glob("*.mdx"):
        existing = mdx.stem
        if existing == candidate:
            continue
        score = jaccard(cand, slug_tokens(existing))
        if score >= 0.5:
            hits.append((score, existing))
    hits.sort(reverse=True)
    if hits:
        print(f"❌ 重複の疑い: {candidate}")
        for score, existing in hits[:5]:
            print(f"   {score:.2f}  {existing}")
        sys.exit(1)
    print(f"✅ 重複なし: {candidate}")
    sys.exit(0)
 
if __name__ == "__main__":
    main()

このスクリプトを今朝の例で動かすと、候補 claude-api-prompt-cache-ttl-5m-to-1h-refresh-design に対して、既存の claude-api-prompt-cache-5m-1h-two-tier-ttl-design0.62 で引っかかります。共通トークンは prompt, cache, 5m, 1h, ttl, design の 6 語で、和集合は 10 語前後。表記は違うのに、概念は明確に重なっていることが数値で出ます。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
既存 slug をトークン分解して Jaccard 類似度を測り、しきい値で『同一概念の記事』を公開前に弾く Python ゲートの実装
当日ログと近接 slug を二段で照合し、誤検出と見逃しのどちらにも倒れないしきい値(0.5 前後)の決め方
重複を検出したあとの分岐 — 別角度へ振り直すか、既存記事の加筆昇格に切り替えるかの判断基準
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

Cowork2026-06-13
Cowork スケジュールタスク運用の実際 — 朝のダイジェストと週次レポートを無人で回すまで
Claude Cowork のスケジュールタスクで定期実行・リマインダー・自動レポートを設定する手順を、cron 式の基本から無人実行に耐えるプロンプト設計、複数タスクの時間帯設計まで、運用で掴んだ勘所とともにお届けします。
Cowork2026-05-03
Claude Cowork半年間の実運用レビュー — 期待と現実、個人開発者が見えてきた真価
Claude Coworkを半年間使い続けた個人開発者視点の正直なレビュー。スケジュールタスク・スキル・メモリ機能の実際の使い勝手と、期待を裏切られた点、逆に予想外に役立った点を具体的に解説します。
Cowork2026-04-17
CoworkでDropboxフォルダを自動整理する — ファイル分類・重複削除・命名規則の仕組み化
Dropboxが散らかってきたと感じたら、Coworkに任せてみてください。ファイル分類・重複検出・命名規則の一括適用をスケジュール実行する実践的な仕組みの作り方を解説します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →