03 Rilis dan deteksi
Rilis agen terpilih dengan titik buta kebijakan yang sudah diketahui, lalu gunakan evaluasi operasional dan masukan pengguna nyata untuk mendeteksinya.
Titik awal
Modul 02 sudah selesai. Catat config_id pemenang yang terpilih dari run Arena
sebenarnya, lalu ekspor dari root lab (ClickHouse_Demos/workshops/agent_arena):
source .env
export WINNER_CONFIG_ID="${WINNER_CONFIG_ID:-qwen3.7-flash__P2_fewshot}"Run lokakarya yang sudah diverifikasi memilih qwen3.7-flash__P2_fewshot; pertahankan
pemenang dari ruangan Anda jika berbeda. Anda akan memakai model dan prompt yang sama
seperti yang Anda ukur sebelumnya—bukan agen khusus yang sengaja dibuat untuk gagal.
Jika pemenang Anda adalah Qwen, opsi Settings → Privacy → Data Policies → Zero Data Retention → Non-frontier di OpenRouter harus dinonaktifkan. Rute Alibaba yang tersedia akan ditolak ketika ZDR non-frontier diberlakukan. Tinjau kebutuhan privasi Anda sebelum mengubah setelan ini untuk data sungguhan.
Mengapa evaluator yang lolos tetap bisa melewatkan nilai bagi pengguna
Evaluator online hanya mengukur dimensi yang memang dirancang untuknya. Di sini,
sql-execution-success menjawab pertanyaan operasional yang penting: apakah agen
menghasilkan SQL yang bisa dieksekusi oleh ClickHouse? Evaluator ini tidak tahu apakah
SQL tersebut sesuai dengan definisi bisnis terkini untuk pelanggan aktif.
Situasi ini menciptakan kesenjangan pemantauan yang realistis:
| Sinyal | Pertanyaan yang dijawabnya | Nilai yang diharapkan dalam insiden ini |
|---|---|---|
sql-execution-success | Apakah SQL yang dihasilkan berhasil dieksekusi? | true |
user-thumbs | Apakah jawaban ini memenuhi kebutuhan pengguna? | false |
Evaluasi operasional menangkap SQL yang gagal, timeout, dan error eksekusi. Evaluasi semantik atau evaluasi pengguna menanyakan apakah jawaban yang bisa dieksekusi itu benar-benar berguna dan sesuai dengan makna bisnisnya. Yang satu tidak menggantikan yang lain. Jempol ke bawah adalah sinyal prioritas, bukan kebenaran mutlak; seorang manusia akan menyelidikinya di Modul 04.
Sasaran
Buat satu trace chat_turn nyata di mana evaluator operasional lolos tetapi pengguna
menilai jawabannya buruk. Rekam trace tersebut beserta dua hitungan yang saling
bertentangan untuk keperluan investigasi manusia.
Langkah 1 — Buktikan bahwa insiden yang ditanam dapat direproduksi
Jalankan pemeriksaan awal dari root lab sebelum memulai server demo:
source .env
export WINNER_CONFIG_ID="${WINNER_CONFIG_ID:-qwen3.7-flash__P2_fewshot}"
.venv/bin/python -m schema.gen_schema_context
.venv/bin/python -m scripts.check_online_eval_scenario \
--config-id "$WINNER_CONFIG_ID"Perintah ini mengeksekusi kedua definisi dan mengajukan tiga parafrase pertanyaan ke
konfigurasi terpilih. Perintah tersebut harus mencetak nilai stale_count dan
current_count yang berbeda, tiga baris classification_N=policy-v1, dan:
Jika suatu parafrasa menghasilkan ok/unknown, preflight hanya mengulang parafrasa
dan konfigurasi yang sama satu kali. Preflight tidak mengulang hasil policy-v2
ataupun kegagalan penyedia/model/agen, dan hasil ok/unknown kedua tetap memblokir proses.
OK: seeded online-evaluation incident is reproducibleJika kedua hitungan sama atau ada klasifikasi yang bukan policy-v1, hentikan: kontras
ini tidak akan terlihat pada data/model run Anda.
Definisi bisnis yang berlaku saat ini adalah SQL berikut:
SELECT uniqExact(customer_id) FROM v_orders
WHERE order_ts >= now() - INTERVAL 30 DAY
AND status NOT IN ('cancelled', 'returned')Definisi policy-v1 yang lama justru menghitung pelanggan yang mendaftar dalam 90 hari
terakhir. Jadi, SQL yang dihasilkan model pada modul ini sebenarnya valid terhadap
instruksi policy-v1 yang eksplisit. Intinya bukan model tersebut tidak cerdas;
konteks kebijakan yang dirilis sudah usang, sementara evaluator eksekusi SQL terlalu
sempit untuk menyadarinya.
Langkah 2 — Sediakan evaluator operasional
Provisioning bersifat idempoten, sehingga aman dijalankan ulang:
source .env
.venv/bin/python -m scripts.provision_online_evaluators --operationalKeluarannya harus menyebutkan nama evaluator sql-execution-success dan rule yang
diaktifkan agent-arena-sql-execution-online.
Langkah 3 — Jalankan rilis usang yang telah disiapkan
Di terminal pertama, dari root lab, jalankan server dengan kebijakan lama dipilih secara eksplisit dan biarkan tetap berjalan:
source .env
AGENT_ARENA_POLICY_VERSION=policy-v1 \
.venv/bin/uvicorn serving.api:app --port 8100Jangan menghilangkan AGENT_ARENA_POLICY_VERSION. Jika dihilangkan, layanan akan
default ke policy-v2 yang berlaku saat ini, yang justru sudah benar mengecualikan
pesanan yang dibatalkan dan dikembalikan.
Langkah 4 — Tanyakan dan beri rating lewat Chat
Di terminal lain, jalankan dashboard jika belum berjalan:
scripts/arena.sh serveBuka http://localhost:5174, pilih tab Chat dan $WINNER_CONFIG_ID, lalu ajukan
pertanyaan berikut:
How many active customers do we have?Baca SQL yang dihasilkan beserta hasilnya. SQL tersebut seharusnya mengikuti definisi
usang tentang pendaftaran 90 hari dari policy-v1. Klik 👎 pada jawaban ini dan tunggu
sampai UI menampilkan feedback sent.
Trace root Chat ini adalah satu-satunya insiden resmi yang akan Anda nilai dan serahkan ke Modul 04.
Langkah 5 — Temukan dan verifikasi trace Chat
Di Langfuse, buka Tracing dan filter untuk user-thumbs = false. Buka chat_turn
root terbaru yang pertanyaannya adalah How many active customers do we have?,
config-nya cocok dengan $WINNER_CONFIG_ID, dan metadatanya menunjukkan
policyversion=policy-v1. Salin trace ID dan trace URL-nya, lalu atur ID tersebut
secara lokal:
export CHAT_TRACE_ID="<paste the Chat trace ID>"
.venv/bin/python -m scripts.verify_online_scores "$CHAT_TRACE_ID" \
sql-execution-success=true user-thumbs=falsePastikan user-thumbs adalah skor Boolean false, bukan skor numerik atau teks.
Sumber serving memanggil field metadata ini policy_version; adapter OpenTelemetry
menyanitasinya menjadi key Langfuse yang dipancarkan, policyversion.
Langkah 6 — Reproduksi dengan curl tanpa rating
Panggilan API mentah ini merupakan reproduksi dan diagnostik tingkat perintah yang wajib dilakukan. Panggilan ini membuat trace terpisah, tetapi bukan insiden umpan balik dan tidak boleh diberi rating:
source .env
export WINNER_CONFIG_ID="${WINNER_CONFIG_ID:-qwen3.7-flash__P2_fewshot}"
ASK_BODY=$(.venv/bin/python -c \
'import json,sys; print(json.dumps({"question": sys.argv[1], "config_id": sys.argv[2]}))' \
"How many active customers do we have?" "$WINNER_CONFIG_ID")
CURL_RESPONSE=$(curl -fsS http://localhost:8100/ask \
-H 'content-type: application/json' -d "$ASK_BODY")
printf '%s\n' "$CURL_RESPONSE" | .venv/bin/python -m json.tool
CURL_TRACE_ID=$(printf '%s\n' "$CURL_RESPONSE" | .venv/bin/python -c \
'import json,sys; data=json.load(sys.stdin); assert data.get("policy_version") == "policy-v1"; assert data.get("outcome") == "ok"; trace_id=data.get("trace_id"); assert isinstance(trace_id, str) and trace_id; print(trace_id)')Responsnya harus memiliki outcome: "ok", trace_id yang tidak kosong, dan
policy_version: "policy-v1".
Tunggu evaluator asinkron, lalu verifikasi hanya skor operasionalnya:
.venv/bin/python -m scripts.verify_online_scores "$CURL_TRACE_ID" \
sql-execution-success=trueJangan memanggil /feedback untuk CURL_TRACE_ID dan jangan mencatatnya di lembar
kerja. Ini hanyalah diagnostik API yang dapat direproduksi; CHAT_TRACE_ID tetap
menjadi trace yang diserahkan ke Modul 04.
Langkah 7 — Bandingkan dengan kebijakan saat ini
Jalankan SQL kebijakan saat ini lewat klien ClickHouse read-only yang sama dengan
agen, lalu bandingkan hasil tunggalnya dengan hasil kebijakan usang di CURL_RESPONSE:
.venv/bin/python - <<'PY'
from arena.config import load_config
from agents.chclient import ROClickHouseClient
sql = """SELECT uniqExact(customer_id) FROM v_orders
WHERE order_ts >= now() - INTERVAL 30 DAY
AND status NOT IN ('cancelled', 'returned')"""
result = ROClickHouseClient(load_config().clickhouse).query(sql)
print(result.rows[0][0])
PYIni adalah query yang persis sama dengan yang baru Anda jalankan:
SELECT uniqExact(customer_id) FROM v_orders
WHERE order_ts >= now() - INTERVAL 30 DAY
AND status NOT IN ('cancelled', 'returned')Perbedaan hitungan inilah kegagalan yang terlihat oleh pengguna. SQL-nya berjalan; hanya saja menjawab definisi bisnis yang salah. Catat hitungan tersebut di samping bukti trace Chat resmi.
Lembar kerja investigasi
Simpan handoff ini untuk Modul 04:
| Bukti | Nilai Anda |
|---|---|
config_id pemenang | |
| ID trace Chat resmi | |
| URL trace Chat resmi | |
Hitungan policy-v1 yang usang | |
Hitungan policy-v2 saat ini | |
sql-execution-success | true |
user-thumbs | false |
Cara memverifikasi bahwa Anda sudah selesai
- Pemeriksaan awal menunjukkan hitungan kebijakan usang/saat ini yang berbeda, dan ketiga
pertanyaan yang ditanam terklasifikasi sebagai
policy-v1. - Layanan berjalan dengan
AGENT_ARENA_POLICY_VERSION=policy-v1dan/askmengembalikanoutcome: "ok". - Trace Chat resmi memiliki
sql-execution-success=truedanuser-thumbs=falsedi Langfuse. - Diagnostik curl yang wajib mengembalikan
outcome: "ok", menghasilkanCURL_TRACE_IDyang berbeda, dan tidak diberi rating atau diserahkan. - Anda mencatat ID/URL trace Chat resmi beserta kedua hitungan tanpa membagikan kredensial.
- Anda dapat menjelaskan mengapa eksekusi SQL yang berhasil tidak membuktikan kebenaran semantik.
Lanjutkan ke Modul 04 — Investigasi bersama manusia untuk mengubah sinyal ini menjadi diagnosis yang ditinjau manusia.