Craft Cross CMSで公開したコンテンツをCraft RAGに同期する
- solution
- 2026年5月20日
こんにちは、Customer Engineerのgamiです!最近、Switch 2招待販売の案内が来て小躍りしました。
さて、先日リリースした記事でCraft RAGの機能紹介をしました。その中で、「Craft Cross CMSで入稿したテキストデータをCraft RAGにインポートして活用できる」という旨を記載しました。
Craft RAG と Craft Vector Search は、どう使い分ければいいのか?
たとえばCraft Cross CMSでFAQコンテンツを管理している場合、それをCraft RAGにも自動で同期できると、そのFAQナレッジを使って質問に回答をするAIボットを実装できるようになります。
そこで今回は、Craft Cross CMSで公開したコンテンツを自動でCraft RAGに同期するための仕組みについてご紹介します。
アウトプットイメージ
今回の記事では、Craft Cross CMSで入稿したFAQコンテンツをCraft RAGに自動連携したいというシーンを題材にします。
最終的なアウトプットイメージは次の通りです。
CMSでFAQコンテンツを作成・公開します。
すると、それがMarkdown形式でCraft Sitesに保存され、さらにCraft RAGにインポートされて検索可能になります。
ファイル名がわかりにくいですが、ここではCraft Cross CMSのコンテンツIDをファイル名に利用することでCMS側のコンテンツに対応するCraft SitesやCraft RAGのファイルとを紐付けています。
なおCraft RAGにインポートされたナレッジは、たとえば次のようなAIによるテキスト生成に利用できます。
構成図は次の通りです。
Craft Cross CMS側の対象モデルでコンテンツが公開されると、Hookの仕組みでCraft Functionsが実行されます。そのファンクション内で、次のような処理が実行されます。
- CMSからコンテンツの中身を取得してMarkdown形式に変換
- そのMarkdownテキストをファイルとしてCraft Sitesにアップロード
- そのファイルをファイルパス指定でRAGコーパスにインポート
この一連の処理には、次のAPI群が使われています。
- Get a content
- Craft Cross CMSからコンテンツの中身を取得
- Upload Craft Sites content
- Craft Sitesへのファイルアップロード
- Craft RAG Import By File
- Craft RAGへのファイルインポート
なお、今回紹介するテンプレートはコンテンツ非公開時のファイル削除にも対応しています。コンテンツ非公開時に利用しているAPIは次の通りです。
- Remove Craft Sites file
- Craft Sites上のファイルを削除
- Get RAG File By Path
- Craft Sites上のファイルパスから、対応するCraft RAG側のファイルIDを特定
- Craft RAG Delete Files
- Craft RAG上のファイルを削除
注意点
前提として、次の点に注意をしてください。
- API v2、Craft Functions、Craft Cross CMS、Craft Sites、Craft RAGが利用できるKARTEプロジェクトが必要です
設定手順
設定の手順は次の通りです。
- API v2 アプリを作成する
- API v2 アプリの アクセストークンを Craft Secret Manager に登録する
- Craft Cross CMSのモデルを作成する
- Craft Sitesのサイトを用意する
- Craft RAGのコーパスを作成する
- Craft Functionsを作成する
- CMS更新時のHookを設定する
1. API v2 アプリを作成する
Craft Functionsから各機能にアクセスするためのAPI v2アプリを作成します。
-
[ストア > API v2設定] からアプリを新規作成します
-
[アプリタイプ] を
tokenに設定します -
必要なscopeを追加してください
beta.cms.content.getbeta.craft.sites.content.uploadbeta.craft.sites.content.file.removebeta.craft.rag.importByFilebeta.craft.rag.getFileByPathbeta.craft.rag.deleteFiles
-
アプリを保存し、一度だけ表示されるアクセストークンをメモしておきましょう
2. API v2 アプリの アクセストークンを Craft Secret Manager に登録する
API v2 アプリのアクセストークンをCraft Functionsから安全に利用するために、Craft Secret Manager に登録します。
-
[Craft > シークレット] からシークレットを新規作成します
-
[名前] に、わかりやすい名前を入力します
-
メモしておいたAPI v2 アプリのアクセストークンを [シークレットの値] に入力し、作成してください
-
シークレット名は、Craft Functions作成時に必要なのでメモしておきましょう
3. Craft Cross CMSのモデルを作成する
RAGに同期するコンテンツの構造を定義するため、Craft Cross CMSでモデルを作成します。
- [Craft > コンテンツ一覧 > コンテンツ設定] の [モデルを追加]から、モデル作成画面を開きます
faqなど適当なモデル名で、次の例のようなフィールドをもつモデルを作成してください- どのフィールドをCraft RAGに含めるかについては、後述する手順で指定できます
| フィールド名 | タイプ | 表示名 |
|---|---|---|
| title | テキスト | タイトル |
| content | リッチテキスト | 本文 |
| category | 選択 | カテゴリ |
| tags | 選択(複数) | タグ |
- JSONプレビューの中にある
modelIdの値をコピーしておきます- 例:
a1234567890b2345678901c3
- 例:
4. Craft Sitesのサイトを用意する
Craft RAGにインポートするファイルをホスティングするためのサイトをCraft Sitesで作成します。
すでにサイトがある場合は、それを使っていただいても大丈夫です。
- [Craft > サイト]の[新規作成]から、適当な設定でサイトを作成します
- 検証目的であれば、ドメインは [自動でドメインを払い出す] を使っても問題ありません
5. Craft RAGのコーパスを作成する
Craft RAGでファイルを追加するためのコーパスを作成します。
- [Craft > RAG] の [新規作成]から、適当な名前でコーパスを作成します
- 作成したコーパスのIDをメモしておきます
6. Craft Functionsを作成する
CMS更新を検知してコンテンツをCraft RAGに同期するためのファンクションを作成します。
-
[Craft > ファンクション > 新規作成 > テンプレートから作成] を選択します
-
「 Craft Cross CMSのコンテンツ変更をCraft RAGに同期する 」というテンプレートを検索し[取得]ボタンをクリックします
-
[反映] ボタンをクリックします
-
[設定 > ファンクションのタイプ] で「イベント駆動タイプ」を選択します
-
[変数] タブで次の変数の値を設定してください
| 変数名 | 設定例 | 説明 |
|---|---|---|
LOG_LEVEL | WARN | 出力するログのレベルです。ERROR/WARN/INFO/DEBUGから指定します |
KARTE_APP_TOKEN_SECRET | KARTE_APP_TOKEN | KARTE API v2アプリのtokenを登録したシークレット名です(手順2でメモした値) |
TARGET_MODEL_ID | a1234567890b2345678901c3 | Craft RAGに同期する対象のCraft Cross CMS モデルIDです(手順3でメモした値) |
CMS_CONTENT_FIELDS | title,content,category | RAGファイルに含めるCMS側フィールド名をカンマ区切りで指定します |
SITE_NAME | my-rag-site | Craft Sitesのサイト名です(手順4で作成したサイト名) |
SITE_DIR_PATH | /rag/ | Craft Sitesサイト側でファイルをアップロードしたい対象のディレクトリパスです |
RAG_CORPUS_ID | 1234567890123456789 | Craft RAGのコーパスIDです(手順5でメモした値) |
- 適当なファンクション名をつけて [デプロイ] します
なお、テンプレートのソースコードはGitHubで公開しています。
craft-codes/craft-functions/xcms-hook-to-rag at main · plaidev/craft-codes
7. CMS更新時のHookを設定する
CMSのコンテンツが公開・非公開された際に自動でCraft Functionsを起動するため、作成したAPI v2アプリの設定でHook v2を設定します。
- [ストア > API v2設定] から作成したアプリを選択します
- [hook設定 > 編集] をクリックします
- [トリガー設定] で次のトリガーを追加してください
KARTE CMS: コンテンツの公開時KARTE CMS: コンテンツの非公開時
- [チャネル設定 > Craft > hook status > 有効にする] にチェックを付け、作成したファンクションを選択します
- アプリ設定を保存します
実際に動かしてみる
実際に動作を確認してみましょう。
「コンテンツ公開時」の動作確認
-
Craft Cross CMSの対象モデルで、コンテンツを新規作成し、公開します
-
少し待って、Craft SitesとCraft RAGに対応するファイルが追加されることを確認します
「コンテンツ非公開時」の動作確認
- Craft Cross CMS側で、先ほど作成・公開したコンテンツを下書き状態にします
- 少し待って、Craft SitesとCraft RAG側の対応するファイルが削除されることを確認します
ちなみにファイル名に使われているCMS側の「コンテンツID」は、コンテンツを「ページとして開く」で開いたときの画面から確認できます
うまく動作しない場合は、ファンクションのログにエラーが出ていないか確認してみてください。
補足
Craft RAGにインポートするファイルのCraft Sites上での公開状態について
Craft Sites上にある個々のファイルは公開/非公開の状態を持っていますが、Craft RAGにインポートするファイルについては、特にCraft Sites上で公開状態になっている必要はありません。あくまでCraft内部の権限でCraft RAGにインポートされるので、対象ファイルが公開されていなくてもRAGへのインポートは可能です。
また、Craft Sites自体がpublicなサイトである必要もありません。「サイトの認証」機能が有効なサイトにアップロードしたファイルについても、Craft RAGにインポートすることが可能です。
まとめ
今回は、Craft Cross CMSで公開したコンテンツを自動でCraft RAGに同期する仕組みをご紹介しました。
Craft Cross CMSを使えば、管理しているコンテンツをAIが参照するナレッジとしてすぐに活用することができます。
ぜひ試してみてください!