Hướng dẫn xây dựng chatbot N8N nâng cao với RAG và Function Calling

Viewed 3

Chia sẻ bởi Tù Bà Khuỳm

Chào các bạn! Bạn đang sử dụng N8N và muốn nâng tầm các workflow tự động hóa của mình? Hay bạn là một doanh nghiệp đang tìm cách tối ưu vận hành, tiết kiệm thời gian và chi phí? Hoặc có thể bạn đã nghe về RAG nhưng vẫn còn mơ hồ về cách áp dụng vào thực tế?

Nếu vậy, bài viết này chính là dành cho bạn. Hôm nay, chúng ta sẽ cùng khám phá một chủ đề hấp dẫn: xây dựng một chatbot N8N thông minh, kết hợp sức mạnh của RAG (Retrieval-Augmented Generation) và Function Calling. Chatbot này không chỉ trả lời câu hỏi dựa trên dữ liệu riêng của bạn mà còn có thể thực hiện các tác vụ phức tạp.

Sau bài viết này, bạn sẽ hiểu rõ cách thức hoạt động và có thể tự mình xây dựng (hoặc tùy chỉnh từ các template có sẵn) một chatbot tương tự cho nhu cầu công việc cụ thể. Hãy cùng bắt đầu!

Hiểu rõ các công nghệ cốt lõi: N8N, RAG và Function Calling

Trước khi đi vào chi tiết cách xây dựng, chúng ta cần nắm vững các khái niệm công nghệ nền tảng sẽ sử dụng trong workflow chatbot N8N này.

N8N là gì?

N8N (phát âm là n-eight-n) là một nền tảng tự động hóa workflow mã nguồn mở mạnh mẽ. Điểm nổi bật của N8N là giao diện kéo-thả trực quan, cho phép bạn kết nối các ứng dụng và dịch vụ khác nhau để tạo ra các quy trình tự động phức tạp mà không cần viết nhiều code (hoặc thậm chí không cần code). Nếu bạn chưa biết về N8N, hãy tưởng tượng nó như một công cụ giúp bạn "lắp ráp" các hành động từ nhiều phần mềm khác nhau thành một chuỗi logic tự động.

RAG - Retrieval-Augmented Generation

Nghe có vẻ phức tạp, nhưng RAG thực chất khá dễ hiểu. Nó là một kỹ thuật giúp Trí tuệ nhân tạo (AI) trả lời câu hỏi dựa trên một nguồn kiến thức hoặc dữ liệu cụ thể mà bạn cung cấp, thay vì chỉ dựa vào kiến thức chung được huấn luyện trước đó.

Hãy tưởng tượng bạn có rất nhiều tài liệu nội bộ: file CSV chứa dữ liệu bán hàng, các file PDF về quy trình, hay các trang web chứa thông tin sản phẩm. Khi có người hỏi một câu như "Sản phẩm A bán chạy nhất vào tháng nào?" hay "Quy trình XYZ gồm những bước nào?", RAG sẽ:

  1. Tìm kiếm (Retrieval): Lục tìm trong kho dữ liệu bạn đã cung cấp (đã được xử lý và lưu trữ dưới dạng vector để tìm kiếm ngữ nghĩa hiệu quả).
  2. Bổ sung (Augmented): Lấy những thông tin liên quan nhất tìm được làm ngữ cảnh bổ sung.
  3. Sinh câu trả lời (Generation): Đưa ngữ cảnh này cho mô hình ngôn ngữ lớn (LLM) để tạo ra câu trả lời chính xác, dựa trên chính dữ liệu của bạn.

Ưu điểm lớn của RAG là giảm thiểu hiện tượng "ảo giác" (hallucination) - tức là AI tự bịa ra thông tin không chính xác - vì câu trả lời luôn được neo vào dữ liệu thực tế bạn cung cấp.

Function Calling (hay Function Tooling)

Đây là khả năng thú vị cho phép chatbot không chỉ trả lời câu hỏi mà còn thực hiện các hành động hoặc các phép tính phức tạp mà RAG thông thường không làm được.

Ví dụ, bạn muốn hỏi chatbot: "Hãy so sánh doanh thu trung bình theo khu vực giữa quý 3 năm nay và quý 3 năm ngoái." Câu hỏi này đòi hỏi nhiều bước: truy vấn dữ liệu doanh thu của cả hai kỳ, lọc theo khu vực, tính trung bình cho từng khu vực, rồi mới so sánh.

Function Calling cho phép AI:

  1. Nhận diện yêu cầu cần thực hiện một hành động cụ thể (ví dụ: "tính toán doanh thu trung bình", "gửi email", "cập nhật CRM").
  2. Xác định "công cụ" (function/tool) phù hợp cần gọi để thực hiện hành động đó (ví dụ: một hàm Python để tính toán, một API để gửi email).
  3. Tạo ra các tham số cần thiết cho công cụ đó (ví dụ: khoảng thời gian, khu vực cần lọc).
  4. Thực thi công cụ và nhận lại kết quả để trả lời người dùng.

Kết hợp RAG và Function Calling trong chatbot N8N tạo ra một trợ lý ảo vô cùng mạnh mẽ, vừa có kiến thức chuyên sâu về dữ liệu của bạn, vừa có khả năng thực thi tác vụ.

Hướng dẫn chi tiết xây dựng workflow chatbot N8N

Bây giờ, chúng ta sẽ đi vào các bước cụ thể để xây dựng workflow này trên N8N.

Chuẩn bị môi trường và công cụ

  1. N8N: Bạn cần có một instance N8N đang chạy (có thể là self-hosted hoặc N8N Cloud).
  2. Backend Lưu trữ Vector & Dữ liệu: Chúng ta sẽ sử dụng Superbase. Superbase cung cấp cả cơ sở dữ liệu PostgreSQL (với extension pgvector cho tìm kiếm vector) và các dịch vụ backend khác. Gói miễn phí của Superbase là đủ để bạn thử nghiệm workflow này.
    • Lưu ý: Khi cấu hình credential cho Superbase trong N8N, hãy vào mục "Database settings" -> "Connection info" trong project Superbase của bạn và lấy thông tin từ tab "Connection pooling", đặc biệt là chuỗi kết nối (Connection string) cho Transaction pooler.
    • Bạn cũng cần đảm bảo extension vector đã được kích hoạt trong cơ sở dữ liệu Superbase của mình. Nếu chưa, bạn có thể chạy một lệnh SQL đơn giản (CREATE EXTENSION IF NOT EXISTS vector;) hoặc bật nó trong giao diện Superbase.
  3. AI Provider: Bạn cần một mô hình ngôn ngữ lớn (LLM). Có thể sử dụng:
    • OpenAI API (GPT-3.5, GPT-4)
    • OpenRouter (cung cấp truy cập nhiều mô hình khác nhau)
    • Chạy mô hình local bằng Ollama (nếu bạn có cấu hình máy phù hợp).
  4. Nguồn dữ liệu: Trong ví dụ này, chúng ta sử dụng Google Sheet chứa dữ liệu về các tour du lịch. Tuy nhiên, bạn hoàn toàn có thể điều chỉnh workflow để đọc dữ liệu từ file Word, PDF, Notion, hoặc các nguồn khác mà N8N hỗ trợ.

Bước 1: Tạo bảng và cấu trúc trong Superbase

Workflow N8N đầu tiên bạn cần chạy là để thiết lập cơ sở hạ tầng trong Superbase:

  1. Tạo bảng Vector (documents): Bảng này sẽ lưu trữ các đoạn văn bản (chunks) từ tài liệu của bạn và vector embedding tương ứng của chúng để phục vụ cho RAG.
  2. Tạo hàm tìm kiếm Vector (match_documents): Một hàm PostgreSQL được tối ưu để tìm kiếm các vector tương đồng nhất với vector của câu hỏi người dùng.
  3. Tạo bảng dữ liệu SQL (tours): Bảng này sẽ có cấu trúc giống hệt file Google Sheet của bạn (ví dụ: có các cột id, tour_name, destination, price, rating, duration,...). Bảng này dùng để phục vụ cho các truy vấn SQL phức tạp bằng Function Calling. Workflow N8N có thể tự động tạo câu lệnh CREATE TABLE dựa trên cấu trúc Google Sheet của bạn.

Bạn sẽ cần một node N8N Superbase để thực thi các lệnh SQL tạo bảng và hàm này.

Bước 2: Chuẩn bị và Embedding dữ liệu

Luồng N8N này sẽ đọc dữ liệu từ Google Sheet, xử lý và nạp vào cả hai bảng trong Superbase:

  1. Đọc dữ liệu: Sử dụng node Google Sheet để lấy toàn bộ dữ liệu từ bảng tính của bạn.
  2. Xử lý và Chunking (cho RAG):
    • Với mỗi dòng trong Google Sheet (tương ứng một tour du lịch), tạo ra một đoạn văn bản mô tả (ví dụ: "Tour du lịch đến Đà Nẵng, Hội An, Bà Nà, 4 ngày 3 đêm, giá 10.000.000 VNĐ, rating 4.5 sao, phù hợp cho gia đình.").
    • Metadata: Trích xuất các thông tin cấu trúc (giá, rating, điểm đến...) làm metadata đi kèm với đoạn văn bản. Metadata này hữu ích cho việc lọc kết quả sau này.
    • Text Splitting: Nếu các đoạn văn bản quá dài, bạn có thể dùng node Text Splitter để chia nhỏ chúng thành các chunks vừa phải (ví dụ, giới hạn 1000 ký tự mỗi chunk). Trong ví dụ này, với dữ liệu dạng bảng, mỗi dòng có thể coi là một chunk nên không cần chia nhỏ thêm hoặc overlap.
  3. Tạo Embeddings: Sử dụng node tương ứng với AI Provider bạn chọn (ví dụ: OpenAI Embeddings) để chuyển đổi các đoạn văn bản (chunks) thành vector embedding.
  4. Lưu vào Bảng Vector (documents): Dùng node Superbase để lưu các chunks văn bản, metadata và vector embedding tương ứng vào bảng documents.
  5. Cập nhật Bảng SQL (tours): Dùng node Superbase để thêm mới hoặc cập nhật (UPSERT) dữ liệu từ Google Sheet vào bảng tours. Bảng này giữ cấu trúc dữ liệu gốc để truy vấn SQL.

Bước 3: Xử lý cập nhật dữ liệu (Quan trọng)

Khi dữ liệu trong Google Sheet thay đổi, bạn cần một cơ chế để cập nhật cả bảng vector và bảng SQL. Workflow này nên bao gồm:

  1. Xóa Embeddings cũ: Trước khi thêm embedding mới cho dữ liệu đã thay đổi, điều quan trọng là phải xóa các embedding cũ tương ứng trong bảng documents. Nếu không, bạn có thể nhận về kết quả tìm kiếm không nhất quán chứa cả thông tin cũ và mới. Bạn có thể dùng metadata (ví dụ: ID của tour) để xác định và xóa các bản ghi cũ.
  2. Tạo Embeddings mới: Lặp lại bước tạo embedding cho dữ liệu mới/thay đổi.
  3. Lưu Embeddings mới: Lưu vào bảng documents.
  4. Cập nhật Bảng SQL: Thực hiện thao tác UPSERT vào bảng tours để đảm bảo dữ liệu luôn đồng bộ.

Luồng này có thể được kích hoạt tự động khi có thay đổi trong Google Sheet (dùng trigger) hoặc chạy định kỳ.

Thiết lập luồng tương tác chính của chatbot N8N

Đây là workflow cốt lõi nơi người dùng tương tác với chatbot. Nó sẽ nhận câu hỏi, quyết định dùng RAG hay Function Calling, và trả về câu trả lời.

  1. Trigger: Bắt đầu bằng một trigger, ví dụ như Webhook để nhận tin nhắn từ giao diện chat, hoặc bạn có thể chạy thủ công để test.
  2. Node AI Agent (hoặc tương đương): Sử dụng node có khả năng tích hợp LLM và quản lý tool (ví dụ: AI Agent, OpenAI Chat Model với tùy chọn tools). Đây là bộ não của chatbot.
  3. Cấu hình System Message: Thiết lập một thông điệp hệ thống (system prompt) để định hình vai trò và hành vi của AI. Ví dụ:
    Bạn là một trợ lý du lịch ảo am hiểu về các tour do công ty cung cấp.
    Bạn có hai công cụ chính:
    1. Superbase Vector Store Tool: Dùng để tìm kiếm thông tin tour dựa trên mô tả, yêu cầu chung (ví dụ: 'tìm tour gia đình', 'tour đi biển'). Hãy ưu tiên sử dụng công cụ này trước.
    2. SQL Database Tool: Dùng để trả lời các câu hỏi cần tính toán phức tạp, so sánh, hoặc truy vấn dữ liệu chính xác từ bảng 'tours' (ví dụ: 'tour nào rẻ nhất?', 'so sánh rating trung bình', 'có bao nhiêu tour đi Đà Lạt?'). Chỉ dùng khi Vector Store Tool không đủ khả năng trả lời.
    Hãy trả lời thân thiện và dựa trên thông tin tìm được.
    
  4. Định nghĩa Tools (Function Calling):
    • Tool 1: Vector Search (RAG):
      • Tạo một node N8N riêng (hoặc một sub-workflow) thực hiện việc: nhận câu hỏi -> tạo embedding cho câu hỏi -> truy vấn hàm match_documents trong Superbase -> trả về các đoạn văn bản liên quan nhất.
      • Trong node AI Agent, định nghĩa tool này với một cái tên (vd: search_tour_info) và mô tả rõ ràng: "Sử dụng công cụ này để tìm kiếm thông tin chung về các tour du lịch dựa trên mô tả yêu cầu của người dùng." Kèm theo ví dụ nếu cần.
    • Tool 2: Execute SQL Query (Function Calling):
      • Tạo một node N8N riêng thực hiện việc: nhận câu lệnh SQL (do AI tạo ra) -> thực thi câu lệnh đó trên bảng tours trong Superbase -> trả về kết quả.
      • Trong node AI Agent, định nghĩa tool này với tên (vd: execute_sql_query) và mô tả: "Sử dụng công cụ này để thực thi một câu lệnh SQL trên bảng 'tours' nhằm trả lời các câu hỏi đòi hỏi tính toán, lọc chính xác, hoặc so sánh dữ liệu. Chỉ dùng khi công cụ tìm kiếm thông tin tour (search_tour_info) không phù hợp." Cung cấp thông tin về cấu trúc bảng tours (tên cột, kiểu dữ liệu) trong mô tả này sẽ giúp AI tạo câu lệnh SQL chính xác hơn. Có thể đưa vài ví dụ về câu hỏi và câu lệnh SQL tương ứng.
  5. Xử lý Output: Node AI Agent sẽ trả về phản hồi cuối cùng cho người dùng, hoặc thông tin về tool được gọi và kết quả của nó (nếu có).

Demo thực tế: Chatbot N8N trả lời câu hỏi và thực thi tác vụ

Hãy xem qua hai tình huống demo để thấy chatbot N8N hoạt động như thế nào:

(Lưu ý: Trong demo gốc của video, tiếng Anh được sử dụng để đơn giản hóa template. Việc tối ưu cho tiếng Việt đòi hỏi các bước xử lý ngôn ngữ tự nhiên phức tạp hơn như tách từ (word segmentation), chuẩn hóa số liệu và mô hình embedding riêng cho tiếng Việt.)

Tình huống 1: Sử dụng RAG để tìm tour

Người dùng hỏi: "Tôi muốn tìm một tour du lịch cho gia đình, khách sạn 4 sao."

Workflow:

  1. Câu hỏi được gửi đến node AI Agent.
  2. AI xác định đây là yêu cầu tìm kiếm thông tin chung, phù hợp với Tool 1 (Vector Search).
  3. AI gọi tool search_tour_info với câu hỏi của người dùng.
  4. Node thực thi tool này:
    • Tạo vector embedding cho câu hỏi "Tôi muốn tìm một tour du lịch cho gia đình, khách sạn 4 sao."
    • Truy vấn Superbase để tìm các chunks văn bản có vector gần nhất.
    • Trả về các thông tin tour phù hợp (ví dụ: Tour Đà Nẵng - Hội An, 4 sao, phù hợp gia đình, giá X...).
  5. AI Agent nhận kết quả và trình bày lại cho người dùng một cách thân thiện.

Người dùng hỏi tiếp: "Có tour nào 4 ngày 3 đêm không?"

Workflow: Tương tự, AI sử dụng RAG để tìm trong dữ liệu các tour khớp với tiêu chí thời gian này.

Tình huống 2: Sử dụng Function Calling để tính toán

Người dùng hỏi: "Tour nào có tỷ lệ giá trên rating tốt nhất?" (Tức là price / rating thấp nhất).

Workflow:

  1. Câu hỏi được gửi đến node AI Agent.
  2. AI nhận ra đây là yêu cầu tính toán và so sánh, không thể trả lời chỉ bằng tìm kiếm văn bản thông thường. Nó xác định cần dùng Tool 2 (Execute SQL Query).
  3. Dựa trên mô tả tool và cấu trúc bảng tours, AI tự động tạo ra một câu lệnh SQL, ví dụ:
    SELECT tour_name, price, rating, (price / rating) as price_per_rating
    FROM tours
    WHERE rating > 0 -- Tránh chia cho 0
    ORDER BY price_per_rating ASC
    LIMIT 1;
    
  4. AI gọi tool execute_sql_query với câu lệnh SQL vừa tạo.
  5. Node thực thi tool này kết nối Superbase, chạy câu lệnh SQL trên bảng tours.
  6. Kết quả (tên tour, giá, rating, tỷ lệ tốt nhất) được trả về cho AI Agent.
  7. AI Agent nhận kết quả và trả lời người dùng: "Tour có tỷ lệ giá trên rating tốt nhất là [Tên tour] với giá [Giá] và rating [Rating]."

Kết luận và tài nguyên

Như vậy, chúng ta đã cùng nhau khám phá cách xây dựng một chatbot N8N mạnh mẽ bằng cách kết hợp RAG và Function Calling. Đây không chỉ là một công cụ trả lời câu hỏi dựa trên dữ liệu nội bộ một cách chính xác mà còn là một trợ lý ảo có khả năng thực hiện các phân tích và tác vụ phức tạp.

Việc tích hợp RAG giúp chatbot cung cấp thông tin đáng tin cậy, giảm thiểu lỗi "ảo giác", trong khi Function Calling mở ra khả năng tương tác và xử lý dữ liệu sâu hơn. Với N8N, bạn có thể trực quan hóa và tùy chỉnh toàn bộ quy trình này một cách linh hoạt.

Hy vọng bài viết này đã cung cấp cho bạn cái nhìn chi tiết và hữu ích. Nếu bạn thấy thú vị, hãy bắt tay vào thử nghiệm xây dựng chatbot cho riêng mình. Đừng ngần ngại để lại bình luận nếu bạn có bất kỳ câu hỏi hay gặp khó khăn nào trong quá trình thực hiện!

0 Answers