Noong nakaraang buwan, nag-release ako ng pagbabago sa pipeline na talagang ipinagmamalaki ko. Isang rewrite ng prompt. Isang full-context review step. Isang detalyadong rubric para mahuli ang pag-uulit at ma-enforce ang structural variety sa bawat segment.
Na-deploy ko. Na-observe ko nang anim na linggo. Sinabi ko sa sarili kong gumagana ito.
Tapos gumawa ako ng eval framework. Pinatakbo ko sa 40 totoong production episode sa 7 wika. At natuklasan kong ang review step — 'yung pinag-ingatan kong idisenyo — ay mas lalong nagpapasama ng scripts, at nasusukat ang paglala.
Hindi neutral. Mas malala.
Ang per-segment dialogue ay naka-score ng 3.34 sa 5. Ang outline ay 3.01. At ang final script, pagkatapos ng review pass? 2.91.
Ang step na dinisenyo para pagandahin ang scripts ay binabawasan ang kalidad ng higit 12%.
Ang pagbabagong ito — mula sa "sa tingin ko gumagana" tungo sa "alam kong hindi" — nagsimula ilang linggo na ang nakalipas. Pinapanood ko ang Agentic AI course ni Andrew Ng sa DeepLearning.AI, kung saan binibigyang-diin niya ang isang bagay na parang obvious pero hindi: ang evals at traces ang pundasyon ng kahit anong agentic system. Kapag wala nito, nagde-debug ka sa dilim. Kapag mayroon, alam mo nang eksakto kung aling link sa chain ang nasira.
Matagal na akong nagpapatakbo ng ad-hoc na script quality checks — structural metrics tulad ng turn length ratios at speaker balance, at saka isang LLM judge na kumukumpara ng A/B prompt variants. Nahuhuli nito ang obvious regressions. Pero hindi ito comprehensive. Isang stage (dialogue) lang ang covered, isang language lang sa isang pagkakataon, at dinisenyo ito para sa prompt A/B testing, hindi para sa pipeline-wide quality audits.
Tumama talaga sa akin ang punto ni Andrew tungkol sa traces. Ang pipeline ko ay may limang major LLM calls bawat episode — research, outline, per-segment dialogue, intro/outro, at review — at saka isang ElevenLabs TTS pass. May quality metrics ako para sa isa lang. Ang apat ay pinagkakatiwalaan ko lang base sa pakiramdam.
Kaya gumawa ako ng tunay na eval system. Kumpleto. Multi-dimensional. Pwedeng i-rerun. Heto ang natuklasan nito, ang anim na fix na ni-release ko sa isang araw, at kung ano talaga ang bumuti.
Ang Baseline: Tatlong Numero na Nagbago ng Lahat
Sinuri ko ang 40 completed episodes mula sa aking production database — sumasaklaw sa lahat ng 7 wika (en, vi, ja, ko, es, zh, fr) at 10 podcast styles — laban sa tatlong rubric na may tig-limang dimensyon. Isang LLM judge (GPT-5.6-terra) ang nag-grade sa bawat stage.
| Stage | Score | Worst Dimension |
|---|---|---|
| Dialogue (per-segment) | 3.34 | Factual Grounding: 2.17 |
| Outline (research + structure) | 3.01 | Citation Credibility: 1.28 |
| Final Script (post-review) | 2.91 | Publishability: 1.95 |
Tatlong bagay ang agad na pumukaw ng pansin:
1. Ang review pass ay nagde-degrade ng scripts ng 0.43. Ang dialogue ay 3.34. Pagkatapos ng review? 2.91. Ang step na dinisenyo para pagandahin ang kalidad ay nag-aalis nito.
2. Lahat ng citation URLs ay opaque redirects. Bawat "source URL" sa bawat outline ay tumuturo sa vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQ.... Gumagana ito para sa mga taong nagki-click, pero mukhang gawa-gawa lang sa mga automated reviewer. 344 facts ay may source URLs. Zero ang may resolved_url — isang field na hindi pa nga nag-e-exist noon.
3. Ang Publishability ang pinakamababang dimensyon sa buong pipeline (1.95). Mga totoong podcaster, ayon sa eval judge, ay hindi magpa-publish ng mga script na ito sa ilalim ng sarili nilang pangalan. Nakikitang AI patterns: pare-parehong segment openers, generic na transitions, kawalan ng host personality.
Binigyan ako ng eval ng naka-rank na listahan ng eksakto kung ano ang dapat ayusin. Ginugol ko ang natitirang araw sa pag-aayos.
Ang Anim na Fix (At Ang Nasukat na Impact)
Fix 1: Citation URLs — 0% hanggang 100% Resolution
Before: 0 sa 344 research facts ay may resolved_url. Bawat URL ay mukhang peke.
Fix: Isang 60-line URL resolver na tumatakbo habang ginagawa ang outline, sinusundan ang vertex AI redirect papunta sa totoong source, at iniimbak ang parehong URLs (original para sa Google ToS compliance, resolved para sa lahat ng iba pa).
def resolve_grounding_url(url: str) -> str:
if "grounding-api-redirect" not in url:
return url
response = requests.head(url, allow_redirects=True, timeout=5)
return response.url if response.url != url else url
After: 23 sa 23 research facts sa mga bagong episode ngayon ay may resolved_url na populated — tunay na URLs tulad ng simonwillison.net, axios.com, thinkingmachines.ai. 100% resolution.
Fix 2: Pinalitan ang Review Model (Gemini → DeepSeek)
Before: Gemini 3.5 Flash ang nagpapatakbo ng review pass. Gumagawa ito ng magagaan at konserbatibong edit: binabago ang "Exactly!" sa "No question about it!" pero kadalasa'y pinapanatili ang orihinal na text. Nagdadagdag ito ng filler na nagpapa-flatten ng dialogue. Bumababa ang audio tag density. Bumababa ang type-token ratio. Lumalobo ang turn count.
Fix: Pinalitan ang review pass sa DeepSeek v4-pro (384K max output, naka-set sa 96K cap). Ginawang configurable ang provider:
provider = get_provider("review") # reads REVIEW_PROVIDER env var
response = provider.generate(
prompt=prompt, temperature=0.0,
max_output_tokens=96000,
)
Verification: Na-deploy sa production. Isang Vietnamese tech news episode ang dumaan sa full pipeline gamit ang DeepSeek review — 10.3K → 11.6K tokens, natapos sa 121 seconds, 0 tightening pass ang kailangan. Ang pangalawang episode (English) ay nagproseso ng 7.9K → 17K tokens sa 203 seconds. Ang DeepSeek API key ay nasa Google Cloud Secret Manager, awtomatikong iniinject sa deploy time sa pamamagitan ng service.yaml.
Fix 3: Outline Self-Critique (+0.50 Improvement)
Before: Ang mga outline ay diretso mula Gemini papunta sa user na walang internal quality check. Average score: 3.01.
Fix: Nagdagdag ng automated critique step. Sine-evaluate ng DeepSeek v4-pro ang outline laban sa 6-dimension rubric (5 outline dimensions at saka segment count), nagbabalik ng scores + specific feedback, at iniimbak ang critique sa podcast metadata.
Pagkatapos ay nagpatakbo ako ng controlled experiment: kunin ang 6 na episode na ang outlines ay may score na mas mababa sa 3.0, patakbuhin ang DeepSeek critique, ibalik ang feedback kay Gemini bilang regeneration instructions, at i-re-score.
After: +0.50 overall improvement sa 6 na episode.
| Dimension | Before | After | Delta |
|---|---|---|---|
| Content Boundaries | 3.33 | 4.17 | +0.83 |
| Research Depth | 2.67 | 3.17 | +0.50 |
| Citation Credibility | 1.00 | 1.50 | +0.50 |
| Structural Logic | 3.67 | 4.17 | +0.50 |
| Audience Fit | 2.17 | 2.33 | +0.17 |
Ang pinakamalalang episode ay umangat mula 1.80 hanggang 3.20 (+1.40). Isa lang sa 6 ang lumala. Ang critique ay naka-enable na ngayon by default sa production — bawat bagong outline ay dumadaan sa quality check na ito bago ito makita ng user.
Fix 4: One-Segment Outlines Ay Nagfa-fail Nang Matindi Ngayon
Before: Ipinakita ng eval na ang mga episode na may iisang segment at zero research facts ay nag-i-score nang kasingbaba ng 2.07. Ito ay mga failure cases na hindi tinuturing ng pipeline bilang failures.
Fix: Kapag ang outline generator ay gumawa ng mas mababa sa 3 valid segments pagkatapos ng recovery attempt, ang podcast ay mina-mark na FAILED. Wala nang one-segment outlines na makakarating sa users. Sa susunod na creation attempt, ang credit ng user ay pinalalaya para mag-retry.
Fix 5: Chinese Localization Rules
Before: Ang Chinese episodes ay nag-score ng 2.88 — ang pinakamababa sa 7 wika. Translation artifacts (English idioms na literal na isinalin), pare-parehong segment openers, default English host names (Alex/Maya) sa halip na Chinese names (明辉/晓雯).
Fix: Sumulat ako ng Chinese-specific dialogue rules: native conversational patterns (不是...而是... constructions), tamang sentence-final particles (吧/啊/呢), anti-translation guidelines (huwag literal na isalin ang "medical miracle"), Chinese football metaphors para sa World Cup episodes, at locale-specific host profiles na may natatanging personalidad.
Ang Chinese dialogue template ay mula sa pag-reuse ng English defaults tungo sa pagkakaroon ng sarili nitong 80-line guide na sumasaklaw sa conversational patterns, disagreement phrasing, at audience-specific framing para sa bawat podcast style.
Fix 6: Host Name Defaults para sa Non-English
Before: Maraming non-English episodes ang may hosts na Alex at Maya. Ang locale-specific host profiles ay umiiral pero ang fallback path sa outline generator ay naka-hardcode sa English defaults.
Fix: Tinunton ko ang fix sa pamamagitan ng locale-aware profile resolution pipeline. Ang mga kamakailang production episodes ay gumagamit na ngayon ng 翔太/健一 (ja), Mạnh/Nga (vi), Hugo/Camille (fr), 明辉/晓雯 (zh). Naayos na ng July commits ang edge function at creation flow — ang natitirang fallback ay nasa outline generator mismo.
Ang Eval Framework (Reusable)
Ang framework na nakatuklas ng lahat ng ito ay ~500 lines ng Python, tatlong rubric files (5 dimensions bawat isa), isang shared GPT-5.6-terra judge, at isang orchestrator:
docs/pipeline/evals/
├── run.py # Orchestrator: extract → judge → report
├── judge.py # Shared LLM judge (rate with rubric)
├── rubric_outline.py # Stage 1: 5 dimensions, 1-5 scale
├── rubric_dialogue.py # Stage 2: 5 dimensions, 1-5 scale
├── rubric_final_script.py # Stage 3: 5 dimensions, 1-5 scale
├── dataset_40.json # Extracted production data
├── scores.json # Machine-readable scores
└── report.md # Auto-generated report
Gumawa rin ako ng experiments layer para sa A/B comparisons:
docs/pipeline/evals/experiments/
├── review_ab.py # Compare two review models
├── outline_critique_ab.py # Critique → regenerate → compare
├── shared.py # Score comparator, report generator
└── results/ # Archived by date
Patakbuhin ang python docs/pipeline/evals/run.py --full pagkatapos ng kahit anong pipeline change at makakakuha ka ng report sa ~8 minutes. Patakbuhin ang experiments/review_ab.py --episodes 10 para ikumpara ang mga model. Ang results ay naka-archive ayon sa petsa para sa trend tracking — gusto mong malaman kung bumuti ang kalidad ngayong buwan kumpara noong nakaraang buwan? I-diff ang scores.
Ang full 40-episode eval ay nagkakahalaga ng humigit-kumulang $1-2 sa API calls. Mas mura ang experiments. Para sa signal na nakukuha mong kapalit — isang naka-rank na listahan ng eksakto kung aling pipeline stages at dimensyon ang nangangailangan ng atensyon — ito ang pinakamurang debugging tool na nagawa ko.
Kung Ano Pa Ang Sira
Ang DeepSeek review A/B experiment ay nangangailangan ng full production prompt. Gumamit ang experiment script ng simplified 15-line prompt. Ang production review ay gumagamit ng 80-line prompt na may anti-repetition rules, catchphrase quotas, editorial guardrails, at duration policy. Gamit ang simplified prompt, nagpakita ang DeepSeek ng essentially neutral results (-0.04). Gamit ang full prompt sa production, ang pipeline ay kumukumpleto nang maayos sa English at Vietnamese. Kailangan kong i-update ang experiment para tumugma sa production at i-rerun.
Ang Chinese localization ay nangangailangan ng validation. Ang rules ay mukhang tama sa papel, ang host profiles ay nasulat na, ang dialogue guides ay nasa lugar na. Pero hindi ko pa naipatakbo ang eval sa bagong Chinese episodes para makumpirmang umangat ang score mula 2.88. Iyan ang prayoridad ngayong linggo.
Kailangan kong i-rerun ang full 40-episode eval sa bagong episodes. Lahat ng anim na fix ay naka-deploy na. Ang susunod na step ay mag-extract ng 40 episodes na na-generate pagkatapos ng mga pagbabagong ito, patakbuhin ang mga ito sa parehong evals, at ikumpara laban sa historical baseline. Kapag ang final script score ay umangat mula 2.91 papuntang lampas ng 3.0, at ang citation credibility ay umangat mula 1.28 papunta sa makatwirang antas, malalaman kong gumana ang mga pagbabago nang end-to-end.
Ang Three-Question Pipeline Audit
Pagkatapos ng karanasang ito, ina-audit ko na ngayon ang bawat pipeline change laban sa tatlong tanong:
1. May quality gate ba sa pagitan ng bawat step? Ang outline ko ay diretso mula Gemini papunta sa user. Ang pagdagdag ng critique step ay nakahuli sa pinakamalalang outlines bago pa man may makakita. Bawat pipeline step ay nangangailangan ng quality check — automated LLM evaluation laban sa explicit criteria.
2. Talaga bang nagpapabuti ng kalidad ang bawat step kapag sinusukat? Ang patakbuhin ito at ipagpalagay na nakakatulong ay hindi sapat. Kailangan mo ng literal na before/after scores sa parehong content. Ang review step ko ay nag-degrade ng scripts nang anim na linggo bago ko ito sinukat. Sukatin muna, huwag mag-assume ng kahit ano.
3. Kaya ko bang tukuyin kung aling dimensyon ang nasira? Ang "pangit ang kalidad" ay hindi actionable. Ang "citation credibility ay 1.28 dahil 100% ng URLs ay opaque redirects" ay actionable. Ang multi-dimensional rubric sa bawat stage ay nagsasabi nang eksakto kung saan titingin. Ilang oras akong nag-imbestiga sa review step ko bago ang eval. Gamit ang eval, ilang segundo lang — direktang itinuro ng mga numero ang publishability at ang review model.
Mga Madalas Itanong
Hindi ba nagiging mahal ang pagpapatakbo ng LLM evaluations?
Ang full 40-episode eval ay nagkakahalaga ng humigit-kumulang $1-2 sa API calls (GPT-5.6-terra, ~420K total tokens). Mas mura pa ang A/B experiments. Para sa signal na nakukuha mo — isang naka-rank na listahan ng eksakto kung aling pipeline stages ang nangangailangan ng atensyon — ito ang pinakamurang debugging tool na nagawa ko, at mas mura kaysa sa credits na sasayangin ng users sa sirang episodes.
Bakit 5 dimensions bawat stage? Bakit hindi na lang "overall quality"?
Ang "overall quality" ay nagsasabi sa iyong may mali. Hindi nito sinasabi kung ano. Nang makita ko ang Citation Credibility sa 1.28, agad kong nalaman na sira ang URLs. Nang makita ko ang Publishability sa 1.95, nalaman kong detectable ang AI tells. Limang dimensyon ang nagbibigay sa iyo ng differential diagnosis. Isang dimensyon ay fever thermometer lang.
Paano mo pinapanatiling consistent ang LLM judge?
Parehong model (GPT-5.6-terra), parehong temperature (0.0), parehong reasoning effort (medium), parehong rubric prompts sa bawat pagkakataon. Ang scores ay naka-archive na may timestamps para maikumpara mo sa pagitan ng mga petsa. Ang pagpapalit ng judge ay nagpapalit ng baseline — pumili ng isa at manatili dito.
Ano ang mangyayari kapag ang judge mismo ay mali?
Ang rubric ay may kasamang required justifications para sa bawat score — kailangang mag-cite ang judge ng specific evidence mula sa content. Gumawa rin ako ng manual qualitative review ng 10 episodes sa lahat ng 7 wika para i-calibrate ang judge. Ang LLM scores ay malapit na tumugma sa aking human judgment. Para sa critical dimensions kung saan maaaring hindi maaasahan ang LLM (tulad ng "publishability," na nangangailangan ng cultural judgment), mahalaga ang human spot-checks.
Binubuo ko ang DIALOGUE, isang AI podcast platform, mag-isa, sa aking mga gabi at weekend. Sinusulat ko ang mga natututunan ko sa daan.
Kung nakagawa ka ng eval system para sa sarili mong LLM pipeline, gusto kong malaman: paano mo sinusukat ang kalidad, at ano ang natuklasan mo na ikinagulat mo?
Iyon lang muna mula sa akin.
Maraming salamat, Chandler