ทำความรู้จักกับ Semantic Search สำหรับโค้ด

เคยไหมที่พยายามหาโค้ดที่เคยเขียนไว้แต่จำคำที่ใช้ค้นหาไม่ได้? หรืออยากค้นหาฟังก์ชันที่ทำงานคล้ายๆ กันแต่ใช้ชื่อต่างกัน? นี่คือปัญหาที่ Semantic Search สำหรับโค้ดสามารถแก้ไขได้อย่างมหัศจรรย์

Semantic Search หมายถึงการค้นหาที่เข้าใจความหมาย ไม่ใช่แค่จับคู่คำตรงตัว ลองนึกภาพว่าคุณถาม AI ว่า "หาโค้ดที่จัดการการยืนยันตัวตน" แล้วระบบเข้าใจว่าคุณหมายถึง login, authentication, verify, token หรือ session ซึ่งทั้งหมดนี้เชื่อมโยงกันทางความหมาย

เตรียมพร้อมก่อนเริ่มต้น

สิ่งที่คุณต้องมี:

ขั้นตอนที่ 1: ติดตั้งเครื่องมือที่จำเป็น

เปิด Terminal หรือ Command Prompt แล้วพิมพ์คำสั่งติดตั้ง:

pip install requests python-dotenv sentence-transformers

คำอธิบายแบบง่ายๆ: requests คือเครื่องมือส่งข้อมูลไปหา AI, python-dotenv ช่วยเก็บรหัสลับอย่างปลอดภัย และ sentence-transformers จะแปลงโค้ดของคุณให้เป็นตัวเลขที่ AI เข้าใจ

ขั้นตอนที่ 2: สร้างไฟล์เก็บรหัส API

สร้างไฟล์ชื่อ .env ในโฟลเดอร์เดียวกับโค้ดของคุณ โดยพิมพ์ข้อความนี้ลงไป:

HOLYSHEEP_API_KEY=YOUR_HOLYSHEEP_API_KEY

สิ่งสำคัญ: แทนที่ YOUR_HOLYSHEEP_API_KEY ด้วยรหัสที่ได้จากหน้า สมัคร HolySheep AI และห้ามลบเครื่องหมาย = ออกเด็ดขาด

ขั้นตอนที่ 3: เขียนโค้ด Semantic Search พื้นฐาน

สร้างไฟล์ใหม่ชื่อ code_search.py แล้วคัดลอกโค้ดด้านล่างนี้ไปวาง:

import os
import requests
from dotenv import load_dotenv

โหลดรหัส API จากไฟล์ .env

load_dotenv() def search_code_semantic(query, codebase_vectors, top_k=5): """ ค้นหาโค้ดที่มีความหมายใกล้เคียงกับคำถาม query: คำถามของคุณ เช่น "การเข้ารหัส password" codebase_vectors: รายการ tuple (โค้ด, เวกเตอร์) ของโค้ดทั้งหมดในโปรเจกต์ top_k: จำนวนผลลัพธ์ที่ต้องการ """ api_key = os.getenv("HOLYSHEEP_API_KEY") # ส่งคำถามไปให้ AI สร้างเวกเตอร์ response = requests.post( "https://api.holysheep.ai/v1/embeddings", headers={ "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" }, json={ "model": "text-embedding-3-small", "input": query } ) if response.status_code != 200: print(f"เกิดข้อผิดพลาด: {response.status_code}") print(response.text) return [] # รับเวกเตอร์ของคำถามกลับมา query_vector = response.json()["data"][0]["embedding"] # คำนวณความคล้ายคลึงกับโค้ดทั้งหมด results = [] for code, code_vector in codebase_vectors: similarity = cosine_similarity(query_vector, code_vector) results.append((code, similarity)) # เรียงลำดับจากความคล้ายคลึงมากไปน้อย results.sort(key=lambda x: x[1], reverse=True) return results[:top_k] def cosine_similarity(vec1, vec2): """คำนวณความคล้ายคลึงระหว่างเวกเตอร์สองตัว""" dot_product = sum(a * b for a, b in zip(vec1, vec2)) magnitude = (sum(a**2 for a in vec1) ** 0.5) * (sum(b**2 for b in vec2) ** 0.5) return dot_product / magnitude if magnitude != 0 else 0 print("พร้อมใช้งานแล้ว! รอให้ฟังก์ชัน index_codebase() สร้างดัชนีโค้ดก่อน")

ขั้นตอนที่ 4: สร้างดัชนีสำหรับโค้ดทั้งโปรเจกต์

ต่อไปเราต้องสแกนโค้ดทั้งหมดในโปรเจกต์แล้วแปลงเป็นเวกเตอร์ เพิ่มฟังก์ชันนี้ต่อจากโค้ดข้างบน:

import os
from pathlib import Path

def index_codebase(folder_path):
    """
    อ่านไฟล์โค้ดทั้งหมดในโปรเจกต์แล้วสร้างดัชนี
    folder_path: ที่อยู่โฟลเดอร์โปรเจกต์ เช่น "./my_project"
    """
    
    api_key = os.getenv("HOLYSHEEP_API_KEY")
    
    # กำหนดนามสกุลไฟล์ที่ต้องการอ่าน
    code_extensions = {'.py', '.js', '.ts', '.java', '.cpp', '.c', '.go', '.rs'}
    
    all_codes = []
    
    # เดินผ่านทุกไฟล์ในโฟลเดอร์
    for file_path in Path(folder_path).rglob('*'):
        if file_path.suffix in code_extensions:
            try:
                # ข้ามไฟล์ที่ใหญ่เกินไป
                if file_path.stat().st_size > 100000:
                    continue
                    
                with open(file_path, 'r', encoding='utf-8') as f:
                    content = f.read()
                    # ดึงฟังก์ชัน/คลาสแต่ละตัวมาทำเวกเตอร์
                    all_codes.append({
                        "file": str(file_path),
                        "content": content
                    })
            except Exception as e:
                print(f"ข้ามไฟล์ {file_path}: {e}")
    
    print(f"พบ {len(all_codes)} ไฟล์โค้ด")
    
    # สร้างเวกเตอร์สำหรับแต่ละไฟล์
    codebase_vectors = []
    
    for i, code_info in enumerate(all_codes):
        print(f"กำลังประมวลผลไฟล์ที่ {i+1}/{len(all_codes)}...")
        
        # แบ่งโค้ดเป็นส่วนๆ (chunk) เพื่อให้ค้นหาแม่นยำขึ้น
        chunks = split_code_into_chunks(code_info["content"])
        
        for chunk in chunks:
            response = requests.post(
                "https://api.holysheep.ai/v1/embeddings",
                headers={
                    "Authorization": f"Bearer {api_key}",
                    "Content-Type": "application/json"
                },
                json={
                    "model": "text-embedding-3-small",
                    "input": chunk
                }
            )
            
            if response.status_code == 200:
                vector = response.json()["data"][0]["embedding"]
                codebase_vectors.append(({
                    "file": code_info["file"],
                    "code": chunk
                }, vector))
    
    return codebase_vectors

def split_code_into_chunks(code, max_chars=500):
    """แบ่งโค้ดออกเป็นส่วนเล็กๆ เหมาะสำหรับค้นหา"""
    lines = code.split('\n')
    chunks = []
    current_chunk = []
    current_length = 0
    
    for line in lines:
        current_chunk.append(line)
        current_length += len(line)
        
        if current_length >= max_chars:
            chunks.append('\n'.join(current_chunk))
            current_chunk = []
            current_length = 0
    
    if current_chunk:
        chunks.append('\n'.join(current_chunk))
    
    return chunks

ตัวอย่างการใช้งาน

if __name__ == "__main__": # ระบุที่อยู่โฟลเดอร์โปรเจกต์ของคุณ project_path = "./your_project_folder" print("เริ่มสร้างดัชนีโค้ด...") index = index_codebase(project_path) print(f"เสร็จสิ้น! มี {len(index)} ชิ้นส่วนโค้ดพร้อมค้นหา")

ขั้นตอนที่ 5: ทดสอบการค้นหา

ตอนนี้คุณมีระบบค้นหาพร้อมแล้ว ลองทดสอบด้วยการค้นหาแบบต่างๆ:

# ตัวอย่างการใช้งานจริง
if __name__ == "__main__":
    # สร้างดัชนีโค้ดก่อน (ทำครั้งเดียว)
    project_path = "./your_project_folder"
    index = index_codebase(project_path)
    
    # ทดสอบค้นหาด้วยคำถามภาษาธรรมชาติ
    queries = [
        "การตรวจสอบผู้ใช้ก่อนเข้าถึง",
        "การเชื่อมต่อฐานข้อมูล",
        "การจัดการข้อผิดพลาด"
    ]
    
    for query in queries:
        print(f"\n{'='*60}")
        print(f"ค้นหา: {query}")
        print('='*60)
        
        results = search_code_semantic(query, index, top_k=3)
        
        for i, (result, score) in enumerate(results, 1):
            print(f"\nผลลัพธ์ที่ {i} (ความแม่นยำ: {score:.2%})")
            print(f"ไฟล์: {result['file']}")
            print(f"โค้ด:\n{result['code'][:200]}...")

ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข

กรณีที่ 1: ได้รับข้อผิดพลาด 401 Unauthorized

# ❌ ผิดพลาด - API Key ไม่ถูกต้องหรือหมดอายุ

ข้อความที่แสดง: {"error": {"message": "Invalid API key"}}

✅ แก้ไข - ตรวจสอบว่าไฟล์ .env อยู่ในที่ถูกต้อง

และรหัส API ถูกวางอย่างครบถ้วน

ให้เพิ่มโค้ดตรวจสอบดังนี้

import os from dotenv import load_dotenv load_dotenv() api_key = os.getenv("HOLYSHEEP_API_KEY") if not api_key or api_key == "YOUR_HOLYSHEEP_API_KEY": print("กรุณาใส่ API Key ที่ถูกต้องในไฟล์ .env") print("สมัครได้ที่: https://www.holysheep.ai/register") exit(1) else: print(f"พบ API Key เริ่มทำงาน...")

กรณีที่ 2: ได้รับข้อผิดพลาด 429 Rate Limit

# ❌ ผิดพลาด - ส่งคำขอเร็วเกินไป ระบบปฏิเสธ

ข้อความที่แสดง: {"error": {"message": "Rate limit exceeded"}}

✅ แก้ไข - เพิ่มการรอระหว่างการส่งคำขอ

import time def index_codebase_with_delay(folder_path, delay=0.5): """เพิ่ม delay ระหว่างการเรียก API""" for i, code_info in enumerate(all_codes): # ... โค้ดประมวลผล ... response = requests.post( "https://api.holysheep.ai/v1/embeddings", headers={...}, json={...} ) if response.status_code == 429: print("รอเนื่องจากถึงขีดจำกัด กรุณารอ 5 วินาที...") time.sleep(5) # ลองใหม่อีกครั้ง response = requests.post(...) time.sleep(delay) # รอครึ่งวินาทีระหว่างแต่ละคำขอ return codebase_vectors

กรณีที่ 3: ได้รับข้อความ "Connection Error"

# ❌ ผิดพลาด - ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์

ข้อความที่แสดง: ConnectionError หรือ Timeout

✅ แก้ไข - ตรวจสอบการเชื่อมต่อและเพิ่ม timeout

import requests from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry def create_session(): """สร้าง session ที่มีการ retry อัตโนมัติ""" session = requests.Session() # ตั้งค่าให้ลองใหม่ 3 ครั้งเมื่อล้มเหลว retry = Retry( total=3, backoff_factor=1, status_forcelist=[500, 502, 503, 504] ) adapter = HTTPAdapter(max_retries=retry) session.mount('http://', adapter) session.mount('https://', adapter) return session

ใช้งานแทน requests ปกติ

session = create_session() response = session.post( "https://api.holysheep.ai/v1/embeddings", headers={...}, json={...}, timeout=30 # รอได้สูงสุด 30 วินาที )

วิธีดูผลลัพธ์การทำงาน

เมื่อรันโค้ดแล้ว คุณจะเห็นข้อความแบบนี้ในหน้าจอ Terminal:

เริ่มสร้างดัชนีโค้ด...
พบ 25 ไฟล์โค้ด
กำลังประมวลผลไฟล์ที่ 1/25...
กำลังประมวลผลไฟล์ที่ 2/25...
...
เสร็จสิ้น! มี 152 ชิ้นส่วนโค้ดพร้อมค้นหา

============================================================
ค้นหา: การตรวจสอบผู้ใช้ก่อนเข้าถึง
============================================================

ผลลัพธ์ที่ 1 (ความแม่นยำ: 94.32%)
ไฟล์: ./my_project/auth/login.py
โค้ด:
def verify_user(username, password):
    # ตรวจสอบข้อมูลผู้ใช้...

ผลลัพธ์ที่ 2 (ความแม่นยำ: 87.65%)
ไฟล์: ./my_project/middleware/auth.py
โค้ด:
async def check_session(request):
    # ตรวจสอบ session ก่อนประมวลผล...

เคล็ดลับเพิ่มเติมสำหรับการใช้งาน

สรุป

Semantic Search สำหรับโค้ดเป็นเครื่องมือที่ช่วยให้คุณค้นหาโค้ดได้อย่างฉลาด โดยไม่ต้องจำชื่อฟังก์ชันหรือตำแหน่งไฟล์ให้แม่นยำ เพียงอธิบายสิ่งที่ต้องการด้วยภาษาธรรมชาติ AI ก็จะเข้าใจและค้นหาโค้ดที่เกี่ยวข้องให้คุณ

ด้วยบริการของ HolySheep AI คุณสามารถใช้งานได้อย่างประหยัดด้วยราคาเพียง $1 ต่อ ¥1 พร้อมความเร็วในการตอบสนองต่ำกว่า 50 มิลลิวินาที และรองรับการชำระเงินผ่าน WeChat และ Alipay อีกด้วย

👉 สมัคร HolySheep AI — รับเครดิตฟรีเมื่อลงทะเบียน