Models
ใช้ ChatOpenAI หรือ ChatGoogleGenerativeAI เป็นหลัก
LangChain ประกอบด้วย components หลักที่ทำงานร่วมกัน:
graph TD
Core["LangChain Core"]
Core --> Models["Models<br/>(LLM/Chat)"]
Core --> Prompts["Prompts<br/>(Templates)"]
Core --> Parsers["Output<br/>Parsers"]
Core --> Runnable["Runnable<br/>(LCEL)"]
LangChain รองรับ 2 ประเภทหลัก:
LLMs รับ string เข้าและส่ง string ออก:
from langchain_openai import OpenAI
# Text completion modelllm = OpenAI(model="gpt-3.5-turbo-instruct")result = llm.invoke("กรุงเทพมหานครเป็นเมืองหลวงของ")print(result)# ประเทศไทย ตั้งอยู่ริมแม่น้ำเจ้าพระยา...Chat Models รับ messages เข้าและส่ง message ออก — เป็นแนวทางที่ใช้งานทั่วไป:
from langchain_openai import ChatOpenAIfrom langchain_core.messages import HumanMessage, SystemMessage
# สร้าง Chat Modelchat = ChatOpenAI( model="gpt-4o-mini", temperature=0.7, # ความสร้างสรรค์ (0=เป๊ะ, 1=สร้างสรรค์) max_tokens=1000, # จำนวนคำสูงสุดในคำตอบ)
# ส่ง messagesmessages = [ SystemMessage(content="คุณเป็นผู้เชี่ยวชาญด้าน Python"), HumanMessage(content="อธิบาย List Comprehension ให้หน่อย")]
response = chat.invoke(messages)print(response.content)| Provider | Model | ราคา | จุดเด่น |
|---|---|---|---|
| OpenAI | gpt-4o-mini | ถูก | เร็ว, อเนกประสงค์ |
| OpenAI | gpt-4o | ปานกลาง | ฉลาดมาก, multimodal |
| gemini-2.0-flash | ฟรี-ถูก | เร็ว, context ยาว | |
| Anthropic | claude-3.5-sonnet | ปานกลาง | เก่งเรื่องโค้ด |
| Meta | llama-3.1 | ฟรี (self-host) | Open source |
ระบบ Messages เป็นหัวใจของ Chat Models:
from langchain_core.messages import ( SystemMessage, # กำหนดบทบาท/บุคลิก AI HumanMessage, # ข้อความจากผู้ใช้ AIMessage, # คำตอบจาก AI ToolMessage, # ผลลัพธ์จาก Tool)คำอธิบาย: โค้ดตัวอย่างด้านล่างแสดงวิธีใช้งานด้วย Python ตามหัวข้อนี้แบบทีละขั้นตอน
messages = [ # 1. SystemMessage - กำหนดบทบาท SystemMessage(content=""" คุณเป็นผู้เชี่ยวชาญการทำอาหารไทย ตอบเป็นภาษาไทย ให้สูตรละเอียด """),
# 2. HumanMessage - คำถามจากผู้ใช้ HumanMessage(content="สูตรผัดไทยทำยังไง?"),
# 3. AIMessage - คำตอบก่อนหน้า (สำหรับ context) AIMessage(content="ผัดไทยต้องใช้เส้นจันท์..."),
# 4. HumanMessage - คำถามต่อเนื่อง HumanMessage(content="ถ้าไม่มีเส้นจันท์ ใช้อะไรแทนได้?"),]
response = chat.invoke(messages)Prompt Templates ช่วยสร้าง prompts แบบ dynamic:
คำอธิบาย: โค้ดตัวอย่างด้านล่างแสดงวิธีใช้งานด้วย Python ตามหัวข้อนี้แบบทีละขั้นตอน
from langchain_core.prompts import ChatPromptTemplate
# สร้าง templateprompt = ChatPromptTemplate.from_messages([ ("system", "คุณเป็นผู้เชี่ยวชาญด้าน {topic}"), ("human", "{question}"),])
# ใช้งาน templatemessages = prompt.invoke({ "topic": "Machine Learning", "question": "Neural Network คืออะไร?"})
# ส่งไปยัง LLMresponse = chat.invoke(messages)print(response.content)คำอธิบาย: โค้ดตัวอย่างด้านล่างแสดงวิธีใช้งานด้วย Python ตามหัวข้อนี้แบบทีละขั้นตอน
from langchain_core.prompts import PromptTemplate
# สร้าง templatetemplate = PromptTemplate.from_template("""แปลข้อความต่อไปนี้จาก {source_lang} เป็น {target_lang}:
ข้อความ: {text}
คำแปล:""")
# ใช้งานresult = template.invoke({ "source_lang": "อังกฤษ", "target_lang": "ไทย", "text": "Hello, how are you?"})
print(result.text)Output Parsers ช่วยแปลงคำตอบจาก LLM ให้เป็นรูปแบบที่ต้องการ:
คำอธิบาย: โค้ดตัวอย่างด้านล่างแสดงวิธีใช้งานด้วย Python ตามหัวข้อนี้แบบทีละขั้นตอน
from langchain_core.output_parsers import StrOutputParser
# แปลง AIMessage เป็น stringparser = StrOutputParser()
# ใช้กับ chain (จะเรียนเพิ่มในบทที่ 5)chain = prompt | chat | parserresult = chain.invoke({"topic": "Python", "question": "Lambda คืออะไร?"})print(result) # ได้ string โดยตรงคำอธิบาย: โค้ดตัวอย่างด้านล่างแสดงวิธีใช้งานด้วย Python ตามหัวข้อนี้แบบทีละขั้นตอน
from langchain_core.output_parsers import JsonOutputParserfrom pydantic import BaseModel, Field
# กำหนดโครงสร้างข้อมูลที่ต้องการclass Recipe(BaseModel): name: str = Field(description="ชื่อเมนู") ingredients: list[str] = Field(description="วัตถุดิบ") cooking_time: int = Field(description="เวลาทำ (นาที)")
# สร้าง parserparser = JsonOutputParser(pydantic_object=Recipe)
# สร้าง prompt ที่บอก formatprompt = ChatPromptTemplate.from_messages([ ("system", "คุณเป็นเชฟอาหารไทย ตอบในรูปแบบ JSON\n{format_instructions}"), ("human", "สูตร {dish}"),])
# ดึง format instructionsprompt_with_format = prompt.partial( format_instructions=parser.get_format_instructions())
chain = prompt_with_format | chat | parserresult = chain.invoke({"dish": "ต้มยำกุ้ง"})print(result)# {'name': 'ต้มยำกุ้ง', 'ingredients': [...], 'cooking_time': 30}วิธีที่ง่ายและน่าเชื่อถือที่สุดในการได้ structured data:
from pydantic import BaseModel, Fieldfrom langchain_openai import ChatOpenAI
class MovieReview(BaseModel): """รีวิวภาพยนตร์""" title: str = Field(description="ชื่อภาพยนตร์") rating: float = Field(description="คะแนน 1-10") summary: str = Field(description="สรุปสั้นๆ") recommend: bool = Field(description="แนะนำหรือไม่")
# ใช้ with_structured_outputllm = ChatOpenAI(model="gpt-4o-mini")structured_llm = llm.with_structured_output(MovieReview)
result = structured_llm.invoke("รีวิวหนัง Inception ให้หน่อย")print(f"ชื่อ: {result.title}")print(f"คะแนน: {result.rating}/10")print(f"สรุป: {result.summary}")print(f"แนะนำ: {'✅' if result.recommend else '❌'}")LangChain รองรับ 3 วิธีการเรียกใช้:
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o-mini")
# 1. invoke - เรียกครั้งเดียว รอผลลัพธ์ทั้งหมดresult = llm.invoke("สวัสดี")print(result.content)
# 2. stream - รับผลลัพธ์ทีละส่วน (real-time)for chunk in llm.stream("เล่านิทานสั้นๆ ให้หน่อย"): print(chunk.content, end="", flush=True)
# 3. batch - ส่งหลายคำถามพร้อมกันresults = llm.batch([ "เมืองหลวงของไทย", "เมืองหลวงของญี่ปุ่น", "เมืองหลวงของฝรั่งเศส",])for r in results: print(r.content)คำอธิบาย: โค้ดตัวอย่างด้านล่างแสดงวิธีใช้งานด้วย Python ตามหัวข้อนี้แบบทีละขั้นตอน
import asyncio
async def main(): llm = ChatOpenAI(model="gpt-4o-mini")
# ainvoke result = await llm.ainvoke("สวัสดี") print(result.content)
# astream async for chunk in llm.astream("เล่านิทาน"): print(chunk.content, end="")
# abatch results = await llm.abatch(["คำถาม 1", "คำถาม 2"])
asyncio.run(main())Models
ใช้ ChatOpenAI หรือ ChatGoogleGenerativeAI เป็นหลัก
Messages
System, Human, AI Messages สร้างบทสนทนา
Prompts
ChatPromptTemplate สำหรับ dynamic prompts
Output
StrOutputParser, JsonOutputParser, หรือ with_structured_output