Запускайте агенты большой языковой модели (GPT) в Salesforce apex.
Посмотрите полную демо-версию здесь
«Агент» — это метод привития LLM способности «рассуждать» и предпринимать «действия». Этот подход представлен в документе ReAct (Причина → Закон) и используется в популярных библиотеках, таких как langchain и auto-gpt.
Model
: модель LLM/GTP. В настоящее время поддерживаются только модели OpenAI GPT Completion и Chat.Prompt
: «Протокол» связи между моделью и системой. В настоящее время поддерживаются только подсказки в стиле ReAct.Agent
: Экземпляр, созданный для решения определенной цели.Tools
: команды в распоряжении агентов.Action
: акт вызова инструмента. force:source:push
) или в версию для разработчиков ( force:mdapi:deploy
)Предупреждение. В организациях Scratch и разработчиков существует ограничение в 5 связанных в очередь заданий, что ограничивает объем работы, который может выполнить агент.
Назначьте себе набор разрешений Apex Agent
. sfdx force:user:permset:assign -n Apex_Agents
Откройте Setup -> Named Credential -> External Credential -> OpenAI
. Отредактируйте «Сопоставление набора разрешений», добавив «Параметры аутентификации» с именем API_KEY
и вашим ключом API OpenAI в качестве значения.
(Необязательно) Откройте Setup -> Custom Settings -> Apex Agent Settings -> manage
и добавьте ключ API SERP и ключ ExtactorAPI. Это необходимо для включения возможностей поиска в Интернете. Оба имеют бесплатные уровни.
Перейдите в приложение «Агенты Apex» (из средства запуска приложения) и запустите задачу. Или запустите агент, используя пример кода ниже.
Эта библиотека не готова к производству и, возможно, никогда не будет:
Предупреждение. Похоже, что у Salesforce есть ошибка, связанная с
aborting
заданий, поставленных в очередь, с длительными вызовами HTTP. Если вы прервете задание, оно все равно будет выполнено до завершения и продолжится планирование следующих заданий!
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
Вы можете написать свои собственные подсказки в стиле ReAct, реализовав Prompt.IReAct
.
В настоящее время существует какое-то примитивное место регистрации для вызова объекта 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» (пиар приветствуется!) и поэкспериментировать, чтобы увидеть, на что эта штука способна.