Agentic AI: Code "Nhân viên CSKH" tự động tra cứu Database, tự sửa lỗi SQL và trả lời qua Telegram chỉ trong 100 dòng code

AI Hunter

Member
Thành viên BQT
Agentic AI: Code "Nhân viên CSKH" tự động tra cứu Database, tự sửa lỗi SQL và trả lời qua Telegram chỉ trong 100 dòng code

Năm 2024, chúng ta phát cuồng vì RAG (Retrieval-Augmented Generation) - nạp tài liệu cho AI đọc. Nhưng RAG có một điểm yếu chết người: Nó thụ động. Nếu khách hỏi: *"Đơn hàng #123 của tôi đang ở đâu?"*, RAG chịu chết vì nó không thể truy cập database thời gian thực.

Agentic AI Code Nhân viên CSKH tự động tra cứu Database, tự sửa lỗi SQL và trả lời qua Telegra...jpg

Năm 2026, kỷ nguyên của Agentic AI lên ngôi. Hôm nay, tôi sẽ hướng dẫn các bạn dùng LangGraph để code một nhân viên CSKH "hardcore".
Khả năng đặc biệt:
  • Tự viết câu lệnh SQL để tra cứu dữ liệu.
  • Self-Correction: Nếu viết sai SQL, nó tự nhìn lỗi và sửa lại cho đúng.
  • Tích hợp trực tiếp lên Telegram để chat với khách.

1. Tư duy lập trình: Chain vs. Graph​

  • Chain (Cũ): Tuyến tính (A -> B -> C). Nếu B lỗi, chương trình crash.
  • Graph (LangGraph): Có vòng lặp. Agent suy luận -> Viết SQL -> Chạy lỗi -> Agent đọc lỗi -> Viết lại SQL -> Kết quả. Đây là chìa khóa để xử lý các tác vụ phức tạp.

2. Chuẩn bị môi trường​

Chúng ta cần cài đặt các gói cho LangChain, OpenAI và Telegram Bot.
Bash:
pip install langgraph langchain-openai langchain-community python-telegram-bot
*Lưu ý: Bạn cần API Key của OpenAI (GPT-4o) và Token của Telegram Bot (Lấy từ @BotFather).*

3. Code "Bộ não" Agent (Python)​

Tạo file agent_bot.py. Chúng ta sẽ đi từ Database giả lập đến việc tạo Tool thông minh.

Bước 1: Giả lập Database & Tool "Hardcore"​

Thay vì viết hàm tra cứu cứng nhắc, tôi sẽ cho Agent quyền chạy SQL (Read-only) để nó linh hoạt xử lý mọi câu hỏi.

Python:
import sqlite3
from langchain_core.tools import tool
from typing import List

# --- SETUP DATABASE GIẢ LẬP ---
conn = sqlite3.connect(":memory:", check_same_thread=False)
cursor = conn.cursor()
cursor.execute("""
    CREATE TABLE orders (
        id INTEGER PRIMARY KEY,
        customer_name TEXT,
        status TEXT,
        delivery_date TEXT
    )
""")
# Fake data
cursor.execute("INSERT INTO orders VALUES (101, 'Minh Hieu', 'Đang giao', '2026-12-20')")
cursor.execute("INSERT INTO orders VALUES (102, 'Lan Anh', 'Đã hủy', 'N/A')")
cursor.execute("INSERT INTO orders VALUES (103, 'Quoc Tuan', 'Chờ lấy hàng', '2026-12-25')")
conn.commit()

# --- TOOL CHO AGENT ---
@tool
def execute_sql_query(query: str):
    """
    Chạy câu lệnh SQL (SELECT) để lấy thông tin đơn hàng.
    Input: Câu lệnh SQL hợp lệ (Ví dụ: SELECT * FROM orders WHERE...)
    Output: Kết quả truy vấn hoặc THÔNG BÁO LỖI nếu SQL sai.
    """
    try:
        # Chỉ cho phép lệnh SELECT để bảo mật (Cơ bản)
        if not query.strip().upper().startswith("SELECT"):
            return "Lỗi: Chỉ cho phép câu lệnh SELECT."
      
        c = conn.cursor()
        c.execute(query)
        rows = c.fetchall()
        if not rows:
            return "Không tìm thấy dữ liệu nào khớp với yêu cầu."
        return str(rows)
    except Exception as e:
        # TRẢ VỀ LỖI ĐỂ AGENT TỰ SỬA
        return f"SQL Error: {e}. Hãy kiểm tra lại cú pháp hoặc tên cột và thử lại."

Bước 2: Dựng Graph với khả năng Tự sửa lỗi​

Chúng ta cung cấp schema của bảng trong prompt để Agent biết cấu trúc dữ liệu.

Python:
import os
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent

# Config API Key
os.environ["OPENAI_API_KEY"] = "sk-..." # ĐIỀN KEY CỦA BẠN VÀO ĐÂY

# System Prompt cực quan trọng: Cung cấp Schema DB
system_prompt = """
Bạn là nhân viên CSKH thông minh. Nhiệm vụ: Tra cứu đơn hàng giúp khách.
Bạn có quyền truy cập vào bảng 'orders' với các cột:
- id (INTEGER)
- customer_name (TEXT)
- status (TEXT)
- delivery_date (TEXT)

QUY TẮC QUAN TRỌNG:
1. Nếu chạy SQL bị lỗi, hãy ĐỌC thông báo lỗi và TỰ SỬA lại câu lệnh SQL khác. Đừng bỏ cuộc sớm.
2. Trả lời khách hàng thân thiện, ngắn gọn.
"""

llm = ChatOpenAI(model="gpt-4o", temperature=0)
tools = [execute_sql_query]

# Tạo Agent ReAct (Reasoning + Acting)
agent_executor = create_react_agent(llm, tools, state_modifier=system_prompt)

4. Tích hợp Telegram Bot (Giao diện)​

Phần này kết nối Agent vào ứng dụng chat thực tế. Vì Telegram chạy bất đồng bộ (Async), LangGraph hỗ trợ rất tốt qua hàm ainvoke.

Python:
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, filters, ContextTypes

TELEGRAM_TOKEN = "YOUR_TELEGRAM_BOT_TOKEN" # ĐIỀN TOKEN CỦA BẠN

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    await update.message.reply_text("Chào bạn! Tôi là trợ lý AI. Bạn cần tra cứu đơn hàng nào?")

async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_text = update.message.text
    print(f"\nUser: {user_text}") # Log check
  
    # Gửi tin nhắn "Đang gõ..." để trải nghiệm tốt hơn
    await context.bot.send_chat_action(chat_id=update.effective_chat.id, action="typing")
  
    # --- GỌI AGENT XỬ LÝ ---
    # Agent sẽ tự động loop: Suy nghĩ -> Gọi SQL -> (Sửa lỗi nếu có) -> Trả lời
    response = await agent_executor.ainvoke({"messages": [("user", user_text)]})
  
    # Lấy câu trả lời cuối cùng từ AI
    final_answer = response["messages"][-1].content
  
    await update.message.reply_text(final_answer)

if __name__ == '__main__':
    print("🚀 Bot đang chạy...")
    app = ApplicationBuilder().token(TELEGRAM_TOKEN).build()
  
    app.add_handler(CommandHandler("start", start))
    app.add_handler(MessageHandler(filters.TEXT & (~filters.COMMAND), handle_message))
  
    app.run_polling()

5. Thử nghiệm thực tế (Case Study)​

Hãy xem Agent xử lý tình huống khó (Agent "lỡ tay" viết sai tên cột):

User: "Đơn của Minh Hieu tình trạng sao rồi?"

Suy nghĩ bên trong Agent (Log):
1. Agent action: Chạy lệnh `SELECT * FROM order WHERE name = 'Minh Hieu'` (Sai tên bảng 'order' thiếu 's' và cột 'name').
2. Tool Output: "SQL Error: no such table: order".
3. Agent Thought: "À, mình nhầm tên bảng. Schema bảo là bảng 'orders' và cột 'customer_name'".
4. Agent Action (Retry): Chạy lệnh `SELECT * FROM orders WHERE customer_name LIKE '%Minh Hieu%'`.
5. Tool Output: `[(101, 'Minh Hieu', 'Đang giao', ...)]`.

Telegram Bot trả lời: "Chào bạn, đơn hàng của Minh Hieu đang ở trạng thái Đang giao, dự kiến đến ngày 20/12/2026 nhé!"

Kết luận​

Chỉ với 100 dòng code, bạn đã tạo ra một hệ thống Agent có khả năng tự phục hồi lỗi (Self-healing) và giao tiếp thực tế. Đây chính là sự khác biệt giữa Chatbot Rule-based cổ điển và AI Agent hiện đại.
 
Back
Top