Trong bài học trước, agent của bạn đã trích xuất tên và vấn đề từ cuộc trò chuyện, sau đó chuyển chúng vào hai trường nhập liệu dạng Văn bản (Text) trong flow. Bạn chưa bao giờ chỉ định cụ thể từ nào sẽ đi vào đâu. Vậy làm sao nó biết được?
Nó đã đọc tên tham số và mô tả công cụ của bạn - rồi coi chúng như những chỉ dẫn. Đây chính là tư duy mới mà bài học này muốn truyền tải: Trong agent flow, tên và mô tả không chỉ là tài liệu ghi chú, mà thực chất là các câu lệnh điều hướng. Orchestrator sẽ quyết định công cụ nào cần chạy và đoạn hội thoại nào cần đưa vào trường nhập liệu nào bằng cách đọc chính những thông tin đó. Nếu viết qua loa, agent sẽ phải đoán mò; nếu viết chỉn chu, khả năng điều hướng của nó sẽ nhạy bén và chính xác đến mức như thể đọc được suy nghĩ.
Dưới đây là toàn bộ luồng dữ liệu mà flow thực hành của bạn đang vận hành:
Tin nhắn của người dùng: "Ghi nhận yêu cầu — Tôi là Mai, chuột máy tính của tôi bị hỏng"
Orchestrator khớp với công cụ: Đọc mô tả công cụ
Điền dữ liệu vào các trường nhập: RequesterName = "Mai" - do AI tự xác định hoặc giá trị tùy chỉnh
Flow thực hiện các bước: Flow cố định, không ngẫu hứng
Trả về kết quả đầu ra: Phản hồi cho agent
Hoàn tất: Agent hiển thị hoặc viết lại kết quả
Ba loại tham số (và giải pháp thay thế)
Tham số trong agent flow chỉ có đúng ba loại: Văn bản (Text), Số (Number) và Boolean (Đúng/Sai). Không có kiểu ngày tháng, dấu thời gian, danh sách hay file. Điều này có vẻ hạn chế trong thời gian đầu, cho đến khi bạn nắm được hai mô hình xử lý sau:
Ngày tháng được truyền dưới dạng Văn bản. Hãy truyền giá trị `2026-10-02` vào trường nhập liệu Văn bản và để các hàm xử lý ngày tháng trong flow phân tích nó. Hãy yêu cầu định dạng cụ thể trong phần mô tả tham số (ví dụ: "ngày bắt đầu theo định dạng YYYY-MM-DD"), khi đó Orchestrator sẽ chuẩn hóa thông tin người dùng cung cấp theo đúng định dạng đó.
Dữ liệu có cấu trúc được truyền dưới dạng JSON trong trường nhập liệu Văn bản. Ví dụ, một trường nhập liệu tên là `ItemsJson` với mô tả "một mảng JSON chứa các mục, mỗi mục gồm tên và số lượng" - sau đó, hành động "Parse JSON" bên trong flow sẽ giải mã dữ liệu này. Đây là mô hình thường được sử dụng để tạo hàng loạt bản ghi, cho phép mở rộng quy mô từ 3 mục lên 30mục mà không cần thay đổi cấu trúc dữ liệu (schema).
Giá trị Null (rỗng) là "kẻ phá hoại thầm lặng" trong trường hợp này: Nếu Orchestrator không thể điền dữ liệu vào một trường nhập liệu, trường đó sẽ bị bỏ trống và có thể khiến flow bị lỗi ngay khi đang chạy. Hai biện pháp phòng ngừa - hãy đánh dấu rõ ràng các dữ liệu bắt buộc trong phần mô tả công cụ (ví dụ: "Cần tên người yêu cầu - luôn hỏi nếu thiếu"), và xử lý các giá trị trống ngay trong flow trước khi sử dụng chúng.
Kiểm tra nhanh: Flow của bạn cần biết thông tin "khẩn cấp hay không" từ người dùng. Bạn sẽ chọn loại dữ liệu nào và đặt tên là gì?
Đáp án: Kiểu Boolean, đặt tên dễ hiểu như `IsUrgent`, với mô tả: "giá trị là true nếu người dùng cho biết yêu cầu là khẩn cấp". Phần mô tả này đóng vai trò chuyển đổi ngôn ngữ thông thường sang giá trị true/false.
Điền dữ liệu đầu vào: AI hoặc giá trị cố định
Mở phần cấu hình công cụ cho flow thực hành của bạn (agent → Tools → chọn công cụ). Trong mục Inputs, mỗi tham số đều có chế độ điền dữ liệu:
Điền động bằng AI — đây là chế độ mặc định. Orchestrator sẽ trích xuất giá trị từ cuộc trò chuyện và đặt câu hỏi bổ sung nếu thiếu thông tin. Hãy dùng chế độ này cho bất kỳ thông tin nào mà người dùng nắm rõ.
Giá trị tùy chỉnh — một giá trị cố định hoặc biến hệ thống được thiết lập một lần. Hãy dùng chế độ này cho những thông tin mà người dùng không nên can thiệp: Danh tính đã xác thực của người dùng hiện tại, tên môi trường, hoặc một hằng số.
Sai lầm thường gặp là để AI điền giá trị ảnh hưởng đến vấn đề bảo mật. Nếu flow của bạn xử lý dựa trên "email người yêu cầu", đừng để mô hình AI trích xuất thông tin này từ khung chat (nơi bất kỳ ai cũng có thể nhập địa chỉ của người khác) - thay vào đó, hãy lấy giá trị từ biến hệ thống của người dùng đã xác thực dưới dạng Giá trị tùy chỉnh. Chỉ cần một lựa chọn trong menu drop-down là đã tạo ra rào cản bảo mật thực sự. Chúng ta sẽ phát triển thêm ý này trong Bài 4.
Trong mục Completion (Hoàn tất), bạn chọn điều gì sẽ xảy ra sau khi flow trả về kết quả: Mặc định là để agent tiếp tục suy luận dựa trên các kết quả đầu ra; hoặc bạn có thể yêu cầu agent gửi một phản hồi cụ thể đã chèn các giá trị đầu ra vào, hay định dạng kết quả bằng Generative AI. Đối với các xác nhận mang tính cố định như dòng PRACTICE-REQ của bạn, việc sử dụng phản hồi cụ thể sẽ giúp giữ nguyên chính xác cách diễn đạt mà bạn mong muốn.
Viết mô tả giống như các quy tắc định tuyến
Mở claude.ai hoặc chatgpt.com. Sao chép câu lệnh (prompt) này, điền thông tin vào phần dành cho biến (placeholder) dựa trên kế hoạch tự động hóa ở Bài 1, rồi gửi đi:
Tôi đang cấu hình một flow của Microsoft Copilot Studio để hoạt động như một công cụ (tool). Hãy soạn thảo
siêu dữ liệu (metadata) cho công cụ tự động hóa này: [dán các bước tự động hóa và
2-3 loại dữ liệu cần thu thập từ ghi chú Bài 1 của bạn]
Hãy cung cấp cho tôi:
1. Tên công cụ (3-5 từ, bắt đầu bằng động từ)
2. Mô tả công cụ gồm ba câu: chức năng của công cụ, cụm từ kích hoạt "Sử dụng khi người dùng...", và các dữ liệu cần thiết
3. Với mỗi tham số đầu vào: tên định dạng PascalCase, kiểu dữ liệu (chỉ chọn Text/Number/Boolean), và một dòng mô tả ngắn gọn để AI biết chính xác giá trị cần trích xuất — bao gồm cả định dạng, ví dụ: YYYY-MM-DD cho ngày tháng
Kết quả nhận được: Một khối siêu dữ liệu sẵn sàng để dán vào hệ thống. Hãy đối chiếu với quy tắc định tuyến: Liệu một người lạ chỉ đọc phần mô tả có hiểu chính xác khi nào công cụ này được kích hoạt không? Nếu có, thì orchestrator cũng sẽ hiểu được.
Cách xử lý kết quả: Lưu lại cùng với ghi chú Bài 1 của bạn - đây chính là siêu dữ liệu bạn sẽ nhập khi thực sự xây dựng flow này trong dự án cuối khóa.
Phải làm gì khi có thay đổi trong schema
Mỗi khi bạn đổi tên, thêm hoặc xóa một tham số, schema của flow sẽ thay đổi - nhưng agent vẫn tiếp tục gọi flow với schema đã lưu tại thời điểm bạn gắn công cụ vào. Dấu hiệu nhận biết là lỗi FlowActionBadRequest, thường chỉ xuất hiện trên Teams trong khi bảng Test vẫn hoạt động bình thường.
Cách khắc phục rất đơn giản: Làm mới liên kết công cụ (đối với flow cấp topic, chọn dấu ba chấm (…) tại nút Action → Refresh), xác minh các đầu vào và đầu ra trong Copilot Studio khớp với flow, sau đó lưu và xuất bản lại agent. Hãy tạo thói quen: Thay đổi schema → làm mới → xuất bản lại, cho mọi lần thay đổi.
Kiểm tra nhanh: Bạn đã thêm một đầu ra vào flow và xuất bản nó. Hai bước nào giúp ngăn chặn lỗi cho agent?
Trả lời: Làm mới công cụ/nút Action để Copilot Studio đọc lại schema, sau đó xuất bản lại agent.
Những điểm chính cần ghi nhớ
Orchestrator đọc tên và mô tả tham số như các chỉ dẫn - hãy viết chúng dưới dạng quy tắc định tuyến, không phải chỉ là nhãn đơn thuần
Chỉ có các kiểu dữ liệu Text, Number và Boolean; Các giá trị ngày tháng được truyền dưới dạng văn bản đã định dạng, còn dữ liệu có cấu trúc được truyền dưới dạng JSON-in-Text (kèm hàm Parse JSON bên trong).
Tự động điền bằng AI cho các giá trị mà người dùng đã biết; kết hợp giá trị tùy chỉnh và biến hệ thống cho những yếu tố liên quan đến bảo mật.
Một phần mô tả công cụ hiệu quả cần giải đáp được ba vấn đề: Chức năng của công cụ, trường hợp sử dụng và dữ liệu đầu vào cần thiết.
Nếu schema thay đổi: hãy cập nhật lại công cụ rồi xuất bản lại agent - nếu không, bạn sẽ gặp lỗi FlowActionBadRequest trên Teams.
Câu 1:
Elena đã đổi tên một đầu vào của flow và thêm một đầu ra mới, sau đó xuất bản lại flow - và giờ đây, agent trong Teams báo lỗi FlowActionBadRequest mỗi khi được gọi. Chuyện gì đã xảy ra?
GIẢI THÍCH:
Lỗi FlowActionBadRequest xảy ra do sự không khớp về schema: Agent gửi yêu cầu với cấu trúc dữ liệu mà nó đang ghi nhớ, trong khi luồng lại yêu cầu cấu trúc mới. Cách khắc phục là làm mới công cụ (tại nút Action trong một topic: Chọn menu dấu ba chấm → Refresh), xác nhận các tham số đã khớp, sau đó lưu và xuất bản lại agent. Quy trình này không yêu cầu quản trị viên phê duyệt hay phải tạo lại luồng - và phiên bản ứng dụng Teams không phải là nguyên nhân gây ra vấn đề về schema.
Câu 2:
Flow của Marcus cần nhận một danh sách gồm ba mục, mỗi mục có tên và số lượng — nhưng trình kích hoạt (trigger) chỉ hỗ trợ các kiểu dữ liệu Văn bản (Text), Số (Number) và Boolean. Đâu là giải pháp khả thi?
GIẢI THÍCH:
Mô hình truyền JSON dưới dạng văn bản là cách các chuyên gia truyền dữ liệu có cấu trúc thông qua ba kiểu dữ liệu được hỗ trợ: Một đầu vào Văn bản chứa chuỗi JSON, và hành động Parse JSON sẽ khôi phục cấu trúc dữ liệu bên trong flow. Việc dùng 6 trường song song sẽ bị lỗi ngay khi có mục thứ tư, việc thay đổi trình kích hoạt sẽ khiến flow không còn phù hợp để sử dụng, còn tùy chọn bất đồng bộ (async) chỉ thay đổi cơ chế thời gian chứ không thay đổi kiểu dữ liệu.
Câu 3:
Hai người tạo đã viết mô tả cho cùng một flow yêu cầu nghỉ phép. Orchestrator sẽ định tuyến đến flow nào một cách đáng tin cậy nhất?
GIẢI THÍCH:
Flow chiến thắng là cái nêu rõ chức năng, thời điểm sử dụng và dữ liệu cần thiết - đây là ba yếu tố mà orchestrator dùng để đối chiếu. Các nhãn phiên bản và thuật ngữ kỹ thuật backend không thể hiện mục đích, còn mô tả bao hàm "mọi loại nghỉ phép" dễ khiến orchestrator định tuyến các yêu cầu mà quy trình thực tế không thể xử lý.
Theo Nghị định 147/2024/ND-CP, bạn cần xác thực tài khoản trước khi sử dụng tính năng này. Chúng tôi sẽ gửi mã xác thực qua SMS hoặc Zalo tới số điện thoại mà bạn nhập dưới đây: