คุณเคยสงสัยไหมว่า ทำไมระบบ Chatbot บางตัวถึงตอบคำถามได้แม่นยำมาก แต่บางตัวกลับตอบอะไรก็ไม่ถูก? ความลับอยู่ที่ การค้นหาความคล้ายคลึง (Similarity Search) ซึ่งเป็นหัวใจสำคัญของระบบ AI Knowledge Base
ในบทความนี้ ผมจะพาคุณ (ที่ไม่เคยเขียนโค้ดมาก่อนเลย) สร้างระบบถาม-ตอบที่ฉลาดได้ด้วยตัวเอง โดยใช้ HolySheep AI ซึ่งมีความเร็วตอบสนองน้อยกว่า 50 มิลลิวินาที และราคาประหยัดกว่าบริการอื่นถึง 85%
การค้นหาความคล้ายคลึงคืออะไร?
ลองนึกภาพว่าสมองของเราจดจำความหมายของประโยค ไม่ใช่แค่คำๆ นั้น การค้นหาความคล้ายคลึงก็ทำงานคล้ายกัน:
# ตัวอย่างง่ายๆ ที่จะอธิบายหลักการ
สมมติเรามีคำถามในฐานข้อมูล
คำถาม: "วิธีรีเซ็ตรหัสผ่าน"
คำตอบ: "ไปที่หน้าตั้งค่า > คลิกรีเซ็ตรหัสผ่าน > ยืนยันอีเมล"
เมื่อผู้ใช้ถามว่า "ลืมรหัสผ่านต้องทำไง"
ระบบจะรู้ว่าสองประโยคนี้ "หมายความเหมือนกัน"
แม้จะใช้คำไม่เหมือนกันเลย!
องค์ประกอบ 3 อย่างที่ทำให้ระบบทำงานได้
1. Embedding Model - แปลงข้อความเป็นตัวเลข
คอมพิวเตอร์ไม่เข้าใจภาษามนุษย์โดยตรง เราต้องแปลงข้อความเป็นตัวเลข (เรียกว่า Vector) ก่อน
2. Vector Database - ที่เก็บตัวเลขเหล่านั้น
เมื่อแปลงแล้ว เราต้องเก็บไว้ที่ใดที่หนึ่ง เพื่อนำมาเปรียบเทียบภายหลัง
3. Similarity Algorithm - วัดความ "ใกล้เคียง"
สุดท้าย วัดว่าคำถามใหม่ "ใกล้เคียง" กับคำถามเดิมในฐานข้อมูลแค่ไหน
เริ่มต้นใช้งาน: ติดตั้งเครื่องมือ
ก่อนจะเขียนโค้ด คุณต้องติดตั้งโปรแกรม Python และไลบรารีที่จำเป็นก่อน
# ติดตั้งไลบรารีที่จำเป็น
pip install requests numpy
วิธีตรวจสอบว่าติดตั้งสำเร็จ: เปิด Command Prompt (หรือ Terminal) แล้วพิมพ์คำสั่งข้างบน ถ้าไม่มีข้อความแดงขึ้นมาบอก error แสดงว่าสำเร็จ
ขั้นตอนที่ 1: สร้างฟังก์ชันแปลงข้อความเป็นตัวเลข (Embedding)
นี่คือโค้ดที่จะแปลงข้อความของคุณให้เป็น Vector ที่คอมพิวเตอร์เข้าใจได้:
import requests
import numpy as np
กำหนดค่าสำหรับเชื่อมต่อ HolySheep API
BASE_URL = "https://api.holysheep.ai/v1"
API_KEY = "YOUR_HOLYSHEEP_API_KEY" # ใส่ API Key ของคุณตรงนี้
def get_embedding(text):
"""
ฟังก์ชันนี้จะแปลงข้อความให้เป็น Vector
"""
url = f"{BASE_URL}/embeddings"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
payload = {
"model": "text-embedding-3-small",
"input": text
}
response = requests.post(url, headers=headers, json=payload)
if response.status_code == 200:
data = response.json()
return np.array(data["data"][0]["embedding"])
else:
print(f"เกิดข้อผิดพลาด: {response.status_code}")
print(response.text)
return None
ทดสอบการทำงาน
test_text = "วิธีติดต่อฝ่ายบริการลูกค้า"
embedding = get_embedding(test_text)
print(f"Vector ที่ได้: {embedding[:5]}...") # แสดงแค่ 5 ค่าแรก
หมายเหตุสำคัญ: คุณต้องได้รับ API Key จากการ สมัครสมาชิก HolySheep ก่อน โดยหลังสมัครจะได้รับเครดิตฟรีทันที
ขั้นตอนที่ 2: คำนวณความคล้ายคลึง (Cosine Similarity)
เมื่อได้ Vector แล้ว เราต้องวัดว่าสอง Vector นี้ "ใกล้กัน" แค่ไหน วิธีที่นิยมใช้คือ Cosine Similarity
def cosine_similarity(vec1, vec2):
"""
คำนวณความคล้ายคลึงระหว่าง Vector สองตัว
ค่าที่ได้จะอยู่ระหว่าง -1 ถึง 1
ถ้าใกล้ 1 หมายถึง "คล้ายกันมาก"
"""
dot_product = np.dot(vec1, vec2)
norm_vec1 = np.linalg.norm(vec1)
norm_vec2 = np.linalg.norm(vec2)
if norm_vec1 == 0 or norm_vec2 == 0:
return 0
return dot_product / (norm_vec1 * norm_vec2)
ทดสอบ
vec_a = np.array([0.1, 0.5, 0.8])
vec_b = np.array([0.2, 0.4, 0.7])
similarity = cosine_similarity(vec_a, vec_b)
print(f"ความคล้ายคลึง: {similarity:.4f}")
ขั้นตอนที่ 3: สร้างระบบ Knowledge Base พื้นฐาน
ตอนนี้เรามีทุกอย่างที่จะสร้างระบบถาม-ตอบแล้ว:
import requests
import numpy as np
BASE_URL = "https://api.holysheep.ai/v1"
API_KEY = "YOUR_HOLYSHEEP_API_KEY"
def get_embedding(text):
"""แปลงข้อความเป็น Vector"""
url = f"{BASE_URL}/embeddings"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
payload = {"model": "text-embedding-3-small", "input": text}
response = requests.post(url, headers=headers, json=payload)
return np.array(response.json()["data"][0]["embedding"])
def cosine_similarity(vec1, vec2):
"""คำนวณความคล้ายคลึง"""
return np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))
class SimpleKnowledgeBase:
"""ระบบถาม-ตอบแบบง่าย"""
def __init__(self):
self.questions = []
self.answers = []
self.question_vectors = []
def add_qa(self, question, answer):
"""เพิ่มคำถาม-คำตอบลงในฐานข้อมูล"""
self.questions.append(question)
self.answers.append(answer)
# แปลงคำถามเป็น Vector แล้วเก็บไว้
q_vector = get_embedding(question)
self.question_vectors.append(q_vector)
print(f"✅ เพิ่ม: {question}")
def find_answer(self, user_question, threshold=0.7):
"""หาคำตอบจากคำถามของผู้ใช้"""
# แปลงคำถามผู้ใช้เป็น Vector
user_vector = get_embedding(user_question)
# หาคำถามที่คล้ายกันที่สุด
best_score = 0
best_index = -1
for i, q_vec in enumerate(self.question_vectors):
score = cosine_similarity(user_vector, q_vec)
if score