Exécutez des agents GPT (Large Language Model) dans Salesforce Apex.
Regardez la démo complète ici
Un « agent » est une technique permettant à un LLM de « raisonner » et d'agir. Cette approche est introduite par le ReAct Paper (Reason → Act) et utilisée dans les bibliothèques populaires comme langchain et auto-gpt.
Model
: Modèle LLM/GTP. Actuellement, seuls les modèles OpenAI GPT Completion & Chat sont pris en charge.Prompt
: le "protocole" de communication entre le modèle et le système. Actuellement, seules les invites de style ReAct sont prises en charge.Agent
: Une instance formée pour résoudre un objectif donné.Tools
: Les commandes à disposition des agentsAction
: L'action d'invoquer un outil force:source:push
) ou dans une édition développeur ( force:mdapi:deploy
)Avertissement Les organisations Scratch et de développement ont une limite de 5 tâches en file d'attente en chaîne, ce qui limitera la quantité de travail que l'agent peut effectuer.
Attribuez-vous à l'ensemble d'autorisations Apex Agent
. sfdx force:user:permset:assign -n Apex_Agents
Ouvrez Setup -> Named Credential -> External Credential -> OpenAI
. Modifiez le "Mappage de l'ensemble d'autorisations" pour ajouter des "Paramètres d'authentification" avec le nom API_KEY
et votre clé API OpenAI comme valeur.
(Facultatif) Ouvrez Setup -> Custom Settings -> Apex Agent Settings -> manage
et ajoutez votre clé API SERP et votre clé ExtactorAPI. Ceci est nécessaire pour activer les capacités de recherche sur Internet. Les deux ont des niveaux gratuits.
Accédez à l'application « Apex Agents » (à partir du lanceur d'applications) et exécutez une tâche. Ou démarrez l'agent en utilisant l'exemple de code ci-dessous.
Cette bibliothèque n'est pas prête pour la production et ne le sera peut-être jamais :
Avertissement Salesforce semble avoir un bug avec
aborting
des tâches en file d'attente avec des appels HTTP de longue durée. Si vous abandonnez une tâche, elle s'exécutera toujours jusqu'à son terme et continuera à planifier les tâches suivantes !
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 ();
Remarque Pour de meilleurs résultats, il est recommandé d'utiliser
OpenAIChatModel
avecgpt-4
etReActZeroShotChatPromptManager
et d'inclure uniquement le nombre minimum d'outils dont vous avez besoin.
Créer un outil personnalisé est simple. Créez simplement une classe qui implémente l'interface IAgentTool et ajoutez-la à la carte des outils lorsque vous créez l'invite.
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' );
}
Conseils:
JSON.serialize
Vous pouvez écrire vos propres invites de style ReAct en implémentant Prompt.IReAct
.
Actuellement, il existe un emplacement de journalisation primitif pour un appel d'objet Agent_Log__c
. Les étapes de l'agent déclenchent des événements de plateforme immédiats Agent_Event__e, ce qui entraîne la mise à jour du journal en temps réel.
{thought/reasoning} {action_result}
Invites testées :
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
Le moyen le plus simple de contribuer à ce stade est de créer de nouveaux "AgentTools" (les relations publiques sont les bienvenues !) et d'expérimenter pour voir ce que cette chose peut faire.