Chatbot Telegram hỏi đáp dữ liệu với n8n và Claude

Featured Image 1200×628@2x

Giữa buổi họp, sếp nhắn: “Doanh thu tuần này bao nhiêu rồi em?”. Bạn mở laptop, mở file, lọc ngày, cộng tổng rồi mới trả lời được. Câu hỏi đơn giản, nhưng lặp lại nhiều lần mỗi tuần. Bài viết này hướng dẫn bạn xây một chatbot hỏi đáp dữ liệu trên Telegram bằng n8n và Claude: người dùng gõ câu hỏi bằng tiếng Việt tự nhiên, bot trả lời con số chính xác từ Google Sheets chỉ sau vài giây.

✦Bot dữ liệu bán hàng
bot · trả lời trong vài giây
Doanh thu tuần này bao nhiêu rồi em?
Sếp
✦ Claude hiểu là: doanhThu · tuanNay
✦

💰 Doanh thu tuần này: [số liệu] (… giao dịch).
📅 Dữ liệu từ thứ Hai đến hôm nay
Bot dữ liệu

Chatbot hỏi đáp dữ liệu hoạt động thế nào?

Cách làm dễ nhất là đưa cả file dữ liệu cho AI rồi hỏi. Nhưng như vậy AI phải tự cộng hàng trăm dòng, dễ tính sai mà không ai biết, và bạn phải gửi toàn bộ dữ liệu ra ngoài. Chatbot trong bài chia việc theo đúng thế mạnh của từng bên:

✦ Claude

Hiểu câu hỏi tiếng Việt, chuyển thành yêu cầu có cấu trúc

“doanh thu tuần này?” → chỉ số doanhThu, kỳ tuanNay

{ } Node Code

Lọc dữ liệu và tính con số chính xác

Cộng doanh thu từ thứ Hai đến hôm nay

✈ Telegram

Nhận câu hỏi và gửi câu trả lời

“Doanh thu tuần này: [số liệu]”

Kiến trúc chatbot: 6 node

✈

NODE 1 · TELEGRAM

Telegram Trigger

Nhận tin nhắn người dùng gửi cho bot

➜ Nội dung câu hỏi và Chat ID

🛡

NODE 2 · BẢO VỆ

Filter – Kiểm tra quyền

Chỉ cho người trong danh sách được hỏi

➜ Tin nhắn hợp lệ

✦

NODE 3 · AI

Basic LLM Chain + Claude – Hiểu câu hỏi

Chuyển câu hỏi thành JSON: chỉ số, kỳ thời gian, cửa hàng

➜ Yêu cầu có cấu trúc

▦

NODE 4 · DATA

Google Sheets – Đọc dữ liệu

Đọc dữ liệu bán hàng

➜ Các dòng giao dịch

{ }

NODE 5 · CODE

Code – Tính và soạn trả lời

Lọc theo yêu cầu, tính số, ghép câu trả lời

➜ Nội dung trả lời

➤

NODE 6 · TRẢ LỜI

Telegram – Trả lời

Gửi câu trả lời về đúng cuộc trò chuyện

➜ Tin nhắn trả lời

✦ CLAUDE

Hiểu câu hỏi

{ } NODE CODE

Tính số

💡 Nguyên tắc quan trọng nhất: AI hiểu câu hỏi, code tính số. Claude chỉ đọc câu hỏi và trả về một yêu cầu ngắn dạng JSON, không bao giờ nhìn thấy dữ liệu bán hàng. Mọi con số do node Code tính nên luôn chính xác và kiểm tra lại được, còn dữ liệu không rời khỏi hệ thống của bạn. Đây là cùng tinh thần “code tính số, AI viết lời” trong bài Tự động hóa báo cáo tuần với n8n và AI.

Xây chatbot từng bước

🧰 Bước 0✈ Bước 1🛡 Bước 2✦ Bước 3▦ Bước 4{ } Bước 5➤ Bước 6

BƯỚC 0🧰 CHUẨN BỊ

Bước 0: Chuẩn bị dữ liệu, bot và credentials

  • Dữ liệu: một Google Sheet tên DuLieuBanHang, mỗi dòng là một giao dịch với các cột NgayBan, CuaHang, SanPham, SoLuong, ThanhTien. Định dạng cột NgayBan là văn bản dạng YYYY-MM-DD (chọn cột, vào Format › Number › Plain text) để việc lọc theo ngày luôn chính xác.
  • Bot Telegram: mở @BotFather, gõ /newbot, đặt tên và nhận Access Token.
  • Credentials trong n8n: Telegram (token vừa nhận), Google (cho Google Sheets) và Anthropic (API key để dùng Claude).
  • Địa chỉ công khai: Telegram gửi tin nhắn về n8n qua webhook, nên n8n phải truy cập được từ internet qua HTTPS. Bản n8n cloud đã sẵn sàng; nếu tự cài, bạn cần tên miền có HTTPS và cấu hình biến môi trường WEBHOOK_URL.
  • Múi giờ: trong Settings của workflow, đặt Timezone là Asia/Ho_Chi_Minh để “hôm nay”, “tuần này” được tính theo giờ Việt Nam.

BƯỚC 1✈ TELEGRAM

Bước 1: Telegram Trigger – nhận câu hỏi

Thêm node Telegram Trigger, chọn credential Telegram và Trigger On là Message. Bấm nút nghe sự kiện thử trên node, rồi nhắn cho bot một câu bất kỳ. Đầu ra có nội dung câu hỏi ở message.text và mã cuộc trò chuyện ở message.chat.id. Hãy ghi lại chat.id của bạn (và của những người được phép dùng bot) để dùng ở bước sau.

BƯỚC 2🛡 BẢO VỆ

Bước 2: Filter – chỉ cho người được phép hỏi

Bot Telegram là công khai: ai biết tên bot đều nhắn được. Thêm node Filter, điều kiện {{ $json.message.chat.id }} is equal to chat.id của bạn. Có nhiều người dùng thì thêm điều kiện cho từng người và đổi kiểu kết hợp sang OR. Tin nhắn từ người lạ sẽ dừng lại ở đây, không tốn lượt gọi AI và không lộ dữ liệu.

BƯỚC 3✦ AI

Bước 3: Basic LLM Chain + Claude – hiểu câu hỏi

Thêm node Basic LLM Chain, đặt tên Hiểu câu hỏi, gắn sub-node Anthropic Chat Model (chọn một model Claude, đặt temperature bằng 0 để kết quả ổn định). Phần prompt nhập như sau:

✦ prompt.txtHiểu câu hỏi · Claude
Bạn chuyển câu hỏi về dữ liệu bán hàng thành JSON. Chỉ trả về JSON, không giải thích.
Câu hỏi: {{ $json.message.text }}

Định dạng:
{“chiSo”: “doanhThu” | “soGiaoDich” | “topSanPham” | “khongHieu”,
“ky”: “homNay” | “homQua” | “tuanNay” | “tuanTruoc” | “thangNay” | “thangTruoc”,
“cuaHang”: tên cửa hàng hoặc null}

Quy tắc:
– Không tự tính hay đoán bất kỳ con số nào.
– Câu hỏi không thuộc ba chỉ số trên thì đặt “chiSo”: “khongHieu”.
– Không nói rõ thời gian thì dùng “tuanNay”.

Với câu “doanh thu tuần này của cửa hàng Quận 1?”, Claude trả về {“chiSo”: “doanhThu”, “ky”: “tuanNay”, “cuaHang”: “Quận 1”} trong trường text. Claude chỉ nhìn thấy câu hỏi, không nhìn thấy dữ liệu.

✦Bước 3 · Hiểu câu hỏi
Claude chỉ trả về JSON, không thấy dữ liệu
doanh thu tuần này của cửa hàng Quận 1?
Bạn
✦ Claude hiểu là: doanhThu · tuanNay · Quận 1

BƯỚC 4▦ DATA

Bước 4: Google Sheets – đọc dữ liệu bán hàng

Thêm node Google Sheets, đặt tên Đọc dữ liệu, chọn thao tác Get row(s) in sheet, trỏ tới sheet DuLieuBanHang. Node nhận một item từ bước trước nên chỉ đọc một lần và trả về toàn bộ các dòng giao dịch.

BƯỚC 5{ } CODE

Bước 5: Code – tính số và soạn câu trả lời

Thêm node Code (JavaScript, chế độ Run Once for All Items), đặt tên Tính và trả lời:

{ } Tính và trả lời.jsCode node · JavaScript
1// 1. Đọc yêu cầu Claude trả về (bỏ dấu ``` nếu có)
2let y;
3try {
4  const raw = $('Hiểu câu hỏi').first().json.text.replace(/```(json)?/g, '').trim();
5  y = JSON.parse(raw);
6} catch (e) { y = { chiSo: 'khongHieu' }; }
7
8const HUONG_DAN = 'Mình trả lời được doanh thu, số giao dịch và top sản phẩm theo hôm nay, hôm qua, tuần này, tuần trước, tháng này, tháng trước. Ví dụ: "doanh thu tuần này của cửa hàng Quận 1?"';
9if (!y || y.chiSo === 'khongHieu') {
10  return [{ json: { traLoi: '🤔 Mình chưa hiểu câu hỏi. ' + HUONG_DAN } }];
11}
12
13// 2. Xác định khoảng thời gian (tuần bắt đầu từ thứ Hai)
14const nay = $now.startOf('day');
15const KY = {
16  homNay:     [nay, nay.plus({ days: 1 }), 'hôm nay'],
17  homQua:     [nay.minus({ days: 1 }), nay, 'hôm qua'],
18  tuanNay:    [nay.startOf('week'), nay.plus({ days: 1 }), 'tuần này'],
19  tuanTruoc:  [nay.startOf('week').minus({ weeks: 1 }), nay.startOf('week'), 'tuần trước'],
20  thangNay:   [nay.startOf('month'), nay.plus({ days: 1 }), 'tháng này'],
21  thangTruoc: [nay.startOf('month').minus({ months: 1 }), nay.startOf('month'), 'tháng trước']
22};
23const [tu, den, tenKy] = KY[y.ky] || KY.tuanNay;
24const tuNgay = tu.toISODate(), denNgay = den.toISODate();
25
26// 3. Lọc dữ liệu theo kỳ và cửa hàng
27const ch = (y.cuaHang || '').toLowerCase();
28const dong = $input.all().map(i => i.json).filter(r =>
29  r.NgayBan >= tuNgay && r.NgayBan < denNgay &&
30  !isNaN(Number(r.ThanhTien)) &&
31  (!ch || String(r.CuaHang).toLowerCase().includes(ch)));
32
33// 4. Tính số và ghép câu trả lời
34const tien = n => new Intl.NumberFormat('vi-VN').format(Math.round(n)) + ' đ';
35const noi = y.cuaHang ? ` của ${y.cuaHang}` : '';
36let traLoi;
37if (dong.length === 0) {
38  traLoi = `Chưa có dữ liệu ${tenKy}${noi}.`;
39} else if (y.chiSo === 'doanhThu') {
40  const dt = dong.reduce((s, r) => s + Number(r.ThanhTien), 0);
41  traLoi = `💰 Doanh thu ${tenKy}${noi}: ${tien(dt)} (${dong.length} giao dịch).`;
42} else if (y.chiSo === 'soGiaoDich') {
43  traLoi = `🧾 Số giao dịch ${tenKy}${noi}: ${dong.length}.`;
44} else {
45  const m = {};
46  dong.forEach(r => { m[r.SanPham] = (m[r.SanPham] || 0) + Number(r.ThanhTien); });
47  const top = Object.entries(m).sort((a, b) => b[1] - a[1]).slice(0, 3)
48    .map(([sp, v], k) => `${k + 1}. ${sp}: ${tien(v)}`).join('\n');
49  traLoi = `🏆 Top sản phẩm ${tenKy}${noi}:\n${top}`;
50}
51
52const khoang = `${tu.toFormat('dd/MM')} – ${den.minus({ days: 1 }).toFormat('dd/MM')}`;
53return [{ json: { traLoi: `${traLoi}\n📅 Dữ liệu từ ${khoang}` } }];

Câu trả lời luôn kèm khoảng ngày đã tính, để người hỏi biết ngay bot hiểu “tuần này” là từ ngày nào đến ngày nào. Nếu Claude hiểu sai câu hỏi hoặc trả về không phải JSON, bot trả lời hướng dẫn cách hỏi thay vì đưa ra một con số sai.

BƯỚC 6➤ TRẢ LỜI

Bước 6: Telegram – gửi câu trả lời

Thêm node Telegram, chọn thao tác Send Message:

⚙ CẤU HÌNH NODE · TELEGRAM SEND MESSAGE
Chat ID{{ $('Telegram Trigger').first().json.message.chat.id }}, để trả lời đúng người vừa hỏi.
Text{{ $json.traLoi }}.
Additional Fieldstắt Append n8n Attribution để tin nhắn không kèm dòng quảng cáo của n8n.

Cuối cùng, lưu và kích hoạt workflow (nút Active, hoặc Publish ở một số phiên bản mới). Chỉ khi workflow được kích hoạt, bot mới tự trả lời mà không cần bạn mở n8n.

Thử nghiệm: những câu hỏi bot trả lời được

Trước khi chia sẻ bot cho người khác, hãy thử nhiều cách hỏi khác nhau và đối chiếu con số với Google Sheets. Bảng dưới đây cho thấy cách Claude hiểu từng câu (số liệu trong câu trả lời do dữ liệu của bạn quyết định):

✦Thử nghiệm bot
5 câu hỏi mẫu · số liệu do dữ liệu của bạn quyết định
doanh thu tuần này?
Bạn
✦ Claude hiểu là: doanhThu · tuanNay
✦

💰 Doanh thu tuần này: [số liệu] (… giao dịch)
Bot dữ liệu
hôm qua bán được bao nhiêu đơn
Bạn
✦ Claude hiểu là: soGiaoDich · homQua
✦

🧾 Số giao dịch hôm qua: [số liệu]
Bot dữ liệu
tháng trước sản phẩm nào bán chạy nhất?
Bạn
✦ Claude hiểu là: topSanPham · thangTruoc
✦

🏆 Top sản phẩm tháng trước: 1. … 2. … 3. …
Bot dữ liệu
doanh thu cửa hàng Quận 1 tuần trước
Bạn
✦ Claude hiểu là: doanhThu · tuanTruoc · Quận 1
✦

💰 Doanh thu tuần trước của Quận 1: [số liệu]
Bot dữ liệu
tồn kho còn bao nhiêu?
Bạn
✦ Claude hiểu là: khongHieu
✦

🤔 Mình chưa hiểu câu hỏi, kèm hướng dẫn cách hỏi
Bot dữ liệu

Câu cuối rất quan trọng: dữ liệu không có tồn kho, nên bot phải nói không biết thay vì đoán. Một chatbot dữ liệu đáng tin là chatbot biết giới hạn của mình.

Kiểm soát rủi ro: để chatbot trả lời đúng và an toàn

⚠ RỦI RO 01 Người lạ hỏi dữ liệu

Ví dụ: Ai đó tìm thấy tên bot và hỏi doanh thu

Cách phòng tránh: Node Filter chỉ cho các chat.id trong danh sách; không chia sẻ tên bot công khai

⚠ RỦI RO 02 Claude hiểu sai câu hỏi

Ví dụ: “tuần rồi” bị hiểu thành tuần này

Cách phòng tránh: Câu trả lời luôn ghi rõ chỉ số và khoảng ngày đã tính để người hỏi tự kiểm tra; bổ sung ví dụ vào prompt khi gặp cách hỏi mới

⚠ RỦI RO 03 AI bịa số

Ví dụ: Bot nêu một con số không có trong dữ liệu

Cách phòng tránh: Claude không nhìn thấy dữ liệu và không viết câu trả lời; mọi con số do node Code tính

⚠ RỦI RO 04 Dữ liệu ngày sai định dạng

Ví dụ: Bot báo “chưa có dữ liệu” dù sheet có số

Cách phòng tránh: Đặt cột NgayBan là văn bản YYYY-MM-DD như Bước 0

⚠ RỦI RO 05 Bot không trả lời

Ví dụ: Nhắn tin nhưng không thấy phản hồi

Cách phòng tránh: Kiểm tra workflow đã kích hoạt, n8n truy cập được qua HTTPS, và xem tab Executions để biết dừng ở node nào

🔒 Về bảo mật và chi phí: Claude chỉ nhận câu hỏi ngắn, không nhận dữ liệu bán hàng, nên dữ liệu không rời hệ thống của bạn và mỗi câu hỏi chỉ tốn rất ít token. Với dữ liệu nhạy cảm, nên dùng n8n tự cài trên máy chủ công ty và tuân theo chính sách IT.

Mở rộng chatbot

Khi phiên bản đầu chạy ổn, bạn có thể nâng cấp dần:

➕ Thêm chỉ số mới

thêm tên chỉ số vào prompt ở Bước 3 và thêm một nhánh tính tương ứng trong code ở Bước 5, ví dụ giá trị trung bình mỗi giao dịch hay so sánh với kỳ trước.

🗄 Dùng dữ liệu từ SQL

thay node Google Sheets bằng node Postgres, MySQL hoặc Microsoft SQL, với câu truy vấn chỉ lấy khoảng thời gian cần thiết.

✦ Thêm nhận xét của AI

sau khi code đã tính xong, gửi các con số cho Claude viết một câu nhận xét ngắn, theo đúng cách của bài báo cáo tuần.

📅 Gửi báo cáo định kỳ qua cùng bot

kết hợp với workflow chạy theo lịch để bot vừa trả lời khi được hỏi, vừa tự gửi bản tóm tắt mỗi sáng thứ Hai.

Checklist trước khi chia sẻ bot

☑ TRƯỚC KHI CHIA SẺ BOT

✓Node Filter chỉ cho các chat.id được phép
✓Cột NgayBan là văn bản YYYY-MM-DD, múi giờ workflow là Asia/Ho_Chi_Minh
✓Temperature của Claude bằng 0, prompt có quy tắc “không tự tính số”
✓Đã thử ít nhất 10 cách hỏi khác nhau và đối chiếu con số với Google Sheets
✓Câu hỏi ngoài phạm vi nhận được hướng dẫn thay vì một con số
✓Workflow đã kích hoạt và bot trả lời khi không mở n8n

6/6 mục đạt → gửi tên bot cho người dùng

📅 Muốn học cách kết hợp phân tích dữ liệu với AI và tự động hóa? Xem Lịch khai giảng tháng 10/2026 các khóa Power BI, SQL, Python, AI tại MCNA.

Câu hỏi thường gặp (FAQ)

?Sao không đưa cả dữ liệu cho AI trả lời luôn cho đơn giản?

Vì AI cộng hàng trăm dòng số liệu rất dễ sai mà vẫn trả lời tự tin, và bạn phải gửi toàn bộ dữ liệu ra ngoài. Tách “hiểu câu hỏi” cho AI và “tính số” cho code giúp câu trả lời luôn kiểm tra lại được.

?n8n có node AI Agent, sao không dùng?

AI Agent cho phép AI tự chọn công cụ và tự truy vấn dữ liệu, linh hoạt hơn nhưng khó kiểm soát và khó kiểm tra hơn. Với người mới và các câu hỏi lặp lại, cách trong bài đơn giản, rẻ và đáng tin hơn; khi đã vững, bạn có thể thử AI Agent.

?Thêm bot vào nhóm chat được không?

Được. Mặc định, bot trong nhóm chỉ nhận tin nhắn bắt đầu bằng lệnh hoặc tin nhắc tên bot. Nhớ thêm chat.id của nhóm (số âm) vào node Filter.

?Dùng Zalo hoặc Microsoft Teams thay Telegram được không?

n8n có node cho Microsoft Teams và Slack; Zalo không có node dựng sẵn phổ biến nên thường phải tích hợp API riêng. Telegram là lựa chọn dễ nhất để bắt đầu vì tạo bot miễn phí và có sẵn Telegram Trigger.

?Chi phí AI có cao không?

Thường rất thấp, vì mỗi câu hỏi chỉ gửi cho Claude một đoạn prompt ngắn và nhận về một dòng JSON. Giá API có thể thay đổi, hãy xem bảng giá hiện hành của Anthropic khi ước tính cho công ty.

Kết luận

Một chatbot hỏi đáp dữ liệu không cần hệ thống BI đắt tiền: 6 node n8n, một file Google Sheets, Claude và một bot Telegram là đủ để sếp hỏi “doanh thu tuần này?” và có câu trả lời sau vài giây. Chìa khóa là nguyên tắc AI hiểu câu hỏi, code tính số, câu trả lời luôn kèm khoảng ngày đã tính, và bot biết nói “chưa hiểu” thay vì đoán. Bắt đầu với ba chỉ số quen thuộc nhất, rồi mở rộng dần theo câu hỏi thật của người dùng.

Nếu bạn muốn học bài bản cách kết hợp phân tích dữ liệu với AI và tự động hóa, các khóa học tại MCNA Technology School sẽ đồng hành cùng bạn. Đọc thêm: Tự động hóa báo cáo tuần với n8n và AI và AI Automation cho Data Analyst.

👉 Xem lịch khai giảng tháng 10/2026: Power BI, SQL, Python, AI – MCNA

Thông tin tác giả

Võ Ngọc Vương – Data Analyst tại MCNA Technology School

MCNA Technology School – Đơn vị tiên phong đào tạo AI, Big Data, Business Intelligence tại Việt Nam. Chuyên sâu về Power BI, Python, SQL và Data Analytics — đối tác đào tạo của 300+ doanh nghiệp.

Đối tác đào tạo: Viettel Global, Masan Group, Techcombank, VPBank, Daikin.

→ Chỉ mục