Doctor AI

Dr. Savath Saypadith

240 ບົດຄວາມ

ການຂຽນ Prompts ເພື່ອບັງຄັບໃຫ້ LLMs ສົ່ງຂໍ້ມູນກັບມາເປັນ JSON ທີ່ຖືກຕ້ອງ 100%

ໂພສເມື່ອ # Prompt Engineering # API Integration # OpenAI

ການຂຽນ Prompts ເພື່ອບັງຄັບໃຫ້ LLMs ສົ່ງຂໍ້ມູນກັບມາເປັນ JSON ທີ່ຖືກຕ້ອງ 100%

ໃນຖານະນັກພັດທະນາຊອບແວ (Developer) ໃນປະເທດລາວປັດຈຸບັນ, ການນຳເອົາ AI ມາສ້າງເປັນແອັບພລິເຄຊັນແມ່ນເປັນເລື່ອງທີ່ໜ້າຕື່ນເຕັ້ນ. ແຕ່ໜຶ່ງໃນບັນຫາທີ່ໜ້າປວດຫົວທີ່ສຸດຄືການເຊື່ອມຕໍ່ລະຫວ່າງ Text-based LLMs (ເຊັ່ນ ChatGPT, Claude) ກັບ Backend ຂອງພວກເຮົາ. ລອງນຶກພາບວ່າທ່ານກຳລັງສ້າງແອັບເພື່ອສະຫຼຸບລາຍງານສະພາບຈະລາຈອນໃນນະຄອນຫຼວງວຽງຈັນ ຫຼື ລະບົບຮັບອໍເດີສິນຄ້າ (ເຊັ່ນ: ການສັ່ງຕຳໝາກຫຸ່ງ, ປີ້ງໄກ່) ອັດຕະໂນມັດສຳລັບ SME ທ້ອງຖິ່ນ.

AI ອາດຈະເຂົ້າໃຈພາສາລາວໄດ້ດີ, ແຕ່ຖ້າມັນຕອບກັບມາເປັນປະໂຫຍກຍາວໆແທນທີ່ຈະເປັນໂຄງສ້າງຂໍ້ມູນ (Data Structure) ທີ່ນຳໄປໃຊ້ຕໍ່ໄດ້, ລະບົບຂອງທ່ານກໍຈະເກີດ Error ທັນທີເມື່ອພະຍາຍາມໃຊ້ json.loads(). ໃນບົດຄວາມນີ້, ເຮົາຈະມາເຈາະລິກເຖິງວິທີການຂັ້ນສູງ ໃນການບັງຄັບໃຫ້ LLMs ເຮັດວຽກເປັນ Data Parser ທີ່ຕອບກັບມາເປັນ JSON ທີ່ຄາດເດົາໄດ້ (Predictable) ແລະ ຖືກຕ້ອງ 100%.

ບັນຫາຂອງການປະມວນຜົນຂໍ້ມູນແບບ Unstructured ໄປຫາ Structured

LLMs ຖືກອອກແບບມາເພື່ອຄາດເດົາ Token ຕໍ່ໄປ ເຊິ່ງເຮັດໃຫ້ພວກມັນມີລັກສະນະ “ມັກລົມ” (Chatty). ຖ້າທ່ານສັ່ງພຽງແຕ່ວ່າ “Please output in JSON”, ຫຼາຍຄັ້ງມັນຈະຕອບກັບມາແບບມີຄຳນຳໜ້າເຊັ່ນ: “Here is your JSON: ```json { … } ``` Hope this helps!“.

ສຳລັບການທົດລອງຫຼິ້ນແມ່ນບໍ່ມີບັນຫາ, ແຕ່ສຳລັບ Production Level (ຕົວຢ່າງ: ແອັບຕິດຕາມລະດັບນ້ຳຂອງ ທີ່ຕ້ອງອັບເດດຂໍ້ມູນລົງ Database ທຸກຊົ່ວໂມງ), ການມີຕົວອັກສອນເກີນມາພຽງຕົວດຽວກໍສາມາດເຮັດໃຫ້ Pipeline ພັງໄດ້.

ເຕັກນິກຂັ້ນສູງໃນການຄວບຄຸມ JSON Outputs

ເພື່ອບັງຄັບໃຫ້ AI ສົ່ງຂໍ້ມູນຕາມທີ່ເຮົາຕ້ອງການ, ພວກເຮົາຕ້ອງໃຊ້ເຕັກນິກ Prompting ບວກກັບການຕັ້ງຄ່າ API ລະດັບສູງ.

1. ການກຳນົດ Schema ຢ່າງຊັດເຈນໃນ System Prompt

ຢ່າພຽງແຕ່ບອກໃຫ້ມັນສົ່ງ JSON, ແຕ່ໃຫ້ກຳນົດ “ໂຄງສ້າງ (Schema)” ແລະ “ປະເພດຂໍ້ມູນ (Data Types)” ແບບລະອຽດ, ພ້ອມທັງໃຊ້ເຕັກນິກ Few-Shot Prompting.

ຕົວຢ່າງ System Prompt ທີ່ດີ:

You are a highly capable data extraction JSON API. 
Your ONLY job is to extract ordering data into the exact JSON schema provided below.
Do NOT wrap the JSON in markdown blocks (```json). Do NOT add ANY conversational text.

Schema:
{
  "customer_name": "string (null if unknown)",
  "items": [
     {
       "food_name": "string",
       "quantity": "integer"
     }
  ],
  "delivery_zone": "string (Extract the district in Vientiane capital: e.g., Chanthabouly, Sikhottabong, Xaysetha)"
}

2. ການນໍາໃຊ້ API JSON Mode / Structured Outputs

ຖ້າທ່ານໃຊ້ OpenAI API (GPT-4o), ປັດຈຸບັນມີຟັງຊັນ Structured Outputs ທີ່ສາມາດບັງຄັບ Output ໃນລະດັບ Token Probability. ນີ້ໝາຍຄວາມວ່າ ໂມເດວຈະຖືກຈຳກັດທາງຄະນິດສາດ ໃຫ້ສ້າງສະເພາະ Token ທີ່ຖືກຕ້ອງຕາມ JSON Schema ທີ່ທ່ານສົ່ງໃຫ້ເທົ່ານັ້ນ.

3. ການບັງຄັບໂຄງສ້າງດ້ວຍ Pydantic ໃນ Python

ເພື່ອເຮັດໃຫ້ລະຫັດ (Code) ຂອງທ່ານສະອາດ ແລະ ປອດໄພ, ການຖ່າຍທອດ Schema ຜ່ານ Pydantic ແມ່ນວິທີທີ່ເປັນມາດຕະຖານທີ່ສຸດໃນວົງການ AI ປັດຈຸບັນ. Pydantic ຈະຊ່ວຍກວດສອບ (Validate) ຂໍ້ມູນທີ່ໄດ້ຮັບມາ ແລະ ທ່ານສາມາດສົ່ງ Pydantic Model ໃຫ້ກັບ OpenAI API ໄດ້ໂດຍກົງ.

ຕົວຢ່າງການຂຽນ Code: ການດຶງຂໍ້ມູນລະດັບນ້ຳຂອງ (Mekong River Data Parsing)

ລອງມາເບິ່ງຕົວຢ່າງການຂຽນ Code ໃນ Python ໂດຍໃຊ້ OpenAI API ເວີຊັນຫຼ້າສຸດ ເພື່ອແປງຂໍ້ຄວາມລາຍງານສະພາບນ້ຳຂອງທີ່ເປັນພາສາລາວທຳມະດາ ໃຫ້ກາຍເປັນ Data Object.

from pydantic import BaseModel, Field
from openai import OpenAI

# ກຽມ Client ສຳລັບ OpenAI
client = OpenAI(api_key="YOUR_API_KEY")

# 1. ສ້າງ Pydantic Model ເພື່ອກຳນົດໂຄງສ້າງ JSON ທີ່ຕ້ອງການ
class WaterLevelReport(BaseModel):
    station_name: str = Field(description="ຊື່ຂອງສະຖານີວັດແທກ ເຊັ່ນ: ຫຼວງພະບາງ, ປາກເຊ, ວຽງຈັນ")
    water_level_meters: float = Field(description="ລະດັບນ້ຳເປັນແມັດ, ຄວນເປັນຕົວເລກທົດສະນິຍົມ")
    status: str = Field(description="ສະຖານະຂອງນ້ຳ ຕ້ອງເປັນ: 'Normal', 'Warning', ຫຼື 'Danger'")
    date_mentioned: str = Field(description="ວັນທີທີ່ຖືກກ່າວເຖິງໃນຂໍ້ຄວາມ (Format: YYYY-MM-DD)")

# 2. ຂໍ້ຄວາມຕົ້ນສະບັບແບບ Unstructured (ຕົວຢ່າງຈາກຂ່າວ ຫຼື ແຈ້ງການ)
raw_lao_text = """
ລາຍງານດ່ວນປະຈຳມື້ນີ້ ວັນທີ 12 ມິຖຸນາ 2025: 
ສະຖານີວັດແທກລະດັບນ້ຳຂອງທີ່ແຂວງຫຼວງພະບາງ ແທກໄດ້ 15.2 ແມັດ, 
ເຊິ່ງປະຈຸບັນແມ່ນໄດ້ເຂົ້າສູ່ຂີດອັນຕະລາຍແລ້ວ ຂໍໃຫ້ປະຊາຊົນເຝົ້າລະວັງ.
"""

# 3. ໃຊ້ beta.chat.completions.parse ເພື່ອບັງຄັບ Structured Outputs
completion = client.beta.chat.completions.parse(
    model="gpt-4o-2024-08-06", # ຕ້ອງໃຊ້ Model ຮຸ່ນໃໝ່ທີ່ຮອງຮັບ Structured Outputs
    messages=[
        {
            "role": "system", 
            "content": "You are a data extraction assistant for the Mekong River Commission (MRC). Extract information directly to the provided schema."
        },
        {
            "role": "user", 
            "content": raw_lao_text
        }
    ],
    response_format=WaterLevelReport, # ຍັດ Pydantic Model ເຂົ້າໄປເລີຍ
)

# 4. ດຶງຂໍ້ມູນທີ່ເປັນ Object ອອກມາໃຊ້ງານ
report = completion.choices[0].message.parsed

# ຜົນໄດ້ຮັບທີ່ຄາດຫວັງ (Valid Data Object)
print(f"Station: {report.station_name}")
print(f"Water Level: {report.water_level_meters}m")
print(f"Status: {report.status}")
print(f"Date: {report.date_mentioned}")

ຜົນທີ່ໄດ້ຮັບຈະຖືກແປງເປັນ (JSON Representation):

{
  "station_name": "ຫຼວງພະບາງ",
  "water_level_meters": 15.2,
  "status": "Danger",
  "date_mentioned": "2025-06-12"
}

ການຈັດການກັບ Error (Error Handling & Self-Correction)

ເຖິງແມ່ນວ່າຈະໃຊ້ເຕັກນິກຂັ້ນສູງ, ໃນບາງກໍລະນີ (ໂດຍສະເພາະກັບໂມເດວຂະໜາດນ້ອຍ ຫຼື ພາສາທີ່ຊັບຊ້ອນຫຼາຍ) AI ອາດຈະທຳການຄາດເດົາຂໍ້ມູນຜິດພາດ (Hallucination) ເຊັ່ນ: ບໍ່ສາມາດປ່ຽນຊື່ເມືອງຈາກພາສາລາວເປັນພາສາອັງກິດໄດ້ຖືກຕ້ອງ.

ເພື່ອຮັບມືກັບເຫດການນີ້, ທ່ານຄວນ:

Key Takeaways (ສິ່ງທີ່ຄວນຈື່)

ສະຫຼຸບແລ້ວ, ການຫັນປ່ຽນຂໍ້ມູນຈາກຂໍ້ຄວາມທີ່ບໍ່ມີໂຄງສ້າງ (Unstructured text) ໃຫ້ກາຍເປັນ JSON ທີ່ຖືກຕ້ອງ 100% ແມ່ນກຸນແຈສຳຄັນທີ່ຈະຊ່ວຍໃຫ້ນັກພັດທະນາໃນລາວສາມາດເຊື່ອມຕໍ່ເຕັກໂນໂລຊີ AI ເຂົ້າກັບລະບົບ (Legacy Systems), Databases, ແລະ ແອັບພລິເຄຊັນສະມາດໂຟນຕ່າງໆ ໄດ້ຢ່າງໜັ້ນໃຈ ແລະ ຍືນຍົງ. ການໃຊ້ເວລາກັບການອອກແບບ Schema ທີ່ຊັດເຈນ ຈະຊ່ວຍລຸດຜ່ອນບັນຫາ Bug ໄດ້ຢ່າງມະຫາສານໃນອະນາຄົດ.