AI และ LLM สำหรับ Developer สอนใช้ OpenAI API, LangChain และ RAG สร้าง AI App 2026

AI และ LLM สำหรับ Developer สอนใช้ OpenAI API, LangChain และ RAG สร้าง AI App 2026

ในปี 2026 AI และ Large Language Models (LLMs) ไม่ใช่แค่เทรนด์อีกต่อไป แต่กลายเป็นเครื่องมือพื้นฐานที่ Developer ทุกคนต้องรู้จักและใช้เป็น ตั้งแต่การสร้าง Chatbot อัจฉริยะ ระบบค้นหาเชิงความหมาย ไปจนถึง AI-powered Application ที่สร้างรายได้จริง

บทความนี้จะสอนคุณทุกอย่างที่ Developer ต้องรู้เกี่ยวกับการนำ AI/LLM มาใช้ในงานจริง ตั้งแต่ OpenAI API, Claude API, LangChain, RAG Architecture ไปจนถึง Vector Database และการสร้าง Production AI Application

AI/LLM Landscape สำหรับ Developer ปี 2026

ก่อนจะเริ่มเขียน Code มาทำความเข้าใจ Landscape ของ AI/LLM ที่ Developer ต้องรู้

ประเภทของ LLM

ประเภทตัวอย่างข้อดีข้อเสีย
Cloud APIOpenAI GPT-4o, Claude, Geminiแรงสุด ไม่ต้อง Infraมีค่าใช้จ่าย ข้อมูลออกนอก
Open Source (Cloud)Llama 3, Mistral, QwenFree ควบคุมได้ต้องมี GPU Server
Local LLMOllama, llama.cppPrivacy 100% ฟรีช้ากว่า ต้องมี RAM/VRAM
Fine-tunedCustom trained modelsเฉพาะทาง แม่นยำต้องมีข้อมูล/เวลา Train

เลือก Model อย่างไร

  • งาน Complex (Reasoning, Code Generation): GPT-4o, Claude Opus, Gemini Ultra
  • งานทั่วไป (Chat, Summary, Translation): GPT-4o-mini, Claude Sonnet, Gemini Flash
  • Privacy-sensitive: Local LLMs ผ่าน Ollama
  • High Volume / Low Cost: GPT-4o-mini, Open Source Models
  • Domain-specific: Fine-tuned Models

OpenAI API — พื้นฐานที่ต้องรู้

ติดตั้งและเริ่มต้น

# ติดตั้ง
pip install openai

# หรือ Node.js
npm install openai

Chat Completions — API หลัก

# Python
from openai import OpenAI

client = OpenAI(api_key="sk-...")  # หรือตั้ง OPENAI_API_KEY env

# Basic Chat Completion
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "คุณเป็นผู้เชี่ยวชาญด้านการเขียนโปรแกรม Python"},
        {"role": "user", "content": "อธิบาย List Comprehension ใน Python"}
    ],
    temperature=0.7,  # ความสร้างสรรค์ (0=แม่นยำ, 1=สร้างสรรค์)
    max_tokens=1000,
)

print(response.choices[0].message.content)
print(f"Tokens used: {response.usage.total_tokens}")

Streaming — แสดงผลแบบ Real-time

# Streaming Response (สำหรับ UI ที่แสดงทีละตัวอักษร)
stream = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "user", "content": "เขียนบทความเรื่อง Python สั้นๆ"}
    ],
    stream=True,
)

for chunk in stream:
    content = chunk.choices[0].delta.content
    if content:
        print(content, end="", flush=True)

Function Calling — ให้ AI เรียกฟังก์ชัน

import json

# กำหนด Tools/Functions ที่ AI สามารถเรียกได้
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "ดึงข้อมูลสภาพอากาศของเมืองที่ระบุ",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {
                        "type": "string",
                        "description": "ชื่อเมือง เช่น Bangkok, Chiang Mai"
                    },
                    "unit": {
                        "type": "string",
                        "enum": ["celsius", "fahrenheit"],
                        "description": "หน่วยอุณหภูมิ"
                    }
                },
                "required": ["city"]
            }
        }
    }
]

# AI จะตัดสินใจว่าต้องเรียก Function ไหน
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "อากาศกรุงเทพวันนี้เป็นยังไง?"}],
    tools=tools,
    tool_choice="auto",
)

# ตรวจว่า AI ต้องการเรียก Function
if response.choices[0].message.tool_calls:
    tool_call = response.choices[0].message.tool_calls[0]
    args = json.loads(tool_call.function.arguments)
    print(f"AI ต้องการเรียก: {tool_call.function.name}")
    print(f"Arguments: {args}")

    # เรียก Function จริง
    weather_data = get_weather(args["city"])  # ฟังก์ชันของเรา

    # ส่งผลลัพธ์กลับให้ AI
    messages = [
        {"role": "user", "content": "อากาศกรุงเทพวันนี้เป็นยังไง?"},
        response.choices[0].message,
        {
            "role": "tool",
            "tool_call_id": tool_call.id,
            "content": json.dumps(weather_data)
        }
    ]
    final = client.chat.completions.create(model="gpt-4o", messages=messages)
    print(final.choices[0].message.content)

Structured Outputs — ได้ JSON ที่ต้องการ

from pydantic import BaseModel

class ProductReview(BaseModel):
    sentiment: str  # positive, negative, neutral
    score: float    # 0.0 - 1.0
    summary: str
    keywords: list[str]

response = client.beta.chat.completions.parse(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "วิเคราะห์รีวิวสินค้าแล้วตอบเป็น JSON"},
        {"role": "user", "content": "สินค้าดีมาก คุณภาพเยี่ยม ส่งไว แพ็คอย่างดี"}
    ],
    response_format=ProductReview,
)

review = response.choices[0].message.parsed
print(f"Sentiment: {review.sentiment}")
print(f"Score: {review.score}")
print(f"Keywords: {review.keywords}")

Anthropic Claude API

# pip install anthropic
from anthropic import Anthropic

client = Anthropic(api_key="sk-ant-...")

# Basic Message
message = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    system="คุณเป็นผู้เชี่ยวชาญด้านการเขียนโปรแกรม",
    messages=[
        {"role": "user", "content": "อธิบาย async/await ใน Python"}
    ]
)
print(message.content[0].text)

# Streaming
with client.messages.stream(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    messages=[{"role": "user", "content": "เขียน Python decorator ตัวอย่าง"}]
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)

# Tool Use (Function Calling)
response = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    tools=[{
        "name": "calculate",
        "description": "คำนวณสมการทางคณิตศาสตร์",
        "input_schema": {
            "type": "object",
            "properties": {
                "expression": {"type": "string", "description": "สมการ เช่น 2+2"}
            },
            "required": ["expression"]
        }
    }],
    messages=[{"role": "user", "content": "คำนวณ 15% ของ 2500 บาท"}]
)
Claude vs GPT: Claude เก่งเรื่อง Long Context (รองรับ 200K tokens), การวิเคราะห์เอกสารยาว, และ Code Generation ส่วน GPT-4o เก่งเรื่อง Multimodal (รูป/เสียง) และ Ecosystem ที่ใหญ่กว่า เลือกใช้ตามความเหมาะสมของงาน

Local LLMs — Ollama และ llama.cpp

สำหรับงานที่ต้องการ Privacy หรือไม่อยากเสียค่า API สามารถรัน LLM บนเครื่องตัวเองได้

# ติดตั้ง Ollama (https://ollama.ai)
# macOS/Linux
curl -fsSL https://ollama.ai/install.sh | sh

# ดาวน์โหลดและรัน Model
ollama pull llama3.1:8b      # Meta Llama 3.1 8B
ollama pull mistral           # Mistral 7B
ollama pull codellama         # สำหรับ Code

# รัน Chat
ollama run llama3.1:8b

# ใช้ผ่าน API (OpenAI-compatible)
curl http://localhost:11434/v1/chat/completions \
  -d '{
    "model": "llama3.1:8b",
    "messages": [{"role": "user", "content": "Hello"}]
  }'
# ใช้ Ollama กับ OpenAI Python SDK (Compatible!)
from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama",  # ไม่จำเป็นแต่ต้องใส่
)

response = client.chat.completions.create(
    model="llama3.1:8b",
    messages=[{"role": "user", "content": "สอน Python OOP"}]
)
print(response.choices[0].message.content)

LangChain — Framework สำหรับ AI Application

LangChain เป็น Framework ที่ช่วยให้สร้าง AI Application ได้ง่ายขึ้น โดยจัดการ Prompt, Chain, Memory, Agent และ Tool Integration ให้

ติดตั้ง

pip install langchain langchain-openai langchain-community
pip install langchain-anthropic  # สำหรับ Claude

Basic Chain

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

# สร้าง LLM instance
llm = ChatOpenAI(model="gpt-4o", temperature=0.7)

# สร้าง Prompt Template
prompt = ChatPromptTemplate.from_messages([
    ("system", "คุณเป็นผู้เชี่ยวชาญด้าน {topic}"),
    ("user", "{question}")
])

# สร้าง Chain (LCEL - LangChain Expression Language)
chain = prompt | llm | StrOutputParser()

# เรียกใช้
result = chain.invoke({
    "topic": "Python",
    "question": "อธิบาย Generator ใน Python"
})
print(result)

Memory — จำบทสนทนา

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.chat_history import InMemoryChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory

llm = ChatOpenAI(model="gpt-4o")

prompt = ChatPromptTemplate.from_messages([
    ("system", "คุณเป็น AI Assistant ที่ช่วยตอบคำถาม"),
    MessagesPlaceholder(variable_name="history"),
    ("user", "{input}")
])

chain = prompt | llm

# Store สำหรับเก็บประวัติ
store = {}

def get_session_history(session_id: str):
    if session_id not in store:
        store[session_id] = InMemoryChatMessageHistory()
    return store[session_id]

chain_with_history = RunnableWithMessageHistory(
    chain,
    get_session_history,
    input_messages_key="input",
    history_messages_key="history",
)

# สนทนา — AI จะจำบริบทได้
config = {"configurable": {"session_id": "user123"}}
r1 = chain_with_history.invoke({"input": "ผมชื่อสมชาย"}, config=config)
r2 = chain_with_history.invoke({"input": "ผมชื่ออะไร?"}, config=config)
print(r2.content)  # "คุณชื่อสมชาย"

Agents — AI ที่ตัดสินใจและใช้ Tools

from langchain_openai import ChatOpenAI
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_core.tools import tool
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

# สร้าง Custom Tools
@tool
def search_database(query: str) -> str:
    """ค้นหาข้อมูลจาก Database ภายใน"""
    # จำลอง Database search
    return f"ผลลัพธ์สำหรับ '{query}': พบข้อมูล 5 รายการ..."

@tool
def calculate_price(base_price: float, discount_percent: float) -> str:
    """คำนวณราคาหลังหักส่วนลด"""
    final = base_price * (1 - discount_percent / 100)
    return f"ราคาหลังลด {discount_percent}%: {final:.2f} บาท"

# สร้าง Agent
llm = ChatOpenAI(model="gpt-4o")
tools = [search_database, calculate_price]

prompt = ChatPromptTemplate.from_messages([
    ("system", "คุณเป็น AI Shopping Assistant ช่วยค้นหาสินค้าและคำนวณราคา"),
    MessagesPlaceholder(variable_name="chat_history", optional=True),
    ("user", "{input}"),
    MessagesPlaceholder(variable_name="agent_scratchpad"),
])

agent = create_tool_calling_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# Agent จะตัดสินใจเองว่าต้องเรียก Tool ไหน
result = executor.invoke({
    "input": "ค้นหาสินค้า iPhone 16 แล้วคำนวณราคาถ้าลด 15% จาก 45000 บาท"
})
print(result["output"])

RAG — Retrieval Augmented Generation

RAG เป็นเทคนิคที่สำคัญที่สุดสำหรับการสร้าง AI Application ที่ตอบคำถามจากข้อมูลของเราเอง แทนที่จะพึ่ง Knowledge ของ LLM อย่างเดียว

RAG Architecture

# ขั้นตอนของ RAG:
# 1. Ingestion (ครั้งเดียว):
#    เอกสาร → Chunk → Embedding → Vector Database
#
# 2. Query (ทุกครั้งที่ User ถาม):
#    คำถาม → Embedding → ค้นหา Vector DB → เอกสารที่เกี่ยวข้อง
#    → ส่งให้ LLM พร้อมคำถาม → คำตอบ

สร้าง RAG ด้วย LangChain

from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain_community.document_loaders import (
    PyPDFLoader, TextLoader, DirectoryLoader
)
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser

# === ขั้นตอนที่ 1: Ingestion ===

# โหลดเอกสาร
loader = PyPDFLoader("company_handbook.pdf")
# หรือโหลดหลายไฟล์จากโฟลเดอร์
# loader = DirectoryLoader("./docs", glob="**/*.pdf", loader_cls=PyPDFLoader)
documents = loader.load()

# แบ่งเอกสารเป็น Chunks
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,      # ขนาด chunk (ตัวอักษร)
    chunk_overlap=200,    # overlap ระหว่าง chunks
    separators=["\n\n", "\n", " ", ""]
)
chunks = text_splitter.split_documents(documents)
print(f"แบ่งเป็น {len(chunks)} chunks")

# สร้าง Embeddings และเก็บใน Vector Store
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(
    documents=chunks,
    embedding=embeddings,
    persist_directory="./chroma_db"  # เก็บบน Disk
)

# === ขั้นตอนที่ 2: Query ===

# สร้าง Retriever
retriever = vectorstore.as_retriever(
    search_type="similarity",
    search_kwargs={"k": 5}  # ดึง 5 chunks ที่เกี่ยวข้องที่สุด
)

# สร้าง RAG Chain
llm = ChatOpenAI(model="gpt-4o", temperature=0)

prompt = ChatPromptTemplate.from_template("""
ตอบคำถามโดยใช้เฉพาะข้อมูลจาก Context ด้านล่าง
ถ้าไม่มีข้อมูลเพียงพอ ให้บอกว่าไม่ทราบ อย่าแต่งคำตอบขึ้นมาเอง

Context:
{context}

คำถาม: {question}

คำตอบ:
""")

def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)

rag_chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

# ถามคำถาม
answer = rag_chain.invoke("นโยบายการลาป่วยของบริษัทเป็นอย่างไร?")
print(answer)

Vector Databases — เปรียบเทียบ

Vector DBประเภทจุดเด่นเหมาะกับ
ChromaDBEmbedded / Serverง่ายที่สุด ติดตั้งเร็วPrototype, โปรเจกต์เล็ก
PineconeManaged CloudScale ได้ไม่จำกัด ManagedProduction, Enterprise
WeaviateSelf-hosted / CloudGraphQL API, Hybrid SearchComplex Search, Multi-modal
pgvectorPostgreSQL Extensionใช้กับ PostgreSQL ที่มีอยู่ทีมที่ใช้ PostgreSQL อยู่แล้ว
QdrantSelf-hosted / Cloudเร็วมาก Rust-basedHigh Performance needs
MilvusSelf-hosted / CloudScale ได้มาก DistributedBig Data, Enterprise

ตัวอย่าง pgvector

# ใช้ pgvector กับ PostgreSQL ที่มีอยู่แล้ว
# SQL: CREATE EXTENSION vector;

from langchain_community.vectorstores import PGVector

CONNECTION_STRING = "postgresql://user:pass@localhost:5432/mydb"

vectorstore = PGVector.from_documents(
    documents=chunks,
    embedding=embeddings,
    connection_string=CONNECTION_STRING,
    collection_name="company_docs",
)

# ค้นหา
results = vectorstore.similarity_search("วันลาพักร้อน", k=3)
for doc in results:
    print(doc.page_content[:200])

Embeddings คืออะไร?

Embedding คือการแปลงข้อความ (Text) เป็น Vector ตัวเลข (Array of floats) ที่คอมพิวเตอร์เข้าใจ โดยข้อความที่มีความหมายคล้ายกันจะมี Vector ที่อยู่ใกล้กันใน Vector Space

from openai import OpenAI
client = OpenAI()

# สร้าง Embedding
response = client.embeddings.create(
    model="text-embedding-3-small",
    input=["แมวนอนอยู่บนโซฟา", "สุนัขนอนบนเตียง", "Python programming"]
)

# ได้ Vector (1536 dimensions สำหรับ text-embedding-3-small)
vec1 = response.data[0].embedding  # แมว
vec2 = response.data[1].embedding  # สุนัข
vec3 = response.data[2].embedding  # Python

# คำนวณ Cosine Similarity
import numpy as np
def cosine_sim(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

print(f"แมว vs สุนัข: {cosine_sim(vec1, vec2):.4f}")   # สูง (คล้ายกัน)
print(f"แมว vs Python: {cosine_sim(vec1, vec3):.4f}")  # ต่ำ (ต่างกัน)

Prompt Engineering Techniques

การเขียน Prompt ที่ดีเป็นทักษะสำคัญสำหรับ Developer ที่ทำงานกับ LLM

เทคนิคสำคัญ

# 1. System Prompt — กำหนดบทบาทและกฎเกณฑ์
system_prompt = """คุณเป็น Senior Python Developer ที่เชี่ยวชาญ Django
กฎ:
- ตอบเป็นภาษาไทย
- แสดง Code ตัวอย่างเสมอ
- อธิบาย Best Practices
- เตือนเรื่อง Security ถ้าเกี่ยวข้อง"""

# 2. Few-shot Prompting — ให้ตัวอย่างก่อน
prompt = """จำแนกประเภทข้อความ:

ข้อความ: "สินค้าดีมาก ส่งไว"
ประเภท: positive

ข้อความ: "สินค้าเสีย ส่งช้ามาก"
ประเภท: negative

ข้อความ: "ได้รับของแล้ว"
ประเภท: neutral

ข้อความ: "คุณภาพไม่ตรงปก แต่ส่งเร็วดี"
ประเภท:"""

# 3. Chain of Thought — ให้คิดทีละขั้น
prompt = """วิเคราะห์โค้ด Python ต่อไปนี้ ทีละขั้นตอน:
1. อ่านโค้ดทั้งหมดก่อน
2. ระบุ Bug หรือปัญหาที่พบ
3. อธิบายสาเหตุของแต่ละปัญหา
4. เสนอวิธีแก้ไขพร้อม Code

โค้ด:
```python
def get_user(id):
    user = db.query(f"SELECT * FROM users WHERE id={id}")
    return user
```"""

# 4. Output Format Control
prompt = """วิเคราะห์ข้อมูลต่อไปนี้แล้วตอบในรูปแบบ JSON:
{
  "summary": "สรุปสั้นๆ",
  "sentiment": "positive/negative/neutral",
  "action_items": ["สิ่งที่ต้องทำ"],
  "priority": "high/medium/low"
}"""

สร้าง AI Chatbot พร้อม Context

from openai import OpenAI
from typing import List

class AIChatbot:
    def __init__(self, system_prompt: str, model: str = "gpt-4o"):
        self.client = OpenAI()
        self.model = model
        self.messages: List[dict] = [
            {"role": "system", "content": system_prompt}
        ]

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

        response = self.client.chat.completions.create(
            model=self.model,
            messages=self.messages,
            temperature=0.7,
        )

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

        return assistant_message

    def clear_history(self):
        self.messages = [self.messages[0]]  # เก็บ system prompt

# ใช้งาน
bot = AIChatbot(
    system_prompt="คุณเป็น AI ผู้ช่วยสำหรับร้านอาหารไทย ช่วยแนะนำเมนูและรับออเดอร์"
)

print(bot.chat("มีเมนูแนะนำอะไรบ้าง?"))
print(bot.chat("สั่งผัดกะเพรา 2 จาน ส้มตำ 1 จาน"))
print(bot.chat("รวมเป็นเท่าไหร่?"))  # AI จำบริบทได้

AI-Powered Search

from openai import OpenAI
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings

class SemanticSearch:
    def __init__(self, collection_name: str):
        self.embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
        self.vectorstore = Chroma(
            collection_name=collection_name,
            embedding_function=self.embeddings,
            persist_directory="./search_db"
        )
        self.llm = OpenAI()

    def index_documents(self, documents: list[dict]):
        """เพิ่มเอกสารเข้า Index"""
        texts = [doc["content"] for doc in documents]
        metadatas = [{
            "title": doc["title"],
            "url": doc.get("url", ""),
            "category": doc.get("category", "")
        } for doc in documents]
        self.vectorstore.add_texts(texts, metadatas=metadatas)

    def search(self, query: str, k: int = 5) -> str:
        """ค้นหาเชิงความหมาย + สรุปด้วย AI"""
        # ค้นหา Vector
        results = self.vectorstore.similarity_search_with_score(query, k=k)

        # สร้าง Context จากผลลัพธ์
        context = "\n\n".join([
            f"[{doc.metadata.get('title', 'N/A')}] {doc.page_content}"
            for doc, score in results
        ])

        # ให้ AI สรุปผลลัพธ์
        response = self.llm.chat.completions.create(
            model="gpt-4o-mini",
            messages=[
                {"role": "system", "content": "สรุปผลการค้นหาให้กระชับ อ้างอิงแหล่งที่มา"},
                {"role": "user", "content": f"คำค้น: {query}\n\nผลลัพธ์:\n{context}"}
            ]
        )
        return response.choices[0].message.content

# ใช้งาน
search = SemanticSearch("products")
search.index_documents([
    {"title": "iPhone 16 Pro", "content": "สมาร์ทโฟนรุ่นใหม่...", "category": "phone"},
    {"title": "MacBook Pro M4", "content": "แล็ปท็อปสำหรับมืออาชีพ...", "category": "laptop"},
])
result = search.search("โน้ตบุ๊คสำหรับเขียนโปรแกรม")
print(result)

Cost Optimization สำหรับ AI Application

เทคนิคลดค่าใช้จ่าย

# 1. Caching — ไม่ต้อง Call API ซ้ำ
import hashlib
import json
from functools import lru_cache

# Simple In-memory Cache
response_cache = {}

def cached_completion(messages: list, model: str = "gpt-4o"):
    cache_key = hashlib.md5(json.dumps(messages).encode()).hexdigest()
    if cache_key in response_cache:
        return response_cache[cache_key]

    response = client.chat.completions.create(model=model, messages=messages)
    result = response.choices[0].message.content
    response_cache[cache_key] = result
    return result

# 2. Model Selection — ใช้ Model ถูกก่อน
def smart_completion(messages: list):
    # ลองใช้ Model ถูกก่อน
    response = client.chat.completions.create(
        model="gpt-4o-mini",  # ถูกกว่า 10x
        messages=messages,
    )
    result = response.choices[0].message.content

    # ถ้าคำตอบไม่ดีพอ (เช่น สั้นเกิน) ค่อยใช้ Model แพง
    if len(result) < 50 or "ไม่ทราบ" in result:
        response = client.chat.completions.create(
            model="gpt-4o",
            messages=messages,
        )
        result = response.choices[0].message.content

    return result

# 3. Token Management
# - ตัด Context ที่ไม่จำเป็น
# - ใช้ Summary แทน Full History
# - กำหนด max_tokens ให้เหมาะสม

# 4. Batch API — ลด Cost 50% (ไม่ต้องการ Real-time)
# OpenAI Batch API ให้ส่ง Requests เป็น Batch
# ประมวลผลภายใน 24 ชั่วโมง ราคาลดครึ่ง
ModelInput (1M tokens)Output (1M tokens)เหมาะกับ
GPT-4o$2.50$10.00งาน Complex
GPT-4o-mini$0.15$0.60งานทั่วไป ประหยัด
Claude Sonnet$3.00$15.00Long context, Code
Claude Haiku$0.25$1.25งานเบา รวดเร็ว

AI Safety และ Guardrails

# 1. Input Validation — กรอง Input ที่อันตราย
def validate_input(user_input: str) -> bool:
    # ตรวจ Prompt Injection
    suspicious_patterns = [
        "ignore previous instructions",
        "ignore all rules",
        "system prompt",
        "reveal your instructions",
    ]
    lower_input = user_input.lower()
    return not any(p in lower_input for p in suspicious_patterns)

# 2. Output Moderation
def moderate_output(response: str) -> str:
    moderation = client.moderations.create(input=response)
    if moderation.results[0].flagged:
        return "ขออภัย ไม่สามารถแสดงเนื้อหานี้ได้"
    return response

# 3. Rate Limiting
from datetime import datetime, timedelta

class RateLimiter:
    def __init__(self, max_requests: int, window_seconds: int):
        self.max_requests = max_requests
        self.window = timedelta(seconds=window_seconds)
        self.requests: dict[str, list] = {}

    def is_allowed(self, user_id: str) -> bool:
        now = datetime.now()
        if user_id not in self.requests:
            self.requests[user_id] = []

        # ลบ Request เก่า
        self.requests[user_id] = [
            t for t in self.requests[user_id] if now - t < self.window
        ]

        if len(self.requests[user_id]) >= self.max_requests:
            return False

        self.requests[user_id].append(now)
        return True

limiter = RateLimiter(max_requests=10, window_seconds=60)

LlamaIndex — ทางเลือกของ LangChain

# pip install llama-index
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.llms.openai import OpenAI

# โหลดเอกสาร (ง่ายมาก!)
documents = SimpleDirectoryReader("./docs").load_data()

# สร้าง Index
index = VectorStoreIndex.from_documents(documents)

# สร้าง Query Engine
query_engine = index.as_query_engine(
    llm=OpenAI(model="gpt-4o"),
    similarity_top_k=5,
)

# ถามคำถาม
response = query_engine.query("นโยบายการทำงานจากบ้านเป็นอย่างไร?")
print(response)
print(f"Sources: {response.source_nodes}")
LangChain vs LlamaIndex: LangChain เหมาะกับงานที่ต้อง Custom มาก (Agents, Complex Chains, Multi-tool) ส่วน LlamaIndex เหมาะกับงาน RAG/Search โดยเฉพาะ ตั้งค่าง่ายกว่ามาก ในโปรเจกต์จริงอาจใช้ทั้งสองร่วมกันได้

Testing AI Applications

import pytest
from unittest.mock import patch, MagicMock

# 1. Mock LLM Responses สำหรับ Unit Tests
@patch('openai.OpenAI')
def test_chatbot_response(mock_openai):
    mock_client = MagicMock()
    mock_openai.return_value = mock_client
    mock_client.chat.completions.create.return_value = MagicMock(
        choices=[MagicMock(message=MagicMock(content="สวัสดีครับ"))]
    )

    bot = AIChatbot("test system prompt")
    result = bot.chat("สวัสดี")
    assert "สวัสดี" in result

# 2. Evaluation Metrics
def evaluate_rag_response(question: str, expected: str, actual: str) -> dict:
    """ประเมินคุณภาพคำตอบ RAG"""
    # Relevance — คำตอบเกี่ยวข้องกับคำถามไหม
    # Faithfulness — คำตอบตรงกับ Context ไหม (ไม่ Hallucinate)
    # Completeness — คำตอบครบถ้วนไหม

    eval_prompt = f"""ประเมินคำตอบ AI (0-10):
    คำถาม: {question}
    คำตอบที่คาดหวัง: {expected}
    คำตอบ AI: {actual}

    ให้คะแนน: relevance, faithfulness, completeness"""

    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[{"role": "user", "content": eval_prompt}]
    )
    return response.choices[0].message.content

# 3. Regression Testing — ทดสอบชุดคำถามมาตรฐาน
test_cases = [
    {"q": "วันลาป่วยมีกี่วัน?", "expected_keywords": ["30", "วัน"]},
    {"q": "เงินเดือนออกวันไหน?", "expected_keywords": ["25", "ทุกเดือน"]},
]

def run_regression_tests(rag_chain):
    results = []
    for tc in test_cases:
        answer = rag_chain.invoke(tc["q"])
        passed = all(kw in answer for kw in tc["expected_keywords"])
        results.append({"question": tc["q"], "passed": passed, "answer": answer})
    return results

Production AI Architecture

# Production AI App Architecture
# ┌─────────────────────────────────────────┐
# │              Frontend (React/Next.js)    │
# │  Chat UI | Search UI | Dashboard        │
# └────────────────┬────────────────────────┘
#                  │ REST/WebSocket
# ┌────────────────▼────────────────────────┐
# │            API Server (FastAPI)          │
# │  Rate Limiting | Auth | Input Validation │
# └────────────────┬────────────────────────┘
#                  │
# ┌────────────────▼────────────────────────┐
# │          AI Orchestration Layer          │
# │  LangChain/LlamaIndex | Prompt Mgmt     │
# │  Caching | Model Router | Guardrails    │
# └──┬──────────┬──────────┬────────────────┘
#    │          │          │
# ┌──▼──┐  ┌───▼───┐  ┌──▼──────────┐
# │ LLM │  │Vector │  │  Database   │
# │ API │  │  DB   │  │ (PostgreSQL)│
# └─────┘  └───────┘  └─────────────┘

# FastAPI + AI Example
from fastapi import FastAPI, HTTPException
from fastapi.responses import StreamingResponse
from pydantic import BaseModel

app = FastAPI()

class ChatRequest(BaseModel):
    message: str
    session_id: str

@app.post("/api/chat")
async def chat(req: ChatRequest):
    if not validate_input(req.message):
        raise HTTPException(400, "Invalid input")

    if not limiter.is_allowed(req.session_id):
        raise HTTPException(429, "Rate limit exceeded")

    response = rag_chain.invoke(req.message)
    return {"response": response}

@app.post("/api/chat/stream")
async def chat_stream(req: ChatRequest):
    async def generate():
        stream = client.chat.completions.create(
            model="gpt-4o",
            messages=[{"role": "user", "content": req.message}],
            stream=True,
        )
        for chunk in stream:
            if chunk.choices[0].delta.content:
                yield f"data: {chunk.choices[0].delta.content}\n\n"
    return StreamingResponse(generate(), media_type="text/event-stream")

สรุป

AI และ LLM ได้เปลี่ยนวิธีที่เราสร้าง Software ไปอย่างสิ้นเชิง ในปี 2026 Developer ที่เข้าใจการใช้ AI API, สร้าง RAG System, และออกแบบ AI Application ที่ปลอดภัยและคุ้มค่า จะมีข้อได้เปรียบอย่างมากในตลาดแรงงาน

เทคโนโลยีหลักที่ควรเรียนรู้: OpenAI API สำหรับ Cloud LLM, Ollama สำหรับ Local LLM, LangChain สำหรับ Orchestration, RAG + Vector Database สำหรับ Knowledge-augmented AI และ Prompt Engineering สำหรับการควบคุมคุณภาพ Output

เริ่มต้นง่ายๆ ด้วยการสร้าง Chatbot ง่ายๆ ด้วย OpenAI API แล้วค่อยๆ เพิ่ม RAG, Agents และ Tools เข้าไป เมื่อเข้าใจพื้นฐานแล้ว คุณจะสามารถสร้าง AI Application ที่แก้ปัญหาจริงในธุรกิจได้อย่างมั่นใจ

อ.บอม กิตติทัศน์ เจริญพนาสิทธิ์

ผู้ก่อตั้ง SiamCafe.net (1997) · IT Expert 30+ ปี · XM VIP Partner

SiamCafe.net แหล่งความรู้ด้าน IT, Network, Security, Programming อันดับ 1 ของไทย ก่อตั้งตั้งแต่ปี 1997 บทความทุกชิ้นเขียนจากประสบการณ์จริงในวงการ IT ประเทศไทย —

✨ ติดตามบทความใหม่

เรียนรู้ IT, Network, Security, AI, Cloud จากประสบการณ์จริง 30 ปี