Production · chatbot.lks.ac.th

TCAS ChatBot

AI Chatbot ตอบคำถาม TCAS จากข้อมูล ทปอ. TCAS69

Next.js Google Gemini AI RAG TypeScript Semantic Search Production

ภาพรวมโปรเจกต์

TCAS ChatBot เป็น Web Application ที่ใช้ AI ในการตอบคำถามเกี่ยวกับระบบ TCAS (Thai University Central Admission System) โดยอ้างอิงข้อมูลโดยตรงจากคู่มือและประกาศของ ทปอ. TCAS69 ระบบมีฟีเจอร์ค้นหาคณะใกล้เคียง (Semantic Search) การแสดงสถิติการศึกษา และ Token-based Rate Limiting เพื่อให้บริการแก่นักเรียนทั่วประเทศ พัฒนาด้วย Next.js และ Google Gemini AI

💡 ที่มาและความสำคัญ

ระบบ TCAS มีรายละเอียดซับซ้อนและเปลี่ยนแปลงทุกปี ทำให้นักเรียนหลายคนสับสนในเรื่องรอบการสมัคร เกณฑ์คะแนน และขั้นตอนต่าง ๆ โปรเจกต์นี้จึงถูกพัฒนาขึ้นเพื่อเป็น AI Assistant ที่สามารถตอบคำถามจากข้อมูลอ้างอิงที่เชื่อถือได้ โดยใช้เทคนิค RAG (Retrieval-Augmented Generation) เพื่อให้คำตอบมีความถูกต้องและอ้างอิงได้

TCAS ChatBot หน้าหลัก
หน้าหลัก — แชทถาม-ตอบ TCAS ด้วย Google Gemini AI
TCAS ChatBot คณะใกล้เคียง
ฟีเจอร์ค้นหาคณะใกล้เคียง (Semantic Search)

สถาปัตยกรรมระบบ & ลอจิก

ระบบพัฒนาด้วย Next.js 15 (App Router) และ TypeScript โดยใช้ Google Gemini AI เป็น LLM หลักสำหรับการ Generate คำตอบ ข้อมูล TCAS69 ถูก Embed เป็น Vector ด้วย Text Embedding และจัดเก็บเพื่อทำ Semantic Search ระบบมี Token-based Rate Limiting เพื่อป้องกัน Abuse และ Deploy บน Production Server ที่ chatbot.lks.ac.th

# RAG Pipeline (Retrieval-Augmented Generation)

lib/ai/rag.ts
// RAG Pipeline: ค้นหาข้อมูล TCAS ที่เกี่ยวข้องก่อน Generate คำตอบ
async function generateChatResponse(userMessage: string) {
  // 1. Embed คำถามของผู้ใช้เป็น Vector
  const queryEmbedding = await embedText(userMessage);
  
  // 2. Semantic Search หาข้อมูล TCAS ที่ใกล้เคียงที่สุด
  const relevantChunks = await searchSimilarChunks(queryEmbedding, {
    topK: 5,
    threshold: 0.7,
  });
  
  // 3. สร้าง Context จากข้อมูลที่ค้นพบ
  const context = relevantChunks
    .map((chunk) => chunk.content)
    .join("\n\n---\n\n");
  
  // 4. ส่งให้ Gemini AI สร้างคำตอบโดยใช้ Context
  const response = await gemini.generateContent({
    contents: [{
      role: "user",
      parts: [{ text: buildPrompt(context, userMessage) }],
    }],
  });
  
  return response.text();
}

# Token Rate Limiting

lib/rateLimit.ts
// Token Rate Limiting: จำกัด 20 tokens ต่อ session
export async function checkAndDeductToken(
  sessionId: string
): Promise<{ allowed: boolean; remaining: number }> {
  const key = `tokens:${sessionId}`;
  const MAX_TOKENS = 20;
  
  const current = await redis.get(key);
  const used = current ? parseInt(current) : 0;
  
  if (used >= MAX_TOKENS) {
    return { allowed: false, remaining: 0 };
  }
  
  await redis.incr(key);
  await redis.expire(key, 86400); // Reset ทุก 24 ชั่วโมง
  
  return {
    allowed: true,
    remaining: MAX_TOKENS - used - 1,
  };
}

# Semantic Search (Similar Faculty)

lib/search/semantic.ts
// Semantic Search: ค้นหาคณะใกล้เคียงด้วย Cosine Similarity
function cosineSimilarity(vecA: number[], vecB: number[]): number {
  const dotProduct = vecA.reduce((sum, a, i) => sum + a * vecB[i], 0);
  const magnitudeA = Math.sqrt(vecA.reduce((sum, a) => sum + a * a, 0));
  const magnitudeB = Math.sqrt(vecB.reduce((sum, b) => sum + b * b, 0));
  return dotProduct / (magnitudeA * magnitudeB);
}

export async function findSimilarFaculties(
  targetFaculty: Faculty
): Promise<SimilarFaculty[]> {
  // Embed ชื่อและรายละเอียดคณะเป้าหมาย
  const targetEmbedding = await embedText(
    `${targetFaculty.name} ${targetFaculty.description}`
  );
  
  // คำนวณ Similarity กับทุกคณะในฐานข้อมูล
  const similarities = allFaculties.map((faculty) => ({
    faculty,
    score: cosineSimilarity(targetEmbedding, faculty.embedding),
  }));
  
  // เรียงลำดับและส่งคืน Top 10
  return similarities
    .sort((a, b) => b.score - a.score)
    .slice(1, 11); // ข้ามตัวเอง
}

ฟีเจอร์หลัก

🤖

AI Chat: ตอบคำถาม TCAS ด้วย Google Gemini AI แบบ Real-time

📚

RAG System: อ้างอิงข้อมูลจากคู่มือ TCAS69 ของ ทปอ. เพื่อความถูกต้อง

🔍

คณะใกล้เคียง: ค้นหาคณะที่มีความใกล้เคียง/คล้ายกันด้วย Semantic Search

📊

สถิติการศึกษา: แสดงข้อมูลสถิติและแนวโน้มการสมัคร TCAS

🔒

Token Rate Limiting: จำกัดการใช้งาน 20 Tokens/Session เพื่อความยั่งยืน

📱

Responsive Design: รองรับทุกขนาดหน้าจอ ทั้ง Mobile และ Desktop

← กลับหน้าหลัก