สวัสดีครับ! หลายคนที่เพิ่งเริ่มใช้ AI คงเจอปัญหาว่า ทำไม AI ตอบมามันยาว เยอะ และไม่ตรงที่เราต้องการเลย วันนี้ผมจะมาสอนเรื่อง Output Parsing ใน LangChain ซึ่งจะช่วยให้ AI ตอบเราได้ตรงจุด กระชับ และนำไปใช้ต่อได้เลย
Output Parsing คืออะไร?
ลองนึกภาพว่าคุณสั่งให้เด็กเสิร์ฟไปเอาข้าวมา แต่แทนที่เขาจะเอาจานข้าวมาวางหน้าคุณ เขากลับบรรยายว่า "ข้าวอยู่ในห้องครัว ต้องเดินผ่านประตู เลี้ยวซ้าย ผสมน้ำซุป..." คุณก็งงใช่ไหมครับ? Output Parsing ก็เหมือนกัน — มันคือการบอก AI ว่า "เอาข้อมูลที่ฉันต้องการมาวางในถาดให้เรียบร้อย" แทนที่จะให้มันเล่าเป็นเรื่องยาว
เริ่มต้นง่ายๆ ด้วย Pydantic Output Parser
วิธีที่นิยมใช้กันมากที่สุดคือ Pydantic ซึ่งเป็นเครื่องมือสำหรับกำหนดโครงสร้างข้อมูล ทำให้เราบอกได้ชัดเจนว่าต้องการอะไรบ้าง
ขั้นตอนที่ 1: ติดตั้งโปรแกรมที่จำเป็น
pip install langchain langchain-core langchain-community pydantic
💡 วิธีตรวจสอบ: เปิด Terminal (หรือ Command Prompt) แล้วพิมพ์คำสั่งนี้ ถ้าขึ้นเครื่องหมาย ✓ แสดงว่าติดตั้งสำเร็จ
ขั้นตอนที่ 2: กำหนดโครงสร้างข้อมูลที่ต้องการ
from pydantic import BaseModel, Field
from typing import Optional
class ข้อมูลสินค้า(BaseModel):
ชื่อสินค้า: str = Field(description="ชื่อของสินค้า")
ราคา: float = Field(description="ราคาสินค้าเป็นตัวเลข")
หมวดหมู่: str = Field(description="หมวดหมู่ของสินค้า")
มีสินค้าพร้อมส่ง: bool = Field(description="True ถ้ามีสินค้า, False ถ้าหมด")
คำอธิบายย่อ: Optional[str] = Field(default=None, description="คำอธิบายสั้นๆ ถ้ามี")
💡 เคล็ดลับ: สังเกตว่าผมใช้ชื่อเป็นภาษาไทยได้ และมี Field description เพื่อบอก AI ว่าแต่ละช่องหมายความว่าอะไร ทำให้ AI เข้าใจตรงกันมากขึ้น
ขั้นตอนที่ 3: นำไปใช้กับ LangChain
from langchain.output_parsers import PydanticOutputParser
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage
กำหนดโครงสร้างข้อมูล
parser = PydanticOutputParser(pydantic_object=ข้อมูลสินค้า)
สร้าง Prompt ที่มี instructions อัตโนมัติ
prompt = PromptTemplate(
template="คุณคือผู้ช่วยร้านค้าออนไลน์\n{format_instructions}\n\nรีวิวสินค้านี้และดึงข้อมูลออกมา:\n{รีวิว}",
input_variables=["รีวิว"],
partial_variables={"format_instructions": parser.get_format_instructions()}
)
เชื่อมต่อกับ AI (ใช้ HolySheep AI)
llm = ChatOpenAI(
api_key="YOUR_HOLYSHEEP_API_KEY",
base_url="https://api.holysheep.ai/v1",
model="gpt-4.1"
)
รีวิวสินค้าตัวอย่าง
รีวิวสินค้า = """
ซื้อเสื้อยืดผ้าคอตตอนสีดำมา ราคา 599 บาท
ดีไซน์เรียบง่าย สวมสบายมาก สั่งได้เลยตอนนี้
เป็นเสื้อในหมวดเสื้อยืดค่ะ ชอบมากเลย
"""
ส่งคำถามไปยัง AI
chain = prompt | llm
response = chain.invoke({"รีวิว": รีวิวสินค้า})
แปลงผลลัพธ์เป็นข้อมูลที่มีโครงสร้าง
ผลลัพธ์ = parser.parse(response.content)
print(ผลลัพธ์)
ผลลัพธ์ที่ได้จะเป็น:
ข้อมูลสินค้า(
ชื่อสินค้า='เสื้อยืดผ้าคอตตอนสีดำ',
ราคา=599.0,
หมวดหมู่='เสื้อยืด',
มีสินค้าพร้อมส่ง=True,
คำอธิบายย่อ='ดีไซน์เรียบง่าย สวมสบาย'
)
💡 จุดสังเกต: AI จะดึงข้อมูลออกมาเป็น object ที่เรากำหนดไว้ สามารถนำไปใช้ต่อได้เลย เช่น เก็บลงฐานข้อมูล หรือแสดงผลตามรูปแบบที่ต้องการ
ใช้กับ HolySheep AI ประหยัดและเร็วกว่า
หากคุณใช้ HolySheep AI ราคาจะถูกกว่ามาก เช่น GPT-4.1 อยู่ที่ $8 ต่อล้านตัวอักษร ซึ่งถูกกว่าบริการอื่นถึง 85% แถมมี เครดิตฟรีเมื่อลงทะเบียน และความเร็วในการตอบน้อยกว่า 50 มิลลิวินาที ทำให้การ parse ข้อมูลรวดเร็วมาก
Json Output Parser — กรณีต้องการ JSON
บางครั้งเราต้องการผลลัพธ์เป็น JSON เพื่อนำไปใช้กับระบบอื่นๆ LangChain มี Json Output Parser ที่ช่วยได้
from langchain.output_parsers import JsonOutputParser
from langchain_core.output_parsers import StrOutputParser
กำหนดโครงสร้าง JSON ที่ต้องการ
json_parser = JsonOutputParser()
สร้าง chain ที่ parse แล้วได้ dict
chain_with_parser = prompt | llm | json_parser
ผลลัพธ์_json = chain_with_parser.invoke({"รีวิว": รีวิวสินค้า})
print(ผลลัพธ์_json)
ผลลัพธ์: {'ชื่อสินค้า': 'เสื้อยืดผ้าคอตตอนสีดำ', 'ราคา': 599.0, ...}
CommaSeparatedListOutputParser — แปลงเป็นรายการ
หากต้องการให้ AI แยกข้อมูลออกเป็น list เช่น รายชื่อสินค้า หรือ tag ต่างๆ สามารถใช้ CommaSeparatedListOutputParser ได้เลย
from langchain.output_parsers import CommaSeparatedListOutputParser
list_parser = CommaSeparatedListOutputParser()
สร้าง Prompt สำหรับดึงรายการ
list_prompt = PromptTemplate(
template="ดึงคีย์เวิร์ด 5 ตัวจากข้อความนี้ แยกด้วยเครื่องหมายจุลภาค:\n{text}",
input_variables=["text"]
)
chain = list_prompt | llm | list_parser
ข้อความทดสอบ = "กำลังมองหาเสื้อผ้าสำหรับฤดูร้อน ชอบสีสดใส เน้นความสบาย"
รายการ = chain.invoke({"text": ข้อความทดสอบ})
print(รายการ)
ผลลัพธ์: ['เสื้อผ้า', 'ฤดูร้อน', 'สีสดใส', 'ความสบาย', 'แฟชั่น']
การปรับแต่ง Prompt ให้แม่นยำขึ้น
บางครั้ง AI อาจตอบผิด format หรือหลุดโครงสร้างที่กำหนด วิธีแก้คือเพิ่มคำสั่งใน system prompt ให้ชัดเจน
system_message = """
คุณคือ AI ที่ดึงข้อมูลสินค้าจากรีวิว
กฎสำคัญ:
1. ห้ามตอบเป็นประโยค ต้องตอบเป็น JSON เท่านั้น
2. ถ้าไม่มีข้อมูลใด ให้ใส่ null
3. ราคาต้องเป็นตัวเลขเท่านั้น ไม่มีสกุลเงิน
4. ถ้าไม่แน่ใจ ให้เดาแบบสมเหตุสมผล
ตัวอย่างผลลัพธ์ที่ถูกต้อง:
{"ชื่อสินค้า": "...", "ราคา": 0, "หมวดหมู่": "..."}
"""
ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข
1. ข้อผิดพลาด: OutputParserException - Could not parse LLM output
# ❌ ผิด: AI ตอบเป็นข้อความธรรมดาแทนที่จะเป็น JSON
ผลลัพธ์ที่ได้: "สินค้านี้ชื่อเสื้อยืด ราคา 500 บาท..."
✅ ถูก: เพิ่ม retry เมื่อ parse ล้มเหลว
from langchain.output_parsers import RetryOutputParser, OutputFixingParser
retry_parser = RetryOutputParser.from_llm(
parser=json_parser,
llm=llm
)
ใช้ OutputFixingParser ช่วยแก้ไขผลลัพธ์ที่ผิด format
fixing_parser = OutputFixingParser.from_llm(
parser=json_parser,
llm=llm
)
แทนที่จะ parse โดยตรง ให้ผ่าน fixing_parser ก่อน
ผลลัพธ์ = fixing_parser.parse(response.content)
2. ข้อผิดพลาด: ValidationError - field required
# ❌ ผิด: กำหนด field เป็น required แต่ AI ไม่ส่งมา
class ข้อมูล(BaseModel):
ชื่อ: str # จะ error ถ้าไม่มีชื่อ
✅ ถูก: กำหนดให้ optional หรือมี default
class ข้อมูล(BaseModel):
ชื่อ: Optional[str] = None # ถ้าไม่มีจะเป็น None
ที่อยู่: str = "ไม่ระบุ" # ถ้าไม่มีจะเป็น "ไม่ระบุ"
หรือใช้ Field กำหนดค่าเริ่มต้น
from pydantic import Field
class ข้อมูล(BaseModel):
รายละเอียด: Optional[str] = Field(default=None)
3. ข้อผิดพลาด: ผลลัพธ์เป็นภาษาผสม หรือ format ผิด
# ❌ ผิด: Prompt ไม่ชัดเจน
prompt = PromptTemplate(
template="ดึงข้อมูล: {input}",
input_variables=["input"]
)
✅ ถูก: เพิ่ม format instructions และตัวอย่าง
prompt = PromptTemplate(
template="""คุณคือ AI สำหรับดึงข้อมูล
{format_instructions}
ตัวอย่าง:
Input: "ซื้อกาแฟ Starbucks ราคา 150 บาท"
Output: {{"ชื่อสินค้า": "กาแฟ Starbucks", "ราคา": 150}}
ดึงข้อมูลจาก: {input}
ภาษาของ output ต้องเป็นภาษาเดียวกับ input""",
input_variables=["input"],
partial_variables={"format_instructions": parser.get_format_instructions()}
)
4. ข้อผิดพลาด: AttributeError - 'str' object has no attribute 'content'
# ❌ ผิด: ใช้ OutputParser กับ string โดยตรง
ผลลัพธ์ = parser.parse("ข้อความที่ AI ตอบมา")
✅ ถูก: ต้องผ่าน chain หรือ invoke ให้ได้ AIMessage
chain = prompt | llm
response = chain.invoke({"input": "ข้อมูลทดสอบ"})
ผลลัพธ์ = parser.parse(response)
หรือถ้าได้ string มา ให้สร้างเป็น AIMessage
from langchain_core.messages import AIMessage
response = AIMessage(content="ข้อความที่ AI ตอบ")
ผลลัพธ์ = parser.parse(response)
สรุป
การใช้ Output Parsing ใน LangChain ช่วยให้เราควบคุมผลลัพธ์จาก AI ได้แม่นยำขึ้น ไม่ว่าจะเป็น:
- PydanticOutputParser — เหมาะกับข้อมูลที่มีโครงสร้างชัดเจน
- JsonOutputParser — เหมาะกับการนำไปใช้กับระบบอื่น
- CommaSeparatedListOutputParser — เหมาะกับการดึงรายการ
สิ่งสำคัญคือต้องกำหนด Field description ให้ชัดเจน เพิ่ม ตัวอย่าง ใน prompt และเตรียม retry logic ไว้เผื่อ AI ตอบผิด format ครับ
👉 สมัคร HolySheep AI — รับเครดิตฟรีเมื่อลงทะเบียน