ĐẶC TẢ TÍNH NĂNG RETURN TO INTERRUPTED FLOW
1. Tổng quan
1.1. Mục tiêu
Global Node có thể được kích hoạt tại bất kỳ thời điểm nào trong cuộc gọi để xử lý những tình huống chung nằm ngoài luồng hội thoại hiện tại, chẳng hạn:
- Khách hàng báo đang bận.
- Khách muốn gặp nhân viên.
- Khách hỏi lại: “Bên nào đấy?”.
- Khách phản đối về giá.
- Khách chuyển sang một chủ đề ngoài luồng.
- Khách muốn dừng cuộc gọi nhưng sau đó đổi ý và muốn tiếp tục.
Sau khi nhánh Global xử lý xong, node Return to interrupted flow đưa cuộc hội thoại trở lại đúng bước đang thực hiện trước khi Global Node được kích hoạt.
Việc quay lại không chỉ đơn giản là mở lại node cũ. Hệ thống cần xác định:
- Node trước đó đã hoàn thành hay chưa.
- Nội dung nào khách đã nghe.
- Nội dung nào bị ngắt hoặc chưa được truyền đạt.
- Bot đang nói, đang nghe hay đang thực hiện một tác vụ.
- Có cần phát lại câu hỏi hoặc một phần nội dung hay không.
- Có cần dùng một câu chuyển tiếp để cuộc hội thoại tự nhiên hay không.
1.2. Kết quả mong muốn
Tính năng cần bảo đảm:
- Không làm mất trạng thái của luồng chính.
- Không khởi tạo lại node hoặc Agent nếu không cần thiết.
- Không lặp lại những nội dung khách đã nghe đầy đủ.
- Không bỏ qua những thông tin quan trọng chưa được truyền đạt.
- Không thực hiện lại action hoặc tool đã thành công.
- Không quay lại Node nghe trong trạng thái im lặng.
- Không sử dụng lại câu nói đã kích hoạt Global Node như một câu trả lời cho luồng chính.
- Không quay lại một luồng đã kết thúc, đã chuyển máy thành công hoặc không còn hợp lệ.
2. Khái niệm
2.1. Interrupted flow
Luồng hội thoại đang chạy trước khi một Global Node được kích hoạt.
2.2. Interrupted node
Node đang hoạt động tại thời điểm Global Node được kích hoạt.
Ví dụ:
- Node nói đang phát audio.
- Node nghe đang chờ khách trả lời.
- Node Agent đang xử lý hội thoại.
- Node Action đang gọi API.
- Một node nằm bên trong Group đang được thực thi.
2.3. Global handler
Nhánh hội thoại được kích hoạt để xử lý một intent toàn cục.
Một Global handler có thể bắt đầu từ:
- Agent Global độc lập (that means phía trước không được nối với node nào khác).
- Node nghe bật chế độ Global độc lập.
2.4. Return context
Dữ liệu runtime được tạo khi Global Node kích hoạt, dùng để khôi phục luồng chính sau khi nhánh Global kết thúc.
Mỗi return_context chỉ được phép sử dụng thành công một lần.
2.5. Interaction checkpoint
Điểm hội thoại an toàn mà hệ thống có thể quay lại.
Checkpoint không nhất thiết trùng với node đang chạy. Ví dụ, nếu bot đang ở Node nghe thì checkpoint cần quay lại có thể là câu hỏi của Node nói trước đó.
2.6. Resume plan
Kế hoạch khôi phục được hệ thống tạo khi chạy đến node Return, bao gồm:
- Node cần tiếp tục.
- Phần nội dung cần phát lại.
- Phần nội dung có thể bỏ qua.
- Có cần phát câu chuyển tiếp hay không.
- Có cần chuyển sang node kế tiếp hay không.
- Có cần chờ action hoặc tool đang chạy hay không.
3. Cơ chế hoạt động
3.1. Khi Global Node được kích hoạt
Hệ thống thực hiện lần lượt:
- Tạm dừng quyền điều khiển của luồng chính.
- Tạo
return_context. - Lưu trạng thái của node đang thực hiện.
- Lưu trạng thái của Group nếu node đang nằm trong Group.
- Đánh dấu câu nói kích hoạt Global Node là đã được xử lý.
- Chuyển quyền điều khiển sang nhánh Global.
- Nhánh Global phản hồi và xử lý intent.
- Khi nhánh chạy đến Return, hệ thống đọc
return_context. - Hệ thống tạo
resume_planphù hợp với loại node và trạng thái đã lưu. - Khôi phục luồng chính hoặc thực hiện phương án fallback nếu không thể quay lại.
3.2. Dữ liệu tối thiểu cần lưu trong return context
return_context
├── context_id
├── flow_instance_id
├── source_global_node_id
├── source_global_type
├── interrupted_node_id
├── interrupted_node_type
├── interrupted_node_status
├── interrupted_path
├── group_stack
├── previous_node_id
├── next_node_id
├── conversation_context
├── playback_context
├── listening_context
├── agent_session_context
├── action_context
├── variables_snapshot
├── created_at
├── status
└── consumed_at
Trong đó:
interrupted_node_status: chưa chạy, đang chạy, đang chờ hoặc đã hoàn thành.interrupted_path: đường đi runtime của luồng chính.group_stack: các Group đang mở và node hiện tại trong từng Group.playback_context: nội dung đã phát, câu đang phát và checkpoint phát lại.listening_context: câu hỏi đang chờ, dữ liệu đã thu được và timeout còn lại.agent_session_context: phiên Agent, lịch sử, mục tiêu, tool và dữ liệu đã thu thập.action_context: trạng thái action, request ID, idempotency key và kết quả nếu có.status:available,consumed,invalidatedhoặcexpired.
3.3. Vòng đời return context
Một return_context bị đóng hoặc mất hiệu lực khi:
- Return đã khôi phục luồng chính thành công.
- Cuộc gọi kết thúc.
- Chuyển máy thành công.
- Luồng chính đã kết thúc bằng một end call node.
- Một Return khác đã sử dụng context.
- Hệ thống chuyển sang một flow mới không còn quan hệ với luồng bị ngắt.
4. Node Return to interrupted flow
4.1. Đặc điểm
Node Return có các đặc điểm sau:
- Có một hoặc nhiều cổng đầu vào.
- Không có cổng đầu ra thành công thông thường.
- Không chọn cố định node đích khi thiết kế flow.
- Đích quay lại được xác định tại runtime từ
return_context. - Có thể được nối trực tiếp từ Global Node hoặc từ một nhánh xử lý có nguồn gốc từ Global Node.
- Khi chạy thành công, node chuyển quyền điều khiển về luồng bị gián đoạn.
- Không được sử dụng như một node điều hướng thông thường trong luồng chính.
4.2. Cấu hình đề xuất
Tên node
Tên hiển thị để người dùng dễ nhận biết trên canvas.
Mặc định: Quay lại luồng trước đó.
5. Điều kiện kết nối và xuất bản flow
5.1. Agent Global
Agent Global được phép nối với Return khi đáp ứng tất cả điều kiện:
- Agent đang bật chế độ Global.
- Agent Global hoạt động độc lập. (Không có node nào trong flow chính nối vào đầu vào của Agent Global.)
- Nhánh dẫn đến Return có nguồn gốc từ chính Agent Global đó.
- Agent đã thực hiện phản hồi hoặc xử lý intent trước khi đến Return.
return_contextchưa bị đóng hoặc sử dụng.
Agent Global không được nối với Return khi:
- Agent là một node thông thường trong flow chính.
- Agent được gọi từ một nhánh không phải Global handler.
- Nhánh đã đi qua End Call hoặc Transfer thành công.
- Nhánh đã đi qua một Return khác.
Với Agent Global, bản thân Agent được xem là node xử lý phản hồi. Vì vậy cấu trúc sau có thể hợp lệ:
Agent Global → Return
5.2. Node nghe Global
Vai trò của Node nghe Global
Node nghe Global hoạt động thụ động trong suốt cuộc gọi để:
- Phân tích câu nói của khách.
- Phân loại intent toàn cục.
- Kích hoạt nhánh xử lý tương ứng.
- Tạo và lưu
return_context. - Đánh dấu câu nói kích hoạt Global là đã được xử lý.
- Tạm dừng luồng chính tại checkpoint phù hợp.
Node nghe Global chỉ nhận diện intent, không chịu trách nhiệm tạo phản hồi hoàn chỉnh.
Vai trò của node nói phản hồi
Node nói phản hồi, thường là Node nói hoặc Agent, chịu trách nhiệm xử lý intent vừa được nhận diện.
Ví dụ:
Global Listen
→ Intent: Hỏi đơn vị nào
→ Node nói: “Em gọi từ UCALL...”
→ Return
Điều kiện cần và đủ để nối Return
Giao diện chỉ cho phép nối hoặc xuất bản Return khi:
- Flow có ít nhất một Node nghe đang bật chế độ Global độc lập (Node nghe Global không có node phía trước nối vào).
- Nhánh hiện tại có nguồn gốc từ một intent của Node nghe Global.
- Trước Return đã có ít nhất một node thực hiện phản hồi cho khách.
- Nhánh chưa đi qua node làm đóng hoặc mất hiệu lực
return_context. - Nhánh chưa đi vào lại một node thuộc luồng chính.
- Nhánh chưa sử dụng một Return khác.
Node điều kiện hoặc Node Action đứng một mình không mặc nhiên được xem là đã phản hồi.
Ma trận kiểm tra cấu trúc
| Cấu trúc | Kết quả | Lý do |
|---|---|---|
| Flow chính → Return | Không hợp lệ | Không có return_context |
| Global Listen → Return | Không hợp lệ | Chưa phản hồi intent cho khách |
| Global Listen → Node nói → Return | Hợp lệ | Có nguồn Global và đã phản hồi |
| Global Listen → Agent → Return | Hợp lệ | Agent đã xử lý và phản hồi intent |
| Global Listen → Điều kiện → Node nói → Return | Hợp lệ | Có node phản hồi trước Return |
| Global Listen → Action → Return | Không hợp lệ | Action phải tạo ra phản hồi có ý nghĩa cho khách |
| Global Listen → End Call → Return | Không hợp lệ | Cuộc gọi đã kết thúc |
| Global Listen → Transfer thành công → Return | Không hợp lệ | Không còn cuộc gọi để quay lại |
| Global Listen → Return 1 → Return 2 | Không hợp lệ | Context đã được Return 1 sử dụng |
| Global Listen → Node trong flow chính → Return | Không hợp lệ | Đã rời khỏi phạm vi Global handler |
| Node nói thông thường → Return | Không hợp lệ | Không bắt nguồn từ Global handler |
| Agent Global độc lập → Return | Hợp lệ | Agent tự xử lý và phản hồi intent |
| Agent trong flow chính → Return | Không hợp lệ | Không phải Global handler độc lập |
6. Nguyên tắc khôi phục flow chung
Khi nhánh Global chạy đến Return, hệ thống xác định phương án theo thứ tự ưu tiên sau:
- Kiểm tra
return_contextcòn hợp lệ hay không. - Kiểm tra cuộc gọi và luồng chính còn tồn tại hay không.
- Kiểm tra interrupted node đã hoàn thành mục tiêu chưa.
- Kiểm tra khách đã nghe hoặc đã cung cấp đủ thông tin chưa.
- Xác định interaction checkpoint an toàn.
- Quyết định tiếp tục node, phát lại nội dung hay chuyển node tiếp theo.
- Quyết định có cần từ nối hay không.
6.1. Quy tắc quyết định cấp cao
| Trạng thái interrupted node | Cách xử lý |
|---|---|
| Chưa bắt đầu | Chạy node như bình thường |
| Đang phát nội dung | Phát lại từ checkpoint an toàn |
| Đang chờ khách trả lời | Phát lại câu hỏi (node nói trước) rồi tiếp tục nghe |
| Đã hoàn thành mục tiêu | Chuyển sang node tiếp theo |
8. Xử lý theo từng loại interrupted node
8.1. Node nói bằng file ghi âm
Vấn đề
File ghi âm thường là một audio liền mạch. Nếu tiếp tục đúng mili-giây bị ngắt, khách có thể nghe thấy:
- Một từ bị cụt.
- Một câu bắt đầu từ giữa.
- Nội dung không còn rõ nghĩa.
- Phần kết thúc được phát nhưng phần quan trọng trước đó chưa hoàn chỉnh.
Dữ liệu cần chuẩn bị
Hệ thống cần tiền xử lý file ghi âm để tạo checkpoint:
- Thời điểm bắt đầu và kết thúc từng câu.
- Khoảng lặng tự nhiên.
Có thể tạo checkpoint bằng:
- Transcript và sentence segmentation tự động.
- Phát hiện khoảng lặng.
Nếu không xác định được ranh giới câu đủ tin cậy, hệ thống nên phát lại toàn bộ audio thay vì tiếp tục từ một thời điểm không an toàn.
Quy tắc khôi phục
| Trạng thái audio | Cách quay lại |
|---|---|
| Bị ngắt trong 1–2 giây đầu | Phát lại từ đầu |
| Bị ngắt giữa audio | Phát lại từ đầu câu đang bị ngắt |
| Audio chỉ có một câu ngắn | Phát lại toàn bộ |
| Đã phát trên 95% và ý chính đã hoàn chỉnh | Có thể chuyển sang node tiếp theo (nếu node tiếp theo là node nghe thì vẫn cần phát lại câu cuối của node nói) |
| Không xác định được checkpoint an toàn | Phát lại toàn bộ audio |
8.2. Node nói bằng TTS cố định
TTS có nội dung văn bản xác định trước nên hệ thống có thể chia câu chính xác hơn file ghi âm.
Dữ liệu cần lưu
- Toàn bộ nội dung TTS.
- Danh sách câu.
- Câu đang phát.
- Vị trí phát trong câu.
- Các câu đã phát hoàn chỉnh.
- Câu hỏi hoặc thông tin bắt buộc.
Quy tắc khôi phục
| Trạng thái | Cách quay lại |
|---|---|
| Câu đang nói chưa hoàn thành | Nói lại từ đầu câu đó |
| Câu đã hoàn thành, node còn câu khác | Tiếp tục từ câu kế tiếp |
| Nội dung chỉ có một câu ngắn | Phát lại toàn bộ |
| Toàn bộ nội dung đã phát đầy đủ | Chuyển node tiếp theo (nếu node tiếp theo là node nghe thì vẫn cần phát lại câu cuối của node nói) |
Không tiếp tục từ giữa từ hoặc giữa câu, kể cả khi engine TTS hỗ trợ phát tiếp theo timestamp.
8.3. Node nói bằng Prompt
Dữ liệu cần lưu
Khi bị ngắt, hệ thống cần lưu:
- Prompt gốc.
- Nội dung đã sinh hoàn chỉnh.
- Phần đã phát cho khách.
- Phần chưa phát.
- Câu đang bị ngắt.
- Các ý đã truyền đạt.
- Các ý chưa truyền đạt.
- Biến và dữ liệu dùng để sinh nội dung.
- Phiên bản dữ liệu tại thời điểm sinh.
Nguyên tắc khôi phục
Nếu nội dung đã được sinh hoàn chỉnh, hệ thống nên tiếp tục từ nội dung đã lưu, không chạy lại prompt từ đầu. Việc sinh lại có thể làm:
- Thay đổi cách diễn đạt.
- Lặp ý.
- Mâu thuẫn với phần khách đã nghe.
- Sử dụng dữ liệu mới không đúng với thời điểm trước đó.
Nếu nội dung đang được sinh theo streaming, hệ thống cần tiếp tục dựa trên:
- Các ý đã hoàn thành.
- Câu đang bị ngắt.
- Kế hoạch nội dung còn lại.
- Dữ liệu và biến đã được đóng băng tại checkpoint.
Chỉ dẫn resume đề xuất
Tiếp tục nội dung đang dang dở.
Yêu cầu:
- Không lặp lại các ý khách đã nghe đầy đủ.
- Nói lại đầy đủ câu đang bị ngắt.
- Tiếp tục các ý chưa được truyền đạt.
- Giữ nguyên dữ kiện và mục tiêu của nội dung ban đầu.
- Mở đầu bằng một câu chuyển tiếp ngắn nếu có sự gián đoạn ngữ nghĩa.
- Không đề cập đến cơ chế node, flow hoặc việc hệ thống vừa khôi phục.
Điều kiện hoàn thành
Nếu tất cả ý bắt buộc đã được truyền đạt trước khi Global kích hoạt, Node Prompt được xem là hoàn thành và hệ thống chuyển sang node tiếp theo.
Nếu node tiếp theo là Node nghe, hệ thống vẫn phải kiểm tra câu hỏi hoặc lời hướng dẫn trả lời đã được phát đầy đủ hay chưa.
8.4. Node Agent
Nguyên tắc
Không khởi tạo một phiên Agent mới khi quay lại. Hệ thống phải tạm dừng và tiếp tục đúng phiên Agent đang hoạt động.
Dữ liệu cần lưu
agent_session_id.- Mục tiêu hiện tại.
- Lịch sử hội thoại.
- Lượt hội thoại đang xử lý.
- Nội dung đã phát cho khách.
- Nội dung chưa phát.
- Câu đang bị ngắt.
- Tool hoặc action đang chạy.
tool_call_id.idempotency_key.- Kết quả tool đã có.
- Thông tin đang chờ khách cung cấp.
- Các biến đã thu thập.
- Các trường dữ liệu còn thiếu.
- Trạng thái hoàn thành mục tiêu.
Quy tắc khôi phục
| Trạng thái Agent | Cách quay lại |
|---|---|
| Agent đang nói | Nói lại từ đầu câu bị ngắt rồi tiếp tục |
| Agent đang chờ khách trả lời | Hỏi lại câu hỏi đang chờ |
| Agent đã nhận một phần dữ liệu | Giữ dữ liệu đã có, chỉ hỏi phần còn thiếu |
| Agent đang lập luận nhưng chưa trả lời | Tiếp tục lượt xử lý hiện tại |
| Agent đang gọi tool | Theo dõi tool call hiện tại, không tạo tool call mới |
| Tool đã hoàn thành | Dùng kết quả đã có, không gọi lại |
| Tool đang chạy | Chờ hoặc tiếp tục theo dõi kết quả |
| Agent đã hoàn thành mục tiêu | Chuyển sang node tiếp theo |
8.5. Node nghe
Vấn đề
Nếu hệ thống chỉ quay lại Node nghe, bot sẽ tiếp tục im lặng chờ trong khi khách không biết cần trả lời câu hỏi nào.
Vì vậy, với Node nghe, hệ thống phải khôi phục interaction checkpoint, không chỉ khôi phục đúng node_id.
Dữ liệu cần lưu
- Intent hoặc loại dữ liệu đang chờ.
- Câu hỏi dẫn đến Node nghe.
- Node hoặc Agent đã tạo câu hỏi.
- Các lựa chọn hợp lệ.
- Dữ liệu khách đã cung cấp một phần.
- Số lần hỏi lại.
- Timeout và retry hiện tại.
- Câu nói đã kích hoạt Global.
Quy tắc khôi phục
- Xác định câu hỏi hoặc chỉ dẫn mà Node nghe đang chờ khách trả lời.
- Phát lại câu hỏi đó.
- Chỉ phát lại phần cần thiết, không chạy lại các action nằm giữa Node nói và Node nghe.
- Reset thời gian chờ nghe.
- Giữ nguyên dữ liệu hợp lệ đã thu thập trước đó.
- Không sử dụng câu nói đã kích hoạt Global làm câu trả lời cho Node nghe.
Ví dụ:
Node nói: “Anh muốn đặt lịch vào buổi sáng hay buổi chiều?”
Node nghe: Chờ giá trị Sáng/Chiều
Khách nói: “Khoan, bên nào gọi đấy?”
Sau khi Global handler trả lời, hệ thống cần quay lại:
“Mình quay lại câu hỏi lúc nãy nhé. Anh muốn đặt lịch vào buổi sáng hay buổi chiều?”
Sau đó Node nghe mới tiếp tục chờ câu trả lời.
Trường hợp câu hỏi được tạo bởi Agent hoặc Prompt
Hệ thống phát lại câu hỏi đã được lưu tại runtime, không chạy lại toàn bộ Agent hoặc Prompt chỉ để tạo lại câu hỏi.
Trường hợp đã thu được một phần dữ liệu
Ví dụ Agent đang thu ngày và giờ, khách đã cung cấp ngày nhưng chưa cung cấp giờ.
Sau khi quay lại, bot chỉ hỏi:
“Anh muốn đặt vào khoảng mấy giờ ạ?”
Không hỏi lại ngày nếu dữ liệu ngày đã được xác nhận.
8.6. Node Action
Node Action có thể tiếp tục chạy trong lúc Global handler đang xử lý, nếu action đó không yêu cầu quyền điều khiển hội thoại và không xung đột với nhánh Global.
Quy tắc khôi phục
| Trạng thái Action | Cách quay lại |
|---|---|
| Action chưa bắt đầu | Chạy action như bình thường |
| Action đang chạy | Tiếp tục theo dõi cùng action instance |
| Global kết thúc nhưng action chưa xong | Chờ action hoàn thành hoặc đến timeout |
| Action đã thành công | Không chạy lại, chuyển theo nhánh thành công |
| Action thất bại | Chuyển theo nhánh thất bại hoặc retry đã cấu hình |
8.7. Node nằm trong Group
Khi interrupted node nằm trong Group, hệ thống cần lưu cả trạng thái node và trạng thái Group.
Dữ liệu cần lưu
- Danh sách Group đang mở.
- Group hiện tại.
- Node hiện tại trong Group.
- Các node trong Group đã hoàn thành.
- Biến cục bộ của Group.
- Điều kiện hoàn thành Group.
- Đường đi sau khi Group hoàn thành.
Quy tắc
- Node nói trong Group được xử lý theo quy tắc Node nói.
- Node nghe trong Group được xử lý theo quy tắc Node nghe.
- Node Action trong Group được xử lý theo quy tắc Node Action.
- Node Agent trong Group được xử lý theo quy tắc Node Agent.
- Không chạy lại các node trong Group đã hoàn thành.
- Nếu interrupted node chưa hoàn thành, tiếp tục node đó từ checkpoint.
- Nếu interrupted node đã hoàn thành, chạy node tiếp theo trong Group.
- Nếu toàn bộ Group đã hoàn thành, chuyển sang node tiếp theo bên ngoài Group.
11. Kiểm tra khi xuất bản flow
Hệ thống cần validate tối thiểu các điều kiện sau:
- Return nằm trong nhánh có nguồn gốc từ Global handler hợp lệ.
- Global handler hoạt động độc lập.
- Có node phản hồi trước Return.
- Không có terminal node trước Return.
- Không có Return khác trên cùng đường đi.
- Không đi vào flow chính rồi mới quay lại Return.
- Tất cả nhánh có thể đi đến Return đều giữ được
return_context. - Có cấu hình fallback cho trường hợp context không hợp lệ.
- Không tồn tại vòng lặp Return.
- Agent Global hoặc Global Listen đang được bật.
- Node Return không được đặt làm entry node.
- Node Return không có cổng đầu ra thành công thông thường.
Thông báo lỗi cần chỉ rõ nguyên nhân, ví dụ:
“Node Return không hợp lệ vì nhánh này không bắt nguồn từ một Global Node độc lập.”
“Cần có ít nhất một node phản hồi khách hàng trước khi quay lại luồng bị gián đoạn.”
“Không thể sử dụng Return sau End Call hoặc Transfer thành công.”
“Return context đã được sử dụng bởi một node Return khác trên nhánh này.”
12. Tiêu chí nghiệm thu
Tính năng được xem là đạt yêu cầu khi:
- Global Node có thể ngắt luồng chính từ mọi loại node được hỗ trợ.
- Hệ thống lưu đúng interrupted node và trạng thái runtime.
- Câu nói kích hoạt Global không bị xử lý hai lần.
- File ghi âm không tiếp tục từ giữa từ hoặc giữa câu.
- TTS phát lại đúng câu bị ngắt.
- Prompt không sinh lại toàn bộ nội dung gây lặp hoặc mâu thuẫn.
- Agent tiếp tục đúng session và không mất dữ liệu đã thu thập.
- Tool hoặc Action thành công không bị thực hiện lại.
- Khi đang ở Node nghe, bot phát lại câu hỏi trước khi tiếp tục nghe.
- Quy tắc
>95%không làm mất câu hỏi hoặc thông tin bắt buộc. - Node trong Group được khôi phục đúng vị trí.
- Return không hoạt động nếu context đã bị đóng.
- Một
return_contextkhông được sử dụng thành công quá một lần. - Câu chuyển tiếp chỉ được phát khi cần và không làm thay đổi ý nghĩa hội thoại.
- Flow không hợp lệ bị chặn ngay khi xuất bản.
- Khi không thể quay lại, hệ thống chạy đúng fallback và không tự chọn một node đích không xác định.