AIChatbotBusinessIntegrationCustomer ServiceAdvanced

สร้าง AI Chatbot สำหรับธุรกิจ: คู่มือฉบับสมบูรณ์

คู่มือครบวงจรในการสร้าง AI Chatbot สำหรับธุรกิจ ตั้งแต่การออกแบบ conversation flow, เชื่อมต่อ AI API, ไปจนถึงการ deploy และ monitor

AI Unlocked Team
28/01/2568
สร้าง AI Chatbot สำหรับธุรกิจ: คู่มือฉบับสมบูรณ์

สร้าง AI Chatbot สำหรับธุรกิจ: คู่มือฉบับสมบูรณ์

AI Chatbot กลายเป็นเครื่องมือสำคัญสำหรับธุรกิจยุคใหม่ ไม่ว่าจะใช้เพื่อ Customer Support, Sales, หรือ Internal Operations บทความนี้จะพาคุณไปเรียนรู้การสร้าง AI Chatbot ตั้งแต่เริ่มต้นจนพร้อมใช้งานจริง

ทำไมธุรกิจต้องมี AI Chatbot?

ประโยชน์ของ AI Chatbot

  1. ให้บริการ 24/7: ไม่มีวันหยุด ไม่มีเวลาพัก
  2. ลดภาระงาน Support Team: ตอบคำถามซ้ำๆ อัตโนมัติ
  3. Scalability: รองรับลูกค้าพร้อมกันได้ไม่จำกัด
  4. Consistency: ตอบคำถามสม่ำเสมอ ไม่มีอารมณ์
  5. Data Collection: เก็บข้อมูล insight จากการสนทนา
  6. Cost Reduction: ลดต้นทุนในระยะยาว

ROI ของ AI Chatbot

ตัวอย่างการคำนวณ ROI:

Before Chatbot:
- Support Agents: 5 คน x 30,000 บาท = 150,000 บาท/เดือน
- Tickets handled: 1,000 tickets/เดือน
- Cost per ticket: 150 บาท

After Chatbot:
- Chatbot handles: 70% of tickets (700)
- Agents handle: 30% (300) complex cases
- Need only: 2 Agents = 60,000 บาท/เดือน
- Chatbot cost: ~10,000 บาท/เดือน
- Total: 70,000 บาท/เดือน
- Savings: 80,000 บาท/เดือน (53% reduction)

ประเภทของ AI Chatbot

1. Rule-Based Chatbot

ทำงานตามกฎที่กำหนดไว้ล่วงหน้า

// Simple rule-based chatbot
const rules = {
  "สวัสดี": "สวัสดีครับ! ยินดีให้บริการครับ",
  "ราคา": "สินค้าของเรามีราคาเริ่มต้นที่ 999 บาท",
  "เปิดกี่โมง": "เราเปิดให้บริการ 9:00 - 18:00 น."
};

function respond(input) {
  for (const [keyword, response] of Object.entries(rules)) {
    if (input.includes(keyword)) {
      return response;
    }
  }
  return "ขออภัย ไม่เข้าใจคำถาม กรุณาติดต่อ support";
}

ข้อดี: ง่าย, เร็ว, ไม่มีค่าใช้จ่าย API ข้อเสีย: ไม่ flexible, ไม่เข้าใจบริบท

2. AI-Powered Chatbot (LLM-based)

ใช้ AI ในการเข้าใจและสร้างคำตอบ

# AI-powered chatbot with context
class AIBusinessChatbot:
    def __init__(self):
        self.client = OpenAI()
        self.conversation_history = []
        self.system_prompt = """คุณเป็น AI Customer Service ของบริษัท XYZ

ข้อมูลสำคัญ:
- เปิดให้บริการ 9:00-18:00 น. (จันทร์-ศุกร์)
- โทร: 02-xxx-xxxx
- Email: support@xyz.com

กฎ:
1. ตอบสุภาพ ใช้ครับ/ค่ะ
2. ถ้าไม่รู้คำตอบ ให้แนะนำติดต่อทีม support
3. ห้ามให้ข้อมูลเท็จ"""

    async def chat(self, user_message: str) -> str:
        self.conversation_history.append({
            "role": "user",
            "content": user_message
        })

        response = await self.client.chat.completions.create(
            model="gpt-4",
            messages=[
                {"role": "system", "content": self.system_prompt},
                *self.conversation_history
            ],
            temperature=0.7
        )

        assistant_message = response.choices[0].message.content
        self.conversation_history.append({
            "role": "assistant",
            "content": assistant_message
        })

        return assistant_message

3. RAG-Enhanced Chatbot

ใช้ RAG เพื่อดึงข้อมูลจาก Knowledge Base

# RAG-enhanced business chatbot
class RAGBusinessChatbot:
    def __init__(self, knowledge_base_path: str):
        self.rag_pipeline = RAGPipeline()
        self.rag_pipeline.ingest([knowledge_base_path])
        self.client = OpenAI()

    async def chat(self, user_message: str) -> dict:
        # 1. Search relevant documents
        search_result = self.rag_pipeline.query(user_message, top_k=3)

        # 2. Generate response with context
        context = "\n".join([
            doc['content'] for doc in search_result['sources']
        ])

        response = await self.client.chat.completions.create(
            model="gpt-4",
            messages=[
                {
                    "role": "system",
                    "content": f"""คุณเป็น AI Customer Service

ใช้ข้อมูลต่อไปนี้ในการตอบคำถาม:
{context}

ถ้าไม่มีข้อมูลเพียงพอ ให้บอกว่าจะส่งต่อให้ทีม support"""
                },
                {"role": "user", "content": user_message}
            ]
        )

        return {
            "answer": response.choices[0].message.content,
            "sources": search_result['sources']
        }

อ่านเพิ่มเติมเกี่ยวกับ RAG ได้ที่ RAG คืออะไร? ทำไมถึงสำคัญสำหรับ AI

Architecture ของ AI Chatbot

Basic Architecture

┌─────────────────────────────────────────────────────────────────┐
│                    AI Chatbot Architecture                      │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ┌──────────┐     ┌─────────────────┐     ┌──────────────┐     │
│  │ Frontend │────▶│ Backend API     │────▶│ AI Service   │     │
│  │ (Chat UI)│◀────│ (Websocket/REST)│◀────│ (GPT/Claude) │     │
│  └──────────┘     └────────┬────────┘     └──────────────┘     │
│                            │                                    │
│                    ┌───────┴───────┐                           │
│                    │               │                           │
│                    ▼               ▼                           │
│            ┌─────────────┐ ┌─────────────┐                    │
│            │ Database    │ │ Knowledge   │                    │
│            │ (History)   │ │ Base (RAG)  │                    │
│            └─────────────┘ └─────────────┘                    │
└─────────────────────────────────────────────────────────────────┘

Production Architecture

┌─────────────────────────────────────────────────────────────────┐
│                Production Chatbot Architecture                  │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│     ┌──────────────────────────────────────────────────────┐   │
│     │                    Load Balancer                      │   │
│     └──────────────────────────┬───────────────────────────┘   │
│                                │                                │
│     ┌──────────────────────────┼───────────────────────────┐   │
│     │                          │                            │   │
│     ▼                          ▼                            ▼   │
│  ┌────────┐              ┌────────┐              ┌────────┐    │
│  │ API    │              │ API    │              │ API    │    │
│  │Server 1│              │Server 2│              │Server 3│    │
│  └───┬────┘              └───┬────┘              └───┬────┘    │
│      │                       │                       │         │
│      └───────────────────────┼───────────────────────┘         │
│                              │                                  │
│  ┌───────────────────────────┼───────────────────────────────┐ │
│  │                           ▼                               │ │
│  │  ┌────────────┐  ┌────────────┐  ┌────────────────────┐  │ │
│  │  │ Redis      │  │ PostgreSQL │  │ Vector DB          │  │ │
│  │  │ (Cache/    │  │ (History)  │  │ (Knowledge Base)   │  │ │
│  │  │  Sessions) │  │            │  │                    │  │ │
│  │  └────────────┘  └────────────┘  └────────────────────┘  │ │
│  └──────────────────────────────────────────────────────────┘ │
│                                                                 │
│  ┌──────────────────────────────────────────────────────────┐ │
│  │  External Services                                        │ │
│  │  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐ │ │
│  │  │ OpenAI   │  │ Claude   │  │ CRM      │  │ Analytics│ │ │
│  │  └──────────┘  └──────────┘  └──────────┘  └──────────┘ │ │
│  └──────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘

สร้าง Chatbot Step-by-Step

Step 1: วางแผน Conversation Design

# conversation_design.yaml
intents:
  - name: greeting
    examples:
      - สวัสดี
      - หวัดดี
      - Hello
    response_type: greeting

  - name: product_inquiry
    examples:
      - สินค้าราคาเท่าไหร่
      - มีสินค้าอะไรบ้าง
      - อยากดูสินค้า
    response_type: rag_search
    search_topic: products

  - name: order_status
    examples:
      - สถานะคำสั่งซื้อ
      - ออเดอร์ถึงไหนแล้ว
      - ติดตามพัสดุ
    response_type: api_call
    api_endpoint: /orders/{order_id}

  - name: complaint
    examples:
      - ไม่พอใจบริการ
      - อยากร้องเรียน
      - สินค้ามีปัญหา
    response_type: escalate
    priority: high

Step 2: สร้าง Backend API

# chatbot_api.py
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from fastapi.middleware.cors import CORSMiddleware
import json
import uuid

app = FastAPI()

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["*"],
    allow_headers=["*"],
)

class ChatbotService:
    def __init__(self):
        self.sessions = {}
        self.rag = RAGBusinessChatbot("knowledge_base/")
        self.client = OpenAI()

    async def process_message(
        self,
        session_id: str,
        message: str
    ) -> dict:
        # Get or create session
        if session_id not in self.sessions:
            self.sessions[session_id] = {
                "history": [],
                "created_at": datetime.now(),
                "context": {}
            }

        session = self.sessions[session_id]

        # Classify intent
        intent = await self.classify_intent(message)

        # Process based on intent
        if intent == "greeting":
            response = await self.handle_greeting(session)
        elif intent == "product_inquiry":
            response = await self.handle_product_inquiry(message, session)
        elif intent == "order_status":
            response = await self.handle_order_status(message, session)
        elif intent == "complaint":
            response = await self.handle_complaint(message, session)
        else:
            response = await self.handle_general(message, session)

        # Store in history
        session["history"].append({
            "role": "user",
            "content": message,
            "timestamp": datetime.now().isoformat()
        })
        session["history"].append({
            "role": "assistant",
            "content": response["answer"],
            "timestamp": datetime.now().isoformat()
        })

        return response

    async def classify_intent(self, message: str) -> str:
        """Classify user intent using AI"""
        response = await self.client.chat.completions.create(
            model="gpt-4",
            messages=[
                {
                    "role": "system",
                    "content": """Classify the intent:
                    - greeting: สวัสดี, หวัดดี
                    - product_inquiry: ถามเรื่องสินค้า
                    - order_status: ถามสถานะคำสั่งซื้อ
                    - complaint: ร้องเรียน, ไม่พอใจ
                    - general: อื่นๆ

                    Return only the intent name."""
                },
                {"role": "user", "content": message}
            ],
            temperature=0
        )
        return response.choices[0].message.content.strip().lower()

    async def handle_product_inquiry(
        self,
        message: str,
        session: dict
    ) -> dict:
        """Handle product questions with RAG"""
        result = await self.rag.chat(message)
        return {
            "answer": result["answer"],
            "sources": result.get("sources", []),
            "type": "product_inquiry"
        }

    async def handle_order_status(
        self,
        message: str,
        session: dict
    ) -> dict:
        """Handle order status inquiries"""
        # Extract order ID
        order_id = self.extract_order_id(message)

        if order_id:
            # Call order API
            order_info = await self.get_order_info(order_id)
            return {
                "answer": f"คำสั่งซื้อ {order_id}: {order_info['status']}",
                "type": "order_status",
                "data": order_info
            }
        else:
            return {
                "answer": "กรุณาระบุหมายเลขคำสั่งซื้อครับ",
                "type": "order_status",
                "need_info": "order_id"
            }

    async def handle_complaint(
        self,
        message: str,
        session: dict
    ) -> dict:
        """Handle complaints - escalate to human"""
        # Create ticket
        ticket_id = await self.create_support_ticket(
            message=message,
            session=session,
            priority="high"
        )

        return {
            "answer": f"""ขอบคุณที่แจ้งครับ เราเสียใจที่คุณพบปัญหา

ทีม support จะติดต่อกลับภายใน 24 ชั่วโมง
หมายเลข ticket: {ticket_id}

หากต้องการความช่วยเหลือเร่งด่วน โทร: 02-xxx-xxxx""",
            "type": "complaint",
            "ticket_id": ticket_id,
            "escalated": True
        }

chatbot = ChatbotService()

@app.websocket("/ws/chat/{session_id}")
async def websocket_chat(websocket: WebSocket, session_id: str):
    await websocket.accept()

    try:
        while True:
            data = await websocket.receive_text()
            message = json.loads(data)

            response = await chatbot.process_message(
                session_id,
                message["content"]
            )

            await websocket.send_text(json.dumps(response))

    except WebSocketDisconnect:
        print(f"Session {session_id} disconnected")

@app.post("/api/chat")
async def rest_chat(request: ChatRequest):
    """REST API endpoint for chat"""
    response = await chatbot.process_message(
        request.session_id,
        request.message
    )
    return response

Step 3: สร้าง Chat UI

// components/Chatbot.tsx
'use client';

import { useState, useEffect, useRef } from 'react';

interface Message {
  role: 'user' | 'assistant';
  content: string;
  timestamp: Date;
  sources?: any[];
}

export function Chatbot() {
  const [messages, setMessages] = useState<Message[]>([]);
  const [input, setInput] = useState('');
  const [isLoading, setIsLoading] = useState(false);
  const [sessionId] = useState(() => crypto.randomUUID());
  const messagesEndRef = useRef<HTMLDivElement>(null);
  const wsRef = useRef<WebSocket | null>(null);

  useEffect(() => {
    // Connect WebSocket
    wsRef.current = new WebSocket(
      `wss://api.example.com/ws/chat/${sessionId}`
    );

    wsRef.current.onmessage = (event) => {
      const response = JSON.parse(event.data);
      setMessages(prev => [...prev, {
        role: 'assistant',
        content: response.answer,
        timestamp: new Date(),
        sources: response.sources
      }]);
      setIsLoading(false);
    };

    return () => {
      wsRef.current?.close();
    };
  }, [sessionId]);

  useEffect(() => {
    messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
  }, [messages]);

  const sendMessage = () => {
    if (!input.trim() || isLoading) return;

    // Add user message
    setMessages(prev => [...prev, {
      role: 'user',
      content: input,
      timestamp: new Date()
    }]);

    // Send to server
    wsRef.current?.send(JSON.stringify({ content: input }));
    setInput('');
    setIsLoading(true);
  };

  return (
    <div className="flex flex-col h-[600px] max-w-md mx-auto border rounded-lg">
      {/* Header */}
      <div className="bg-primary text-white p-4 rounded-t-lg">
        <h3 className="font-bold">AI Customer Support</h3>
        <p className="text-sm opacity-80">ออนไลน์ - ตอบทันที</p>
      </div>

      {/* Messages */}
      <div className="flex-1 overflow-y-auto p-4 space-y-4">
        {/* Welcome message */}
        {messages.length === 0 && (
          <div className="text-center text-gray-500 py-8">
            <p>สวัสดีครับ! มีอะไรให้ช่วยไหมครับ?</p>
          </div>
        )}

        {messages.map((msg, i) => (
          <div
            key={i}
            className={`flex ${msg.role === 'user' ? 'justify-end' : 'justify-start'}`}
          >
            <div
              className={`max-w-[80%] rounded-lg p-3 ${
                msg.role === 'user'
                  ? 'bg-primary text-white'
                  : 'bg-gray-100'
              }`}
            >
              <p>{msg.content}</p>
              {msg.sources && msg.sources.length > 0 && (
                <div className="mt-2 text-xs opacity-70">
                  <p>อ้างอิงจาก: {msg.sources.length} แหล่ง</p>
                </div>
              )}
            </div>
          </div>
        ))}

        {isLoading && (
          <div className="flex justify-start">
            <div className="bg-gray-100 rounded-lg p-3">
              <div className="flex space-x-2">
                <div className="w-2 h-2 bg-gray-400 rounded-full animate-bounce" />
                <div className="w-2 h-2 bg-gray-400 rounded-full animate-bounce delay-100" />
                <div className="w-2 h-2 bg-gray-400 rounded-full animate-bounce delay-200" />
              </div>
            </div>
          </div>
        )}

        <div ref={messagesEndRef} />
      </div>

      {/* Input */}
      <div className="p-4 border-t">
        <div className="flex space-x-2">
          <input
            type="text"
            value={input}
            onChange={(e) => setInput(e.target.value)}
            onKeyPress={(e) => e.key === 'Enter' && sendMessage()}
            placeholder="พิมพ์ข้อความ..."
            className="flex-1 border rounded-lg px-4 py-2 focus:outline-none focus:ring-2"
            disabled={isLoading}
          />
          <button
            onClick={sendMessage}
            disabled={isLoading || !input.trim()}
            className="bg-primary text-white px-4 py-2 rounded-lg disabled:opacity-50"
          >
            ส่ง
          </button>
        </div>
      </div>
    </div>
  );
}

Step 4: เพิ่ม Features เสริม

Quick Replies

// Quick reply buttons
const quickReplies = [
  { text: "ดูสินค้า", action: "product_inquiry" },
  { text: "ติดตามพัสดุ", action: "order_status" },
  { text: "ติดต่อ support", action: "contact_support" }
];

function QuickReplies({ onSelect }: { onSelect: (text: string) => void }) {
  return (
    <div className="flex flex-wrap gap-2 p-2">
      {quickReplies.map((reply, i) => (
        <button
          key={i}
          onClick={() => onSelect(reply.text)}
          className="px-3 py-1 border rounded-full text-sm hover:bg-gray-100"
        >
          {reply.text}
        </button>
      ))}
    </div>
  );
}

File Upload

# Handle file uploads in chat
@app.post("/api/chat/upload")
async def upload_file(
    file: UploadFile,
    session_id: str = Form(...)
):
    # Save file
    file_path = f"uploads/{session_id}/{file.filename}"
    await save_file(file, file_path)

    # Process with AI if it's an image
    if file.content_type.startswith("image/"):
        # Use vision model
        result = await analyze_image(file_path)
        return {"type": "image_analysis", "result": result}

    # Process documents
    elif file.content_type in ["application/pdf", "text/plain"]:
        content = await extract_text(file_path)
        return {"type": "document", "content_preview": content[:500]}

    return {"type": "file_received", "filename": file.filename}

Sentiment Tracking

class SentimentTracker:
    def __init__(self):
        self.client = OpenAI()

    async def analyze_sentiment(self, message: str) -> dict:
        response = await self.client.chat.completions.create(
            model="gpt-4",
            messages=[
                {
                    "role": "system",
                    "content": """Analyze sentiment and return JSON:
                    {
                        "sentiment": "positive|neutral|negative",
                        "score": 0.0-1.0,
                        "emotions": ["happy", "frustrated", etc.]
                    }"""
                },
                {"role": "user", "content": message}
            ]
        )
        return json.loads(response.choices[0].message.content)

    async def should_escalate(self, session_history: list) -> bool:
        """Check if conversation should be escalated to human"""
        recent_sentiments = []
        for msg in session_history[-5:]:
            if msg["role"] == "user":
                sentiment = await self.analyze_sentiment(msg["content"])
                recent_sentiments.append(sentiment)

        # Escalate if multiple negative sentiments
        negative_count = sum(
            1 for s in recent_sentiments if s["sentiment"] == "negative"
        )
        return negative_count >= 2

Integrations

LINE Integration

# LINE Chatbot Integration
from linebot import LineBotApi, WebhookHandler
from linebot.models import MessageEvent, TextMessage, TextSendMessage

line_bot_api = LineBotApi('YOUR_CHANNEL_ACCESS_TOKEN')
handler = WebhookHandler('YOUR_CHANNEL_SECRET')

@app.post("/webhook/line")
async def line_webhook(request: Request):
    signature = request.headers['X-Line-Signature']
    body = await request.body()

    try:
        handler.handle(body.decode(), signature)
    except InvalidSignatureError:
        raise HTTPException(status_code=400)

    return 'OK'

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    user_id = event.source.user_id

    # Process with chatbot
    response = chatbot.process_message(user_id, event.message.text)

    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=response["answer"])
    )

Facebook Messenger Integration

# Facebook Messenger Integration
@app.post("/webhook/facebook")
async def facebook_webhook(request: Request):
    data = await request.json()

    for entry in data.get("entry", []):
        for messaging_event in entry.get("messaging", []):
            sender_id = messaging_event["sender"]["id"]

            if "message" in messaging_event:
                message_text = messaging_event["message"].get("text", "")

                # Process with chatbot
                response = await chatbot.process_message(sender_id, message_text)

                # Send response
                await send_facebook_message(sender_id, response["answer"])

    return {"status": "ok"}

async def send_facebook_message(recipient_id: str, message: str):
    await httpx.post(
        "https://graph.facebook.com/v18.0/me/messages",
        params={"access_token": FB_ACCESS_TOKEN},
        json={
            "recipient": {"id": recipient_id},
            "message": {"text": message}
        }
    )

Monitoring & Analytics

Metrics to Track

# Chatbot analytics
class ChatbotAnalytics:
    def __init__(self):
        self.metrics = {
            "total_conversations": 0,
            "messages_processed": 0,
            "avg_response_time": 0,
            "escalation_rate": 0,
            "satisfaction_score": 0,
            "intent_distribution": {}
        }

    def log_conversation(self, session: dict, response: dict):
        """Log conversation for analytics"""
        self.metrics["messages_processed"] += 1

        # Log intent
        intent = response.get("type", "general")
        self.metrics["intent_distribution"][intent] = \
            self.metrics["intent_distribution"].get(intent, 0) + 1

        # Log to analytics service
        analytics.track({
            "event": "chatbot_message",
            "properties": {
                "session_id": session["id"],
                "intent": intent,
                "response_time_ms": response.get("latency_ms"),
                "escalated": response.get("escalated", False),
                "sources_count": len(response.get("sources", []))
            }
        })

    def get_dashboard_data(self) -> dict:
        """Get data for analytics dashboard"""
        return {
            **self.metrics,
            "top_intents": sorted(
                self.metrics["intent_distribution"].items(),
                key=lambda x: x[1],
                reverse=True
            )[:5]
        }

สรุป

การสร้าง AI Chatbot สำหรับธุรกิจต้องพิจารณาหลายปัจจัย ตั้งแต่การออกแบบ conversation flow, เลือก architecture ที่เหมาะสม, ไปจนถึงการ monitor และปรับปรุงอย่างต่อเนื่อง


อ่านบทความที่เกี่ยวข้อง


พร้อมสร้าง AI Chatbot สำหรับธุรกิจแล้วหรือยัง?

ติดต่อทีม AI Unlocked เราพร้อมให้คำปรึกษาและพัฒนา AI Chatbot ที่ตอบโจทย์ธุรกิจของคุณ

เขียนโดย

AI Unlocked Team

บทความอื่นๆ ที่น่าสนใจ