AI Prompt Engineering · บทเรียน

กลยุทธ์การบันทึกข้อมูลและจัดทำเอกสาร

บันทึกเวอร์ชันของพรอมต์ ข้อมูลนำเข้า และข้อมูลส่งออก เพื่อให้แก้ไขข้อบกพร่องซ้ำได้

บทเรียน 4 จาก 413 ขั้นตอน

กลยุทธ์การบันทึกข้อมูลและจัดทำเอกสาร เป็นบทเรียน AI Prompt Engineering ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Prompt Engineering และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Prompt Engineering มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดการบันทึกพรอมต์จึงสำคัญ

หากไม่มีการบันทึกข้อมูล ความล้มเหลวของพรอมต์จะมองไม่เห็นจนกว่าผู้ใช้จะแจ้ง เมื่อมีการบันทึกข้อมูล คุณจะสามารถ:

  • ตรวจพบการถดถอยทันทีที่เกิดขึ้น
  • ทำให้ความล้มเหลวในอดีตเกิดซ้ำได้ตรงตามที่เคยเกิดขึ้น
  • วัดการปรับปรุงเมื่อเวลาผ่านไปขณะที่พรอมต์พัฒนา
  • ตรวจสอบพฤติกรรมของโมเดลด้านการปฏิบัติตามข้อกำหนดหรือความปลอดภัย

การบันทึกข้อมูลไม่ใช่สิ่งที่เลือกทำหรือไม่ก็ได้สำหรับระบบพรอมต์ที่ใช้งานจริง — แต่เป็นรากฐานของแอปพลิเคชัน LLM ที่เชื่อถือได้

รายการบันทึกขั้นต่ำที่ใช้งานได้

การโต้ตอบกับพรอมต์ทุกครั้งควรบันทึกฟิลด์เหล่านี้เป็นอย่างน้อย:

  • timestamp: เวลา UTC ตามมาตรฐาน ISO 8601
  • prompt_id: แม่แบบพรอมต์ที่ใช้
  • model: ชื่อและเวอร์ชันโมเดลที่แน่นอน
  • temperature: พารามิเตอร์การสุ่มตัวอย่าง
  • input: ข้อความของผู้ใช้ (หรือค่าแฮชหากมี PII)
  • output: การตอบกลับของโมเดล
  • latency_ms: เวลาในการตอบกลับ
  • tokens_used: โทเค็นข้อมูลนำเข้า + ผลลัพธ์
import time, json
from datetime import datetime, timezone

def logged_call(prompt_id, system_prompt, user_message, model='gpt-4o', temperature=0.7):
    start = time.time()
    resp = client.chat.completions.create(
        model=model,
        messages=[
            {'role': 'system', 'content': system_prompt},
            {'role': 'user', 'content': user_message}
        ],
        temperature=temperature
    )
    latency = int((time.time() - start) * 1000)
    output = resp.choices[0].message.content
    log_entry = {
        'timestamp': datetime.now(timezone.utc).isoformat(),
        'prompt_id': prompt_id,
        'model': model,
        'temperature': temperature,
        'input': user_message,
        'output': output,
        'latency_ms': latency,
        'input_tokens': resp.usage.prompt_tokens,
        'output_tokens': resp.usage.completion_tokens
    }
    append_log(log_entry)
    return output

รูปแบบการบันทึกข้อมูลแบบมีโครงสร้าง

ใช้ JSON ที่แบ่งด้วยบรรทัดใหม่ (JSONL) สำหรับไฟล์บันทึกข้อมูล แต่ละบรรทัดเป็นออบเจ็กต์ JSON ที่สมบูรณ์และถูกต้อง รูปแบบนี้มีคุณสมบัติดังนี้:

  • เพิ่มข้อมูลต่อท้ายได้ง่ายโดยไม่ต้องล็อก
  • อ่านได้ด้วย jq, pandas และเครื่องมือรวมบันทึกข้อมูลทั้งหมด
  • เหมาะกับการประมวลผลแบบสตรีม — แต่ละบรรทัดสามารถประมวลผลได้ทันทีที่มาถึง
import json

LOG_FILE = 'prompt_logs.jsonl'

def append_log(entry):
    with open(LOG_FILE, 'a') as f:
        f.write(json.dumps(entry) + '\n')

def read_logs():
    with open(LOG_FILE) as f:
        return [json.loads(line) for line in f if line.strip()]

# Query: all entries for prompt_id 'summarize_v3'
logs = read_logs()
summarize_logs = [e for e in logs if e['prompt_id'] == 'summarize_v3']
print(f'Total calls to summarize_v3: {len(summarize_logs)}')

การจัดการเวอร์ชันพรอมต์

พรอมต์เปลี่ยนแปลงไปตามเวลา หากไม่มีการจัดการเวอร์ชัน คุณจะไม่สามารถทำให้พฤติกรรมในอดีตเกิดซ้ำหรือเปรียบเทียบผลลัพธ์ของโมเดลระหว่างเวอร์ชันพรอมต์ได้ ใช้ตัวระบุเวอร์ชันในรายการบันทึกข้อมูลทุกรายการ

การจัดการเวอร์ชันแบบง่าย: สตริงเวอร์ชันเชิงความหมาย (เช่น v1.2.3) หรือแฮชคอมมิตของ git จัดเก็บเวอร์ชันพรอมต์ไว้ในไฟล์เฉพาะ เพื่อให้เรียกคืนเวอร์ชันใดก็ได้สำหรับการเล่นซ้ำ

PROMPTS = {
    'summarize': {
        'v1': 'Summarize the following text.',
        'v2': 'Summarize the following text in 3 sentences.',
        'v3': 'Summarize the following text in exactly 3 sentences. '
              'Start each sentence on a new line. No bullet points.'
    }
}

CURRENT_VERSIONS = {'summarize': 'v3'}

def get_prompt(prompt_id):
    version = CURRENT_VERSIONS[prompt_id]
    return version, PROMPTS[prompt_id][version]

version, prompt = get_prompt('summarize')
log_entry['prompt_version'] = version

การจัดการ PII ในบันทึกข้อมูล

ข้อมูลนำเข้าของผู้ใช้อาจมีข้อมูลที่ระบุตัวบุคคลได้ (PII) การบันทึกข้อมูลนำเข้าดิบอาจละเมิด GDPR หรือ CCPA ทางเลือกมีดังนี้:

  • แฮช: จัดเก็บค่า SHA-256 ของข้อมูลนำเข้า — ทำซ้ำได้เพื่อขจัดรายการซ้ำ แต่ไม่สามารถใช้เล่นซ้ำได้
  • ปกปิด: ใช้นิพจน์ทั่วไปหรือโมเดล NER เพื่อแทนที่ PII ก่อนบันทึกข้อมูล
  • จัดเก็บแยกกัน: บันทึก PII ในพื้นที่จัดเก็บที่เข้ารหัสและมีการควบคุมการเข้าถึง ส่วนบันทึกหลักให้บันทึกเฉพาะรหัสอ้างอิง ID
import hashlib, re

def redact_pii(text):
    # Redact email addresses
    text = re.sub(r'[\w.-]+@[\w.-]+\.\w+', '[EMAIL]', text)
    # Redact phone numbers (US format)
    text = re.sub(r'\b\d{3}[-.]\d{3}[-.]\d{4}\b', '[PHONE]', text)
    return text

def hash_input(text):
    return hashlib.sha256(text.encode()).hexdigest()[:16]

log_entry['input'] = redact_pii(user_message)
log_entry['input_hash'] = hash_input(user_message)

การติดตามเวลาแฝงและต้นทุน

บันทึกข้อมูลช่วยให้สร้างแดชบอร์ดต้นทุนและเวลาแฝงได้ ติดตามตัวชี้วัดแยกตามเวอร์ชันพรอมต์เพื่อตรวจพบการถดถอยด้านประสิทธิภาพหรือต้นทุนหลังจากเปลี่ยนพรอมต์:

def compute_cost(entry, price_per_1m_input=5.0, price_per_1m_output=15.0):
    input_cost = entry['input_tokens'] / 1_000_000 * price_per_1m_input
    output_cost = entry['output_tokens'] / 1_000_000 * price_per_1m_output
    return input_cost + output_cost

def prompt_stats(prompt_id, version):
    logs = [e for e in read_logs()
            if e['prompt_id'] == prompt_id and e.get('prompt_version') == version]
    if not logs:
        return
    avg_latency = sum(e['latency_ms'] for e in logs) / len(logs)
    total_cost = sum(compute_cost(e) for e in logs)
    print(f'{prompt_id} {version}: {len(logs)} calls, avg {avg_latency:.0f}ms, total ${total_cost:.4f}')

การบันทึกผลการประเมินผลลัพธ์

นอกเหนือจากบันทึกข้อมูลดิบ ให้จัดเก็บคะแนนการประเมินควบคู่กับแต่ละรายการบันทึก วิธีนี้ช่วยให้วิเคราะห์แนวโน้มได้ว่า คุณภาพผลลัพธ์ดีขึ้นในเวอร์ชันพรอมต์ต่าง ๆ หรือไม่

def evaluated_call(prompt_id, system_prompt, user_message, evaluator_fn):
    output = logged_call(prompt_id, system_prompt, user_message)
    score = evaluator_fn(user_message, output)
    # Update the last log entry with the evaluation score
    logs = read_logs()
    last = logs[-1]
    last['eval_score'] = score
    last['eval_pass'] = score >= 0.8
    # Rewrite the last line
    with open(LOG_FILE, 'a') as f:
        # In practice, use a DB or separate eval log
        pass
    return output, score

เอกสารประกอบพรอมต์

แม่แบบพรอมต์แต่ละรายการควรมีเอกสารประกอบที่ครอบคลุมหัวข้อต่อไปนี้:

  • วัตถุประสงค์: พรอมต์นี้ทำงานอะไร
  • ตัวแปร: มีตัวแทนค่าใดบ้างและต้องระบุค่าอย่างไร
  • ข้อจำกัดที่ทราบ: ข้อมูลนำเข้าที่ทราบว่าพรอมต์จะล้มเหลว
  • ประวัติเวอร์ชัน: แต่ละเวอร์ชันเปลี่ยนแปลงอะไรและเพราะเหตุใด
  • กรณีทดสอบ: ลิงก์ไปยังชุดการทดสอบของพรอมต์นี้
PROMPT_DOCS = {
    'summarize': {
        'purpose': 'Summarize a single text passage into 3 sentences.',
        'variables': {'text': 'The passage to summarize (max 2000 tokens)'},
        'known_limitations': [
            'Fails to preserve numbers accurately for texts with many statistics',
            'May not summarize correctly for non-English text'
        ],
        'versions': {
            'v1': 'Initial version — vague length instruction',
            'v2': 'Added 3-sentence limit',
            'v3': 'Added line-break and no-bullet formatting fix'
        },
        'test_suite': 'tests/test_summarize.py'
    }
}

การใช้บริการบันทึกข้อมูลแบบรวมศูนย์

สำหรับระบบที่ใช้งานจริง ให้เขียนบันทึกข้อมูลไปยังบริการแบบรวมศูนย์แทนไฟล์ในเครื่อง:

  • LangSmith: แพลตฟอร์มการติดตามและประเมินผลดั้งเดิมของ LangChain
  • Weights and Biases Prompts: การติดตามการทดลองสำหรับพรอมต์
  • Datadog / Grafana: แดชบอร์ดการปฏิบัติการมาตรฐานพร้อมตัวชี้วัดแบบกำหนดเอง
  • Supabase / PostgreSQL: สืบค้นบันทึกข้อมูลด้วย SQL เพื่อวิเคราะห์เฉพาะกิจ

แบบแผนข้อมูลเหมือนเดิม มีเพียงปลายทางที่เปลี่ยนแปลง

# Example: writing to Supabase
from supabase import create_client

supabase = create_client('https://xxx.supabase.co', 'your-anon-key')

def log_to_supabase(entry):
    supabase.table('prompt_logs').insert(entry).execute()

# Now query with SQL:
# SELECT prompt_id, prompt_version, AVG(latency_ms), COUNT(*)
# FROM prompt_logs
# WHERE timestamp > NOW() - INTERVAL '7 days'
# GROUP BY prompt_id, prompt_version
# ORDER BY COUNT(*) DESC;

การแจ้งเตือนเมื่อความล้มเหลวพุ่งสูงขึ้น

กำหนดค่าการแจ้งเตือนเมื่ออัตราความล้มเหลวพุ่งสูงเกินค่าเกณฑ์ ตัวอย่างเช่น หากการเรียกใช้พรอมต์มากกว่า 10% ส่งคืน JSON ที่ไม่ถูกต้องภายในช่วงเวลา 5 นาที ให้ส่งการแจ้งเตือน

from collections import deque
from datetime import datetime, timezone, timedelta

recent_results = deque(maxlen=100)  # sliding window

def track_and_alert(prompt_id, success, alert_fn, threshold=0.10):
    recent_results.append({'success': success, 'time': datetime.now(timezone.utc)})
    window = [
        r for r in recent_results
        if r['time'] > datetime.now(timezone.utc) - timedelta(minutes=5)
    ]
    if not window:
        return
    fail_rate = sum(1 for r in window if not r['success']) / len(window)
    if fail_rate > threshold:
        alert_fn(f'ALERT: {prompt_id} failure rate {fail_rate:.0%} in last 5 min')

การเก็บรักษาและการจัดเก็บถาวร

กำหนดนโยบายการเก็บรักษาบันทึก:

  • บันทึกการเรียกใช้งานดิบ: 30 วัน (แบบเลื่อนต่อเนื่อง) — มีปริมาณสูงและจำเป็นสำหรับการแก้ไขข้อบกพร่องของปัญหาล่าสุด
  • ตัวชี้วัดแบบรวม: 1 ปี — จำเป็นสำหรับการวิเคราะห์แนวโน้มและการคาดการณ์ต้นทุน
  • บันทึกความล้มเหลว: ไม่มีกำหนด — จำเป็นสำหรับการวิเคราะห์รูปแบบของสาเหตุราก

บีบอัดและจัดเก็บบันทึกดิบแบบถาวรหลังครบ 30 วัน อย่าลบบันทึกความล้มเหลวไม่ว่าเมื่อใด — บันทึกเหล่านี้คือความรู้สะสมขององค์กรสำหรับวิศวกรรมพรอมต์

ทดสอบความรู้

ข้อได้เปรียบหลักของการใช้รูปแบบ JSON แบบคั่นด้วยบรรทัดใหม่ (JSONL) สำหรับบันทึกพรอมต์ เมื่อเทียบกับอาร์เรย์ JSON ขนาดใหญ่เพียงชุดเดียวคืออะไร

ทบทวน: การบันทึกและเอกสารประกอบ

แนวปฏิบัติสำคัญสำหรับการบันทึกพรอมต์และเอกสารประกอบ:

  • บันทึกทุกการเรียกใช้งาน: การประทับเวลา, รหัสพรอมต์, เวอร์ชัน, โมเดล, อุณหภูมิ, อินพุต, เอาต์พุต, เวลาแฝง, โทเค็น
  • ใช้รูปแบบ JSONL: รองรับการเพิ่มต่อท้ายได้ง่ายและสืบค้นด้วยเครื่องมือมาตรฐานได้
  • กำหนดเวอร์ชันให้พรอมต์: ทุกการเปลี่ยนแปลงต้องใช้เวอร์ชันใหม่ และบันทึกจะอ้างอิงเวอร์ชันนั้น
  • จัดการ PII: ปกปิดหรือแฮชอินพุตที่ละเอียดอ่อนก่อนบันทึก
  • ติดตามต้นทุนและเวลาแฝง: ตรวจจับการถดถอยหลังการอัปเดตพรอมต์
  • แจ้งเตือนเมื่อความล้มเหลวพุ่งสูง: ตรวจสอบอัตราความล้มเหลวด้วยหน้าต่างเลื่อน

หลักสูตรที่ 17 เรื่องการแก้ไขปัญหาความล้มเหลวของพรอมต์สิ้นสุดลงเพียงเท่านี้ ต่อไป: การฉีดพรอมต์และการป้องกัน

เริ่มต้นได้ฟรี

เรียนรู้ AI Prompt Engineering ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
53
บทเรียน
199

คำถามที่พบบ่อย

บทเรียน “กลยุทธ์การบันทึกข้อมูลและจัดทำเอกสาร” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “กลยุทธ์การบันทึกข้อมูลและจัดทำเอกสาร” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Prompt Engineering ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Prompt Engineering มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “กลยุทธ์การบันทึกข้อมูลและจัดทำเอกสาร”

บันทึกเวอร์ชันของพรอมต์ ข้อมูลนำเข้า และข้อมูลส่งออก เพื่อให้แก้ไขข้อบกพร่องซ้ำได้ คุณปฏิบัติ AI Prompt Engineering ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Prompt Engineering หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Prompt Engineering บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “กลยุทธ์การบันทึกข้อมูลและจัดทำเอกสาร” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน AI Prompt Engineering นี้ได้ไหม

ได้ บทเรียน AI Prompt Engineering ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การวินิจฉัยผลลัพธ์ที่ไม่คาดคิด
  2. การวิเคราะห์สาเหตุรากของพรอมป์ต
  3. แนวทางการแก้ไขข้อบกพร่องอย่างเป็นระบบ
  4. กลยุทธ์การบันทึกข้อมูลและจัดทำเอกสาร
← กลับไปที่ AI Prompt Engineering