ആഴ്ചകളോളം നീണ്ടുനിന്ന നിശബ്ദമായ ഡാറ്റാ നഷ്ടത്തിന് ശേഷം, LangGraph ഏജന്റുകൾക്ക് അവരുടെ സ്റ്റേറ്റ് (state) നിലനിർത്താൻ ഒടുവിൽ വിശ്വസനീയമായ ഒരു മാർഗ്ഗം ലഭിച്ചു. SQLite, റോ (raw) ഒബ്ജക്റ്റ് സ്റ്റോറേജ്, ഇവയുടെ പരാജയപ്പെട്ട പതിപ്പുകൾ എന്നിങ്ങനെ മൂന്ന് പരാജയപ്പെട്ട ചെക്ക്പോയിന്റിംഗ് രീതികൾക്ക് ശേഷം, ഓരോ തവണ ഒരു റിക്വസ്റ്റ് വരുമ്പോഴും ഏജന്റുകൾക്ക് ആദ്യം മുതൽ തുടങ്ങേണ്ടി വരുന്നത് ഒഴിവാക്കാൻ സഹായിക്കുന്ന ഒരു 'അറ്റോമിക്-അപ്ഡേറ്റ് പാറ്റേൺ' (atomic-update pattern) ആണ് ലേഖകൻ കണ്ടെത്തിയത്.
എന്തുകൊണ്ടാണ് LangGraph-ൽ ചെക്ക്പോയിന്റിംഗ് പ്രധാനമാകുന്നത്?
ഒരു സംഭാഷണത്തിൽ മുമ്പ് നടന്ന കാര്യങ്ങൾ ഓർമ്മിച്ചുവെക്കാൻ കഴിയുന്ന രീതിയിൽ LLM കോളുകളെ വീണ്ടും ഉപയോഗിക്കാവുന്ന "ഏജന്റുകളായി" കോർത്തിണക്കാൻ LangGraph ഡെവലപ്പർമാരെ അനുവദിക്കുന്നു. ഈ ഏജന്റുകൾ ഒരു ഉപയോക്താവിന്റെ റിക്വസ്റ്റിനെ ഉപ-ടാസ്ക്കുകളായി (sub-tasks) തിരിക്കുകയും, ഇടക്കാല ഫലങ്ങൾ (intermediate results) സംഭരിക്കുകയും, അടുത്ത തവണ വിളിക്കുമ്പോൾ എവിടെയാണോ നിർത്തിയത് അവിടെ നിന്ന് തുടരുകയും ചെയ്യുന്നു. സംഭരിച്ച സ്റ്റേറ്റ് നഷ്ടപ്പെട്ടാൽ, ഏജന്റ് എല്ലാം വീണ്ടും കണക്കുകൂട്ടേണ്ടി വരും; ഇത് കമ്പ്യൂട്ട് ശേഷി പാഴാക്കാനും, ലേറ്റൻസി (latency) വർദ്ധിപ്പിക്കാനും, മോശം ഉപയോക്തൃ അനുഭവം ഉണ്ടാക്കാനും കാരണമാകുന്നു. ടെലിഗ്രാം സന്ദേശങ്ങൾ കൈകാര്യം ചെയ്യുന്ന ഒരു പ്രൊഡക്ഷൻ ബോട്ടിന്റെ കാര്യത്തിൽ, ഡാറ്റ നഷ്ടപ്പെട്ടത് ആഴ്ചകളോളം നീണ്ട സംഭാഷണ ചരിത്രത്തെ തന്നെ ഇല്ലാതാക്കിയിരുന്നു.
ആദ്യത്തെ പരിഹാരം: SQLite സേവർ
ഒരു സിംഗിൾ ഇൻസ്റ്റൻസ് മാത്രം ഏജന്റിനെ പ്രവർത്തിപ്പിക്കുമ്പോഴാണ് ഇൻ-ബിൽറ്റ് SqliteSaver കൃത്യമായി പ്രവർത്തിക്കുന്നത്. ഇത് ഓരോ ചെക്ക്പോയിന്റും ഒരു ലോക്കൽ SQLite ഫയലിൽ JSON ബ്ലോബ് ആയി എഴുതുന്നു. എന്നാൽ ഡെവലപ്പർ AgentState ടൈപ്പിൽ ഒരു പുതിയ ഫീൽഡ് ചേർക്കുകയും അത് വീണ്ടും ഡെപ്ലോയ് ചെയ്യുകയും ചെയ്തപ്പോഴാണ് പ്രശ്നങ്ങൾ തുടങ്ങിയത്. സ്കീമ മാറ്റത്തിന് മുമ്പ് നിർമ്മിച്ച നിലവിലുള്ള ചെക്ക്പോയിന്റുകളിൽ പുതിയ ഫീൽഡ് ഉണ്ടായിരുന്നില്ല. SqliteSaver ഒരിക്കലും ഒരു മൈഗ്രേഷൻ (migration) നടത്താത്തതിനാൽ, LangGraph അപൂർണ്ണമായ JSON ലോഡ് ചെയ്യുകയും കാണാതായ ഡാറ്റ ഒഴിവാക്കുകയും ചെയ്തു, തൽഫലമായി ഏജന്റ് തുടക്കം മുതൽ തന്നെ വീണ്ടും ആരംഭിച്ചു.
പ്രധാന പോയിന്റ്: സ്കീമ പരിണാമം (schema evolution) ആവശ്യമായ സാഹചര്യങ്ങളിൽ SQLite സ്റ്റോറേജ് ഒരു ഡെമോ ടൂൾ മാത്രമാണ്, പ്രൊഡക്ഷൻ റെഡി ആയ പരിഹാരമല്ല.
രണ്ടാമത്തെ പരിഹാരം: ഒബ്ജക്റ്റ് സ്റ്റോറേജ്
സീരിയലൈസേഷൻ ഫോർമാറ്റിന്മേൽ കൂടുതൽ നിയന്ത്രണം ലഭിക്കുന്നതിനായി, ലേഖകൻ JSON ചെക്ക്പോയിന്റ് Oracle Cloud Object Storage-ലേക്ക് അപ്ലോഡ് ചെയ്യുന്ന ഒരു കസ്റ്റം സേവർ എഴുതി. ഇത് സ്കീമ മാനുവലായി വെർഷൻ ചെയ്യാൻ വഴിയൊരുക്കിയെങ്കിലും, പുതിയൊരു പരാജയ രീതിക്ക് കാരണമായി. രണ്ട് റിക്വസ്റ്റുകൾ ഒരേസമയം ഒരേ സംഭാഷണ ത്രെഡിലേക്ക് വന്നാൽ, രണ്ടും ഒരേ ഒബ്ജക്റ്റിനെ ഓവർറൈറ്റ് ചെയ്യാൻ ശ്രമിച്ചു. ഒബ്ജക്റ്റ് സ്റ്റോറേജ് സേവനങ്ങൾ 'write-once, read-many' പാറ്റേണുകൾക്കായി ഒപ്റ്റിമൈസ് ചെയ്തവയാണ്; അവ അറ്റോമിക് ഓവർറൈറ്റ് സെമാന്റിക്സ് നൽകുന്നില്ല. ഈ റേസ് കണ്ടീഷൻ (race condition) കാരണം തെറ്റായതോ അപൂർണ്ണമായതോ ആയ JSON ഫയലുകൾ ഉണ്ടാവുകയും ഏജന്റ് വീണ്ടും അതിന്റെ കോൺടെക്സ്റ്റ് നഷ്ടപ്പെടുത്തുകയും ചെയ്തു.
പ്രധാന പോയിന്റ്: ഒന്നിലധികം വർക്കർമാർ ഒരേസമയം ഒരേ കീ ഉപയോഗിക്കാൻ സാധ്യതയുള്ളപ്പോൾ ഒബ്ജക്റ്റ് സ്റ്റോറേഷനിലെ സാധാരണ ഓവർറൈറ്റുകൾ സുരക്ഷിതമല്ല.
മൂന്നാമത്തെ പരിഹാരം: വെർഷനിംഗോടു കൂടിയ അറ്റോമിക് അപ്ഡേറ്റുകൾ
അവസാനമായി കണ്ടെത്തിയ സ്ഥിരതയുള്ള ഡിസൈൻ രണ്ട് ആശയങ്ങൾ സംയോജിപ്പിക്കുന്നു: വ്യക്തമായ വെർഷൻ നമ്പറുകളും, ഒബ്ജക്റ്റിന്റെ ETag-നെ (സ്റ്റോറേജ് സർവീസിന്റെ ചെക്ക്സം ഐഡന്റിഫയർ) അടിസ്ഥാനമാക്കിയുള്ള കണ്ടീഷനൽ റൈറ്റുകളും (conditional writes).
- നിലവിലുള്ള ചെക്ക്പോയിന്റ് വായിക്കുക (Read), അതിന്റെ ETag ശേഖരിക്കുക.
- ചെക്ക്പോയിന്റ് എൻവലപ്പിനുള്ളിലെ ഒരു വെർഷൻ ഫീൽഡ് വർദ്ധിപ്പിക്കുക (Increment).
- നേരത്തെ വായിച്ച ETag-മായി ഒത്തുപോകുന്നുണ്ടെങ്കിൽ മാത്രം വിജയിക്കുന്ന ഒരു കണ്ടീഷനൽ റിക്വസ്റ്റ് ഉപയോഗിച്ച് അപ്ഡേറ്റ് ചെയ്ത ചെക്ക്പോയിന്റ് എഴുതുക (Write).
- മറ്റൊരു പ്രോസസ് ഒബ്ജക്റ്റ് മാറ്റം വരുത്തിയത് കാരണം കണ്ടീഷനൽ റൈറ്റ് പരാജയപ്പെട്ടാൽ, ഈ റീഡ്-ഇൻക്രിമെന്റ്-റൈറ്റ് ലൂപ്പ് മുഴുവനായി വീണ്ടും ശ്രമിക്കുക (Retry).
മറ്റൊരു പ്രോസസ് ഫയലിൽ മാറ്റം വരുത്തിയിട്ടില്ലെങ്കിൽ മാത്രമേ റൈറ്റ് വിജയിക്കുകയുള്ളൂ എന്നതിനാൽ, ഒരു സമയത്ത് ഒരു വർക്കറിന് മാത്രമേ പുതിയ സ്റ്റേറ്റ് കമിറ്റ് ചെയ്യാൻ കഴിയൂ. വെർഷൻ ഫീൽഡ് ഉപയോഗിക്കുന്നത് കാലഹരണപ്പെട്ട ചെക്ക്പോയിന്റുകൾ കണ്ടെത്താനും സ്കീമ മാറുമ്പോൾ അവ മൈഗ്രേറ്റ് ചെയ്യാനും എളുപ്പമാക്കുന്നു.
ETag അടിസ്ഥാനമാക്കിയുള്ള കണ്ടീഷനൽ റൈറ്റുകൾ പിന്തുണയ്ക്കുന്ന ഒബ്ജക്റ്റ് സ്റ്റോറേജുകളിൽ ഈ പാറ്റേൺ പ്രവർത്തിക്കും.
AI എഞ്ചിനീയർമാർക്കുള്ള പാഠങ്ങൾ
- പ്രോട്ടോടൈപ്പുകൾക്കായി മാത്രം SQLite ഉപയോഗിക്കുക. പ്രൊഡക്ഷൻ ഏജന്റുകൾക്ക് സ്കീമ മാറ്റങ്ങളും കൺകറന്റ് റൈറ്റുകളും കൈകാര്യം ചെയ്യാൻ കഴിയുന്ന ഒരു സ്റ്റോർ ആവശ്യമാണ്.
- സ്കീമ മൈഗ്രേഷനുകൾ സ്വയം പ്ലാൻ ചെയ്യുക. ടൈപ്പ്ഡ് ഡിക്ഷണറികൾ സ്റ്റാറ്റിക് അനാലിസിസിനായി രൂപങ്ങൾ വിവരിക്കുന്നുണ്ടെങ്കിലും അവ റൺടൈം സ്ട്രക്ചർ നിർബന്ധമാക്കുന്നില്ല.
- സ്റ്റേറ്റിനെ ഒരു പങ്കിട്ട വിഭവം (shared resource) ആയി പരിഗണിക്കുക. കൺകറൻസി ബഗുകൾ നിശബ്ദമായ ഡാറ്റാ നഷ്ടമായിട്ടാണ് പ്രത്യക്ഷപ്പെടുന്നത്; അവ കണ്ടെത്തുന്നത് സാധാരണ എക്സെപ്ഷനുകളേക്കാൾ പ്രയാസകരമാണ്.
- ക്ലൗഡ് പ്രിമിറ്റീവുകൾ ഉപയോഗിക്കുക. ഒരു പ്രത്യേക ലോക്ക് സർവീസ് ഇല്ലാതെ തന്നെ ETag അടിസ്ഥാനമാക്കിയുള്ള കണ്ടീഷനൽ റൈറ്റുകൾ കുറഞ്ഞ ചിലവിൽ ഒപ്റ്റിമിസ്റ്റിക് ലോക്കിംഗ് നൽകുന്നു.
- ഓരോ ഘട്ടവും ലോഗ് ചെയ്യുക. LangGraph അവഗണിക്കുന്ന ഒരു മിസ്സിംഗ് ഫീൽഡ് പോലുള്ള നിശബ്ദമായ പരാജയങ്ങൾ കണ്ടെത്തുക എന്നത് ഏറ്റവും പ്രയാസകരമായ കാര്യമാണ്.
LangGraph ചെക്ക്പോയിന്റിംഗിന്റെ ഭാവി എന്താണ്?
ഇതേ തടസ്സങ്ങൾ നേരിട്ട ടീമുകൾക്ക്, ഈ അറ്റോമിക്-അപ്ഡേറ്റ് രീതി ഒരു വേഗത്തിലുള്ളതും കുറഞ്ഞ ചിലവുള്ളതുമായ പരിഹാരം വാഗ്ദാനം ചെയ്യുന്നു. ഒരു വിശ്വസനീയമായ പ്രൊഡക്ഷൻ പൈപ്പ്ലൈനിന് ഭാരമേറിയ ഒരു സ്റ്റേറ്റ് സ്റ്റോർ ആവശ്യമില്ലെന്നും, കൺകറൻസിയും വെർഷനിംഗും ശ്രദ്ധാപൂർവ്വം കൈകാര്യം ചെയ്താൽ മതിയാകുമെന്നും ഇത് കാണിച്ചുതരുന്നു.
ചുരുക്കത്തിൽ: ലളിതമായ ഒരു വെർഷൻഡ് എൻവലപ്പും കണ്ടീഷനൽ റൈറ്റുകളും ഒരു അസ്ഥിരമായ സിസ്റ്റത്തെ വിശ്വസനീയമായ ഒന്നാക്കി മാറ്റുന്നു. ഇത് ഡാറ്റാ നഷ്ടം മൂലമുള്ള ഡീബഗ്ഗിംഗിൽ കുടുങ്ങിക്കിടക്കാതെ, AI എഞ്ചിനീയർമാർക്ക് ഏജന്റ് ലോജിക്കിൽ കൂടുതൽ ശ്രദ്ധ കേന്ദ്രീകരിക്കാൻ അനുവദിക്കുന്നു.
