Xuất bản: Ngày 12 tháng 6 năm 2026 | Thời gian đọc: 7 phút | Danh mục: Salesforce


TÓM LƯỢC

Xây dựng một Agentforce Service Agent để thu thập khách hàng tiềm năng đòi hỏi việc xử lý quản lý trạng thái đa lượt một cách an toàn. Mặc dù Flows tiêu chuẩn rất tốt cho các tác vụ đơn giản, việc sử dụng @InvocableMethod của Apex cho phép theo dõi trạng thái liên tục qua các lượt hội thoại và các thao tác DML USER_MODE an toàn. Đây là cách chính xác để xây dựng một agent.


Giới thiệu: Kỷ nguyên Agentforce

Salesforce Agentforce đã thay đổi hoàn toàn cách chúng ta nghĩ về các tương tác tự động với khách hàng. Chúng ta đang chuyển đổi từ các chatbot cứng nhắc, dựa trên cây sang các agent tự động có khả năng suy luận, đặt câu hỏi làm rõ và thực hiện hành động.

Một trong những trường hợp sử dụng phổ biến sớm nhất cho Agentforce là Thu thập khách hàng tiềm năng. Mục tiêu rất đơn giản: một agent AI hỏi người dùng thông tin của họ (ví dụ: Họ và Công ty), giữ thông tin đó qua nhiều lượt hội thoại và tạo một bản ghi Khách hàng tiềm năng (Lead) của Salesforce khi tất cả dữ liệu cần thiết được thu thập.

Mặc dù bạn có thể thử điều này với một screen flow hoặc autolaunched flow, các hành động có thể gọi của Apex cung cấp quyền kiểm soát đáng kể hơn đối với quản lý trạng thái và ngữ cảnh bảo mật.

Đây là bản thiết kế chính xác cho một Lead Capture Agent sẵn sàng cho sản xuất vào năm 2026.


Kiến trúc

Giải pháp của chúng ta yêu cầu ba thành phần cốt lõi:

  1. Agent Router (start_agent): Chào mừng người dùng và chuyển họ đến subagent phù hợp dựa trên ý định.
  2. Lead Capture Subagent (subagent): Hướng dẫn LLM về chính xác các trường cần thiết (Họ và Công ty) và kích hoạt hành động.
  3. Apex Invocable Action (@InvocableMethod): "Động cơ" thực tế phân tích đầu vào, giữ trạng thái và thực hiện chèn dữ liệu.

1. Ngôn ngữ kịch bản Agent (Agent Script DSL)

Agentforce sử dụng một Ngôn ngữ kịch bản chuyên dụng (DSL) để xác định hành vi của agent. Chúng ta định nghĩa các biến để giữ đầu vào của người dùng qua các lượt.

variables:
    last_name: mutable string = ""
        description: "Lead last name"
    company: mutable string = ""
        description: "Lead company"
    lead_created: mutable boolean = False
        description: "Whether the lead has already been created"
    last_lead_id: mutable string = ""
        description: "The most recently created Lead ID"

Logic cho subagent của chúng ta quy định rằng đối với mọi tin nhắn mà người dùng gửi khi đang ở chủ đề thu thập khách hàng tiềm năng, chúng ta gọi hành động Apex của mình. Chúng ta chuyển userMessage hiện tại, cùng với các biến last_namecompany mà chúng ta đã thu thập cho đến nay.

subagent lead_capture:
    label: "Lead Capture"
    description: "Collect last name and company, then create a Salesforce Lead through Apex."
    reasoning:
        instructions: ->
            if @variables.lead_created == True:
                | A lead has already been created in this conversation. Share the Lead ID and ask if the user wants anything else.
            if @variables.lead_created == False:
                | Use Process Lead Capture Turn for every lead-capture message.
        actions:
            process_lead_turn: @actions.process_lead_turn
                    with userMessage = ...
                    with knownLastName = @variables.last_name
                    with knownCompany = @variables.company
                    set @variables.last_name = @outputs.resolvedLastName
                    set @variables.company = @outputs.resolvedCompany
                    set @variables.lead_created = @outputs.isSuccess
                    set @variables.last_lead_id = @outputs.leadId

2. Apex Invocable Action

Sức mạnh thực sự của mẫu này nằm ở lớp Apex. Thay vì để LLM đoán khi nào cần tạo khách hàng tiềm năng, chúng ta sử dụng một hành động có thể gọi để quản lý logic nghiệp vụ một cách an toàn.

Tại sao Apex thay vì Flow?

  • Trạng thái đa lượt: Bằng cách chuyển knownLastNameknownCompany vào hành động Apex, và trả về resolvedLastNameresolvedCompany, chúng ta duy trì trạng thái hội thoại một cách hoàn hảo, ngay cả khi người dùng cung cấp thông tin theo thứ tự khác.
  • Ngữ cảnh bảo mật: Chúng ta có thể thực thi các quyền FLS (Field Level Security) và CRUD một cách động bằng cách sử dụng AccessLevel.USER_MODE.

Dưới đây là cấu trúc của các biến đầu vào và đầu ra:

public class LeadCaptureTurnAction {
    
    public class Request {
        @InvocableVariable(required=true label='User Message')
        public String userMessage;
        
        @InvocableVariable(label='Known Last Name')
        public String knownLastName;
        
        @InvocableVariable(label='Known Company')
        public String knownCompany;
    }
    
    public class Result {
        @InvocableVariable(label='Is Success')
        public Boolean isSuccess;
        
        @InvocableVariable(label='Lead ID')
        public String leadId; // GOTCHA: Must be String, not Id
        
        @InvocableVariable(label='Resolved Last Name')
        public String resolvedLastName;
        
        @InvocableVariable(label='Resolved Company')
        public String resolvedCompany;
        
        @InvocableVariable(label='Message')
        public String message;
    }
    
    @InvocableMethod(label='Process Lead Capture Turn')
    public static List<Result> processTurn(List<Request> requests) {
        // 1. Parse the userMessage for missing fields using Regex
        // 2. Combine found fields with knownLastName and knownCompany
        // 3. If both are present, insert the Lead
        // 4. Return the Result
    }
}

Vấn đề với liên kết leadId

Lưu ý rằng public String leadId; được định nghĩa là String chứ không phải Id. Đây là một chi tiết quan trọng trong Agentforce. Khi liên kết đầu ra của một hành động có thể gọi trở lại một biến Agent Script (set @variables.last_lead_id = @outputs.leadId), Agentforce ưu tiên các kiểu chuỗi nguyên thủy hơn các kiểu Id nghiêm ngặt của Salesforce. Sử dụng Id có thể gây ra lỗi liên kết thầm lặng trong quá trình thực thi.


3. Thực thi Bảo mật với USER_MODE

Khi Agentforce thực thi một hành động có thể gọi, nó chạy dưới ngữ cảnh của người dùng Einstein Service Agent (hoặc người dùng agent mặc định được cấu hình của bạn).

Nếu bạn cố gắng chèn một khách hàng tiềm năng bằng DML tiêu chuẩn (insert newLead;), ngữ cảnh hệ thống có thể bỏ qua các kiểm tra bảo mật cần thiết hoặc thất bại một cách khó đoán tùy thuộc vào cài đặt chia sẻ của org.

Cách tiếp cận đúng vào năm 2026 là luôn thực thi DML ở chế độ người dùng:

Database.SaveResult sr = Database.insert(newLead, false, AccessLevel.USER_MODE);

Quyền bị thiếu

Để chèn USER_MODE hoạt động, người dùng Einstein Service Agent phải có quyền tạo bản ghi Khách hàng tiềm năng.

Bạn phải tạo một Permission Set (ví dụ: LeadCaptureAgent_Apex_Access) cấp:

  1. Quyền truy cập Apex Class: Đến lớp LeadCaptureTurnAction của bạn.
  2. Quyền truy cập đối tượng: Quyền Đọc và Tạo trên đối tượng Lead.
  3. Quyền trường: Quyền chỉnh sửa đối với LastNameCompany.

Gán Permission Set này cho người dùng Einstein Service Agent. Nếu không có nó, agent sẽ lặp vô tận, yêu cầu các trường mà nó đã thu thập vì lỗi DML USER_MODE thầm lặng ngăn isSuccess trả về true.


4. Kiểm tra Agent cục bộ

Trước khi xuất bản, bạn nên xác thực logic đa lượt bằng Salesforce CLI. Lệnh sf agent preview cho phép bạn mô phỏng cuộc hội thoại trực tiếp từ terminal của mình.

# Start the session
sf agent preview start --json --authoring-bundle LeadCaptureAgent --use-live-actions --target-org my-org

# Send the first utterance (Company only)
sf agent preview send --json --session-id <SESSION_ID> --utterance "My company is Acme Corp" --authoring-bundle LeadCaptureAgent --target-org my-org

# Send the second utterance (Last Name)
sf agent preview send --json --session-id <SESSION_ID> --utterance "My last name is Smith" --authoring-bundle LeadCaptureAgent --target-org my-org

# Verify the Lead creation
sf data query --query "SELECT Id, LastName, Company FROM Lead ORDER BY CreatedDate DESC LIMIT 1" --target-org my-org

Điểm mấu chốt

Agentforce cho phép chúng ta xây dựng các trải nghiệm hội thoại năng động đáng kinh ngạc, nhưng nó đòi hỏi một sự thay đổi trong cách chúng ta xử lý trạng thái và bảo mật. Bằng cách chuyển hướng thu thập khách hàng tiềm năng thông qua một subagent chuyên dụng và dựa vào các hành động có thể gọi của Apex để quản lý trạng thái xác định, bạn đảm bảo trải nghiệm an toàn, mạnh mẽ và thân thiện với người dùng.

Luôn nhớ sử dụng String cho đầu ra ID, thực thi DML USER_MODE và gán các permission set chính xác cho người dùng agent của bạn.


Về tác giả: Hướng dẫn này được viết bởi đội ngũ Biên tập Kỹ thuật của Resumity, khám phá sự giao thoa giữa các nền tảng AI hiện đại và kiến trúc CRM doanh nghiệp.