Đặt lịch là tính năng vùng Xanh có giá trị cao nhất: nó tiết kiệm thời gian lễ tân và bắt được khách ngoài giờ. Bài này xây luồng đặt lịch hoàn chỉnh, từ system prompt tới tool calling.
System prompt cho agent đặt lịch
Bạn là trợ lý đặt lịch của Phòng khám Da liễu Minh Châu.
NHIỆM VỤ: giúp bệnh nhân đặt / đổi / hủy lịch hẹn.
QUY TẮC AN TOÀN:
- KHÔNG tư vấn y tế, thuốc, triệu chứng. Nếu được hỏi,
từ chối lịch sự và đề nghị đặt lịch hoặc gọi chuyen_nguoi_that.
- LUÔN xác nhận lại khung giờ + dịch vụ trước khi gọi tao_lich_hen.
- Nếu không tìm được khung giờ phù hợp sau 2 lần, gọi chuyen_nguoi_that.
- Xưng "em", gọi khách "anh/chị", ngắn gọn, thân thiện.
CÔNG CỤ: tim_khung_gio_trong, tao_lich_hen, chuyen_nguoi_that.
Luồng hội thoại chuẩn (happy path)
- Nhận yêu cầu, xác định dịch vụ và mốc thời gian mong muốn.
- Gọi
tim_khung_gio_trong→ nhận danh sách khung giờ. - Đề xuất tối đa 3 lựa chọn cụ thể (không hỏi mở "anh muốn giờ nào").
- Bệnh nhân chọn → agent nhắc lại đầy đủ để xác nhận.
- Sau khi khách đồng ý → gọi
tao_lich_hen. - Xác nhận thành công + hướng dẫn chuẩn bị (nếu có).
Ví dụ hội thoại thật
Khách: cho em đặt soi da tuần này
Agent: Dạ để em kiểm tra lịch soi da tuần này ạ.
[gọi tim_khung_gio_trong(dich_vu="soi da", tu_ngay=..., den_ngay=...)]
Agent: Em có 3 khung trống ạ:
1) Thứ 4, 15:00
2) Thứ 5, 09:30
3) Thứ 5, 16:00
Anh/chị chọn khung nào ạ?
Khách: thứ 5 chiều nhé
Agent: Dạ em xác nhận: SOI DA, Thứ 5 (04/06) lúc 16:00,
tại phòng khám. Anh/chị đồng ý em đặt luôn nhé?
Khách: ok em
Agent: [gọi tao_lich_hen(...)]
Agent: Đã đặt xong ạ! Lịch: Soi da, Thứ 5 04/06 16:00.
Anh/chị đến trước 10 phút để làm thủ tục nhé.
Cần đổi lịch cứ nhắn em ạ.
Xử lý các nhánh khó
Hết chỗ: đề xuất ngày gần nhất khác → nếu khách không ưng lần 2 → chuyen_nguoi_that
Khách mơ hồ: hỏi đúng 1 câu làm rõ (dịch vụ HOẶC thời gian), không hỏi dồn
Đổi lịch: tra lịch hiện tại → xác nhận hủy cũ → đặt mới (2 bước rõ ràng)
Hỏi y tế: từ chối + đề nghị đặt khám hoặc chuyển điều dưỡng
Pseudocode vòng lặp agent
def xu_ly_tin_nhan(msg, patient):
ctx = build_context(patient) # chỉ field hành chính
while True:
resp = llm(system_prompt, ctx, msg)
if resp.tool_call:
if resp.tool == "tao_lich_hen" and not da_xac_nhan(ctx):
# chặn: chưa xác nhận thì không cho tạo
return yeu_cau_xac_nhan(resp.args)
ket_qua = goi_tool(resp.tool, resp.args)
ctx.append(ket_qua)
continue
return resp.text
Điểm mấu chốt: chặn tao_lich_hen khi chưa có xác nhận — đây là rào chắn code, không chỉ dựa vào prompt.
Khung tư duy "Xác nhận trước khi ghi"
Mọi hành động GHI (tạo/đổi/hủy) phải qua 3 bước: (1) nhắc lại đầy đủ chi tiết, (2) chờ đồng ý rõ ràng, (3) mới thực thi. Đây là lá chắn chống agent "tự tin đặt nhầm".
Checklist agent đặt lịch
- [ ] Luôn đề xuất khung giờ cụ thể, không hỏi mở
- [ ] Nhắc lại đầy đủ trước khi tạo lịch
- [ ] Có rào chắn code chặn tạo lịch khi chưa xác nhận
- [ ] Giới hạn số lần thử trước khi chuyển người
- [ ] Gửi hướng dẫn chuẩn bị sau khi đặt
Sai lầm thường gặp
- Hỏi mở "anh muốn giờ nào?" khiến hội thoại dài lê thê. Luôn đề xuất lựa chọn cụ thể.
- Tin prompt là đủ để chặn hành động sai. Prompt có thể bị bỏ qua; hãy chặn bằng code ở bước gọi tool.
- Không xác nhận lại trước khi ghi. Dẫn tới lịch sai giờ, sai dịch vụ.
- Vòng lặp vô tận khi không có giới hạn số lần thử — bệnh nhân bực và tốn token.
Học xong bài này rồi?
Tạo tài khoản miễn phí để lưu lại — lần sau vào là biết ngay đang dở ở đâu,
và học hết khóa thì có chứng chỉ.
Lưu tiến độ của tôi