กลยุทธ์การบันทึกข้อมูลและจัดทำเอกสาร
บันทึกเวอร์ชันของพรอมต์ ข้อมูลนำเข้า และข้อมูลส่งออก เพื่อให้แก้ไขข้อบกพร่องซ้ำได้
กลยุทธ์การบันทึกข้อมูลและจัดทำเอกสาร เป็นบทเรียน AI Prompt Engineering ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Prompt Engineering และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Prompt Engineering มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดการบันทึกพรอมต์จึงสำคัญ
หากไม่มีการบันทึกข้อมูล ความล้มเหลวของพรอมต์จะมองไม่เห็นจนกว่าผู้ใช้จะแจ้ง เมื่อมีการบันทึกข้อมูล คุณจะสามารถ:
- ตรวจพบการถดถอยทันทีที่เกิดขึ้น
- ทำให้ความล้มเหลวในอดีตเกิดซ้ำได้ตรงตามที่เคยเกิดขึ้น
- วัดการปรับปรุงเมื่อเวลาผ่านไปขณะที่พรอมต์พัฒนา
- ตรวจสอบพฤติกรรมของโมเดลด้านการปฏิบัติตามข้อกำหนดหรือความปลอดภัย
การบันทึกข้อมูลไม่ใช่สิ่งที่เลือกทำหรือไม่ก็ได้สำหรับระบบพรอมต์ที่ใช้งานจริง — แต่เป็นรากฐานของแอปพลิเคชัน LLM ที่เชื่อถือได้
รายการบันทึกขั้นต่ำที่ใช้งานได้
การโต้ตอบกับพรอมต์ทุกครั้งควรบันทึกฟิลด์เหล่านี้เป็นอย่างน้อย:
timestamp: เวลา UTC ตามมาตรฐาน ISO 8601prompt_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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การวินิจฉัยผลลัพธ์ที่ไม่คาดคิด
- การวิเคราะห์สาเหตุรากของพรอมป์ต
- แนวทางการแก้ไขข้อบกพร่องอย่างเป็นระบบ
- กลยุทธ์การบันทึกข้อมูลและจัดทำเอกสาร