நீங்கள் கோவாவிற்கு ஒரு பயணத்தைத் திட்டமிட விரும்புகிறீர்கள். உங்களிடம் ஐந்து நாட்கள், 25,000 ரூபாய் பட்ஜெட் மற்றும் கடற்கரைகள் மற்றும் கடல் உணவுகள் மீதான தெளிவான விருப்பம் உள்ளது. பொதுவாக, இதற்கு பத்து பிரவுசர் டேப்களைத் திறப்பது, காலாவதியான ஃபோரம் பதிவுகளைப் படிப்பது மற்றும் ஒரு பயணத் திட்டத்தை கைமுறையாகத் தயாரிப்பது என்று பொருள். அதற்குப் பதிலாக, ஒரு ஒற்றை POST request-ஐ அனுப்பி, உணவுப் பரிந்துரைகள், செயல்பாடுகளின் பட்டியல் மற்றும் துல்லியமான பட்ஜெட் பிரிவினையுடன் கூடிய கட்டமைக்கப்பட்ட நாள்வாரியான திட்டத்தைப் பெறுவதை கற்பனை செய்து பாருங்கள். இந்தத் திட்டம் அதைத்தான் வழங்குகிறது.

இந்தத் திட்டம் Spring Boot மற்றும் Azure OpenAI ஆகியவற்றைப் பயன்படுத்தி ஒரு REST API-ஐ உருவாக்கும். இந்த API ஒரு இலக்கு (destination), பட்ஜெட், காலம் மற்றும் ஆர்வங்களை ஏற்கும். இது ஒரு frontend அல்லது மொபைல் ஆப் உடனடியாகப் பயன்படுத்தக்கூடிய வகையில் சுத்தமான JSON-ஐத் திருப்பித் தரும். ஸ்கிராப்பிங் (scraping) தேவையில்லை, முன்கூட்டியே தீர்மானிக்கப்பட்ட பயணத் திட்டங்களும் தேவையில்லை. ஒரு பயணத் திட்டமிடுபவராகச் செயல்படத் தூண்டப்பட்ட (prompted) ஒரு AI மாடல் மட்டுமே இதைக் கையாளும்.

API என்ன வழங்குகிறது

இதன் பதில் என்பது நீங்கள் regex மூலம் பிரிக்க வேண்டிய ஒரு Markdown உரைத் தொகுப்பு அல்ல. இது தினசரி செயல்பாடுகள், உணவுப் பரிந்துரைகள் மற்றும் பட்ஜெட் விவரங்களைக் கொண்ட ஒரு கட்டமைக்கப்பட்ட JSON பொருளாகும் (object). ஒரு கோவா பயணத்திற்கு, நீங்கள் ஒரு நாள் பகுதியைத் தரவாகப் பெறலாம்; அதில் கடற்கரை உணவகத்தில் (beach shack) காலை உணவிற்காக 500 ரூபாய், காலையில் Palolem பகுதியில் நேரத்தைச் செலவிடுதல் மற்றும் ஒரு குறிப்பிட்ட பகுதியில் மாலையில் கடல் உணவு இரவு உணவு போன்ற விவரங்கள் இருக்கும். ஒவ்வொரு நாளும் நேரக் காலங்கள் (time slots), மதிப்பிடப்பட்ட செலவுகள் மற்றும் "beach" அல்லது "food" போன்ற டேக்ஸ்களைக் கொண்டிருக்கும். நவீன பயண செயலிகள் (travel apps) பத்திகளைப் (paragraphs) பகுப்பாய்வு செய்ய விரும்புவதில்லை என்பதால் இந்த அமைப்பு முக்கியமானது. அவை RecyclerViews அல்லது React components-களுக்குப் பயன்படுத்தக்கூடிய பொருள்களையே (objects) விரும்புகின்றன.

தொழில்நுட்ப அடுக்கு (The Stack) மற்றும் அது ஏன் பொருத்தமானது

இந்தத் திட்டம் Spring AI உடன் Spring Boot 3.5-ஐப் பயன்படுத்துகிறது. Spring AI தான் இதில் மிக முக்கியமான பகுதி. இது ஒரு ஒருங்கிணைந்த ChatModel அப்ஸ்ட்ராக்ஷனை (abstraction) வழங்குகிறது, இதனால் நீங்கள் Azure OpenAI-க்கு எதிராக நேரடியாக HTTP clients-களை எழுத வேண்டிய அவசியமில்லை. நீங்கள் சேவை குறியீட்டை (service code) மாற்றாமல், டிபென்டென்சிகளையும் (dependencies) பண்புகளையும் (properties) மட்டும் மாற்றினால் போதும்.

உங்கள் build file-இல் நான்கு டிபென்டென்சிகள் தேவை:

  • REST லேயருக்காக spring-boot-starter-web.
  • Spring AI இன் இன்டர்ஃபேஸ் மூலம் LLM உடன் இணைக்க spring-ai-starter-model-azure-openai.
  • தானியங்கி Swagger ஆவணமாக்கலுக்கு (documentation) springdoc-openapi.
  • உங்கள் request மற்றும் response POJOs-களில் உள்ள போயிலர்ப்ளேட் (boilerplate) குறியீட்டைக் குறைக்க Lombok.

Spring AI உங்கள் பிசினஸ் லாஜிக் மற்றும் LLM ப்ரொவைடர் ஆகியவற்றுக்கு இடையில் அமைகிறது. இந்த நிலைப்பாடு திட்டமிடப்பட்ட ஒன்றுதான். இது உங்கள் @Service வகுப்புகளைத் தூய்மையாகவும், எந்தவொரு குறிப்பிட்ட ப்ரொவைடரையும் சார்ந்து இல்லாமலும் (provider-agnostic) வைத்திருக்க உதவுகிறது.

PromptTemplates மூலம் Prompt Engineering செய்தல்

Java strings-க்குள் prompts-களை நேரடியாகக் கொடுப்பது (Hardcoding) பராமரிக்க முடியாத மென்பொருளை உருவாக்கும் ஒரு விரைவான வழியாகும். தயாரிப்பு குழு (product team) AI இன்னும் இயல்பாகப் பேச வேண்டும் அல்லது ஒரு குறிப்பிட்ட வரம்பிற்கு மேல் பட்ஜெட் மதிப்பீடுகளை மறுக்க வேண்டும் என்று முடிவு செய்தால், நீங்கள் உங்கள் சேவையை மீண்டும் கம்பைல் (recompile) செய்ய வேண்டிய அவசியமில்லை.

Spring AI PromptTemplate-ஐ வழங்குகிறது. நீங்கள் prompt-ன் கட்டமைப்பை ஒரு resource file அல்லது ஒரு பிரத்யேக template string-இல் சேமித்து வைக்கலாம், மேலும் {destination}, {budget}, {days}, மற்றும் {interests} போன்ற மாறிகளுக்கான (variables) இடங்களை (placeholders) விட்டுவிடலாம். ரன்டைமில் (runtime), சேவை ஒரு Prompt பொருளை உருவாக்கி பயனரின் மதிப்புகளை அதில் செலுத்தும்.

System messages-களை user messages-களிலிருந்து தனித்தனியாகப் பிரிக்கவும். ஒரு தனித்துவமான ஆளுமையை (persona) வரையறுக்க system message-ஐப் பயன்படுத்தவும். உதாரணமாக, இந்த மாடல் இந்தியத் தலங்களில் நிபுணத்துவம் பெற்ற, பட்ஜெட் குறித்த விழிப்புணர்வு கொண்ட மற்றும் markdown fences இல்லாமல் JSON மட்டுமே திருப்பித் தருவதில் கண்டிப்பான ஒரு பயணத் திட்டமிடுபவர் என்று நீங்கள் கூறலாம். குறிப்பிட்ட பயண விவரங்களை அனுப்ப user message-ஐப் பயன்படுத்தவும். இந்த பிரிவினை, நீங்கள் பிற்காலத்தில் API ஒப்பந்தத்தை (contract) மாற்றாமல் ஆளுமைகளை (personas) A/B test செய்ய உதவும்.

Service Layer: Azure OpenAI உடன் உரையாடுதல்

@Service வகுப்பிற்கு ஒரு வேலை மட்டுமே உள்ளது. அது prompt-ஐ உருவாக்குகிறது, மாடலை அழைக்கிறது, பதிலைச் சுத்தப்படுத்துகிறது மற்றும் முடிவைப் பகுப்பாய்வு (parse) செய்கிறது.

Spring AI-இன் ChatClient அல்லது ChatModel-ஐ இன்ஜெக்ட் (Inject) செய்யவும். வரும் கோரிக்கை மதிப்புகளைக் கொண்டு PromptTemplate-ஐ ரெண்டர் செய்து, பின்னர் chat முறையை அழைக்கவும். பதில் ஒரு String-ஆக வரும். பல பயிற்சிகள் (tutorials) இத்துடன் நின்றுவிடுகின்றன, ஆனால் உண்மையான புரொடக்ஷன் கோட் (production code) இங்கிருந்துதான் தொடங்குகிறது.

LLM-கள் சில நேரங்களில் மரியாதையான முன்னுரைகளைச் சேர்க்கக்கூடும். "Here is your itinerary" என்று தொடங்கி, பின்னர் மூன்று backticks-க்குள் JSON-ஐக் கொடுக்கும் பதிலை நீங்கள் பெறலாம். அதை நேரடியாக Jackson மூலம் டிசீரியலைஸ் (deserialize) செய்ய முயன்றால், உங்கள் ஆப் கிராஷ் (crash) ஆகிவிடும். ஒரு சிறிய ஹெல்ப்பர் மெத்தடைச் சேர்த்து, அந்த மூல சரத்தை (raw string) ஸ்கேன் செய்து, முதல் திறக்கும் அடைப்புக்குறி (opening brace) மற்றும் கடைசி மூடும் அடைப்புக்குறி (closing brace) ஆகியவற்றைக் கண்டறிந்து, JSON பேலோடை (payload) மட்டும் பிரித்தெடுக்கவும். பின்னர் பிரித்தெடுக்கப்பட்ட தொகுதியை (block) சரிபார்க்கவும். பொருளைக் கண்ட்ரோலருக்குத் திருப்பி அனுப்பும் முன், தேவையான புலங்கள் (fields) உள்ளனவா மற்றும் எண்களின் மதிப்புகள் சரியாக உள்ளனவா என்பதைச் சரிபார்க்கவும்.

இந்தத் தடுப்புப் பகுப்பாய்வு (defensive parsing) என்பது விருப்பத்தேர்வு அல்ல. இது ஒரு டெமோவிற்கும் நம்பகமான API-க்கும் இடையிலான எல்லையாகும்.

முதிர்ந்த ஒரு சிஸ்டம் போல பிழைகளைக் கையாளுதல்

வெளிப்புற API-கள் தோல்வியடையக்கூடும். Azure OpenAI, rate limit பிழைகள், அங்கீகாரத் தோல்விகள் (authentication failures) அல்லது தற்காலிகமான 500 பிழைகளைத் திருப்பித் தரும். இந்தத் தவறுகளை ஸ்டேக் ட்ரேஸாக (stack traces) பயனருக்குத் தெரியப்படுத்தினால், நீங்கள் உங்கள் நம்பகத்தன்மையை இழப்பீர்கள்.

விதிவிலக்குகளை (exceptions) உலகளாவிய ரீதியில் இடைமறிக்க @RestControllerAdvice-ஐப் பயன்படுத்தவும். Spring AI விதிவிலக்குகள், HttpClientErrorException மற்றும் பொதுவான RuntimeException-களை சீரான பிழைப் பதில்களாக (error responses) மாற்றவும். தெளிவான செய்தி, விகிதக் கட்டுப்பாடுகளுக்காக (rate limits) 429 போன்ற HTTP நிலை (status) மற்றும் கிளையண்ட் மீண்டும் முயற்சி செய்ய அல்லது சிக்கலைப் பதிவு செய்ய போதுமான விவரங்களுடன் கூடிய JSON பாடியைத் திருப்பியனுப்பவும். பயனர் "Service temporarily busy. Please retry in 30 seconds" போன்ற ஒன்றையே பார்க்க வேண்டும், Java வகுப்புப் பெயர்கள் (class names) நிறைந்த திரையை அல்ல.

ரகசியத் தகவல்களை (Secrets) ஒருபோதும் நேரடியாகக் குறியீட்டில் (Hardcode) எழுதாதீர்கள்

உங்கள் Azure OpenAI API சாவியை (key) Git-இல் சேமிக்கப்படும் application.properties-இல் வைக்கக்கூடாது. அதை வெளிப்படையான முறையில் (Externalize) வைக்கவும். உங்கள் Spring உள்ளமைப்பில் (configuration) குறிப்பிடப்பட்டுள்ள ${AZURE_OPENAI_KEY} மற்றும் ${AZURE_OPENAI_ENDPOINT} போன்ற சூழல் மாறிகளை (environment variables) பயன்படுத்தவும். மேம்பாட்டிற்காக (development) ஒரு உள்ளூர் .env கோப்பைப் பராமரிக்கவும், அதை .gitignore-இல் சேர்க்கவும், மேலும் Spring Boot-இன் relaxed binding மூலம் அதை ஏற்றவும். ஒரு சாவி கசிந்தால், உங்கள் artifact-ஐ மீண்டும் உருவாக்கத் தேவையில்லை, ஒரே இடத்தில் அதை மாற்றிக்கொள்ள (rotate) முடியும்.

Swagger மூலம் சோதனை செய்தல்

springdoc-openapi சார்பு (dependency) இயங்கும் நேரத்தில் (runtime) ஒரு Swagger UI endpoint-ஐ வழங்குகிறது. உங்கள் பயன்பாடு தொடங்கியதும், உலாவியில் (browser) /swagger-ui.html-ஐத் திறக்கவும். நீங்கள் Goa உதாரணத்தை நேரடியாக நிரப்பலாம்: இலக்கு (destination) "Goa", பட்ஜெட் 25000, நாட்கள் 5, ஆர்வங்கள் "beaches, food". 'execute' என்பதைக் கிளிக் செய்து, JSON பயணத் திட்டத்தை (itinerary) தோன்றச் செய்வதைக் காணவும். இது prompt மாற்றங்களைச் சரிபார்க்கவும், serialization-ஐ உறுதிப்படுத்தவும் மற்றும் இரு தரப்பினரும் unit test எழுதுவதற்கு முன்பே frontend டெவலப்பர்களுடன் ஒரு நேரடிப் பயன்பாட்டுத் தளத்தைப் (live playground) பகிரவும் உதவுகிறது.

குறியீட்டை மாற்றாமல் வழங்குநர்களை (Providers) மாற்றுதல்

ஸ்டார்ட்அப்கள் (Startups) வழங்குநர்களை மாற்றிக்கொண்டே இருக்கும். ஒருவேளை Azure கிரெடிட்கள் காலாவதியாகலாம் அல்லது செலவைக் குறைக்க ஒரு உள்ளூர் Ollama instance மூலம் inference செய்ய விரும்பலாம். Spring AI, ChatModel interface-ஐத் தழுவி (abstracts) இருப்பதால், இந்த மாற்றம் மிகவும் எளிதானது. Maven dependency-ஐ spring-ai-starter-model-azure-openai-லிருந்து மற்றொரு starter-க்கு மாற்றவும், புதிய endpoint மற்றும் சாவியுடன் உங்கள் properties கோப்பைத் புதுப்பிக்கவும், உங்கள் service class-ஐ அப்படியே விடவும். உங்கள் மொபைல் ஆப் பார்க்கும் API ஒப்பந்தம் (contract) அப்படியே இருக்கும்.

அந்தத் தகவமைப்புத் தன்மை (portability) இந்த கட்டமைப்பை (architecture) உண்மையான தயாரிப்புகளுக்கு மிகவும் பயனுள்ளதாக மாற்றுகிறது. நீங்கள் Azure-உடன் பிணைக்கப்படவில்லை. நீங்கள் அதை ஒரு சுத்தமான Spring pipeline-இல் இணைக்கப்பட்ட ஒரு இயந்திரமாக மட்டுமே பயன்படுத்துகிறீர்கள்.

உண்மையான கருத்து (The Real Takeaway)

ஒரு AI மாதிரி உங்கள் பயன்பாடு அல்ல. அது கணிக்க முடியாத உரையைத் திருப்பித் தரும் ஒரு வெளிப்புறச் சேவை. ஒரு கட்டண நுழைவாயில் (payment gateway) அல்லது மூன்றாம் தரப்பு வானிலை API-க்கு நீங்கள் கொடுக்கும் அதே கண்டிப்புடன் இதையும் கையாளவும். உங்கள் சான்றுகளை (credentials) வெளிப்படையான முறையில் வைக்கவும். ஒவ்வொரு பதிலையும் சரிபார்க்கவும். parsing செய்வதற்கு முன் payload-ஐச் சுத்தப்படுத்தவும். உங்கள் பயனர்கள் ஒருபோதும் stack trace-ஐப் பார்க்காதவாறு பிழைகளை உலகளாவிய ரீதியில் கையாளவும்.

25,000 ரூபாய் பட்ஜெட்டில் ஒரு Goa பயணத் திட்டத்தை உருவாக்கும் படைப்புத் திறனை AI-யிடம் விட்டுவிடுங்கள். நீங்கள் அதன் அடிப்படை கட்டமைப்பை (plumbing) கவனித்துக் கொள்ளுங்கள். இவை இரண்டும் தனித்தனியாக இருக்கும்போது, நீங்கள் உண்மையில் பயன்பாட்டிற்குத் தயாரான ஒரு அமைப்பைப் பெறுகிறீர்கள்.

இந்தக் கட்டுரைக்குத் தூண்டுதலாக இருந்த அசல் வழிகாட்டி இங்கே காணப்படலாம்.

Spring AI மற்றும் அது போன்ற திட்டங்களைப் பற்றி விவாதிக்க ஆர்வமாக உள்ளீர்களா? GyaanSetu learning community-இல் இணையுங்கள்.