Agent ArenaClickHouse Workshops

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:

SinyalPertanyaan yang dijawabnyaNilai yang diharapkan dalam insiden ini
sql-execution-successApakah SQL yang dihasilkan berhasil dieksekusi?true
user-thumbsApakah 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 reproducible

Jika 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 --operational

Keluarannya 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 8100

Jangan 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 serve

Buka 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=false

Pastikan 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=true

Jangan 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])
PY

Ini 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:

BuktiNilai Anda
config_id pemenang
ID trace Chat resmi
URL trace Chat resmi
Hitungan policy-v1 yang usang
Hitungan policy-v2 saat ini
sql-execution-successtrue
user-thumbsfalse

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-v1 dan /ask mengembalikan outcome: "ok".
  • Trace Chat resmi memiliki sql-execution-success=true dan user-thumbs=false di Langfuse.
  • Diagnostik curl yang wajib mengembalikan outcome: "ok", menghasilkan CURL_TRACE_ID yang 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.

Di halaman ini

Track your progress?

Optional. We email a link to confirm your address; progress records once you open it.

Please use your work email address, not a personal one.

Progress tracking also requires accepting the current Terms of Service in Privacy settings.

ID