𝟯 LangGraph மறுபதிப்புகள்: தயாரிப்புச் சரிபார்ப்புப் புள்ளிகள் (Production Checkpointing) எனக்குக் கற்றுக்கொடுத்தது என்ன

மூன்று வாரங்களாக, எங்களது onboarding agent தான் சேமிக்க வேண்டிய ஒவ்வொரு வேலையையும் இழந்தது. லாக் (logs) எதையும் காட்டவில்லை. பிழைகள் இல்லை. எச்சரிக்கைகள் இல்லை. checkpointer வெற்றிகரமாகச் செயல்பட்டதாகக் காட்டியது, ஆனால் மீண்டும் தொடங்கும் போது (resume) நிலை (state) காணாமல் போனது.

உண்மையை உணர்வதற்கு முன், அதே LangGraph pipeline-ஐ நான் மூன்று முறை மாற்றி எழுதினேன். அந்த framework நான் சொன்னதைச் சரியாகச் செய்தது. நான் அதற்குத் தவறான வழிமுறைகளையே கொடுத்தேன்.

நீங்கள் தயாரிப்புப் பயன்பாட்டிற்காக (production) stateful agents-களை உருவாக்குகிறீர்கள் என்றால், இயல்புநிலை அமைப்புகள் (defaults) உங்களைக் காப்பாற்றும் என்று நினைக்க வேண்டாம். என்ன உடைந்தது மற்றும் நான் அதை எப்படிச் சரி செய்தேன் என்பது இதோ.

𝗧𝗵𝗲 𝗙𝗶𝗿𝘀𝘁 𝗕𝗿𝗲𝗮𝗸: அமைதியான நிலை இழப்பு (Silent State Loss)

எனது agent ஐந்து படிகளைக் கொண்ட onboarding flow-வை கையாண்டது. பயனர்கள் பின்னர் தொடர ஏதுவாக முன்னேற்றத்தைச் சேமிக்க நான் Postgres-ஐப் பயன்படுத்தினேன். ஆனால் ஒவ்வொரு முறையும் மீண்டும் தொடங்கும் போது முதல் நிலையிலிருந்தே தொடங்கியது.

இதற்குக் காரணம் எனது state schema தான். LangGraph-இல், ஒவ்வொரு node-உம் state-உடன் இணைக்கப்பட வேண்டிய ஒரு மாற்றத்தைத் (update) திருப்பித் தரும். எவ்வாறு இணைப்பது என்று நீங்கள் குறிப்பிடவில்லை என்றால், இயல்பாகவே அது பழைய தரவை அழித்துவிட்டுப் புதியதை மாற்றீடு செய்யும் (overwrite).

எனது செய்திப் பட்டியல் (message list) தொடர்ச்சியாகச் சேரும் என்று நான் நினைத்தேன். ஆனால் அதற்குப் பதிலாக, ஒவ்வொரு புதிய node-உம் முழு வரலாற்றையும் ஒரே ஒரு செய்தியால் மாற்றிவிட்டது. checkpoint தவறான தரவை மிகச் சரியாகச் சேமித்தது.

தீர்வு: தெளிவான reducers உடன் Annotated fields-களைப் பயன்படுத்தவும்.

• செய்திப் பட்டியல்களுக்கு add operator-ஐப் பயன்படுத்தவும். • அகராதிகளுக்கு (dictionaries) ஒரு தனிப்பயன் merge function-ஐப் பயன்படுத்தவும். • "step" போன்ற ஒற்றை மதிப்புகளுக்கு மட்டுமே இயல்புநிலை overwrite-ஐப் பயன்படுத்தவும்.

𝗧𝗵𝗲 𝗦𝗲𝗰𝗼𝗻𝗱 𝗕𝗿𝗲𝗮𝗸: Deserialization மற்றும் Concurrency

இரண்டாவது மறுபதிப்பில் இரண்டு புதிய சிக்கல்கள் ஏற்பட்டன:

  1. சிதைந்த வரிசைகள் (Corrupt rows): நான் state-இல் தனிப்பயன் பொருட்களை (custom objects) சேமித்தேன். serializer அவற்றைக் கையாள முடியவில்லை. இது வரிசைகள் இருப்பதை உறுதி செய்தாலும், அவற்றைப் பயன்படுத்த முடியாத நிலையை உருவாக்கியது.
  2. நகல் விசைகள் (Duplicate keys): நீங்கள் விரைவாகப் பதிலளிக்கவில்லை என்றால் WhatsApp webhooks-களை மீண்டும் முயற்சிக்கும். ஒரே நேரத்தில் இரண்டு செய்திகள் வந்தால், இரண்டு graph runs ஒரே thread-இல் எழுத முயற்சிக்கும். இது database மோதல்களை (collisions) உண்டாக்கியது.

தீர்வுகள்: • தனிப்பயன் பொருட்களை நீக்கவும். சாதாரண dicts மற்றும் நிலையான LangChain வகைகளை (types) மட்டுமே பயன்படுத்தவும். • webhooks-களை graph-க்கு வெளியே கையாளவும். நகல்களைத் தவிர்க்க ஒரு queue மற்றும் idempotency key-ஐப் பயன்படுத்தவும். • ஒரு database lock-ஐச் சேர்க்கவும். ஒரு நேரத்தில் ஒரு thread-இல் ஒரு run மட்டுமே நடப்பதை உறுதி செய்யவும்.

𝗧𝗵𝗲 𝗧𝗵𝗶𝗿𝗱 𝗥𝗲𝘄𝗿𝗶𝘁𝗲: நிலையான முறை (The Stable Pattern)

இறுதி பதிப்பு மூன்று கொள்கைகளில் கவனம் செலுத்தியது:

• சிறிய வரைபடங்கள்: நான் ஒரு மிகப்பெரிய வரைபடத்தை மூன்று சிறிய துணை வரைபடங்களாகப் பிரித்தேன். இது பிழைகளின் பாதிப்பு எல்லையை (blast radius) குறைத்தது. • தெளிவான செக்-பாயிண்ட்கள் (Explicit checkpoints): ஒவ்வொரு நோடிற்குப் பிறகும் செக்-பாயிண்ட் செய்வதை நான் நிறுத்தினேன். அர்த்தமுள்ள தொடக்கப் புள்ளிகளில் (resume points) மட்டுமே நான் செக்-பாயிண்ட் செய்கிறேன். இது தரவுத்தளப் பதிவுகளை (database writes) 60% குறைத்தது. • Idempotent நோட்கள்: இது மிக முக்கியமானது. ஒரு நோட் இரண்டு முறை இயங்கினாலும், அது ஒரே முடிவைத் தர வேண்டும். ஒரு பணி ஏற்கனவே ஸ்டேட்டில் (state) முடிந்துவிட்டது என்பதை ஒரு நோட் கண்டால், அது உடனடியாகத் திரும்பியடையும் (return). இது அதிகச் செலவுமிக்க மாடல் அழைப்புகளுக்கான (model calls) இரட்டைச் செலவைத் தடுக்கிறது.

உங்களுக்கான பாடங்கள்:

  • குறியீட்டை (code) எழுதுவதற்கு முன் reducer semantics-ஐப் படிக்கவும்.
  • ஸ்டேட்டில் (state) தனிப்பயனாக்கப்பட்ட ஆப்ஜெக்ட்களை (custom objects) சேமிக்க வேண்டாம்.
  • கன்கரன்சி கட்டுப்பாட்டை (concurrency control) வரைபடத்திற்கு வெளியே கொண்டு செல்லுங்கள்.
  • ஒவ்வொரு நோடையும் idempotent ஆக மாற்றவும்.

பிரேம்வொர்க் தோல்வியடையவில்லை. எனது அனுமானங்களே தோல்வியடைந்தன.

ஆதாரம்: https://dev.to/elenarevicheva/three-langgraph-rewrites-what-production-checkpointing-actually-taught-me-ok9

விருப்பமான கற்றல் சமூகம்: https://t.me/GyaanSetuAi