Orchestration機能の概要
SAP BTP上の SAP AI Coreが提供するOrchestration機能は、大規模言語モデル(LLM)の推論処理に必要な前後処理をまとめて一括実行できる仕組みです。単にモデルに問い合わせを行うだけでなく、その前後でデータの下準備(前処理)や結果のフィルタリング(後処理)を組み合わせ、1回のAPIコールで一連の処理を完了できます。これにより、LLMを企業システムで使う際に求められる様々な機能(コンテキスト付与やコンテンツ検閲など)を統合し、安全でビジネスに適した応答を得ることが可能となります。
特に生成AIを業務シナリオに組み込む場合、次のような課題に対応する必要があります。
ドメイン知識の反映: 基盤となるLLMは汎用知識を持ちますが、そのままでは企業固有の専門知識が不足しがちです。Orchestrationの中で追加コンテキストを提供することで、モデルにビジネス文脈を与えられます。機密データの保護: ユーザ入力や出力に個人情報や機密情報が含まれる場合、事前にマスキングしてモデルに渡す、あるいは結果から除去するといった対応が必要です。不適切な内容のフィルタリング: LLMが不適切な発言(暴力的・差別的内容など)を生成しないよう、入力質問や出力結果に対してコンテンツフィルタを適用してチェックできます。出力形式の統制: 回答を社内システムが処理しやすい形式(例えばJSONや決まったテンプレート)にするため、あらかじめプロンプトにテンプレートを適用してモデルに指示できます。複数モデルや機能の組合せ: 必要に応じて複数のモデルやサービスを順に呼び出すような高度なワークフローも定義できます。Orchestrationではこれらを統合し、LLM呼び出しに付随する様々な機能を組み合わせることで、信頼性の高い業務対応の結果を得ることを目指します。
このように、Orchestration機能はLLMの生の出力をそのまま使うリスクを低減し、企業利用に堪える信頼性・安全性・コンプライアンスを確保するために必要とされています。ユースケースとしては、社内ドキュメントQA(社内データでのRAG: Retrieval Augmented Generation)、顧客問い合わせの自動応答(個人情報のマスキングや不適切表現除去が必要なケース)、定型レポート生成(テンプレートに沿った出力が必要)などが挙げられます。
Orchestrationの構成要素
Orchestrationワークフローは、いくつかのモジュール(ステップ)を直列につないだパイプラインとして構成されます。
引用:SAP Learning Journey
各モジュールは特定の機能を担い、順番に実行されていきます。標準的なOrchestrationのステップには以下のものがあります。
Grounding(グラウンディング): モデルに追加コンテキストを与えるために、外部のデータソースや知識ベースから関連情報を取得するステップです。例えばユーザの質問に関連する社内ドキュメントを検索し、その結果を後続のプロンプトに組み込むことができます。Groundingモジュールにより、ドメイン固有やリアルタイムのデータをLLMプロセスに統合し、ベースモデルの知識に加えて最新かつ文脈に沿った情報を回答に反映できます。Groundingでは検索用の入力変数(例: ユーザ質問をクエリとして渡す)や、検索結果を格納する出力変数を定義し、後続のテンプレートで利用する形になります。Templating(テンプレーティング): プロンプト(モデルへの入力文)を定型フォーマットで構築するステップです。開発者がプレースホルダ付きのテンプレートを定義し、実行時に実際の値(ユーザ入力やGroundingの出力など)でそのプレースホルダを埋めて最終的なプロンプトを実行時に生成します。例えば、「以下の情報を参考にユーザーの質問に答えてください:{grounding_output} 質問: {user_question}」といったテンプレートを用意し、実行時に {grounding_output} や {user_question} を実際の値で置換します。Templatingを使うことで、プロンプトの構造をあらかじめ定め、出力フォーマットもコントロールできます。Data Masking(データマスキング): ユーザからの入力文やGroundingで取得したテキスト中に含まれる機密情報(氏名、メールアドレス、住所など)を検出し、マスク処理(匿名化や伏字化)するステップです。例えば「山田太郎」という個人名を「XXX」やダミー名に置き換えることで、モデルが生の個人情報を参照・出力しないようにします。必要に応じて特定の単語はマスク対象から除外する許可リスト(allowlist)を設定することもできます。例えば「SAP」という語は社名だがマスクしない、等です。このモジュールにより、プライバシー保護とコンプライアンス遵守を担保します。Input Filtering(入力フィルタリング): モデルに渡す前の入力内容をチェックし、不適切な内容が含まれていないか検査するステップです。SAP AI CoreのOrchestrationではマイクロソフトAzureのContent Safetyなどを活用したフィルタが提供されており、ヘイト表現や自傷行為、暴力、性的表現などいくつかのカテゴリについてしきい値を設定してフィルタリングできます。設定した基準を超える不適切な入力が検出された場合、モデル呼び出しを行わず処理を中断します。これにより、モデルが有害な入力に反応しないよう事前にブロックできます。Model Configuration(モデル設定・実行): Orchestrationの中心となるステップで、実際にLLMを呼び出します。ここでは使用するファウンデーションモデルの種類やバージョン、パラメータを指定します。Generative AI Hubでは、OpenAIやAnthropic、AWS Bedrock経由のモデルなど複数のモデルを利用できますが、OrchestrationではHarmonized API(統一API)によってこれら異なるモデルを単一の呼び出し方法で扱うことも可能です。そのため、設定上で model_name を変更するだけで背後のモデルを切り替えられ(例えば “model_name”: “gpt-35-turbo” から “model_name”: “claude-instant” に変更する等)、クライアントコードを修正する必要はありません。モデルへの入力としては、前段のTemplatingで生成された最終プロンプトが渡され、モデルの出力(回答)が次のステップへ引き継がれます。Output Filtering(出力フィルタリング): モデルから得られた回答内容をチェックし、不適切な表現や機密情報が含まれていないか検査するステップです。基本的な仕組みはInput Filteringと同様で、あらかじめ定めたコンテンツフィルタのルールに照らして出力テキストを評価します。もしモデルの回答にポリシー違反となるような内容が含まれていれば、その出力をユーザに返す前に除去・ブロックします。このステップにより、モデルが生成した内容に対しても最後のチェックを行い、安全な応答のみを提供できます。
以上がOrchestrationを構成する主なモジュール要素です。各モジュールは必要に応じて有効/無効を選択可能であり、ユースケースに合わせて柔軟にパイプラインを設計できます。例えば、社内データを使ったQAシナリオでは Grounding を有効にする、一方で公開情報のみで十分なら Grounding は省略するといった選択ができます。なおTemplatingとModel Configurationの2つは必須モジュールであり、Orchestrationワークフローから外すことはできません。それ以外の Grounding、Data Masking、Filtering の各モジュールは任意で、有効化しなければそのステップはスキップされます。Orchestrationは基本的に上記のモジュールを直線的につなぐ直列フローですが、必要なステップのみを選択的に組み込める点で柔軟性があります。
次の章では、ここまで説明した内容を実際の実機で触れて理解するという点に重きを置き、解説を続けます。なお、今回のハンズオンの内容のうち、Grounding部分については前回のブログ記事 「SAP AI Core – Generative AI Hubの新機能Groundingを解き明かす」 のグラウンディング設定に基づいて実行されていますので、完全になぞりたい場合にはそちらを実施したあとでこちらを実施してください。
Orchestrationモジュールを触ってみる
事前準備:GitHubリポジトリをクローンする
今回のハンズオンはSAP Build Code上にて実施します。Devスペースにログインしてターミナルを立ち上げ、まずはサンプルコードをクローンしましょう。
git clone https://github.com/watwatwhat/SAPAICore_Grounding_sample.git
事前準備:認証情報の設定を行う
今回のハンズオンの前提条件として、Object Store on SAP BTP (Standartプラン)のインスタンスと、SAP AI Core(Extendedプラン)のインスタンスをSAP BTP Cockpitから作成して、SAP AI LaunchpadにSAP AI Coreのインスタンスをオンボーディングしておきます。
まずは、今回のハンズオンで用いるサービス群のサービスキーとユーザー定義文字列を設定しましょう。
クローンしたファイル群の中から、下記の2つのファイルを編集します。
(この部分については、前回のハンズオン時に設定されていれば追加の設定は不要です)
credentials/ai_core_sk.json
credentials/user_defined_variable.json
1,2つ目に関しては、SAP AI Coreのインスタンスに作成したサービスキーのjson、Object Store on SAP BTP のインスタンスに作成したサービスキーのjsonをペーストしてください。3つ目に関しては、任意の値を入力してください。使える文字には制限があるようなので、特にこだわりがなければデフォルトと同じような名前をつけることを推奨します。IDの文字が規定に沿っていないという旨のエラーが後段で出た場合、この辺りを設定し直してください。
事前準備:オーケストレーション設定・実行用のDeploymentを作成する
SAP Build Codeの新規ターミナルで、下記のコマンドを実行してください。
node 02_orchestration/01_prerequisites/01_createOrchDeployment.js deploy
このコマンドで実行されるnodeスクリプトでは、SAP AI CoreのAPIを呼び出し、ConfigurationとDeploymentというオブジェクトを生成しています。この結果、Orchestrationの設定やワークフローの実行を行うことのできるAPIエンドポイントを発行します。
次に、対象ソースコードを一部抜粋します。
// Configuration作成
async function createConfiguration(token) {
const url = `${AI_API_HOST}/v2/lm/configurations`;
const payload = {
name: “orchestration-config”,
executableId: “orchestration”,
scenarioId: “orchestration”
};
const res = await axios.post(url, payload, {
headers: {
Authorization: `Bearer ${token}`,
‘ai-resource-group’: resourceGroupId,
‘Content-Type’: ‘application/json’
}
});
console.log(” Configuration 作成完了:”, res.data.id);
return res.data.id;
}
// Deployment作成
async function createDeployment(token, configurationId) {
const url = `${AI_API_HOST}/v2/lm/deployments`;
const payload = {
configurationId
};
const res = await axios.post(url, payload, {
headers: {
Authorization: `Bearer ${token}`,
‘ai-resource-group’: resourceGroupId,
‘Content-Type’: ‘application/json’
}
});
const deploymentId = res.data.id;
console.log(” Deployment スケジュール完了:”, deploymentId);
// orchDeploymentId を保存
const currentVars = JSON.parse(fs.readFileSync(userDefinedPath, ‘utf8’));
currentVars.orchDeploymentId = deploymentId;
fs.writeFileSync(userDefinedPath, JSON.stringify(currentVars, null, 2), ‘utf8’);
console.log(” orchDeploymentId を user_defined_variable.json に保存しました。”);
return deploymentId;
}
その後、下記のコマンドを実行してください。Deploymentsの生成にはしばらく時間がかかるため、DeploymentのステータスがPENDINGからRUNNINGに変わるまで、数分おきに何度か実行する必要があります。
node 02_orchestration/01_prerequisites/01_createOrchDeployment.js check
ステータスがRUNNINGに変わると、credentials/user_defined_variable.jsonにOrchestration用のDeploymentのIDとURLが保存されます。
{
“resourceGroupId”: “deepdive”,
“secretName”: “deepdive-amazons3-secret”,
“orchDeploymentId”: “<DeploymentID>”,
“orchDeploymentUrl”: “https://<host>/v2/inference/deployments/<DeploymentID>”
}
これで前準備は完了です。
ここまでの作業を行うと、SAP AI LaunchpadにもConfigurationとDeploymentが追加されていることが確認できるようになります。
次の章では、SAP AI Launchpadから、具体的なOrchestrationワークフローの設定を行なっていきます。
Orchestrationワークフローを設定する
ワークフロー設定の概要を理解する
それでは、SAP AI LaunchpadのGenerative AI Hub -> Orchestrationに移動しましょう。下記のような画面が表示されるはずです。
画面中央で横に伸びているのが、Orchestrationワークフローのパイプラインです。Grounding -> Templating -> Data Masking -> Input Filtering -> Model Configuration -> Output Filtering と順に繋がっていきます。
右上にはワークフローの設定に関する管理関係のボタンが配置されています。Downloadボタンをクリックすると、現状の設定をjsonファイルとしてエクスポートすることができます(後ほど触ります)。逆に、Uploadボタンを使うと外部に用意されたOrchestration設定用のjsonファイルをインポートすることができます。
Edit Workflowボタンをクリックすると、次のようなポップアップが立ち上がります。
これは、Orchestrationワークフローのモジュールのうち、どれを有効化・無効化するかを選択する画面になっています。画面からも分かるとおり、TemplatingとModel Configurationに関してはOFFにできず、必須の扱いとなります。
それでは早速内容を設定していきましょう。
Groundingモジュールの設定
まずは、Groundingと書かれたアイコンをクリックします。すると、下記のようにGroundingに関する設定項目を操作できるようになります。
ここでは、Groundingモジュールに対する入力・出力・データリポジトリを設定する形になります。
入力はDeploymentのAPIがユーザーから受け入れる値、OutputはGroundingの結果として後続のTemplatingモジュールに渡す値、データリポジトリは参照する知識DBを意味します。例えば、下記のように設定ができます。
入力値には「question(ユーザーからの質問)」、出力値には「related_fragments(関連する文書の断片のリスト)」、データリポジトリには「folkTales(昔話リポジトリ)」を設定しています。なお、folkTaleデータリポジトリの詳細は前回のブログを参照してください。ここには、桃太郎のテキストデータを細分化して格納してあります。
Templatingモジュールの設定
次に、Templatingモジュールを設定します。これはLLMへ送信するプロンプトを設定する画面です。
今回は、下記のようなプロンプトを設定しています。
You are a helpful assistant. n
Please respond to user’s question based on related contexts. nn
User’s question: {{?question}} n
Related contexts are as follows: {{?related_fragments}}
なお、{{?question}}と{{?related_fragments}}に関してはGroundingモジュールから渡されるデータに対するプレ−スホルダーであり、実行時にこちらに実際のあたいが補完される動きとなります。
Data Maskingモジュールの設定
このモジュールでは、入力されたデータの中に秘匿性の高い情報が含まれている場合に、データをマスキングして隠蔽することができます。いくつかのデータの種類が定義されており、この中から選択することで重要なデータがモデルにより処理されることを防止することができます。
Input Filteringモジュールの設定
このモジュールでは、LLMへの入力値について、差別や自傷行為、性的な内容、暴力的な内容などのフィルタリングを行うことができます。この閾値を満たさないような(適切でない)プロンプトに関しては、LLMによる処理が開始される前にリクエストが失敗となります。
Model Configurationモジュールの設定
このモジュールでは、Orchestrationワークフローの中で利用するモデルを選択することができます。Generative AI Hub上で利用することの可能なモデルを、ポップアップメニューの中から選択する形で、設定することができます。
Output Filteringモジュールの設定
最後に、Output側のフィルタリング設定を行います。基本的な仕組みはInput側と同じですが、LLMから返された、生成された内容に関して、差別や自傷行為、性的な内容、暴力的な内容などのフィルタリングを行うことができ、不適切と判定された場合にはAPIリクエストの返り値として返す前にリクエストを失敗させます。
設定の振り返り
ここまでの設定を行うと、下記のようなOrchestrationワークフロー設定のJSONが生成されます。
こちらは後で利用しますので、右上のDownloadボタンから設定をダウンロードしておいてください。
オーケストレーション設定の実行をテストする
右上のTestボタンをクリックすると、今設定したOrchestrationワークフローが期待通りに動作するかを確認することができます。
Input Variables配下にはGroundingモジュールで設定した入力値の入力欄が表示されているはずです。ここに入力値を設定することで、任意の入力に対するテストが可能です。
また、Message History欄にはこれまでの会話の履歴をモックとして設定することができます。LLMに記憶を持たせるような処理をする場合には、こちらで有効にテストが可能となります。
必要事項を入力後、Runボタンをクリックすると、Response部分に返答が返ってくるという使い方になります。
また、Traceタブを開くと各モジュールでの実行結果を確認することができます。この例では、無事folkTaleデータリポジトリ内に格納されている桃太郎のデータを取得し、それに基づいてレスポンスデータが生成されていること、会話履歴についてもLLMに渡されていることが確認できます。
APIからOrchestrationワークフローを経由したLLMのレスポンスを取得する
さて、ここまででSAP AI LaunchpadからOrchestrationワークフローの設定を行いましたが、これをAPI経由で利用して、アプリケーションなどのプログラムから利用できるようにしていきましょう。
下記の設定ファイルに、先ほどダウンロードしたOrchestration設定jsonファイルの内容をコピーします。
02_orchestration/02_orchestration/ModelOrchConfig.json
Orchestration用のDeploymentに対してワークフローを実行させる際、どのようなワークフローなのかをこのjsonを渡して伝えるような実行イメージになります。
次に、Orchestration用のDeploymentに対してAPIリクエストを発行しましょう。次のnodeスクリプトを実行してください。
node ./02_orchestration/02_orchestration/01_callOrchEndpoint.js “桃から生まれたのは誰?”
今回のnodeスクリプトでは、引数として質問を受け付けるようにしています。このスクリプトの中では、下記のようにAPIリクエストを発行しています。ここでのorchestrationConfigに対して、先ほどから扱っているOrchestrationワークフローの設定jsonがそのまま代入されるようになっています。
// Orchestrationエンドポイント呼び出し
async function callOrchestrationCompletion(token, userInputParams) {
const url = `${deploymentUrl}/completion`;
const payload = {
orchestration_config: orchestrationConfig,
input_params: userInputParams,
};
const res = await axios.post(url, payload, {
headers: {
Authorization: `Bearer ${token}`,
‘ai-resource-group’: resourceGroupId,
‘Content-Type’: ‘application/json’
},
});
console.log(” 応答:”);
console.dir(res.data, { depth: null });
}
無事に実行が完了すると、下記のようなレスポンスが表示されます。
無事に質問に対する回答が得られ、かつその回答がfolkTaleデータリポジトリ内の文書に基づいて生成されていることが確認できます。
外部のアプリケーションからこのエンドポイントを利用する際には、こちらのステップで呼び出しているエンドポイントを呼び出せばOKということになります。SAP AI Coreでは統一APIが提供されており、RESTエンドポイント経由でOrchestrationを呼び出す場合は、上記のようにデプロイ時に取得したエンドポイントURLに対してHTTPリクエストを送ります。リクエストのボディにはユーザからの入力や必要なパラメータを含めます。Python SDKを利用する場合、generative-ai-hub-sdk のOrchestrationクライアントを使い、chatCompletion() メソッドで推論を実行できます。詳細は、@sap-ai-sdk/orchestrationのGitHubに用意されたREADME.mdをご参照ください。(参考文献にリンクを記載)
ベストプラクティスやトラブルシューティングのヒント
最後に、SAP AI Core のOrchestration機能を効果的に活用するためのベストプラクティスについていくつかヒントを共有します。
ベストプラクティス
ユースケースに合ったモジュール構成: Orchestrationのモジュールは必要なものだけ有効化し、不要なものは省略することでシンプルかつ高速なパイプラインになります。例えば、内部データの利用が不要な場合はGroundingをオフにする、出力内容が必ず社内ルールに沿うならOutput Filteringを簡略化する、といった調整をします。ただしTemplatingとModel Configは必須モジュールなので外せません。テンプレートで実現できることはできるだけテンプレートに含め、不要なカスタムロジックは避けるのがコツです。プロンプトテンプレートの活用: テンプレート設計は生成AIの精度と一貫性に直結します。プレースホルダを使って入力やコンテキストを適切に配置し、モデルに明確な指示やフォーマット要求を伝えましょう。例えば「回答は50文字以内で箇条書きで出力してください」などの要件もテンプレートに組み込みます。テンプレートはLaunchpadの「Prompt Editor」や「Prompt Management」で事前に管理することも可能なので、複数のOrchestrationで共通のテンプレートを使い回す場合は登録しておくと便利です。コンテンツフィルタのチューニング: Content Filteringは強力ですが、ビジネスニーズに合わせてフィルタの厳しさを調整する必要があります。例えばある程度率直な表現を許容するなら各カテゴリのしきい値を緩めに設定し、逆に厳格なトーンが求められる場合は厳しく設定します。Azure Content Safetyベースのフィルタでは0~2のレベルで許容度を指定できます(数値が小さいほど厳格)。初期設定では一般に「2」(Medium)程度ですが、ユースケースに応じて微調整しましょう。また、フィルタが意図しない単語までブロックしてしまう場合はAllowリストに追加して除外することも検討してください。データマスキングと社内規約遵守: Orchestrationは個人情報や機密データを扱うシナリオで真価を発揮します。自社で定義した機密情報カテゴリに合わせてマスクルールを設定しましょう。ドメイン知識の組み込み: Groundingモジュールを使って社内ナレッジをモデルに提供する場合、データソースの質と関連性が重要です。ベクトルデータベースに登録する文章は最新かつ正確なものに更新しておき、検索クエリの作り方(ユーザ質問をそのまま使うのか、キーワード抽出するのか等)も工夫しましょう。必要ならGroundingの前にユーザ質問に対する前処理(例: キーワード抽出や言語検出)を行ってからGroundingに渡すと効果的です。Groundingで取得した情報量が多すぎるとプロンプト長が増えすぎて逆効果になる場合もありますので、結果の上位何件までを使うか等も調整してください。モデルパラメータ最適化: Model Configurationではモデルのパラメータ(温度、最大トークン長、トップPなど)を指定できます。これらは生成結果の品質に影響するため、ユースケースに応じて適切に設定しましょう。例えば創造的な文章が必要な場合はtemperatureを高めに、定型的な回答で良い場合は低めに設定するといった具合です。パラメータチューニングもLaunchpadのテスト機能を使って何度か試行しながら詰めていくと良いでしょう。逐次実行 vs 並列実行: 現状のOrchestrationパイプラインは基本的に逐次実行ですが、将来的により高度なフローを構築したい場合、例えば複数のモデル応答を比較して最適なものを選ぶといったロジックはOrchestrationの範囲外になります。そのような場合はアプリケーション側で複数のOrchestrationを個別に呼び出し、その結果を集約する制御を行うなど、Orchestrationとアプリケーションロジックを組み合わせて実現しましょう。
おわりに
SAP AI CoreのOrchestration機能は、生成AIをより安全かつ実用的に業務へ組み込むための強力な仕組みです。Groundingやテンプレーティング、マスキング、フィルタリングなどの機能を活用することで、企業利用にふさわしい精度とコンプライアンスを確保したAI応答を実現できます。
設定自体もSAP AI LaunchpadのGUIから直感的に行えるため、初めての方でも比較的スムーズに構築できます。ぜひ本記事を参考に、実際にOrchestrationの設定やAPIからの呼び出しを試してみてください。
免責事項
本ブログに記載されているすべての見解および意見は、私個人のものであり、個人的な立場で述べられたものです。SAPは、本ブログに掲載された内容について一切の責任を負いませんので、あらかじめご了承ください。
参考文献
GitHub:SAP/ai-sdk-js/orchestration(オーケストレーションの全般説明)
https://github.com/SAP/ai-sdk-js/blob/main/packages/orchestration/README.mdSAP Learning:Exploring the Role of the Orchestration Service
https://learning.sap.com/learning-journeys/using-advanced-ai-techniques-with-sap-s-generative-ai-hub/exploring-the-role-of-the-orchestration-service
Orchestration機能の概要SAP BTP上の SAP AI Coreが提供するOrchestration機能は、大規模言語モデル(LLM)の推論処理に必要な前後処理をまとめて一括実行できる仕組みです。単にモデルに問い合わせを行うだけでなく、その前後でデータの下準備(前処理)や結果のフィルタリング(後処理)を組み合わせ、1回のAPIコールで一連の処理を完了できます。これにより、LLMを企業システムで使う際に求められる様々な機能(コンテキスト付与やコンテンツ検閲など)を統合し、安全でビジネスに適した応答を得ることが可能となります。特に生成AIを業務シナリオに組み込む場合、次のような課題に対応する必要があります。ドメイン知識の反映: 基盤となるLLMは汎用知識を持ちますが、そのままでは企業固有の専門知識が不足しがちです。Orchestrationの中で追加コンテキストを提供することで、モデルにビジネス文脈を与えられます。機密データの保護: ユーザ入力や出力に個人情報や機密情報が含まれる場合、事前にマスキングしてモデルに渡す、あるいは結果から除去するといった対応が必要です。不適切な内容のフィルタリング: LLMが不適切な発言(暴力的・差別的内容など)を生成しないよう、入力質問や出力結果に対してコンテンツフィルタを適用してチェックできます。出力形式の統制: 回答を社内システムが処理しやすい形式(例えばJSONや決まったテンプレート)にするため、あらかじめプロンプトにテンプレートを適用してモデルに指示できます。複数モデルや機能の組合せ: 必要に応じて複数のモデルやサービスを順に呼び出すような高度なワークフローも定義できます。Orchestrationではこれらを統合し、LLM呼び出しに付随する様々な機能を組み合わせることで、信頼性の高い業務対応の結果を得ることを目指します。このように、Orchestration機能はLLMの生の出力をそのまま使うリスクを低減し、企業利用に堪える信頼性・安全性・コンプライアンスを確保するために必要とされています。ユースケースとしては、社内ドキュメントQA(社内データでのRAG: Retrieval Augmented Generation)、顧客問い合わせの自動応答(個人情報のマスキングや不適切表現除去が必要なケース)、定型レポート生成(テンプレートに沿った出力が必要)などが挙げられます。Orchestrationの構成要素Orchestrationワークフローは、いくつかのモジュール(ステップ)を直列につないだパイプラインとして構成されます。引用:SAP Learning Journey 各モジュールは特定の機能を担い、順番に実行されていきます。標準的なOrchestrationのステップには以下のものがあります。Grounding(グラウンディング): モデルに追加コンテキストを与えるために、外部のデータソースや知識ベースから関連情報を取得するステップです。例えばユーザの質問に関連する社内ドキュメントを検索し、その結果を後続のプロンプトに組み込むことができます。Groundingモジュールにより、ドメイン固有やリアルタイムのデータをLLMプロセスに統合し、ベースモデルの知識に加えて最新かつ文脈に沿った情報を回答に反映できます。Groundingでは検索用の入力変数(例: ユーザ質問をクエリとして渡す)や、検索結果を格納する出力変数を定義し、後続のテンプレートで利用する形になります。Templating(テンプレーティング): プロンプト(モデルへの入力文)を定型フォーマットで構築するステップです。開発者がプレースホルダ付きのテンプレートを定義し、実行時に実際の値(ユーザ入力やGroundingの出力など)でそのプレースホルダを埋めて最終的なプロンプトを実行時に生成します。例えば、「以下の情報を参考にユーザーの質問に答えてください:{grounding_output} 質問: {user_question}」といったテンプレートを用意し、実行時に {grounding_output} や {user_question} を実際の値で置換します。Templatingを使うことで、プロンプトの構造をあらかじめ定め、出力フォーマットもコントロールできます。Data Masking(データマスキング): ユーザからの入力文やGroundingで取得したテキスト中に含まれる機密情報(氏名、メールアドレス、住所など)を検出し、マスク処理(匿名化や伏字化)するステップです。例えば「山田太郎」という個人名を「XXX」やダミー名に置き換えることで、モデルが生の個人情報を参照・出力しないようにします。必要に応じて特定の単語はマスク対象から除外する許可リスト(allowlist)を設定することもできます。例えば「SAP」という語は社名だがマスクしない、等です。このモジュールにより、プライバシー保護とコンプライアンス遵守を担保します。Input Filtering(入力フィルタリング): モデルに渡す前の入力内容をチェックし、不適切な内容が含まれていないか検査するステップです。SAP AI CoreのOrchestrationではマイクロソフトAzureのContent Safetyなどを活用したフィルタが提供されており、ヘイト表現や自傷行為、暴力、性的表現などいくつかのカテゴリについてしきい値を設定してフィルタリングできます。設定した基準を超える不適切な入力が検出された場合、モデル呼び出しを行わず処理を中断します。これにより、モデルが有害な入力に反応しないよう事前にブロックできます。Model Configuration(モデル設定・実行): Orchestrationの中心となるステップで、実際にLLMを呼び出します。ここでは使用するファウンデーションモデルの種類やバージョン、パラメータを指定します。Generative AI Hubでは、OpenAIやAnthropic、AWS Bedrock経由のモデルなど複数のモデルを利用できますが、OrchestrationではHarmonized API(統一API)によってこれら異なるモデルを単一の呼び出し方法で扱うことも可能です。そのため、設定上で model_name を変更するだけで背後のモデルを切り替えられ(例えば “model_name”: “gpt-35-turbo” から “model_name”: “claude-instant” に変更する等)、クライアントコードを修正する必要はありません。モデルへの入力としては、前段のTemplatingで生成された最終プロンプトが渡され、モデルの出力(回答)が次のステップへ引き継がれます。Output Filtering(出力フィルタリング): モデルから得られた回答内容をチェックし、不適切な表現や機密情報が含まれていないか検査するステップです。基本的な仕組みはInput Filteringと同様で、あらかじめ定めたコンテンツフィルタのルールに照らして出力テキストを評価します。もしモデルの回答にポリシー違反となるような内容が含まれていれば、その出力をユーザに返す前に除去・ブロックします。このステップにより、モデルが生成した内容に対しても最後のチェックを行い、安全な応答のみを提供できます。以上がOrchestrationを構成する主なモジュール要素です。各モジュールは必要に応じて有効/無効を選択可能であり、ユースケースに合わせて柔軟にパイプラインを設計できます。例えば、社内データを使ったQAシナリオでは Grounding を有効にする、一方で公開情報のみで十分なら Grounding は省略するといった選択ができます。なおTemplatingとModel Configurationの2つは必須モジュールであり、Orchestrationワークフローから外すことはできません。それ以外の Grounding、Data Masking、Filtering の各モジュールは任意で、有効化しなければそのステップはスキップされます。Orchestrationは基本的に上記のモジュールを直線的につなぐ直列フローですが、必要なステップのみを選択的に組み込める点で柔軟性があります。次の章では、ここまで説明した内容を実際の実機で触れて理解するという点に重きを置き、解説を続けます。なお、今回のハンズオンの内容のうち、Grounding部分については前回のブログ記事 「SAP AI Core – Generative AI Hubの新機能Groundingを解き明かす」 のグラウンディング設定に基づいて実行されていますので、完全になぞりたい場合にはそちらを実施したあとでこちらを実施してください。前回のブログ記事はこちら→:https://community.sap.com/t5/technology-blogs-by-sap/sap-ai-core-generative-ai-hub%E3%81%AE%E6%96%B0%E6%A9%9F%E8%83%BDgrounding%E3%82%92%E8%A7%A3%E3%81%8D%E6%98%8E%E3%81%8B%E3%81%99/ba-p/14065096Orchestrationモジュールを触ってみる事前準備:GitHubリポジトリをクローンする今回のハンズオンはSAP Build Code上にて実施します。Devスペースにログインしてターミナルを立ち上げ、まずはサンプルコードをクローンしましょう。git clone https://github.com/watwatwhat/SAPAICore_Grounding_sample.git事前準備:認証情報の設定を行う今回のハンズオンの前提条件として、Object Store on SAP BTP (Standartプラン)のインスタンスと、SAP AI Core(Extendedプラン)のインスタンスをSAP BTP Cockpitから作成して、SAP AI LaunchpadにSAP AI Coreのインスタンスをオンボーディングしておきます。まずは、今回のハンズオンで用いるサービス群のサービスキーとユーザー定義文字列を設定しましょう。クローンしたファイル群の中から、下記の2つのファイルを編集します。(この部分については、前回のハンズオン時に設定されていれば追加の設定は不要です)credentials/ai_core_sk.json
credentials/user_defined_variable.json1,2つ目に関しては、SAP AI Coreのインスタンスに作成したサービスキーのjson、Object Store on SAP BTP のインスタンスに作成したサービスキーのjsonをペーストしてください。3つ目に関しては、任意の値を入力してください。使える文字には制限があるようなので、特にこだわりがなければデフォルトと同じような名前をつけることを推奨します。IDの文字が規定に沿っていないという旨のエラーが後段で出た場合、この辺りを設定し直してください。 事前準備:オーケストレーション設定・実行用のDeploymentを作成するSAP Build Codeの新規ターミナルで、下記のコマンドを実行してください。node 02_orchestration/01_prerequisites/01_createOrchDeployment.js deployこのコマンドで実行されるnodeスクリプトでは、SAP AI CoreのAPIを呼び出し、ConfigurationとDeploymentというオブジェクトを生成しています。この結果、Orchestrationの設定やワークフローの実行を行うことのできるAPIエンドポイントを発行します。次に、対象ソースコードを一部抜粋します。// Configuration作成
async function createConfiguration(token) {
const url = `${AI_API_HOST}/v2/lm/configurations`;
const payload = {
name: “orchestration-config”,
executableId: “orchestration”,
scenarioId: “orchestration”
};
const res = await axios.post(url, payload, {
headers: {
Authorization: `Bearer ${token}`,
‘ai-resource-group’: resourceGroupId,
‘Content-Type’: ‘application/json’
}
});
console.log(” Configuration 作成完了:”, res.data.id);
return res.data.id;
}
// Deployment作成
async function createDeployment(token, configurationId) {
const url = `${AI_API_HOST}/v2/lm/deployments`;
const payload = {
configurationId
};
const res = await axios.post(url, payload, {
headers: {
Authorization: `Bearer ${token}`,
‘ai-resource-group’: resourceGroupId,
‘Content-Type’: ‘application/json’
}
});
const deploymentId = res.data.id;
console.log(” Deployment スケジュール完了:”, deploymentId);
// orchDeploymentId を保存
const currentVars = JSON.parse(fs.readFileSync(userDefinedPath, ‘utf8’));
currentVars.orchDeploymentId = deploymentId;
fs.writeFileSync(userDefinedPath, JSON.stringify(currentVars, null, 2), ‘utf8’);
console.log(” orchDeploymentId を user_defined_variable.json に保存しました。”);
return deploymentId;
} その後、下記のコマンドを実行してください。Deploymentsの生成にはしばらく時間がかかるため、DeploymentのステータスがPENDINGからRUNNINGに変わるまで、数分おきに何度か実行する必要があります。node 02_orchestration/01_prerequisites/01_createOrchDeployment.js checkステータスがRUNNINGに変わると、credentials/user_defined_variable.jsonにOrchestration用のDeploymentのIDとURLが保存されます。{
“resourceGroupId”: “deepdive”,
“secretName”: “deepdive-amazons3-secret”,
“orchDeploymentId”: “<DeploymentID>”,
“orchDeploymentUrl”: “https://<host>/v2/inference/deployments/<DeploymentID>”
}これで前準備は完了です。ここまでの作業を行うと、SAP AI LaunchpadにもConfigurationとDeploymentが追加されていることが確認できるようになります。 次の章では、SAP AI Launchpadから、具体的なOrchestrationワークフローの設定を行なっていきます。 Orchestrationワークフローを設定するワークフロー設定の概要を理解するそれでは、SAP AI LaunchpadのGenerative AI Hub -> Orchestrationに移動しましょう。下記のような画面が表示されるはずです。画面中央で横に伸びているのが、Orchestrationワークフローのパイプラインです。Grounding -> Templating -> Data Masking -> Input Filtering -> Model Configuration -> Output Filtering と順に繋がっていきます。右上にはワークフローの設定に関する管理関係のボタンが配置されています。Downloadボタンをクリックすると、現状の設定をjsonファイルとしてエクスポートすることができます(後ほど触ります)。逆に、Uploadボタンを使うと外部に用意されたOrchestration設定用のjsonファイルをインポートすることができます。Edit Workflowボタンをクリックすると、次のようなポップアップが立ち上がります。 これは、Orchestrationワークフローのモジュールのうち、どれを有効化・無効化するかを選択する画面になっています。画面からも分かるとおり、TemplatingとModel Configurationに関してはOFFにできず、必須の扱いとなります。それでは早速内容を設定していきましょう。 Groundingモジュールの設定まずは、Groundingと書かれたアイコンをクリックします。すると、下記のようにGroundingに関する設定項目を操作できるようになります。ここでは、Groundingモジュールに対する入力・出力・データリポジトリを設定する形になります。入力はDeploymentのAPIがユーザーから受け入れる値、OutputはGroundingの結果として後続のTemplatingモジュールに渡す値、データリポジトリは参照する知識DBを意味します。例えば、下記のように設定ができます。入力値には「question(ユーザーからの質問)」、出力値には「related_fragments(関連する文書の断片のリスト)」、データリポジトリには「folkTales(昔話リポジトリ)」を設定しています。なお、folkTaleデータリポジトリの詳細は前回のブログを参照してください。ここには、桃太郎のテキストデータを細分化して格納してあります。 Templatingモジュールの設定次に、Templatingモジュールを設定します。これはLLMへ送信するプロンプトを設定する画面です。今回は、下記のようなプロンプトを設定しています。You are a helpful assistant. n
Please respond to user’s question based on related contexts. nn
User’s question: {{?question}} n
Related contexts are as follows: {{?related_fragments}}なお、{{?question}}と{{?related_fragments}}に関してはGroundingモジュールから渡されるデータに対するプレ−スホルダーであり、実行時にこちらに実際のあたいが補完される動きとなります。 Data Maskingモジュールの設定このモジュールでは、入力されたデータの中に秘匿性の高い情報が含まれている場合に、データをマスキングして隠蔽することができます。いくつかのデータの種類が定義されており、この中から選択することで重要なデータがモデルにより処理されることを防止することができます。 Input Filteringモジュールの設定このモジュールでは、LLMへの入力値について、差別や自傷行為、性的な内容、暴力的な内容などのフィルタリングを行うことができます。この閾値を満たさないような(適切でない)プロンプトに関しては、LLMによる処理が開始される前にリクエストが失敗となります。 Model Configurationモジュールの設定このモジュールでは、Orchestrationワークフローの中で利用するモデルを選択することができます。Generative AI Hub上で利用することの可能なモデルを、ポップアップメニューの中から選択する形で、設定することができます。 Output Filteringモジュールの設定最後に、Output側のフィルタリング設定を行います。基本的な仕組みはInput側と同じですが、LLMから返された、生成された内容に関して、差別や自傷行為、性的な内容、暴力的な内容などのフィルタリングを行うことができ、不適切と判定された場合にはAPIリクエストの返り値として返す前にリクエストを失敗させます。 設定の振り返りここまでの設定を行うと、下記のようなOrchestrationワークフロー設定のJSONが生成されます。こちらは後で利用しますので、右上のDownloadボタンから設定をダウンロードしておいてください。 オーケストレーション設定の実行をテストする右上のTestボタンをクリックすると、今設定したOrchestrationワークフローが期待通りに動作するかを確認することができます。Input Variables配下にはGroundingモジュールで設定した入力値の入力欄が表示されているはずです。ここに入力値を設定することで、任意の入力に対するテストが可能です。また、Message History欄にはこれまでの会話の履歴をモックとして設定することができます。LLMに記憶を持たせるような処理をする場合には、こちらで有効にテストが可能となります。必要事項を入力後、Runボタンをクリックすると、Response部分に返答が返ってくるという使い方になります。また、Traceタブを開くと各モジュールでの実行結果を確認することができます。この例では、無事folkTaleデータリポジトリ内に格納されている桃太郎のデータを取得し、それに基づいてレスポンスデータが生成されていること、会話履歴についてもLLMに渡されていることが確認できます。 APIからOrchestrationワークフローを経由したLLMのレスポンスを取得するさて、ここまででSAP AI LaunchpadからOrchestrationワークフローの設定を行いましたが、これをAPI経由で利用して、アプリケーションなどのプログラムから利用できるようにしていきましょう。下記の設定ファイルに、先ほどダウンロードしたOrchestration設定jsonファイルの内容をコピーします。02_orchestration/02_orchestration/ModelOrchConfig.jsonOrchestration用のDeploymentに対してワークフローを実行させる際、どのようなワークフローなのかをこのjsonを渡して伝えるような実行イメージになります。次に、Orchestration用のDeploymentに対してAPIリクエストを発行しましょう。次のnodeスクリプトを実行してください。node ./02_orchestration/02_orchestration/01_callOrchEndpoint.js “桃から生まれたのは誰?”今回のnodeスクリプトでは、引数として質問を受け付けるようにしています。このスクリプトの中では、下記のようにAPIリクエストを発行しています。ここでのorchestrationConfigに対して、先ほどから扱っているOrchestrationワークフローの設定jsonがそのまま代入されるようになっています。// Orchestrationエンドポイント呼び出し
async function callOrchestrationCompletion(token, userInputParams) {
const url = `${deploymentUrl}/completion`;
const payload = {
orchestration_config: orchestrationConfig,
input_params: userInputParams,
};
const res = await axios.post(url, payload, {
headers: {
Authorization: `Bearer ${token}`,
‘ai-resource-group’: resourceGroupId,
‘Content-Type’: ‘application/json’
},
});
console.log(” 応答:”);
console.dir(res.data, { depth: null });
}無事に実行が完了すると、下記のようなレスポンスが表示されます。無事に質問に対する回答が得られ、かつその回答がfolkTaleデータリポジトリ内の文書に基づいて生成されていることが確認できます。外部のアプリケーションからこのエンドポイントを利用する際には、こちらのステップで呼び出しているエンドポイントを呼び出せばOKということになります。SAP AI Coreでは統一APIが提供されており、RESTエンドポイント経由でOrchestrationを呼び出す場合は、上記のようにデプロイ時に取得したエンドポイントURLに対してHTTPリクエストを送ります。リクエストのボディにはユーザからの入力や必要なパラメータを含めます。Python SDKを利用する場合、generative-ai-hub-sdk のOrchestrationクライアントを使い、chatCompletion() メソッドで推論を実行できます。詳細は、@sap-ai-sdk/orchestrationのGitHubに用意されたREADME.mdをご参照ください。(参考文献にリンクを記載) ベストプラクティスやトラブルシューティングのヒント最後に、SAP AI Core のOrchestration機能を効果的に活用するためのベストプラクティスについていくつかヒントを共有します。ベストプラクティスユースケースに合ったモジュール構成: Orchestrationのモジュールは必要なものだけ有効化し、不要なものは省略することでシンプルかつ高速なパイプラインになります。例えば、内部データの利用が不要な場合はGroundingをオフにする、出力内容が必ず社内ルールに沿うならOutput Filteringを簡略化する、といった調整をします。ただしTemplatingとModel Configは必須モジュールなので外せません。テンプレートで実現できることはできるだけテンプレートに含め、不要なカスタムロジックは避けるのがコツです。プロンプトテンプレートの活用: テンプレート設計は生成AIの精度と一貫性に直結します。プレースホルダを使って入力やコンテキストを適切に配置し、モデルに明確な指示やフォーマット要求を伝えましょう。例えば「回答は50文字以内で箇条書きで出力してください」などの要件もテンプレートに組み込みます。テンプレートはLaunchpadの「Prompt Editor」や「Prompt Management」で事前に管理することも可能なので、複数のOrchestrationで共通のテンプレートを使い回す場合は登録しておくと便利です。コンテンツフィルタのチューニング: Content Filteringは強力ですが、ビジネスニーズに合わせてフィルタの厳しさを調整する必要があります。例えばある程度率直な表現を許容するなら各カテゴリのしきい値を緩めに設定し、逆に厳格なトーンが求められる場合は厳しく設定します。Azure Content Safetyベースのフィルタでは0~2のレベルで許容度を指定できます(数値が小さいほど厳格)。初期設定では一般に「2」(Medium)程度ですが、ユースケースに応じて微調整しましょう。また、フィルタが意図しない単語までブロックしてしまう場合はAllowリストに追加して除外することも検討してください。データマスキングと社内規約遵守: Orchestrationは個人情報や機密データを扱うシナリオで真価を発揮します。自社で定義した機密情報カテゴリに合わせてマスクルールを設定しましょう。ドメイン知識の組み込み: Groundingモジュールを使って社内ナレッジをモデルに提供する場合、データソースの質と関連性が重要です。ベクトルデータベースに登録する文章は最新かつ正確なものに更新しておき、検索クエリの作り方(ユーザ質問をそのまま使うのか、キーワード抽出するのか等)も工夫しましょう。必要ならGroundingの前にユーザ質問に対する前処理(例: キーワード抽出や言語検出)を行ってからGroundingに渡すと効果的です。Groundingで取得した情報量が多すぎるとプロンプト長が増えすぎて逆効果になる場合もありますので、結果の上位何件までを使うか等も調整してください。モデルパラメータ最適化: Model Configurationではモデルのパラメータ(温度、最大トークン長、トップPなど)を指定できます。これらは生成結果の品質に影響するため、ユースケースに応じて適切に設定しましょう。例えば創造的な文章が必要な場合はtemperatureを高めに、定型的な回答で良い場合は低めに設定するといった具合です。パラメータチューニングもLaunchpadのテスト機能を使って何度か試行しながら詰めていくと良いでしょう。逐次実行 vs 並列実行: 現状のOrchestrationパイプラインは基本的に逐次実行ですが、将来的により高度なフローを構築したい場合、例えば複数のモデル応答を比較して最適なものを選ぶといったロジックはOrchestrationの範囲外になります。そのような場合はアプリケーション側で複数のOrchestrationを個別に呼び出し、その結果を集約する制御を行うなど、Orchestrationとアプリケーションロジックを組み合わせて実現しましょう。おわりにSAP AI CoreのOrchestration機能は、生成AIをより安全かつ実用的に業務へ組み込むための強力な仕組みです。Groundingやテンプレーティング、マスキング、フィルタリングなどの機能を活用することで、企業利用にふさわしい精度とコンプライアンスを確保したAI応答を実現できます。設定自体もSAP AI LaunchpadのGUIから直感的に行えるため、初めての方でも比較的スムーズに構築できます。ぜひ本記事を参考に、実際にOrchestrationの設定やAPIからの呼び出しを試してみてください。 免責事項本ブログに記載されているすべての見解および意見は、私個人のものであり、個人的な立場で述べられたものです。SAPは、本ブログに掲載された内容について一切の責任を負いませんので、あらかじめご了承ください。 参考文献GitHub:SAP/ai-sdk-js/orchestration(オーケストレーションの全般説明)https://github.com/SAP/ai-sdk-js/blob/main/packages/orchestration/README.mdSAP Learning:Exploring the Role of the Orchestration Servicehttps://learning.sap.com/learning-journeys/using-advanced-ai-techniques-with-sap-s-generative-ai-hub/exploring-the-role-of-the-orchestration-service Read More Technology Blogs by SAP articles
#SAP
#SAPTechnologyblog