Execute agentes do Large Language Model (GPT) no Salesforce Apex.
Assista à demonstração completa aqui
Um “Agente” é uma técnica para incutir a capacidade de um LLM de “Raciocinar” e realizar “Ação”. Esta abordagem é introduzida pelo ReAct Paper (Reason → Act) e usada em bibliotecas populares como langchain e auto-gpt.
Model
: modelo LLM/GTP. Atualmente, apenas os modelos OpenAI GPT Completion & Chat são suportados.Prompt
: O "protocolo" de comunicação entre o modelo e o sistema. Atualmente, apenas prompts no estilo ReAct são suportados.Agent
: Uma instância formada para resolver um determinado objetivo.Tools
: Os comandos à disposição dos agentesAction
: O ato de invocar uma ferramenta force:source:push
) ou em uma edição de desenvolvedor ( force:mdapi:deploy
)Aviso As organizações Scratch e de desenvolvedores têm um limite de 5 trabalhos encadeados e enfileirados, o que limitará a quantidade de trabalho que o agente pode realizar.
Atribua-se ao conjunto de permissões Apex Agent
. sfdx force:user:permset:assign -n Apex_Agents
Abra Setup -> Named Credential -> External Credential -> OpenAI
. Edite o "Mapeamento do conjunto de permissões" para adicionar "Parâmetros de autenticação" com o nome API_KEY
e sua chave de API OpenAI como valor
(Opcional) Abra Setup -> Custom Settings -> Apex Agent Settings -> manage
e adicione sua chave SERP API e chave ExtactorAPI. Isso é necessário para ativar os recursos de pesquisa na Internet. Ambos têm níveis gratuitos.
Navegue até o aplicativo "Apex Agents" (no inicializador de aplicativos) e execute uma tarefa. Ou inicie o agente usando o código de exemplo abaixo.
Esta biblioteca não está pronta para produção e pode nunca estar:
Aviso O Salesforce parece ter um bug ao
aborting
trabalhos enfileirados com chamadas HTTP de longa duração. Se você abortar um trabalho, ele ainda será executado até a conclusão e continuará a agendar os trabalhos seguintes!
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 ();
Nota Para obter melhores resultados, é recomendável usar
OpenAIChatModel
comgpt-4
eReActZeroShotChatPromptManager
e incluir apenas o número mínimo de ferramentas necessárias.
Criar uma ferramenta personalizada é fácil. Basta criar uma classe que implemente a interface IAgentTool e adicioná-la ao mapa de ferramentas ao criar o prompt.
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' );
}
Pontas:
JSON.serialize
Você pode escrever seus próprios prompts no estilo ReAct implementando Prompt.IReAct
.
Atualmente existe algum local de registro primitivo para uma chamada de objeto Agent_Log__c
. As etapas do agente disparam eventos imediatos da plataforma Agent_Event__e, que resultam na atualização do log em tempo real.
{thought/reasoning} {action_result}
Solicitações testadas:
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
A maneira mais fácil de contribuir nesta fase é criar novas "AgentTools" (PR's bem-vindos!) e experimentar para ver o que isso pode fazer.