Developers can now guarantee that the JSON an LLM returns conforms to a predefined shape by wiring Zod schemas into the Vercel AI SDK or Anthropic’s tool-use API, eliminating the runtime crashes that happen when a model adds an unexpected field.

ജനുവരിയിൽ ഒരു ക്ലാസിഫയർ പ്രൊഡക്ഷനിൽ എത്തി മൂന്ന് ആഴ്ചകൾ സുഗമമായി പ്രവർത്തിച്ചതിന് ശേഷം രണ്ടാമതൊരു “explanation” കീ നൽകാൻ തുടങ്ങിയപ്പോൾ, കൃത്യമായ ഒരു സുരക്ഷാ സംവിധാനത്തിന്റെ (guard) ആവശ്യകത പ്രകടമായി. കോഡ് ഒരു ഫീൽഡ് മാത്രമാണ് പ്രതീക്ഷിച്ചിരുന്നത്, അതിനാൽ ആ അധിക കീ ഒരു എക്സെപ്ഷൻ (exception) ഉണ്ടാക്കി—ഒരു കോഡ് ഡെപ്ലോയ്മെന്റും കൂടാതെ തന്നെ. ഈ സംഭവം ഒരു വലിയ പ്രശ്നത്തെ ചൂണ്ടിക്കാണിക്കുന്നു: മിക്ക ട്യൂട്ടോറിയലുകളും JSON.parse(response) എന്നതിൽ അവസാനിക്കുന്നു, മോഡൽ പ്രോംപ്റ്റിലെ സ്കീമに従う (obey) ചെയ്യുമെന്ന് അവർ കരുതുന്നു. എന്നാൽ യഥാർത്ഥത്തിൽ, LLM-കൾ പലപ്പോഴും വ്യതിചലിക്കാറുണ്ട്—കെയ്‌സിംഗ് (casing) മാറ്റുകയോ, പുതിയ ഫീൽഡുകൾ ചേർക്കുകയോ, അല്ലെങ്കിൽ ഔട്ട്‌പുട്ട് മാർക്ക്ഡൗൺ ഫെൻസുകളിൽ (markdown fences) പൊതിയുകയോ ചെയ്തേക്കാം—ഇത് ഡാറ്റാ കറപ്ഷനോ അല്ലെങ്കിൽ പൂർണ്ണമായ പരാജയമോ ആണ് ഉണ്ടാക്കുന്നത്. Vercel AI SDK-ലോ അല്ലെങ്കിൽ Anthropic-ന്റെ tool-use API-ലോ Zod schemas ബന്ധിപ്പിക്കുന്നതിലൂടെ, ഒരു LLM നൽകുന്ന JSON മുൻകൂട്ടി നിശ്ചയിച്ച രൂപത്തിലാണെന്ന് (predefined shape) ഡെവലപ്പർമാർക്ക് ഇപ്പോൾ ഉറപ്പാക്കാം. ഇത് ഒരു മോഡൽ അപ്രതീക്ഷിതമായ ഒരു ഫീൽഡ് ചേർക്കുമ്പോൾ സംഭവിക്കുന്ന runtime crashes ഒഴിവാക്കുന്നു.

എന്തുകൊണ്ടാണ് നേരിട്ടുള്ള JSON പാഴ്സിംഗ് (raw JSON parsing) സുരക്ഷിതമല്ലാത്തത്

LLM-കൾ സഹായിക്കാൻ വേണ്ടിയാണ് പരിശീലിപ്പിക്കപ്പെട്ടിട്ടുള്ളത്, അനുസരിക്കാൻ വേണ്ടിയല്ല. ```json { "category": "string" }


ഇത്തരത്തിലുള്ള ഒരു വ്യതിയാനം പ്രൊഡക്ഷൻ കോഡിൽ എത്തുമ്പോൾ അതിന്റെ പ്രത്യാഘാതം ഉടനടിയായിരിക്കും: ഒരു എക്സെപ്ഷൻ സംഭവിക്കുന്നു, റിക്വസ്റ്റ് പരാജയപ്പെടുന്നു, കൂടാതെ തുടർന്നുള്ള മറ്റ് പിശകുകൾക്കും (downstream errors) ഇത് കാരണമായേക്കാം. വലിയ സർവീസുകളിൽ, ഇത്തരം മിനിറ്റുകൾ നീണ്ടുനിൽക്കുന്ന ഡൗൺടൈം (downtime) വരുമാന നഷ്ടത്തിനും ഉപഭോക്താക്കളുടെ വിശ്വാസം നഷ്ടപ്പെടുന്നതിനും കാരണമാകുന്നു.

## Zod + Vercel AI SDK: മൂന്ന് ഘട്ടങ്ങളുള്ള ഒരു സുരക്ഷാ വല (safety net)

ഒരു മോഡൽ നൽകേണ്ട കൃത്യമായ ഡാറ്റാ രൂപം വിവരിക്കാൻ കഴിയുന്ന ഒരു TypeScript-first സ്കീമ വാലിഡേറ്ററാണ് Zod. Vercel AI SDK-യുടെ `Output.object` ഹെൽപ്പറുമായി ചേർത്ത് ഉപയോഗിക്കുമ്പോൾ, മോഡൽ അതിന്റെ മറുപടി നൽകിയ ഉടൻ തന്നെ വാലിഡേഷൻ സ്വയമേവ നടക്കുന്നു.

1. **സ്കീമ നിർവചിക്കുക (Define the schema)** – ആവശ്യമുള്ള JSON-നെ പ്രതിഫലിപ്പിക്കുന്ന ഒരു Zod ഒബ്ജക്റ്റ് എഴുതുക. ഒരു ലളിതമായ ക്ലാസിഫയറിന് ഇത് `z.object({ category: z.string() })` ആകാം; സങ്കീർണ്ണമായ ഒരു ഇൻവോയ്സ് എക്സ്ട്രാക്റ്ററിന് സ്കീമയിൽ ഒബ്ജക്റ്റുകൾ, അറേകൾ (arrays), ഡിസ്ക്രിമിനേറ്റഡ് യൂണിയനുകൾ (discriminated unions) എന്നിവ ഉൾപ്പെടുത്താം.
2. **അത് SDK-ലേക്ക് നൽകുക** – സ്കീമയെ `Output.object(schema)` ഉപയോഗിച്ച് റാപ്പ് ചെയ്യുക. സ്കീമയ്ക്ക് അനുസൃതമായ ഒരു JSON ബ്ലോക്ക് ഔട്ട്‌പുട്ട് ചെയ്യാൻ മോഡലിനോട് ആവശ്യപ്പെടുന്ന ഒരു പ്രോംപ്റ്റ് SDK ഇൻജക്റ്റ് ചെയ്യുന്നു, കൂടാതെ Zod-ന്റെ `safeParse` ഉപയോഗിച്ച് ഫലം പാഴ്സ് ചെയ്യുന്നു.
3. **പരാജയങ്ങൾ കൈകാര്യം ചെയ്യുക (Handle failures)** – `safeParse` ഒരു എക്സെപ്ഷൻ എറിയുന്നതിന് പകരം ഒരു റിസൾട്ട് ഒബ്ജക്റ്റ് നൽകുന്നു. പാഴ്സിംഗ് പരാജയപ്പെട്ടാൽ, ആ എറർ മോഡലിന് തിരികെ നൽകി വീണ്ടും ശ്രമിക്കുക (retry). കൃത്യമായ വാലിഡേഷൻ മെസേജിന്റെ അടിസ്ഥാനത്തിൽ ഔട്ട്‌പുട്ട് തിരുത്താൻ മോഡലിനോട് നിർദ്ദേശിക്കാം, ഇത് മിക്ക എഡ്ജ് കേസുകളെയും (edge cases) ഒരു സെൽഫ്-ഹീലിംഗ് ലൂപ്പായി (self-healing loop) മാറ്റുന്നു.

പ്രോംപ്റ്റിംഗ്, പാഴ്സിംഗ്, റീട്രൈ ലോജിക് എന്നിവ SDK ഒരൊറ്റ സ്ഥലത്ത് ചെയ്യുന്നതിനാൽ, ഡെവലപ്പർമാർക്ക് പലതരം അഡ്-ഹോക്ക് സ്ട്രിംഗ് മാനിപുലേഷനുകൾക്ക് പകരം ഒരു സിംഗിൾ ടൈപ്പ്-ചെക്ക്ഡ് കോൾ ഉപയോഗിക്കാം.

## Anthropic tool use: സ്ട്രക്ചേർഡ് ഔട്ട്‌പുട്ട് നിർബന്ധമാക്കുന്നു

Anthropic-ന്റെ API-യുമായി നേരിട്ട് പ്രവർത്തിക്കുമ്പോൾ, "tool use" വഴി ഇതേ ഉറപ്പ് നേടാം. ഒരു ടൂളിനെ ഒരു ഫംഗ്ഷനായി നിർവചിക്കുന്നു, അതിന്റെ ഇൻപുട്ട് സ്കീമ JSON Schema-യിൽ പ്രകടിപ്പിക്കുന്നു; സ്കീമ പാലിക്കാൻ കഴിയുമെങ്കിൽ മാത്രമേ Anthropic മോഡൽ ആ ടൂൾ വിളിക്കുകയുള്ളൂ. `tool_choice` എന്നത് `"any"` (അല്ലെങ്കിൽ ഒരു പ്രത്യേക ടൂൾ പേര്) എന്ന് സെറ്റ് ചെയ്യുന്നതിലൂടെ, മോഡൽ ഫ്രീ-ഫോം ടെക്സ്റ്റിന് പകരം ഒരു സ്ട്രക്ചേർഡ് ബ്ലോക്ക് നൽകാൻ നിർബന്ധിതമാക്കപ്പെടുന്നു.

ഇതിന്റെ വർക്ക്ഫ്ലോ Vercel രീതിയെപ്പോലെ തന്നെയാണ്:

- ഒരു Zod സ്കീമ എഴുതുക.
- ടൂൾ ഡെഫനിഷനായി അതിനെ ഒരു JSON Schema പേലോഡിലേക്ക് (payload) മാറ്റുക.
- റിക്വസ്റ്റിൽ ടൂൾ ഉൾപ്പെടുത്തുകയും മോഡൽ അത് ഉപയോഗിക്കാൻ ആവശ്യപ്പെടുകയും ചെയ്യുക.
- `zod.safeParse` ഉപയോഗിച്ച് ടൂളിന്റെ മറുപടി പാഴ്സ് ചെയ്യുക.

മോഡൽ ഇപ്പോഴും തെറ്റായ ഡാറ്റ നൽകുന്നുണ്ടെങ്കിൽ, റിട്രൈ-വിത്ത്-ഫീഡ്‌ബാക്ക് (retry-with-feedback) രീതി തന്നെ ഇവിടെയും ഉപയോഗിക്കാം.

## വാലിഡേഷൻ പരാജയപ്പെടുമ്പോൾ

സ്കീമ കർശനമായി നടപ്പിലാക്കിയിട്ടുണ്ടെങ്കിൽ പോലും, ഇടയ്ക്കിടെ വ്യതിയാനങ്ങൾ സംഭവിക്കാം. കാരണങ്ങൾ ഇവയാണ്:

- **മോഡൽ ഹാളുസിനേഷൻ (Model hallucination)**: മോഡൽ JSON പോലെ തോന്നിക്കുന്നതും എന്നാൽ സിന്റാക്സ് പിശകുകൾ (syntax errors) ഉള്ളതുമായ ഒരു സ്ട്രിംഗ് നിർമ്മിച്ചേക്കാം.
- **പ്രോംപ്റ്റ് ലീക്കേജ് (Prompt leakage)**: മുൻപത്തെ സംഭാഷണങ്ങൾ സ്കീമ ആവശ്യകതയെ മറികടക്കുന്ന ഫോർമാറ്റിംഗ് നിർദ്ദേശങ്ങൾ നൽകിയേക്കാം.
- **വേർഷൻ വ്യത്യാസങ്ങൾ (Version differences)**: പുതിയ മോഡൽ റിലീസുകൾ ടൂൾ കോളുകളെ വ്യാഖ്യാനിക്കുന്ന രീതിയിൽ മാറ്റം വരുത്തിയേക്കാം.

ഇതിനുള്ള പരിഹാരം ഒരു ലഘുവായ റീട്രൈ ലൂപ്പ് (retry loop) ഉപയോഗിക്കുക എന്നതാണ്. പാഴ്സിംഗ് പരാജയപ്പെട്ടാൽ, കോഡ് “Your last output was not valid JSON. It contained … Please return only the fields defined in the schema.” എന്നതുപോലെയുള്ള ഒരു ഫോളോ-അപ്പ് പ്രോംപ്റ്റ് അയക്കുന്നു. വാലിഡേഷൻ എറർ വ്യക്തമായതിനാൽ, മനുഷ്യ ഇടപെടലില്ലാതെ തന്നെ മോഡലിന് സ്വയം തിരുത്താൻ കഴിയും.

## പെർഫോമൻസ്, ചിലവ് എന്നിവയെക്കുറിച്ചുള്ള പരിഗണനകൾ

Zod validation ചേർക്കുന്നത് വളരെ കുറഞ്ഞ CPU overhead മാത്രമേ ഉണ്ടാക്കുന്നുള്ളൂ—സാധാരണ payloads-കളിൽ `safeParse` ഓപ്പറേഷൻ മൈക്രോസെക്കൻഡുകൾക്കുള്ളിൽ നടക്കുന്നു. Network latency മാറുന്നില്ല; ഒരു retry-യ്ക്കുള്ള അധിക round-trip അപൂർവ്വമായി സംഭവിക്കുന്ന പരാജയങ്ങളിൽ മാത്രമേ ഉണ്ടാകുന്നുള്ളൂ. പ്രായോഗികമായി പറഞ്ഞാൽ, ഒരു exception ഒഴിവാക്കുന്നതിലൂടെ ലഭിക്കുന്ന ഗുണം, റിക്വസ്റ്റ് സമയത്തിലുണ്ടാകുന്ന ചെറിയ വർദ്ധനവിനേക്കാൾ വളരെ വലുതാണ്.

## എതിർവാദം: schema enforcement അമിതമാണോ?

കർശനമായ schemas മോഡലിന്റെ ഫ്ലെക്സിബിലിറ്റിയെ പരിമിതപ്പെടുത്തുന്നു എന്ന് ചില ഡെവലപ്പർമാർ വാദിക്കുന്നു, പ്രത്യേകിച്ച് പുതിയ ഫീൽഡുകൾ മൂല്യവത്തായ വിവരങ്ങൾ (context) നൽകാൻ സാധ്യതയുള്ളപ്പോൾ. സുരക്ഷയും (safety) തുറന്ന സമീപനവും (openness) തമ്മിലുള്ള ഒരു ബാലൻസിംഗ് ആണ് ഇവിടെ വേണ്ടത്. പേയ്‌മെന്റ് പ്രോസസ്സിംഗ്, ഐഡന്റിറ്റി വെരിഫിക്കേഷൻ, കംപ്ലയൻസ് റിപ്പോർട്ടിംഗ് തുടങ്ങിയ നിർണ്ണായകമായ (mission-critical) സേവനങ്ങളിൽ പ്രെഡിക്റ്റബിലിറ്റിക്ക് (predictability) ആണ് മുൻഗണന. പരീക്ഷണാടിസ്ഥാനത്തിലുള്ള പ്രോട്ടോടൈപ്പുകളിൽ (exploratory prototypes) കുറച്ചുകൂടി അയഞ്ഞ സമീപനം സ്വീകരിക്കാം, എങ്കിലും അവിടെ പോലും ഒരു ചെറിയ സുരക്ഷാ സംവിധാനം (ഉദാഹരണത്തിന്, `z.object({}).passthrough()`) ഉപയോഗിക്കുന്നത് ഉപയോഗപ്രദമായ എക്സ്റ്റൻഷനുകൾ ഒഴിവാക്കാതെ തന്നെ വലിയ പാഴ്സിംഗ് പിശകുകൾ (catastrophic parsing errors) തടയാൻ സഹായിക്കും.

## ഇനി ശ്രദ്ധിക്കേണ്ട കാര്യങ്ങൾ

- **SDK evolution**: Vercel-ന്റെ AI SDK റോഡ്മാപ്പിൽ ഇൻ-ബിൽറ്റ് റിട്രൈ പോളിസികളും (retry policies) കൂടുതൽ മെച്ചപ്പെട്ട എറർ റിപ്പോർട്ടിംഗും ഉൾപ്പെടുന്നു, ഇത് പിശകുകൾ പരിഹരിക്കുന്ന പ്രക്രിയയെ (repair loop) കൂടുതൽ ലളിതമാക്കും.
- **Tooling standardization**: കൂടുതൽ പ്രൊവൈഡർമാർ tool-use കൺവെൻഷനുകൾ സ്വീകരിച്ചു വരുമ്പോൾ, വിവിധ പ്രൊവൈഡർമാർക്കും ഉപയോഗിക്കാൻ കഴിയുന്ന schema validators വരാൻ സാധ്യതയുണ്ട്, ഇത് ഓരോ പ്രൊവൈഡറിനും പ്രത്യേകമായി വേണ്ട അഡാപ്റ്ററുകളുടെ (adapters) ആവശ്യം കുറയ്ക്കും.
- **Community patterns**: ഓപ്പൺ സോഴ്സ് ലൈബ്രറികൾ Zod schemas-കളെ പ്രോംപ്റ്റ് ടെംപ്ലേറ്റുകളുമായി (prompt templates) സംയോജിപ്പിക്കാൻ തുടങ്ങിയിട്ടുണ്ട്, ഇത് “schema-first” വർക്ക്ഫ്ലോയെ ഒരു പുനരുപയോഗിക്കാവുന്ന ആസ്തിയാക്കി മാറ്റുന്നു.

## ചുരുക്കത്തിൽ

ഒരു Zod schema-യെ മോഡലിന് ലംഘിക്കാൻ കഴിയാത്ത ഒരു കരാറായി (contract) പരിഗണിക്കുന്നതിലൂടെ, ഡെവലപ്പർമാർക്ക് ദുർബലമായ `JSON.parse` രീതികളിൽ നിന്ന് ഒരു ഡെറ്റർമിനിസ്റ്റിക് പൈപ്പ്‌ലൈനിലേക്ക് (deterministic pipeline) മാറാൻ സാധിക്കുന്നു. ഇവിടെ അപ്രതീക്ഷിതമായ ഫീൽഡുകൾ ഉണ്ടായാൽ അത് നിയന്ത്രിതമായ ഒരു വാലിഡേഷൻ പരാജയമായിരിക്കും (controlled validation failure), അല്ലാതെ പ്രൊഡക്ഷൻ ക്രാഷ് (production crash) ആകില്ല. Vercel-ന്റെ `Output.object` ഹെൽപ്പറും Anthropic-ന്റെ tool-use മെക്കാനിസവും ചേരുമ്പോൾ, LLM-കൾ പ്രവചനാതീതമായ ടെക്സ്റ്റ് ജനറേറ്ററുകളിൽ നിന്ന് വിശ്വസനീയമായ ഡാറ്റാ പ്രൊവൈഡറുകളായി മാറുന്നു. ഇത് ടീമുകളെ അവസാനമില്ലാത്ത എഡ്ജ്-കേസ് ഡിബഗ്ഗിംഗിന് (edge-case debugging) പകരം ബിസിനസ് ലോജിക്കിൽ ശ്രദ്ധ കേന്ദ്രീകരിക്കാൻ അനുവദിക്കുന്നു.