Connect REST API のおかげで、Salesforce プラットフォーム内でプログラムによってプロンプト テンプレートを呼び出すことができるだけでなく、サードパーティ システムからも呼び出すことができるようになりました。
プロンプトテンプレートは、生成AI機能をアプリケーションやワークフローに統合するために使用されます。Einstein 1 Studio AI開発ツールスイートの一部であるPrompt Builderで作成できます。プロンプトテンプレートを呼び出すと、まずテンプレートが解決され、プロンプトテンプレート内のすべてのデータ参照(差し込み項目、関連リスト、フロー、Apexなど)が提示されます。その後、Einstein Trust Layerを介して送信され、大規模言語モデル(LLM)から応答が生成されます。メールコンポーザや動的フォームを含むLightningレコードページなど、すぐに使用できるエントリポイントを使用すると、Salesforceからプロンプトテンプレートを呼び出すことができます。
このブログ記事では、Salesforceアプリ内からフローとApexを使用してプロンプトテンプレートを呼び出すためのカスタムエントリポイントを作成する方法、およびSalesforce外の独自アプリからREST APIを使用してプロンプトテンプレートを呼び出す方法について説明します。プロンプトテンプレートに関する以前のブログ記事もぜひお読みください。そこでは、プロンプトテンプレートを構築するためのさまざまな手法について解説しています。
プロンプトテンプレートを実行するためのエントリポイント
プロンプトテンプレートを呼び出すと、複数の変換処理を経て最終的なプロンプトが生成され、LLMに送信されます。LLMのレスポンス(「完了」)も処理され、AI対応のビジネスワークフローやアプリで使用する最終的な生成が生成されます。すぐに使用できるエントリポイントに加えて、FlowやApexで実装したカスタムビジネスロジックや、REST APIを介して外部システムからこのプロセスを開始することもできます。
以下の表 (前回のブログ投稿にも含まれています) は、プロンプト テンプレートの種類に応じて、入力とエントリ ポイントをまとめたものです。
| プロンプトテンプレートの種類 | 説明 | 入力 | エントリーポイン |
|---|---|---|---|
| 営業メール | Email Composer を通じてパーソナライズされたメールを作成します。 | 連絡先またはリード、およびオプションで選択した別のオブジェクト | メール作成、フロー、Apex、REST API、Copilot アクション |
| フィールド生成 | レコード ページ内のカスタム フィールドに保存されるテキストを生成します。 | お好みのオブジェクト | レコードページ、フロー、Apex、REST API、Copilotアクション |
| フレックス | どこでも使用できるテキストを生成します。 | 選択したオブジェクトは最大5つまで | フロー、Apex、REST API、Copilotアクション |
| Record Summary | Einstein Copilot で使用されるレコードの概要を生成します。 | お好みのオブジェクト | Copilot アクション |
Flow からプロンプトテンプレートを呼び出す
保存・有効化されたプロンプトテンプレートはすべて、Flow から通常のアクション要素を使用して呼び出せる呼び出し可能なアクションとして自動的に公開されます。要素作成時に「プロンプトテンプレート」カテゴリを選択することで、これらのテンプレートを除外できます。
例を見てみましょう。フローから以下のようなプロンプトテンプレートを呼び出すとします。
特定の入力を持つすべてのテンプレートは、フローから呼び出される際に、その入力を関連エンティティとして渡す必要があります。各プロンプトテンプレートタイプの入力オプションについては、以前のブログ投稿で説明しました。この例では、連絡先オブジェクトに関連付けられたフィールド生成プロンプトテンプレートであるため、連絡先を関連エンティティとして渡す必要があります。
ご覧のとおり、Flow からプロンプト テンプレートを呼び出すのは非常に簡単なので、AI によって生成された出力を通常のビジネス ワークフローに組み込むのが非常に便利になります。
Apexからプロンプトテンプレートを呼び出す
Apex でプロンプトテンプレートを呼び出すには、Apex の Connect APIのクラスとメソッドを使用します。
今回は、もう少し複雑な flex プロンプト テンプレートを例として使用します。
このテンプレートは、不動産業者が販売物件を宣伝するためのソーシャル投稿を生成するために使用されます。プロンプトテンプレートの本文は、ここに示されているよりも長いことに注意してください。Apexから呼び出す方法を見てみましょう。
まず、Flow と同様に、各プロンプトテンプレートには異なる入力が渡される必要があるため、Apex で入力を作成し、テンプレートに渡す必要があります。サンプルの Flex プロンプトテンプレートは Property__c カスタムオブジェクトに関連付けられているため、Apex から呼び出す際にはプロパティレコードを渡す必要があります。
Map<String, String> property = new Map<String, String>();
property.put('id', propertyId); // Don't need to pass other field values even if referenced in the template, just the Id
//テンプレートで参照されている場合でも、他のフィールド値を渡す必要はなく、IDのみを渡す必要があります。
ConnectApi.WrappedValue propertyValue = new ConnectApi.WrappedValue();
propertyValue.value = property;
Map<String, ConnectApi.WrappedValue> inputParams = new Map<String, ConnectApi.WrappedValue>();
inputParams.put('Input:Property', propertyValue); // Property is the API Name we gave to the input
//プロパティは入力に指定したAPI名です
ConnectApi.EinsteinPromptTemplateGenerationsInput executeTemplateInput = new ConnectApi.EinsteinPromptTemplateGenerationsInput();
executeTemplateInput.additionalConfig = new ConnectApi.EinsteinLlmAdditionalConfigInput();
executeTemplateInput.additionalConfig.applicationName = 'PromptBuilderPreview';
executeTemplateInput.isPreview = false;
executeTemplateInput.inputParams = inputParams;
インスタンス内では、呼び出しのパラメータをいくつかEinsteinPromptTemplateGenerationsInput制御できることに注意してください。興味深いものをいくつかご紹介します。
- このisPreviewパラメータは、プロンプトを解決して解決結果を返すか、解決してから LLM に送信して完了を返すかを制御します。
- このnumGenerationsパラメータは、LLMから取得するレスポンスの数を制御します。デフォルトは1ですが、複数のオプションから希望するレスポンスを選択したい場合は、1回の呼び出しで複数の補完を返すことができます。
- このtemperatureパラメータは、モデルが取るリスクの数を制御します。デフォルト値および最小値は0(リスクなし)で、この場合、革新性は低くなりますが、決定論的になり、より正確な応答が生成されます。最大値は1です。
- このfrequencyPenaltyパラメータは、この世代または以前の世代でトークンが何回出現したかを考慮して、生成されたトークンの繰り返しを制御するために使用されます。
generateMessagesForPromptTemplate最後に、メソッドを呼び出して、テンプレート API 名とEinsteinPromptTemplateGenerationsInput作成したインスタンスを渡して呼び出しを実行します。
ConnectApi.EinsteinPromptTemplateGenerationsRepresentation generationsOutput = ConnectApi.EinsteinLLM.generateMessagesForPromptTemplate(
'Generate_Social_Media_Posts',
executeTemplateInput
);
応答はEinsteinPromptTemplateGenerationsRepresentation、解決されたプロンプト、世代、およびその他のパラメータを含む になります。
世代が 1 つだけの場合は、次のようにして応答(タイプEinsteinLLMGenerationItemOutput) テキストを抽出できます。
ConnectApi.EinsteinLLMGenerationItemOutput response = generationsOutput.generations[0];
String response = response.text;
// Do something with the text, which will be valid JSON in our example
レスポンスには、 という興味深いパラメータも含まれています。safetyScoreRepresentationこれは、Salesforceが毒性検出モデルにレスポンスを渡すことでレスポンスの安全性を評価するために計算する一連の指標です。安全性スコアに含まれる情報を確認してください 。
Flex プロンプトテンプレートの例に戻ると、テンプレートに有効な JSON を返すように指示していることに注目してください。これは、Apex からプロンプトテンプレートを呼び出す際に非常に便利な方法です。レスポンスが Lightning Web コンポーネントに送信されている場合、Apex でも JavaScript でも簡単に解析できるからです。
ご覧のとおり、Apex からプロンプトテンプレートを呼び出すことは、AI が生成した出力をより複雑なバックエンドのビジネスロジックに組み込む際に非常に便利です。もちろん、LWC から Apex を呼び出すことで、これらの応答をフロントエンドで表示できることもお忘れなく。
REST API からプロンプト テンプレートを呼び出す
最後に、外部システムからプロンプト テンプレートを呼び出すには、 Connect REST APIで公開されているリソースを使用します。
/einstein/prompt-templates/promptTemplateDevName/generations
Flow や Apex の場合と同じように、プロンプト テンプレートが期待する入力をリクエスト ボディに渡す必要があります。
{
"isPreview": "false",
"inputParams": {
"valueMap": {
"Input:Property": {
"value": {
"id": "a011Q00001EQYXOQA5"
}
}
}
},
"additionalConfig": {
"numGenerations": 1,
"temperature": 0,
"frequencyPenalty": 0.0,
"presencePenalty": 0.0,
"additionalParameters": {},
"applicationName": "PromptBuilderPreview"
}
}
生成のレスポンス本体は次のようになります。
{
"generations": [
{
"parameters": "{finish_reason=stop, index=0, logprobs=null}",
"responseId": "893db990-7acb-4845-ad65-54d82606ca65",
"text": "{\n "twitter": "🌟 Exciting new listing! Explore our luxurious property, [Provide:{PROPERTY NAME}], featuring [Provide:{BEDS}] beds, [Provide:{BATHS}] baths, and an asking price of [Provide:{ASKING PRICE}]. Click the link for a sneak peek! [Provide:{PICTURE}]",\n "linkedin": "🌟🌟 Don't miss out on this incredible opportunity! Discover the stunning property, [Provide:{PROPERTY NAME}], offering [Provide:{BEDS}] beds, [Provide:{BATHS}] baths, and an asking price of [Provide:{ASKING PRICE}]. Click the link below to see more! [Provide:{PICTURE}]",\n "blockkit": {\n "blocks": [\n {\n "type": "section",\n "text": {\n "type": "mrkdwn",\n "text": "*Luxury Property Alert!* \n\n🌟🌟🌟\n\nIntroducing [Provide:{PROPERTY NAME}], a magnificent home with [Provide:{BEDS}] beds and [Provide:{BATHS}] baths. Priced at [Provide:{ASKING PRICE}]."\n },\n "accessory": {\n "type": "image",\n "image_url": "[Provide:{PICTURE}]",\n "alt_text": "Luxury Property"\n }\n },\n {\n "type": "divider"\n },\n {\n "type": "actions",\n "elements": [\n {\n "type": "button",\n "text": {\n "type": "plain_text",\n "text": "View Property",\n "emoji": true\n },\n "url": "https://d1q000001ewauuaq-dev-ed.develop.lightning.force.com/[Provide:{RECORD ID}]"\n }\n ]\n }\n ]\n }\n}"
}
],
"parameters": null,
"prompt": "You're the community manager for Dreamhouse, a real estate agency that sells luxury properties. \nCreate social media posts for twitter, linkedin and slack (block kit format) describing the property.\n\nInstructions:\n"""\nUse clear, concise, and straightforward language using the active voice and strictly avoiding the use of filler words and phrases and redundant language.\nMake sure the response is valid JSON.\nWhen you generate the posts, include the name of the property, [Provide:{PROPERTY NAME}], and explain the characteristics of the house, such as [Provide:{BATHS}], [Provide:{BEDS}]and[Provide:{ASKING PRICE}]. Also include a link to the picture of the property, [Provide:{PICTURE}]. \n\nThe twitter post should include emojis.\nThe linkedin post should include several emojis and bullets, and also have a special output formatting: Text render environment only supports Unicode and emoji. Use symbols from Unicode’s Mathematical Alphanumeric Symbols block liberally to produce facsimiles of bold, italics, line separation, and other formatting. Examples for a sample sentence:\n\nitalics sans: 𝘛𝘩𝘦 𝘘𝘶𝘪𝘤𝘬 𝘉𝘳𝘰𝘸𝘯 𝘍𝘰𝘹 𝘑𝘶𝘮𝘱𝘦𝘥 𝘖𝘷𝘦𝘳 𝘵𝘩𝘦 𝘭𝘢𝘻𝘺 𝘥𝘰𝘨.\nbold sans: 𝗧𝗵𝗲 𝗤𝘂𝗶𝗰𝗸 𝗕𝗿𝗼𝘄𝗻 𝗙𝗼𝘅 𝗝𝘂𝗺𝗽𝗲𝗱 𝗢𝘃𝗲𝗿 𝘁𝗵𝗲 𝗹𝗮𝘇𝘆 𝗱𝗼𝗴.\nbold italic sans: 𝙏𝙝𝙚 𝙌𝙪𝙞𝙘𝙠 𝘽𝙧𝙤𝙬𝙣 𝙁𝙤𝙭 𝙅𝙪𝙢𝙥𝙚𝙙 𝙊𝙫𝙚𝙧 𝙩𝙝𝙚 𝙡𝙖𝙯𝙮 𝙙𝙤𝙜.\nitalics serif: 𝑇ℎ𝑒 𝑄𝑢𝑖𝑐𝑘 𝐵𝑟𝑜𝑤𝑛 𝐹𝑜𝑥 𝐽𝑢𝑚𝑝𝑒𝑑 𝑂𝑣𝑒𝑟 𝑡ℎ𝑒 𝑙𝑎𝑧𝑦 𝑑𝑜𝑔.\n\nThe block kit code should be valid block kit code.\nWhen you generate the block kit code: \n- Add several sections. \n- Include the name of the property, [Provide:{PROPERTY NAME}], and explain the characteristics of the house, such as [Provide:{BATHS}], [Provide:{BEDS}] and [Provide:{ASKING PRICE}]. \n- Include a the picture of the property, which image_url is [Provide:{PICTURE}]. \n- Include a button which url points to https://d1q000001ewauuaq-dev-ed.develop.lightning.force.com/[Provide:{RECORD ID}]\n- Include emoticons so the post is more visual.\n\nExample of block kit code:\n\n{\n "blocks": [\n {\n "type": "section",\n "text": {\n "type": "mrkdwn",\n "text": "Hello, Assistant to the Regional Manager Dwight! *Michael Scott* wants to know where you'd like to take the Paper Company investors to dinner tonight.\n\n *Please select a restaurant:*"\n }\n },\n {\n "type": "divider"\n },\n {\n "type": "section",\n "text": {\n "type": "mrkdwn",\n "text": "*Farmhouse Thai Cuisine*\n:star::star::star::star: 1528 reviews\n They do have some vegan options, like the roti and curry, plus they have a ton of salad stuff and noodles can be ordered without meat!! They have something for everyone here"\n },\n "accessory": {\n "type": "image",\n "image_url": "https://s3-media3.fl.yelpcdn.com/bphoto/c7ed05m9lC2EmA3Aruue7A/o.jpg",\n "alt_text": "alt text for image"\n }\n },\n {\n "type": "section",\n "text": {\n "type": "mrkdwn",\n "text": "*Kin Khao*\n:star::star::star::star: 1638 reviews\n The sticky rice also goes wonderfully with the caramelized pork belly, which is absolutely melt-in-your-mouth and so soft."\n },\n "accessory": {\n "type": "image",\n "image_url": "https://s3-media2.fl.yelpcdn.com/bphoto/korel-1YjNtFtJlMTaC26A/o.jpg",\n "alt_text": "alt text for image"\n }\n },\n {\n "type": "section",\n "text": {\n "type": "mrkdwn",\n "text": "*Ler Ros*\n:star::star::star::star: 2082 reviews\n I would really recommend the Yum Koh Moo Yang - Spicy lime dressing and roasted quick marinated pork shoulder, basil leaves, chili & rice powder."\n },\n "accessory": {\n "type": "image",\n "image_url": "https://s3-media2.fl.yelpcdn.com/bphoto/DawwNigKJ2ckPeDeDM7jAg/o.jpg",\n "alt_text": "alt text for image"\n }\n },\n {\n "type": "divider"\n },\n {\n "type": "actions",\n "elements": [\n {\n "type": "button",\n "text": {\n "type": "plain_text",\n "text": "Farmhouse",\n "emoji": true\n },\n "value": "click_me_123"\n },\n {\n "type": "button",\n "text": {\n "type": "plain_text",\n "text": "Kin Khao",\n "emoji": true\n },\n "value": "click_me_123",\n "url": "https://google.com"\n },\n {\n "type": "button",\n "text": {\n "type": "plain_text",\n "text": "Ler Ros",\n "emoji": true\n },\n "value": "click_me_123",\n "url": "https://google.com"\n }\n ]\n }\n ]\n}\n\nThe response should have the next format:\n{\n "twitter": [here goes the twitter post, that should have less than 280 characters],\n "linkedin": [here goes the linkedin post, that should have between 1500 and 2000 characters], \n "blockkit": [here goes the block kit post], \n}\n\n"""\n\nNow generate the posts.\n\n\n",
"promptTemplateDevName": "Generate_Social_Media_Posts",
"requestId": "chatcmpl-97KqPl1TEiOgMdnKKPQ9aVs7rPJGr"
}
Salesforce プラットフォーム Postman コレクションのこのリソースへのサンプル リクエストを確認し、このビデオを見て、 Salesforce の API をテストするために Postman を設定する方法を学習してください。
Connect REST APIのおかげで、Salesforceプラットフォーム内だけでなく、サードパーティシステムからもプロンプトテンプレートをプログラムで呼び出すことができます。さあ、想像力を自由に働かせて、この機能を使って実現できる素晴らしいユースケースを想像してみてください!
Prompt Builder を使用するには、Einstein 1 Edition のライセンスが必要です。アドオンとして購入することもできます。Trailhead の新しいモジュール「クイックスタート:Prompt Builder」で 5 日間のトライアル組織をリクエストすると、無料でお試しいただけます。特典として、Einstein Copilot もトライアル組織に含まれます。さらに詳しく知りたい方は、以下の包括的なリソースリストをご覧ください。




