Strategi Pencatatan dan Dokumentasi
Catat versi prompt, input, dan output agar debugging dapat direproduksi.
Strategi Pencatatan dan Dokumentasi adalah pelajaran AI Prompt Engineering gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Prompt Engineering, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Prompt Engineering mencakup 4 pelajaran total.
Mengapa Pencatatan Perintah Penting
Tanpa pencatatan, kegagalan perintah tidak terlihat hingga pengguna melaporkannya. Dengan pencatatan, Anda dapat:
- Mendeteksi regresi saat terjadi
- Mereproduksi kegagalan apa pun di masa lalu secara persis seperti saat terjadi
- Mengukur peningkatan dari waktu ke waktu seiring berkembangnya perintah
- Mengaudit perilaku model untuk kepatuhan atau keamanan
Pencatatan bukan pilihan tambahan untuk sistem perintah produksi — pencatatan adalah dasar aplikasi LLM yang andal.
Entri Catatan Minimum yang Layak
Setiap interaksi dengan perintah setidaknya harus mencatat bidang-bidang berikut:
timestamp: UTC ISO 8601prompt_id: templat perintah yang digunakanmodel: nama dan versi model yang tepattemperature: parameter pengambilan sampelinput: pesan pengguna (atau hash jika mengandung PII)output: respons modellatency_ms: waktu responstokens_used: token masukan + keluaran
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 outputFormat Pencatatan Terstruktur
Gunakan JSON yang dibatasi baris baru (JSONL) untuk file catatan. Setiap baris merupakan objek JSON lengkap dan valid. Format ini:
- Mudah ditambahkan tanpa penguncian
- Dapat dibaca oleh jq, pandas, dan semua pengumpul catatan
- Ramah terhadap pemrosesan aliran — setiap baris dapat diproses saat tiba
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)}')Penerapan Versi Perintah
Perintah berubah seiring waktu. Tanpa penerapan versi, Anda tidak dapat mereproduksi perilaku sebelumnya atau membandingkan keluaran model di berbagai versi perintah. Gunakan pengenal versi dalam setiap entri catatan.
Penerapan versi sederhana: string versi semantik (misalnya, v1.2.3) atau hash commit git. Simpan versi perintah dalam file khusus agar versi apa pun dapat diambil untuk diputar ulang.
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'] = versionMenangani PII dalam Catatan
Masukan pengguna dapat berisi informasi identitas pribadi (PII). Mencatat masukan mentah dapat melanggar GDPR atau CCPA. Pilihannya:
- Hash: simpan SHA-256 dari masukan — dapat direproduksi untuk deduplikasi, tetapi tidak untuk pemutaran ulang
- Samarkan: gunakan regex atau model NER untuk mengganti PII sebelum pencatatan
- Penyimpanan terpisah: catat PII di penyimpanan terenkripsi dengan kontrol akses; catat hanya ID referensi di catatan utama
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)Pelacakan Latensi dan Biaya
Catatan memungkinkan pembuatan dasbor biaya dan latensi. Lacak metrik per versi perintah untuk mendeteksi regresi kinerja atau biaya setelah perubahan perintah:
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}')Pencatatan Evaluasi Keluaran
Selain catatan mentah, simpan skor evaluasi bersama setiap entri catatan. Hal ini memungkinkan analisis tren: apakah kualitas keluaran meningkat di berbagai versi perintah?
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, scoreDokumentasi Perintah
Setiap templat perintah harus memiliki entri dokumentasi pendamping yang mencakup:
- Tujuan: tugas yang dilakukan perintah ini
- Variabel: placeholder yang tersedia dan hal yang diharapkan dari setiap placeholder
- Keterbatasan yang diketahui: masukan yang diketahui dapat menyebabkan kegagalan
- Riwayat versi: perubahan pada setiap versi dan alasannya
- Kasus pengujian: tautan ke rangkaian pengujian untuk perintah ini
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'
}
}Menggunakan Layanan Pencatatan Terpusat
Untuk sistem produksi, tulis catatan ke layanan terpusat, bukan ke file lokal:
- LangSmith: platform pelacakan dan evaluasi bawaan LangChain
- Weights and Biases Prompts: pelacakan eksperimen untuk perintah
- Datadog / Grafana: dasbor operasi standar dengan metrik khusus
- Supabase / PostgreSQL: kueri catatan dengan SQL untuk analisis ad hoc
Skemanya sama; hanya tujuannya yang berubah.
# 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;Peringatan saat Lonjakan Kegagalan
Konfigurasikan peringatan ketika tingkat kegagalan melonjak melewati ambang batas. Contohnya, jika lebih dari 10% panggilan ke suatu prompt menghasilkan JSON yang tidak valid dalam rentang 5 menit, kirimkan peringatan.
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')Retensi dan Pengarsipan
Tentukan kebijakan retensi log:
- Log panggilan mentah: 30 hari (bergulir) — volumenya tinggi dan diperlukan untuk men-debug masalah terbaru
- Metrik teragregasi: 1 tahun — diperlukan untuk menganalisis tren dan memperkirakan biaya
- Log kegagalan: tanpa batas waktu — diperlukan untuk menemukan pola akar masalah
Kompres dan arsipkan log mentah setelah 30 hari. Jangan pernah menghapus log kegagalan — log tersebut merupakan memori institusional Anda untuk rekayasa prompt.
Pemeriksaan Pengetahuan
Apa keunggulan utama menggunakan format JSON yang dibatasi baris baru (JSONL) untuk log prompt dibandingkan satu larik JSON besar?
Rekap: Pencatatan Log dan Dokumentasi
Praktik utama untuk pencatatan log dan dokumentasi prompt:
- Catat setiap panggilan: stempel waktu, ID prompt, versi, model, suhu, masukan, keluaran, latensi, token
- Gunakan format JSONL: mudah ditambahkan dan dapat dikueri dengan alat standar
- Buat versi prompt: setiap perubahan mendapatkan versi baru; log merujuk ke versi tersebut
- Tangani PII: samarkan atau hash masukan sensitif sebelum dicatat
- Lacak biaya dan latensi: deteksi penurunan kinerja setelah pembaruan prompt
- Beri peringatan saat terjadi lonjakan kegagalan: pantau tingkat kegagalan dalam jendela bergulir
Ini mengakhiri Kursus 17 tentang Men-debug Kegagalan Prompt. Berikutnya: Injeksi Prompt dan Pertahanan.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Strategi Pencatatan dan Dokumentasi” gratis?
Ya — teks lengkap “Strategi Pencatatan dan Dokumentasi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Prompt Engineering, upgrade ke CoddyKit PRO. Kursus AI Prompt Engineering mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Strategi Pencatatan dan Dokumentasi”?
Catat versi prompt, input, dan output agar debugging dapat direproduksi. Kamu berlatih AI Prompt Engineering dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Prompt Engineering?
Tidak diperlukan pengalaman sebelumnya. AI Prompt Engineering di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Strategi Pencatatan dan Dokumentasi” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Prompt Engineering ini?
Ya. Setiap pelajaran AI Prompt Engineering menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mendiagnosis Keluaran Tak Terduga
- Analisis Akar Masalah untuk Perintah
- Pendekatan Debugging Sistematis
- Strategi Pencatatan dan Dokumentasi