Bài học hiện đang bằng tiếng Séc. Giao diện đã được dịch – nội dung bài học sẽ sớm có.

← Cấp 5 – Nhà phát minh

Bài 7 / 8 ⏱ 40 phút Premium

Chatbot riêng của bạn

Xây cửa sổ chat trên website và kết nối với server từ bài trước.

Xem thử: cửa sổ chat

Chat gồm ba thứ: danh sách tin nhắn, ô nhập và nút Gửi.

<div class="chat">
  <div id="zpravy" class="chat-zpravy"></div>
  <form id="chat-form" class="chat-form">
    <input id="chat-vstup" type="text" placeholder="Type your question…" autocomplete="off" />
    <button type="submit">Send</button>
  </form>
</div>
.chat { border: 1px solid #ddd; border-radius: 12px; max-width: 420px; }
.chat-zpravy { height: 300px; overflow-y: auto; padding: 12px; display: flex; flex-direction: column; gap: 8px; }
.zprava { padding: 8px 12px; border-radius: 12px; max-width: 80%; }
.zprava.ja { background: #4f46e5; color: white; align-self: flex-end; }
.zprava.bot { background: #f0f0f0; align-self: flex-start; }
.chat-form { display: flex; gap: 8px; padding: 12px; border-top: 1px solid #ddd; }
.chat-form input { flex: 1; }

Kết nối với server

const zpravy = document.querySelector('#zpravy');
const form = document.querySelector('#chat-form');
const vstup = document.querySelector('#chat-vstup');

function pridejZpravu(text, kdo) {
  const el = document.createElement('div');
  el.className = `zprava ${kdo}`;
  el.textContent = text;
  zpravy.appendChild(el);
  zpravy.scrollTop = zpravy.scrollHeight; // scroll down to the new message
}

form.addEventListener('submit', async (e) => {
  e.preventDefault();
  const otazka = vstup.value.trim();
  if (!otazka) return;

  pridejZpravu(otazka, 'ja');
  vstup.value = '';
  pridejZpravu('Thinking…', 'bot');

  const r = await fetch('/zeptat-se', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ otazka }),
  });
  const data = await r.json();

  zpravy.lastChild.textContent = data.text; // replace "Thinking…" with the answer
});

Mọi thứ trong code đó bạn đã biết: addEventListener, createElement, fetch với POST. Phần mới chỉ là ý tưởng ghép tất cả thành chat.

💡

“Thinking…” là mẹo nhỏ nhưng quan trọng. AI mất vài giây để trả lời – không có tin nhắn đó, khách có thể nghĩ chat bị hỏng. Lập trình viên giỏi luôn cho thấy điều gì đang xảy ra.

Đến lượt bạn 💪

  1. Xây chat theo ví dụ và khớp màu với website.
  2. Trong system prompt trên server (bài 6), dùng prompt bạn viết cho dự án ở bài 5 – biến AI chung thành trợ lý của bạn.
  3. Test: hỏi 5 câu khách có thể hỏi. Bot trả lời đúng không? Tinh chỉnh prompt.
  4. Bonus: thêm lời chào từ bot ngay sau khi trang tải (“Hi! Ask me anything about our school.”).
⚠️

Bảo mật chat: thêm câu vào system prompt như “Only answer questions about [your website]. Politely decline to answer anything else.” – nếu không bot sẽ viết bất cứ gì cho khách, kể cả không liên quan website.

Kiểm tra: Chat chạy trên website: bạn gõ câu hỏi, bong bóng của bạn xuất hiện, rồi “Thinking…”, rồi câu trả lời bot. Bot nói như trợ lý cho dự án.

Những điều cần nhớ