Ejecute agentes de Large Language Model (GPT) en Salesforce Apex.
Vea la demostración completa aquí
Un "Agente" es una técnica para inculcar en un LLM la capacidad de "Razonar" y tomar "Acción". Este enfoque lo introduce ReAct Paper (Reason → Act) y se utiliza en bibliotecas populares como langchain y auto-gpt.
Model
: modelo LLM/GTP. Actualmente, solo se admiten los modelos OpenAI GPT Completion & Chat.Prompt
: El "protocolo" de comunicación entre el modelo y el sistema. Actualmente, solo se admiten mensajes de estilo ReAct.Agent
: Una instancia formada para resolver un objetivo determinado.Tools
: Los comandos a disposición de los agentes.Action
: El acto de invocar una herramienta. force:source:push
) o en una edición de desarrollador ( force:mdapi:deploy
)Advertencia Las organizaciones de Scratch y desarrolladores tienen un límite de 5 trabajos encadenados que se pueden poner en cola, lo que limitará la cantidad de trabajo que puede realizar el agente.
Asígnese el conjunto de permisos Apex Agent
. sfdx force:user:permset:assign -n Apex_Agents
Abra Setup -> Named Credential -> External Credential -> OpenAI
. Edite la "Mapeo de conjunto de permisos" para agregar "Parámetros de autenticación" con el nombre API_KEY
y su clave API OpenAI como valor
(Opcional) Abra Setup -> Custom Settings -> Apex Agent Settings -> manage
y agregue su clave SERP API y su clave ExtractorAPI. Esto es necesario para habilitar las capacidades de búsqueda en Internet. Ambos tienen niveles gratuitos.
Navegue hasta la aplicación "Apex Agents" (desde el iniciador de aplicaciones) y ejecute una tarea. O inicie el agente usando el código de ejemplo a continuación.
Esta biblioteca no está lista para producción y es posible que nunca lo esté:
Advertencia Salesforce parece tener un error al
aborting
trabajos en cola con llamadas HTTP de larga duración. Si cancela un trabajo, aún así se ejecutará hasta su finalización y continuará programando los siguientes trabajos.
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 obtener mejores resultados, se recomienda utilizar
OpenAIChatModel
congpt-4
yReActZeroShotChatPromptManager
y solo incluya la cantidad mínima de herramientas que necesita.
Crear una herramienta personalizada es fácil. Simplemente cree una clase que implemente la interfaz IAgentTool y agréguela al mapa de herramientas cuando cree el mensaje.
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' );
}
Consejos:
JSON.serialize
Puede escribir sus propios mensajes de estilo ReAct implementando Prompt.IReAct
.
Actualmente existe un lugar de registro primitivo para una llamada de objeto Agent_Log__c
. Los pasos del agente activan eventos de plataforma inmediatos Agent_Event__e, lo que da como resultado que el registro se actualice en tiempo real.
{thought/reasoning} {action_result}
Indicaciones probadas:
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
La forma más sencilla de contribuir en esta etapa es crear nuevas "AgentTools" (¡las relaciones públicas son bienvenidas!) y experimentar para ver qué puede hacer esto.