Führen Sie GPT-Agenten (Large Language Model) in Salesforce Apex aus.
Sehen Sie sich hier die vollständige Demo an
Ein „Agent“ ist eine Technik, um einem LLM die Fähigkeit zu vermitteln, „zu argumentieren“ und „Maßnahmen“ zu ergreifen. Dieser Ansatz wird im ReAct Paper (Reason → Act) eingeführt und in beliebten Bibliotheken wie langchain und auto-gpt verwendet.
Model
: LLM/GTP-Modell. Derzeit werden nur OpenAI GPT Completion & Chat-Modelle unterstützt.Prompt
: Das Kommunikationsprotokoll zwischen Modell und System. Derzeit werden nur Eingabeaufforderungen im ReAct-Stil unterstützt.Agent
: Eine Instanz, die zur Lösung eines bestimmten Ziels gebildet wird.Tools
: Die Befehle, die dem Agenten zur Verfügung stehenAction
: Der Vorgang des Aufrufens eines Tools force:source:push
) oder in einer Entwickleredition ( force:mdapi:deploy
)Warnung: Scratch- und Entwicklerorganisationen haben ein Limit von 5 verketteten Jobs in der Warteschlange, was die Arbeit des Agenten einschränkt.
Weisen Sie sich dem Apex Agent
Berechtigungssatz zu. sfdx force:user:permset:assign -n Apex_Agents
Öffnen Sie Setup -> Named Credential -> External Credential -> OpenAI
. Bearbeiten Sie die „Berechtigungssatzzuordnung“, um einen „Authentifizierungsparameter“ mit dem Namen API_KEY
und Ihrem OpenAI-API-Schlüssel als Wert hinzuzufügen
(Optional) Öffnen Sie Setup -> Custom Settings -> Apex Agent Settings -> manage
und fügen Sie Ihren SERP-API-Schlüssel und ExtactorAPI-Schlüssel hinzu. Dies ist erforderlich, um die Internet-Suchfunktionen zu aktivieren. Beide haben kostenlose Stufen.
Navigieren Sie zur „Apex Agents“-App (vom App-Launcher) und führen Sie eine Aufgabe aus. Oder starten Sie den Agent mit dem folgenden Beispielcode.
Diese Bibliothek ist noch nicht produktionsbereit und wird möglicherweise nie:
Warnung: Salesforce scheint einen Fehler beim
aborting
in die Warteschlange gestellten Jobs mit lang laufenden HTTP-Callouts zu haben. Wenn Sie einen Job abbrechen, wird er trotzdem bis zum Abschluss ausgeführt und die Planung der folgenden Jobs wird fortgesetzt!
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 ();
Hinweis Für beste Ergebnisse wird empfohlen,
OpenAIChatModel
mitgpt-4
undReActZeroShotChatPromptManager
zu verwenden und nur die minimale Anzahl an Tools einzuschließen, die Sie benötigen.
Das Erstellen eines benutzerdefinierten Tools ist einfach. Erstellen Sie einfach eine Klasse, die die IAgentTool-Schnittstelle implementiert, und fügen Sie sie der Tool-Karte hinzu, wenn Sie die Eingabeaufforderung erstellen.
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' );
}
Tipps:
JSON.serialize
zurückgeben Sie können Ihre eigenen Eingabeaufforderungen im ReAct-Stil schreiben, indem Sie Prompt.IReAct
implementieren.
Derzeit gibt es einen primitiven Protokollierungsplatz für einen Objektaufruf Agent_Log__c
. Agentenschritte lösen Agent_Event__e unmittelbare Plattformereignisse aus, die dazu führen, dass das Protokoll in Echtzeit aktualisiert wird.
{thought/reasoning} {action_result}
Getestete Eingabeaufforderungen:
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
Der einfachste Weg, in dieser Phase einen Beitrag zu leisten, besteht darin, neue „AgentTools“ zu erstellen (PR willkommen!) und zu experimentieren, um zu sehen, was dieses Ding leisten kann.