- การสร้าง AI Agent ด้วย LangChain
- 3. เตรียม Project
- 4. ติดตั้ง LangChain
- 5. กำหนด API Key
- 6. สร้าง Agent ตัวแรก
- 7. Agent เลือก Tool ได้อย่างไร
- 8. ใช้ ChatOpenAI โดยตรง
- 9. Streaming
- 10. เชื่อมต่อ REST API เป็น Tool
- 11. เชื่อม Database เป็น Tool
- 12. Agent + RAG
- 13. Conversation และ Memory
- 14. Structured Output
- 15. Observability ด้วย LangSmith
- 16. Project Structure ที่แนะนำ
- 17. Tool กับ Business Logic ควรแยกกัน
- 18. การทดสอบ Agent
- 19. Security ที่ต้องระวัง
- 20. Agent เหมาะกับงานแบบไหน
- 21. Agent ไม่เหมาะกับทุกงาน
- 22. LangChain Agent Architecture
- 23. Development Roadmap
- 24. สรุป
#การสร้าง AI Agent ด้วย LangChain
LangChain เป็น Framework สำหรับพัฒนาแอปพลิเคชันที่ใช้ Large Language Model (LLM) โดยมี abstraction สำหรับ Model, Prompt, Tool, Memory, Retrieval และ Agent
ใน LangChain รุ่นปัจจุบัน การสร้าง Agent สามารถเริ่มต้นได้ด้วย create_agent() ซึ่งช่วยให้ LLM สามารถตัดสินใจเลือกใช้ Tool ตามงานที่ผู้ใช้ร้องขอ แล้วนำผลจาก Tool กลับมาวิเคราะห์ต่อจนได้คำตอบสุดท้าย
บทความนี้ใช้แนวทาง LangChain API รุ่นใหม่ (
langchain 1.x) และเน้นcreate_agent()แทน Agent API รุ่นเก่า
#1. AI Agent คืออะไร
LLM ปกติทำงานคล้ายฟังก์ชัน
Prompt
↓
LLM
↓
Answer
แต่ Agent จะสามารถเลือกใช้เครื่องมือเพิ่มเติมระหว่างการทำงานได้
User
↓
Agent / LLM
↓
Reason about the task
↓
Select Tool
↓
Execute Tool
↓
Observe Result
↓
Continue or select another Tool
↓
Final Answer
Agent จึงเหมาะกับงานที่ต้องมีการตัดสินใจหลายขั้นตอน เช่น
- ค้นหาข้อมูล
- เรียก REST API
- Query Database
- คำนวณ
- อ่านเอกสาร
- ใช้ RAG
- เรียก Service ภายในองค์กร
- ทำ Workflow หลายขั้นตอน
- ประสานงานระหว่าง Agent หลายตัว
#2. องค์ประกอบหลักของ LangChain Agent
Agent โดยทั่วไปประกอบด้วย 4 ส่วนสำคัญ
#2.1 Model
Model เป็น reasoning engine ของ Agent เช่น
- OpenAI
- Google Gemini
- Anthropic Claude
- AWS Bedrock
- Ollama
- OpenRouter
- Hugging Face
ตัวอย่างการกำหนด Model
model="openai:gpt-5.4-mini"
#2.2 Tools
Tool คือฟังก์ชันที่ Agent สามารถเลือกเรียกใช้งานได้
ตัวอย่างเช่น
@tool
def get_product_price(product_name: str) -> str:
"""Get product price."""
...
LLM จะอ่านชื่อ Tool, parameter และ docstring เพื่อเข้าใจว่า Tool ใช้ทำอะไร
#2.3 System Prompt
System Prompt ใช้กำหนดบทบาท กติกา และพฤติกรรมของ Agent
system_prompt="""
คุณคือ AI Shopping Assistant
เลือกใช้เครื่องมือเมื่อจำเป็น
ตอบเป็นภาษาไทย
"""
#2.4 Agent Runtime
create_agent() สร้าง runtime แบบ graph-based โดยใช้ LangGraph อยู่เบื้องหลัง
Agent จะวนลูประหว่าง
Model
↓
Tool Call
↓
Tool Result
↓
Model
จนกระทั่ง Model สร้างคำตอบสุดท้ายหรือถึงเงื่อนไขหยุด
#3. เตรียม Project
ต้องใช้ Python 3.10 หรือใหม่กว่า
สร้าง Project
mkdir langchain-agent-demo
cd langchain-agent-demo
สร้าง Virtual Environment
python -m venv .venv
เปิดใช้งานบน macOS / Linux
source .venv/bin/activate
บน Windows
.venv\Scripts\activate
#4. ติดตั้ง LangChain
ติดตั้งด้วย pip
pip install -U langchain langchain-openai python-dotenv
หรือถ้าใช้ uv
uv init
uv add langchain langchain-openai python-dotenv
#5. กำหนด API Key
สร้างไฟล์ .env
OPENAI_API_KEY=your_openai_api_key
และควรเพิ่ม .env ลงใน .gitignore
.env
.venv/
__pycache__/
ห้าม commit API Key ขึ้น Git repository
#6. สร้าง Agent ตัวแรก
สร้างไฟล์
app.py
ตัวอย่างนี้จะสร้าง Shopping Agent ที่มี 3 Tools
- ค้นหาราคาสินค้า
- คำนวณค่าจัดส่ง
- คำนวณยอดรวม
import os
from dotenv import load_dotenv
from langchain.agents import create_agent
from langchain.tools import tool
load_dotenv()
PRODUCTS = {
"mechanical keyboard": 1890,
"wireless mouse": 990,
"usb-c hub": 1290,
}
@tool
def get_product_price(product_name: str) -> str:
"""ค้นหาราคาสินค้าจากชื่อสินค้า"""
name = product_name.lower().strip()
price = PRODUCTS.get(name)
if price is None:
return f"ไม่พบสินค้า: {product_name}"
return f"{product_name} ราคา {price} บาทต่อชิ้น"
@tool
def get_shipping_cost(province: str) -> float:
"""คำนวณค่าจัดส่งตามจังหวัด"""
free_shipping = {
"กรุงเทพมหานคร",
"กรุงเทพ",
"นครปฐม",
"นนทบุรี",
}
if province.strip() in free_shipping:
return 0
return 80
@tool
def calculate_total(
price: float,
quantity: int,
shipping: float,
) -> float:
"""คำนวณยอดรวมจากราคาต่อชิ้น จำนวนสินค้า และค่าจัดส่ง"""
return (price * quantity) + shipping
agent = create_agent(
model="openai:gpt-5.4-mini",
tools=[
get_product_price,
get_shipping_cost,
calculate_total,
],
system_prompt="""
คุณคือ AI Shopping Assistant
หน้าที่:
- ช่วยลูกค้าค้นหาราคาสินค้า
- คำนวณค่าจัดส่ง
- คำนวณยอดรวม
กติกา:
- ใช้ Tool เมื่อจำเป็น
- ห้ามเดาราคาเอง
- ถ้าพบข้อมูลไม่เพียงพอให้แจ้งผู้ใช้
- ตอบเป็นภาษาไทย
- สรุปวิธีคำนวณให้เข้าใจง่าย
""",
)
result = agent.invoke(
{
"messages": [
{
"role": "user",
"content": (
"ต้องการซื้อ Mechanical Keyboard จำนวน 2 ตัว "
"ส่งไปนครปฐม ต้องจ่ายทั้งหมดเท่าไร"
),
}
]
}
)
print(result["messages"][-1].content)
รัน
python app.py
Agent จะตัดสินใจประมาณนี้
User Request
↓
get_product_price()
↓
get_shipping_cost()
↓
calculate_total()
↓
Final Answer
ตัวอย่างผลลัพธ์
Mechanical Keyboard ราคา 1,890 บาทต่อชิ้น
จำนวน 2 ตัว:
1,890 × 2 = 3,780 บาท
จัดส่งไปนครปฐม:
ค่าจัดส่ง = 0 บาท
ยอดรวมทั้งหมด = 3,780 บาท
#7. Agent เลือก Tool ได้อย่างไร
สิ่งสำคัญมากของ Tool คือ
- ชื่อฟังก์ชัน
- Parameter
- Type hint
- Docstring
ตัวอย่าง
@tool
def get_weather(city: str) -> str:
"""ค้นหาสภาพอากาศปัจจุบันของเมืองที่กำหนด"""
LLM จะใช้ metadata เหล่านี้ในการตัดสินใจว่า Tool เหมาะกับคำถามหรือไม่
ดังนั้นควรเขียน Tool ให้มีหน้าที่ชัดเจน
ไม่ควรเขียน
@tool
def do_something(data: str):
"""Do something."""
ควรเขียน
@tool
def search_customer_by_email(email: str) -> str:
"""ค้นหาข้อมูลลูกค้าจาก email address"""
#8. ใช้ ChatOpenAI โดยตรง
นอกจากกำหนด Model เป็น String แล้ว เรายังสามารถสร้าง Model object เพื่อควบคุม configuration ได้ละเอียดขึ้น
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
model="gpt-5.4-mini",
temperature=0,
timeout=30,
max_retries=2,
)
agent = create_agent(
model=model,
tools=[
get_product_price,
get_shipping_cost,
calculate_total,
],
)
วิธีนี้เหมาะเมื่อจำเป็นต้องกำหนด
- temperature
- timeout
- max retries
- API endpoint
- provider-specific options
#9. Streaming
หากต้องการดูผลระหว่าง Agent ทำงาน สามารถใช้ stream()
query = {
"messages": [
{
"role": "user",
"content": (
"ซื้อ Wireless Mouse 3 ตัว "
"ส่งเชียงใหม่ ต้องจ่ายเท่าไร"
),
}
]
}
for step in agent.stream(
query,
stream_mode="values",
):
message = step["messages"][-1]
message.pretty_print()
Streaming มีประโยชน์มากสำหรับ
- Chat UI
- Debug Agent
- ตรวจสอบ Tool Calling
- ดู intermediate steps
- แสดง progress ให้ผู้ใช้
#10. เชื่อมต่อ REST API เป็น Tool
ในระบบจริง Tool มักไม่ได้ใช้ข้อมูล hard-code แต่เรียก API
import requests
from langchain.tools import tool
@tool
def get_exchange_rate(currency: str) -> str:
"""ดึงอัตราแลกเปลี่ยนของสกุลเงิน"""
response = requests.get(
"https://api.example.com/exchange-rate",
params={"currency": currency},
timeout=10,
)
response.raise_for_status()
return response.text
Agent สามารถใช้ API นี้เหมือน Tool ปกติ
#11. เชื่อม Database เป็น Tool
ตัวอย่างแนวคิด
@tool
def find_student(student_id: str) -> str:
"""ค้นหาข้อมูลนักศึกษาจากรหัสนักศึกษา"""
student = database.find_by_id(student_id)
if student is None:
return "ไม่พบข้อมูลนักศึกษา"
return student.to_json()
Agent จึงสามารถทำงานลักษณะ
User
↓
Agent
↓
Database Tool
↓
Result
↓
Agent
↓
Natural-language Answer
#12. Agent + RAG
RAG Retriever สามารถนำมาห่อเป็น Tool ได้
User
↓
Agent
├── Database Tool
├── REST API Tool
└── RAG Search Tool
↓
Vector Database
ตัวอย่าง conceptual code
@tool
def search_documents(query: str) -> str:
"""ค้นหาข้อมูลจาก Knowledge Base"""
docs = retriever.invoke(query)
return "\n\n".join(
doc.page_content
for doc in docs
)
ทำให้ Agent เลือกเองได้ว่า
- คำถามนี้ตอบจาก Model
- คำถามนี้ต้องค้น Database
- คำถามนี้ต้องค้น Knowledge Base
- คำถามนี้ต้องใช้หลาย Tool ร่วมกัน
#13. Conversation และ Memory
Agent เก็บประวัติข้อความใน message state ระหว่างการทำงาน
สำหรับระบบที่ต้องการสนทนาหลายรอบ สามารถเพิ่ม persistence/checkpointer เพื่อเก็บ state ของแต่ละ conversation ได้
แนวคิด
User
↓
Thread / Conversation ID
↓
Agent State
↓
Messages + Tool Results
↓
Persistent Checkpointer
เหมาะกับ
- Customer Support Agent
- Personal Assistant
- Tutor
- Research Assistant
- Coding Agent
#14. Structured Output
ในระบบ Production บางครั้งไม่ควรให้ Agent ตอบเป็นข้อความอิสระ แต่ควรกำหนด schema
ตัวอย่าง
from pydantic import BaseModel
class OrderSummary(BaseModel):
product: str
quantity: int
subtotal: float
shipping: float
total: float
จากนั้นกำหนด response_format ให้ Agent เพื่อให้ผลลัพธ์อยู่ในรูปแบบที่โปรแกรมนำไปใช้งานต่อได้ง่าย
Structured Output เหมาะกับ
- API response
- Workflow automation
- Data extraction
- Database insertion
- Integration กับ Frontend
#15. Observability ด้วย LangSmith
Agent มีหลายขั้นตอนกว่าการเรียก LLM ปกติ
ดังนั้นควรมี tracing เพื่อดูว่า
Prompt
↓
Model
↓
Tool Call
↓
Tool Result
↓
Model
↓
Final Output
สามารถเปิด LangSmith tracing ผ่าน environment variables
LANGSMITH_TRACING=true
LANGSMITH_API_KEY=your_langsmith_api_key
Tracing ช่วยตรวจสอบ
- Agent เลือก Tool อะไร
- Parameter ที่ส่งให้ Tool
- Tool ใช้เวลานานเท่าไร
- Model ใช้ Token เท่าไร
- จุดที่ Error
- Agent วนลูปผิดปกติหรือไม่
#16. Project Structure ที่แนะนำ
เมื่อ Project มีขนาดใหญ่ ไม่ควรวางทุกอย่างใน app.py
ตัวอย่าง
langchain-agent/
│
├── app.py
├── agent.py
├── models.py
│
├── tools/
│ ├── __init__.py
│ ├── product.py
│ ├── shipping.py
│ └── calculator.py
│
├── services/
│ ├── product_service.py
│ └── shipping_service.py
│
├── schemas/
│ └── order.py
│
├── tests/
│ ├── test_tools.py
│ └── test_agent.py
│
├── .env
├── .gitignore
└── pyproject.toml
หลักการคือแยก
Agent
Tools
Business Logic
External Services
Schemas
Tests
ออกจากกัน
#17. Tool กับ Business Logic ควรแยกกัน
ไม่ควรเขียน Business Logic จำนวนมากไว้ใน Tool
ไม่แนะนำ
@tool
def create_order(...):
# validate
# query database
# calculate
# call payment
# call shipping
# save database
# send email
ควรให้ Tool เรียก Service Layer
@tool
def create_order(product_id: int, quantity: int) -> str:
"""สร้างคำสั่งซื้อ"""
return order_service.create_order(
product_id=product_id,
quantity=quantity,
)
ข้อดีคือ
- Test ง่าย
- เปลี่ยน Agent framework ได้
- Business logic ไม่ผูกกับ LangChain
- ลดความซับซ้อน
- Reuse code ได้
#18. การทดสอบ Agent
ควรแยก Test เป็นหลายระดับ
#Unit Test Tool
def test_shipping_nakhon_pathom():
result = get_shipping_cost.invoke(
{"province": "นครปฐม"}
)
assert result == 0
#Integration Test
ทดสอบว่า Agent เลือก Tool ถูกหรือไม่
Question
↓
Expected Tool
↓
Expected Parameters
#End-to-End Test
ตรวจสอบตั้งแต่ User Request จนถึง Final Answer
User
↓
Agent
↓
Tools
↓
External System
↓
Answer
#19. Security ที่ต้องระวัง
Agent สามารถเรียก Tool และกระทำกับระบบจริงได้ ดังนั้นต้องระมัดระวังมากกว่า Chatbot ปกติ
ควรมีมาตรการอย่างน้อยดังนี้
#จำกัดสิทธิ์ของ Tool
Agent ไม่ควรเข้าถึง Database ด้วย account ที่มีสิทธิ์เกินความจำเป็น
#Validate Input
if quantity <= 0:
raise ValueError("quantity must be greater than zero")
#Confirmation ก่อนทำ Action สำคัญ
เช่น
- โอนเงิน
- ลบข้อมูล
- ส่ง Email
- Deploy Production
- ปิด Server
ควรให้ Human ยืนยันก่อน
#ห้ามส่ง Secret เข้า Prompt
เช่น
API Key
Database Password
Private Key
Access Token
ควรเก็บใน Secret Manager หรือ Environment Variable
#20. Agent เหมาะกับงานแบบไหน
Agent เหมาะเมื่อระบบต้อง
- ตัดสินใจว่าจะใช้ Tool ใด
- ใช้หลาย Tool ต่อเนื่องกัน
- วางแผนหลายขั้นตอน
- ทำงานกับข้อมูลหลายแหล่ง
- ปรับเส้นทางการทำงานตามสถานการณ์
ตัวอย่าง
Research Agent
Customer Support Agent
Coding Agent
DevOps Agent
Data Analysis Agent
Database Agent
RAG Agent
Travel Agent
Teaching Assistant
#21. Agent ไม่เหมาะกับทุกงาน
ถ้า Workflow ตายตัว เช่น
Upload File
↓
Validate
↓
Convert
↓
Save
การเขียน workflow ปกติอาจเหมาะกว่า Agent
หลักคิดที่ดีคือ
Deterministic workflow
→ ใช้ Code / Workflow
Dynamic decision making
→ ใช้ Agent
ไม่ควรใช้ LLM ตัดสินใจในจุดที่โปรแกรมปกติสามารถตัดสินใจได้อย่างแน่นอนกว่า
#22. LangChain Agent Architecture
ภาพรวมระบบ Production อาจมีลักษณะดังนี้
flowchart LR
U[User] --> API[API / Chat UI]
API --> A[LangChain Agent]
A --> LLM[LLM]
A --> T1[Database Tool]
A --> T2[REST API Tool]
A --> T3[RAG Tool]
A --> T4[Calculator Tool]
T1 --> DB[(Database)]
T2 --> EXT[External API]
T3 --> VDB[(Vector DB)]
A --> OBS[LangSmith / Observability]
A --> API
API --> U
#23. Development Roadmap
สำหรับผู้เริ่มต้น แนะนำเรียนตามลำดับ
1. Chat Model
↓
2. Prompt
↓
3. Tool Calling
↓
4. create_agent()
↓
5. Streaming
↓
6. Memory / Persistence
↓
7. RAG
↓
8. Structured Output
↓
9. LangSmith
↓
10. Middleware
↓
11. Multi-Agent
#24. สรุป
หัวใจของการสร้าง Agent ด้วย LangChain คือการรวม
LLM
+
Tools
+
Instructions
+
Agent Runtime
เข้าด้วยกัน
ใน LangChain รุ่นใหม่สามารถเริ่มต้นได้ง่ายด้วย
from langchain.agents import create_agent
agent = create_agent(
model="openai:gpt-5.4-mini",
tools=tools,
system_prompt="You are a helpful assistant.",
)
จากนั้นเรียก
agent.invoke(...)
Agent จะเป็นผู้ตัดสินใจเองว่า
ต้องใช้ Tool หรือไม่
↓
ใช้ Tool ตัวไหน
↓
ใช้ Tool กี่ครั้ง
↓
นำผลลัพธ์มาประกอบคำตอบอย่างไร
จุดสำคัญสำหรับระบบจริงคือ อย่าให้ Agent รับผิดชอบ Business Logic ทั้งหมด แต่ควรใช้ Agent เป็นชั้นสำหรับ reasoning และ orchestration ส่วนกฎธุรกิจที่แน่นอนควรอยู่ใน Service หรือ Application Logic ที่สามารถทดสอบและควบคุมได้
#References
- LangChain Agents: https://docs.langchain.com/oss/python/langchain/agents
- LangChain Tools: https://docs.langchain.com/oss/python/langchain/tools
- LangChain Quickstart: https://docs.langchain.com/oss/python/langchain/quickstart
- ChatOpenAI Integration: https://docs.langchain.com/oss/python/integrations/chat/openai
- LangChain PyPI: https://pypi.org/project/langchain/