これは「関連記事表示 by Vector Search 2.0」のデモサイトです。記事コンテンツはソリューションブログから引用しています。
Craft AI ModulesとCraft Functionsを使って、Craft Cross CMSのコンテンツに自動でタグ付けする方法

Craft AI ModulesとCraft Functionsを使って、Craft Cross CMSのコンテンツに自動でタグ付けする方法

こんにちは、Customer Engineerの神谷です!今年も桜の季節が始まったので、この前の週末に早速いくつか都内の桜巡りをしてきました。今年の春は晴天が少なそうなので、貴重な晴れ間の時間にできるだけ効率良く桜巡りをしたいですね。

さて今回は、CMSに関するお話です。CMSでコンテンツを管理する際、その分類をコンテンツごとに手作業でやっていて、面倒だなと思ったりすることはないでしょうか?特にタグ付けは、コンテンツ運用における地味ながらも重たい課題になりがちです。

例えば、以下のような悩みに心当たりはありませんか?

  • 「1記事1つが原則」のカテゴリは自分でパッと選べるけど、複数選べるタグは面倒で後回しにしがち
  • 執筆者によってタグ選びの基準がバラバラで、同じような意味のタグが乱立してしまう(例:AI、人工知能、生成AI…)
  • 過去に作成したタグをいちいちリストから探すのが手間で、結局何も付けずに公開してしまう
  • 後から「特定のタグで記事一覧を作りたい」と思っても、過去記事にタグが付いていないので、全記事を手動でチェックし直す羽目になる

カテゴリであれば「これは政治」「これは経済」などと直感的に決められることが多いですが、タグは「記事の文脈を読み取って、適切なキーワードを複数選ぶ」という高度な判断が求められます。

これを忙しい執筆と同時に行うのは意外にハードルが高く、「タグ付け忘れ」や「表記揺れ」が起きるのも無理はありません。しかし、タグ付けを怠ると、サイト内の回遊性が下がるだけでなく、コンテンツの資産価値を十分に活かせなくなってしまう可能性もあります。

そこで今回は、Craft AI ModulesとCraft Functionsを使って、Craft Cross CMSのコンテンツに自動でタグ付けする方法について紹介します。

本ソリューションを活用することで、Craft Cross CMSでのコンテンツ更新時に、予め用意しておいたタグの一覧から、AIが文脈に沿ったタグを選んでくれ、更にCraft Functionsを利用して該当コンテンツに対するタグの設定まで自動でやってくれます。

今回のポイントは、コンテンツ更新時に毎回Craft Functionsが起動して、ただ闇雲に自動でタグ付与するのではなく、「タグが未設定の場合のみ」にAIが補完してくれる点です。それと「タグが未設定」の場合でも、「文章量が極端に少ない」場合はその中身を理解しづらいのでタグ選定をスキップし、ちゃんとある程度の文章量がある場合にタグ選定作業をしてくれるようになっています。

これにより、編集者はAIを「下書きのサポート役」として活用でき、人間が手動で作成した文章などのこだわりは尊重しつつ、うっかり忘れだけを確実に防ぐといった「賢い運用」が可能になります。わざわざタグ選びに頭を悩ませる必要がなくなり、執筆そのものに集中しやすい環境を整えられるでしょう。

では、実際にどのような動きになるのか見ていきましょう。

アウトプットイメージ

最終的なアウトプットイメージは次の通りです。まずは予めCraft Cross CMSで、記事コンテンツとは別のモデルにタグを入稿しておきましょう。手順の最初でも補足しますが、後でタグごとの記事一覧ページを作ることなどを考慮して、タグ名とスラッグの2つを設定しておくのがオススメです。

そして記事コンテンツを管理している別のモデルで、何か適当に1つコンテンツを選びます。

今回は例として、プレイド社員のインタビュー記事の中から、デザイナーとAIに関するこの記事の中身をAIに読ませてタグ選定してもらうことにします。まだ最初の段階では、コンテンツにタグは設定されていません。

適当にCraft Cross CMS上でコンテンツを少し編集して保存すると、それをきっかけにCraft Functionsが起動し、コンテンツのタイトルや本文を基にタグを選定し、コンテンツの更新処理までを行なってくれます。今回の検証では、「キャリア, デザイン, エンジニアリング」の3つを選んでくれ、実際に記事の中身と照らし合わせてみてもかなりいい感じだと個人的には思いました。

構成図は次の通りです。

  • まずコンテンツの編集者や担当者が、Craft Cross CMS上で記事コンテンツを更新して保存します
  • Craft Cross CMSでの記事コンテンツ更新をきっかけに、Craft Functionsが起動して該当の記事コンテンツの情報を取得します
  • それと並行して、タグの一覧が入稿された別のCraft Cross CMSのモデルからも、タグの一覧を取得します
  • Craft AI Modulesに記事コンテンツの中身とタグの一覧を渡して、記事コンテンツに相応しいタグを選定させます
  • タグの選定が終わったら、Craft Functionsから該当のコンテンツに対してKARTEのAPI v2経由でタグを設定します

注意点

前提として、次の点に注意をしてください。

  • Craft Cross CMS、Craft Functions、Craft AI Modules、KARTE API v2を利用できるKARTEプロジェクトが必要です
  • タグの一覧は、予め記事コンテンツとは別のCraft Cross CMSのモデルに入稿済みの前提で話を進めます
    • ただし手順の最初で、どのような形式で入稿しておくと良いかその確認の意味で補足します
  • AIが選定したタグが、必ずしも適切とは限りません
    • AIが導き出したタグが本当に適切かどうかは、公開前に必ずチェックするようにしてください

設定手順

設定の手順は次の通りです。

  1. Craft Cross CMSで設定したタグの一覧とそのモデルIDを確認する
  2. API v2 アプリを作成してそのアクセストークンをCraft Secret Managerに登録する
  3. Craft Functionsのファンクションを作成する
  4. API v2 アプリにCraft Functionsを起動するための Hook v2 トリガーを設定する

順番に見てみましょう。

1. Craft Cross CMSで設定したタグの一覧とそのモデルIDを確認する

注意事項でも述べましたが、まずは記事コンテンツとは別でタグがきちんと入稿されているかどうか確認しておきましょう。今回の検証では、以下の10個のタグを用意しました。

これも既に述べたように、タグの名称とひとまずスラッグがあれば十分でしょう。スラッグを用意しておくことで、例えばデザインタグを含む記事の一覧ページをhttps://example.com/tags/designのように作成することができます。

これに加えて、タグが入稿されているCraft Cross CMSのモデルIDも控えておきましょう。モデルIDは、以下の手順のどちらかで確認できます。このモデルIDが、後のCraft Functions作成に必要です。記事コンテンツを入稿するモデルのモデルIDもCraft Functions作成時には必要になるので、ここで一緒に確認しておくと便利です。

  • タグの一覧が入稿されているページのURLから取得する
    • https://admin.karte.io/cms/{CollectionId}?tabId={modelId}}&project={projectId}の形式になっており、その中に含まれる{modelId}がそれに該当します
  • タグの一覧が入稿されているページ右上の「コンテンツ設定」から遷移できるページのJSONプレビューから取得する
    • コンテンツ設定画面の右側に以下のようなjsonが表示されており、その中のmodelIdがそれに該当します
{
  "id": "xxxxxxxxxxxx",
  "sys": {
    "createdAt": "2025-01-01T00:00:00.000Z",
    "updatedAt": "2025-01-01T00:00:00.000Z",
    "modelId": "1234567890abcdefghiklmn",
    "customOrder": 0,
    "raw": {
      "createdAt": "2025-01-01T00:00:00.000Z",
      "updatedAt": "2025-01-01T00:00:00.000Z",
      "firstPublishedAt": "2025-01-01T00:00:00.000Z",
      "publishedAt": "2025-01-01T00:00:00.000Z"
    }
  },
  "tag_name": "Sample Text",
  "category": "xxxxxxxxxxxx",
  "slug": "Sample Text"
}

2. API v2 アプリを作成してそのアクセストークンをCraft Secret Managerに登録する

KARTEのAPIを利用するために、API v2アプリを作成し、そのアクセストークンをCraft Secret Managerに登録しましょう。今回はAPI v2を利用してCraft Cross CMSのコンテンツを取得・更新するだけでなく、Craft Functions起動のトリガーとしてもAPI v2アプリを使用します。

  • [ストア > API v2設定] からアプリを新規作成します

  • [アプリタイプ] を token に設定します

  • 必要なscopeを追加してください

    • beta.cms.content.list
    • beta.cms.content.get
    • beta.cms.content.update
    • beta.cms.content.patch
  • アプリを保存すると、そのアクセストークンをCraft Secret Managerに保存するよう促す旨の案内が出ます

  • そのまま任意の名称をつけてアクセストークンをCraft Secret Managerに保存しましょう

  • 登録したシークレット名がCraft Functions作成時に必要なのでメモしておいてください

3. Craft Functionsのファンクションを作成する

Craft Functionsのファンクションを作成します。作成手順は次の通りです。

  • [Craft > ファンクション > 新規作成 > テンプレートから作成] を選択します

  • Craft AI Modulesを使ってCraft Cross CMSのコンテンツに自動でタグ付けする 」というテンプレートを検索し[取得]ボタンをクリックします

  • [反映] ボタンをクリックします

  • [設定 > ファンクションのタイプ] で「イベント駆動タイプ」を選択します

  • [変数] タブで次の変数の値を設定してください

    • LOG_LEVEL
      • 出力するログのレベルをERROR/WARN/INFO/DEBUGから指定します
    • KARTE_APP_TOKEN_SECRET
      • KARTE API v2アプリのtokenを登録したシークレット名です
    • CONTENT_CMS_MODEL_ID
      • 記事コンテンツが入稿されたCraft Cross CMSのモデルIDを指定します
    • TAG_FIELD_ID
      • 記事コンテンツが入稿されたモデルで、タグに設定されているフィールドIDを指定します
    • TAG_CMS_MODEL_ID
      • タグが入稿されたCraft Cross CMSのモデルIDを指定します
    • TAG_NAME_FIELD_ID
      • タグが入稿されたモデルで、タグ名に設定されているフィールドIDを指定します
    • ARTICLE_TITLE_FIELD_ID
      • 記事コンテンツが入稿されたモデルで、タイトルに設定されているフィールドIDを指定します
    • ARTICLE_BODY_FIELD_ID
      • 記事コンテンツが入稿されたモデルで、本文(テキストまたはリッチテキスト)に設定されているフィールドIDを指定します
    • GEMINI_MODEL
      • gemini-2.5-flashやgemini-2.5-proなど、利用する生成AIのモデル名を指定します
    • SYSTEM_INSTRUCTION
      • どのような観点でタグを選ぶべきかそのためのプロンプトを入力します
      • 今回の検証ではあなたは優秀なコンテンツ編集者です。 与えられた「記事」の内容を分析し、提供された「選択可能なタグリスト」の中から関連性の高いタグを【最低1つ、最大3つ】選んでください。選定の際は、記事の主要なトピックを最もよく表すキーワードを優先してください。のように指定してみました
    • その他の変数は、ひとまずデフォルト値のままで問題ありません
  • [保存] します

なお、テンプレートのソースコードはGitHubで公開しています。

craft-codes/craft-functions/xcms-aimodules-tagging-contents at main · plaidev/craft-codes

4. API v2 アプリにCraft Functionsを起動するための Hook v2 トリガーを設定する

作成したAPI v2アプリの設定で、手順3で作成したCraft Functionsを起動するためのHook v2 トリガーを追加します。

  • [ストア > API v2設定] から作成したアプリを選択します
  • [hook設定 > 編集] をクリックします
  • [トリガー設定] で次のトリガー名を追加してください
    • KARTE CMS: コンテンツの更新時
  • [チャネル設定 > Craft > hook status > 有効にする] にチェックを付け、「手順3で作成したCraft Functionsのファンクション」を選択します
  • アプリ設定を保存します

実際に動かしてみる

実際に動作を確認してみましょう。

まずは、タグがきちんと入稿されていることを改めて確認しましょう。

その状態で、Craft Cross CMS上でタグが未設定の記事コンテンツを選んで少しいじって保存すると、Craft Functionsが起動して記事コンテンツのデータとタグの一覧をまず取得します。そして、該当の記事コンテンツに相応しいであろうタグがCraft AI Modulesによって選定され、Craft Cross CMSのコンテンツにそのタグもCraft Functionsが自動で設定してくれます。

既に述べたように、AIによって選定されたタグが絶対に正しい保証はないので、本当にそのタグで問題ないかどうかは、必ず公開前にチェックしてください。

おわりに

今回はCraft AI ModulesとCraft Functionsを使って、Craft Cross CMSのコンテンツに自動でタグ付けする方法について紹介しました。

本ソリューションを利用することで、手動ではちょっと手間がかかったり、あるいは忘れがちになってしまう記事コンテンツのタグ付けを自動でやってくれて、とても便利ですよね。間違えて似たようなタグを複数作ってしまう可能性も低く、一度設定さえしてしまえばあとは公開前にチェックするだけで済みます。

以前ご紹介した、Craft Cross CMSにコンテンツを一括入稿するソリューションなどと組み合わせることで、より効率よくCraft Cross CMSでコンテンツ管理できるようになるでしょう。

参考:Datahubクエリの結果とCraft Functionsを使って、Craft Cross CMSにコンテンツを一括入稿する方法

ぜひ皆さんも試してみてください!