Salesforce apex で Large Language Model (GPT) エージェントを実行します。
ここで完全なデモをご覧ください
「エージェント」は、LLM に「推論」して「アクション」を実行する能力を植え付けるためのテクニックです。このアプローチは ReAct Paper (Reason → Act) によって導入され、langchain や auto-gpt などの人気のあるライブラリで使用されています。
Model
:LLM/GTPモデル。現在、OpenAI GPT Completion & Chat モデルのみがサポートされています。Prompt
: モデルとシステム間の通信「プロトコル」。現在、ReAct スタイルのプロンプトのみがサポートされています。Agent
: 与えられた目的を解決するために形成されたインスタンス。Tools
: エージェントが自由に使えるコマンドAction
: ツールを呼び出す行為force:source:push
) または開発者エディション ( force:mdapi:deploy
) にインストールします。警告スクラッチ組織と開発者組織には、チェーンされたキュー可能なジョブの数が 5 つに制限されており、エージェントが実行できる作業量が制限されます。
Apex Agent
権限セットに自分自身を割り当てます。 sfdx force:user:permset:assign -n Apex_Agents
Setup -> Named Credential -> External Credential -> OpenAI
開きます。 「権限セット マッピング」を編集して、 API_KEY
の名前と値として OpenAI API キーを使用して「認証パラメータ」を追加します。
(オプション) [ Setup -> Custom Settings -> Apex Agent Settings -> manage
および追加します。これは、インターネット検索機能を有効にするために必要です。どちらにも無料枠があります。
(アプリランチャーから)「Apex Agents」アプリに移動し、タスクを実行します。または、以下のサンプルコードを使用してエージェントを起動します。
このライブラリは本番環境に対応していないため、次のような状態になることはありません。
警告Salesforce には、長時間実行される HTTP コールアウトを含むキュー可能なジョブの
aborting
に関するバグがあるようです。ジョブを中止した場合でも、ジョブは完了するまで実行され、次のジョブのスケジュールが続行されます。
OpenAIChatModel chatLLM = new OpenAIChatModel ();
// chatLLM.model = 'gpt-3.5-turbo';
chatLLM . model = 'gpt-4' ;
SerpAPIKey__c mc = SerpAPIKey__c . getInstance ( UserInfo . getUserId ());
Map < String , IAgentTool > tools = new Map < String , IAgentTool >{
'search_internet' => new InternetSearchAgentTool ( mc . API_Key__c ),
'find_records' => new SOSLSearchAgentTool (),
'send_notification' => new SentNotificationAgentTool (),
'create_records' => new CreateRecordAgentTool (),
'get_fields' => new GetSObjectFieldsAgentTool (),
'list_custom_objects' => new ListSObjectAgentTool (),
'execute_soql' => new RunSQLAgentTool ()
};
ReActZeroShotChatPrompt prompt = new ReActZeroShotChatPrompt ( tools );
ReActChatAgent agent = new ReActChatAgent ( 'Find 3 accounts with missing phone numbers and try to populate them from the internet' , prompt , chatLLM );
agent . maxInvocations = 15 ;
AgentQueueable manager = new AgentQueueable ( agent );
manager . startAgent ();
注最良の結果を得るには、
OpenAIChatModel
gpt-4
およびReActZeroShotChatPromptManager
とともに使用し、必要な最小限のツールのみを含めることをお勧めします。
カスタム ツールの作成は簡単です。 IAgentTool インターフェイスを実装するクラスを作成し、プロンプトの作成時にそれをツールのマップに追加するだけです。
public class GreetingAgentTool implements IAgentTool {
public string getDescription () {
return 'Get a greeting' ;
}
public Map < string , string > getParameters () {
return new Map < string , string >({
'name' => 'The name to greet'
});
}
public string execute ( Map < string , string > args ) {
if ( String . isEmpty ( args . get ( 'name' )){
// throw an error with instructions so the agent can self correct
throw new Agent . ActionRuntimeException ( 'missing required parameter: name' );
}
return 'hello ' + args . get ( 'name' );
}
ヒント:
JSON.serialize
を使用して JSON または YAML を返すことができますPrompt.IReAct
を実装することで、独自の ReAct スタイル プロンプトを作成できます。
現在、オブジェクト呼び出しAgent_Log__c
への基本的なロギング場所がいくつかあります。エージェント ステップは Agent_Event__e 即時プラットフォーム イベントを起動し、その結果、ログがリアルタイムで更新されます。
{thought/reasoning} {action_result}
テストされたプロンプト:
Search for accounts containing the word "sample" and send a notification to the user with name = "charlie jonas", notifying them that they should remove the account.
write a SOQL query that returns all billing related fields for an account. Send me a notification with the results of the query
Get the weather tomorrow in Lander, wyoming. Send a notification to Charlie Jonas letting him know how to dress
Research 3 companies that offer leading edge solutions for building API. Insert the new account with basic information about the business, but only if the account does not already exist.
Find out how many employees work at amazon and update the account
query 3 accounts that do not have Number of Employees set. Update the account with the number of employees from the internet.
See if you can fill in any missing information on the amazon account. Send me a notification with the summary
Search for accounts containing the word "sample". Create a task assigned to me with the subject "Remove Sample Account
write a SOQL query to group invoice total by project name. Send me the results in a notification
この段階で貢献する最も簡単な方法は、新しい「AgentTools」(PR さん大歓迎!) を作成し、これで何ができるかを実験することです。