TCAS ChatBot
AI Chatbot ตอบคำถาม TCAS จากข้อมูล ทปอ. TCAS69
ภาพรวมโปรเจกต์
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) เพื่อให้คำตอบมีความถูกต้องและอ้างอิงได้
สถาปัตยกรรมระบบ & ลอจิก
ระบบพัฒนาด้วย 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)
// 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
// 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)
// 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