ਤੁਸੀਂ ਗੋਆ ਦੀ ਯਾਤਰਾ ਦੀ ਯੋਜਨਾ ਬਣਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ। ਤੁਹਾਡੇ ਕੋਲ ਪੰਜ ਦਿਨ ਹਨ, 25,000 ਰੁਪਏ ਦਾ ਬਜਟ ਹੈ, ਅਤੇ ਸਮੁੰਦਰੀ ਤੱਟਾਂ (beaches) ਅਤੇ ਸੀਫੂਡ (seafood) ਲਈ ਸਪੱਸ਼ਟ ਪਸੰਦ ਹੈ। ਆਮ ਤੌਰ 'ਤੇ, ਇਸਦਾ ਮਤਲਬ ਹੈ ਦਸ ਬ੍ਰਾਊਜ਼ਰ ਟੈਬ ਖੋਲ੍ਹਣਾ, ਪੁਰਾਣੀਆਂ ਫੋਰਮ ਪੋਸਟਾਂ ਪੜ੍ਹਨਾ, ਅਤੇ ਮੈਨੂਅਲੀ ਇੱਕ ਯਾਤਰਾ ਯੋਜਨਾ (itinerary) ਤਿਆਰ ਕਰਨਾ। ਇਸਦੇ ਬਜਾਏ, ਇੱਕ ਸਿੰਗਲ POST request ਭੇਜਣ ਅਤੇ ਖਾਣ-ਪੀਣ ਦੇ ਸੁਝਾਵਾਂ, ਗਤੀਵਿਧੀਆਂ ਦੀਆਂ ਸੂਚੀਆਂ, ਅਤੇ ਇੱਕ ਸਹੀ ਬਜਟ ਵੰਡ ਦੇ ਨਾਲ ਇੱਕ ਸੰਰਚਿਤ ਦਿਨ-ਦਰ-ਦਿਨ ਯੋਜਨਾ ਪ੍ਰਾਪਤ ਕਰਨ ਬਾਰੇ ਸੋਚੋ। ਇਹ ਪ੍ਰੋਜੈਕਟ ਉਹੀ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ।

ਅਸੀਂ Spring Boot ਅਤੇ Azure OpenAI ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਇੱਕ REST API ਬਣਾਵਾਂਗੇ। API ਮੰਜ਼ਿਲ (destination), ਬਜਟ, ਸਮਾਂ ਅਤੇ ਦਿਲਚਸਪੀਆਂ ਨੂੰ ਸਵੀਕਾਰ ਕਰਦਾ ਹੈ। ਇਹ ਸਾਫ਼ JSON ਵਾਪਸ ਕਰਦਾ ਹੈ ਜਿਸ ਨੂੰ ਫਰੰਟਐਂਡ ਜਾਂ ਮੋਬਾਈਲ ਐਪ ਤੁਰੰਤ ਰੈਂਡਰ ਕਰ ਸਕਦੀ ਹੈ। ਕੋਈ ਸਕ੍ਰੇਪਿੰਗ (scraping) ਨਹੀਂ। ਕੋਈ ਹਾਰਡਕੋਡ ਕੀਤੀਆਂ ਯੋਜਨਾਵਾਂ ਨਹੀਂ। ਬੱਸ ਇੱਕ AI ਮਾਡਲ ਜਿਸ ਨੂੰ ਟ੍ਰੈਵਲ ਪਲਾਨਰ ਵਜੋਂ ਕੰਮ ਕਰਨ ਲਈ ਪ੍ਰੋਂਪਟ ਕੀਤਾ ਗਿਆ ਹੈ।

API ਕੀ ਵਾਪਸ ਕਰਦਾ ਹੈ

ਜਵਾਬ Markdown ਟੈਕਸਟ ਦਾ ਇੱਕ ਬਲਾਕ ਨਹੀਂ ਹੈ ਜਿਸ ਨੂੰ ਤੁਹਾਨੂੰ regex ਰਾਹੀਂ ਵੱਖ ਕਰਨਾ ਪਵੇ। ਇਹ ਇੱਕ ਸੰਰਚਿਤ JSON ਆਬਜੈਕਟ ਹੈ ਜਿਸ ਵਿੱਚ ਰੋਜ਼ਾਨਾ ਦੀਆਂ ਗਤੀਵਿਧੀਆਂ, ਖਾਣ-ਪੀਣ ਦੇ ਸੁਝਾਅ ਅਤੇ ਬਜਟ ਦਾ ਵੇਰਵਾ ਸ਼ਾਮਲ ਹੈ। ਗੋਆ ਦੀ ਯਾਤਰਾ ਲਈ, ਤੁਹਾਨੂੰ ਇੱਕ ਪਹਿਲੇ ਦਿਨ ਦਾ ਹਿੱਸਾ ਮਿਲ ਸਕਦਾ ਹੈ ਜੋ ਬੀਚ ਸ਼ੈਕ (beach shack) ਵਿੱਚ ਨਾਸ਼ਤੇ ਲਈ 500 ਰੁਪਏ, ਪਾਲੋਲਮ (Palolem) ਵਿੱਚ ਸਵੇਰ, ਅਤੇ ਇੱਕ ਖਾਸ ਇਲਾਕੇ ਵਿੱਚ ਸ਼ਾਮ ਦੇ ਸੀਫੂਡ ਡਿਨਰ ਲਈ ਅਲਾਟ ਕਰਦਾ ਹੈ। ਹਰੇਕ ਦਿਨ ਵਿੱਚ ਸਮਾਂ ਸਲੌਟ, ਅਨੁਮਾਨਿਤ ਲਾਗਤ, ਅਤੇ "beach" ਜਾਂ "food" ਵਰਗੇ ਟੈਗ ਹੁੰਦੇ ਹਨ। ਇਹ ਸੰਰਚਨਾ ਮਹੱਤਵਪੂਰਨ ਹੈ ਕਿਉਂਕਿ ਆਧੁਨਿਕ ਟ੍ਰੈਵਲ ਐਪਸ ਪੈਰਾਗ੍ਰਾਫਾਂ ਨੂੰ ਪਾਰਸ (parse) ਨਹੀਂ ਕਰਨਾ ਚਾਹੁੰਦੀਆਂ। ਉਹ ਆਬਜੈਕਟ ਚਾਹੁੰਦੀਆਂ ਹਨ ਜਿਨ੍ਹਾਂ ਨੂੰ ਉਹ RecyclerViews ਜਾਂ React components ਨਾਲ ਮੈਪ ਕਰ ਸਕਣ।

ਸਟੈਕ ਅਤੇ ਇਹ ਕਿਉਂ ਢੁਕਵਾਂ ਹੈ

ਪ੍ਰੋਜੈਕਟ Spring AI ਦੇ ਨਾਲ Spring Boot 3.5 ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ। Spring AI ਇੱਕ ਮਹੱਤਵਪੂਰਨ ਹਿੱਸਾ ਹੈ। ਇਹ ਇੱਕ 通합 (unified) ChatModel ਅਬਸਟਰੈਕਸ਼ਨ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ ਤਾਂ ਜੋ ਤੁਹਾਨੂੰ Azure OpenAI ਦੇ ਵਿਰੁੱਧ ਰੋਅ (raw) HTTP ਕਲਾਇੰਟ ਨਾ ਲਿਖਣੇ ਪੈਣ। ਤੁਸੀਂ ਡਿਪੈਂਡੈਂਸੀਆਂ (dependencies) ਅਤੇ ਪ੍ਰੋਪਰਟੀਜ਼ ਨੂੰ ਬਦਲਦੇ ਹੋ

ਐਕਸੈਪਸ਼ਨਾਂ (exceptions) ਨੂੰ ਗਲੋਬਲੀ ਤਰੀਕੇ ਨਾਲ ਇੰਟਰਸੈਪਟ ਕਰਨ ਲਈ @RestControllerAdvice ਦੀ ਵਰਤੋਂ ਕਰੋ। Spring AI ਐਕਸੈਪਸ਼ਨਾਂ, HttpClientErrorException, ਅਤੇ ਜੈਨਰਿਕ RuntimeExceptions ਨੂੰ ਇੱਕਸਾਰ ਐਰਰ ਰਿਸਪਾਂਸਾਂ (error responses) ਨਾਲ ਮੈਪ ਕਰੋ। ਇੱਕ JSON ਬਾਡੀ ਰਿਟਰਨ ਕਰੋ ਜਿਸ ਵਿੱਚ ਇੱਕ ਸਪਸ਼ਟ ਸੁਨੇਹਾ, ਰੇਟ ਲਿਮਿਟਾਂ ਲਈ 429 ਵਰਗਾ HTTP ਸਟੇਟਸ, ਅਤੇ ਕਲਾਇੰਟ ਲਈ ਇਸ਼ੂ ਨੂੰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਜਾਂ ਲੌਗ ਕਰਨ ਲਈ ਲੋੜੀਂਦੀ ਜਾਣਕਾਰੀ ਹੋਵੇ। ਯੂਜ਼ਰ ਨੂੰ "Service temporarily busy. Please retry in 30 seconds" ਵਰਗਾ ਕੁਝ ਦਿਖਾਈ ਦੇਣਾ ਚਾਹੀਦਾ ਹੈ, ਨਾ ਕਿ Java ਕਲਾਸ ਦੇ ਨਾਮਾਂ ਨਾਲ ਭਰੀ ਹੋਈ ਸਕ੍ਰੀਨ।

ਕਦੇ ਵੀ Secrets ਨੂੰ Hardcode ਨਾ ਕਰੋ

ਤੁਹਾਡੀ Azure OpenAI API key ਨੂੰ Git ਵਿੱਚ ਚੈੱਕ ਕੀਤੇ ਗਏ application.properties ਵਿੱਚ ਨਹੀਂ ਰੱਖਣਾ ਚਾਹੀਦਾ। ਇਸਨੂੰ externalize ਕਰੋ। ਆਪਣੀ Spring configuration ਵਿੱਚ ਰੈਫਰੈਂਸ ਕੀਤੇ ਗਏ environment variables ਦੀ ਵਰਤੋਂ ਕਰੋ, ਜਿਵੇਂ ਕਿ ${AZURE_OPENAI_KEY} ਅਤੇ ${AZURE_OPENAI_ENDPOINT}। ਡਿਵੈਲਪਮੈਂਟ ਲਈ ਇੱਕ ਸਥਾਨਕ .env ਫਾਈਲ ਰੱਖੋ, ਇਸਨੂੰ .gitignore ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ, ਅਤੇ ਇਸਨੂੰ Spring Boot ਦੇ relaxed binding ਰਾਹੀਂ ਲੋਡ ਕਰੋ। ਜੇਕਰ ਕੋਈ key ਲੀਕ ਹੋ ਜਾਂਦੀ ਹੈ, ਤਾਂ ਤੁਸੀਂ ਆਪਣੇ artifact ਨੂੰ ਦੁਬਾਰਾ ਬਣਾਉਣ ਦੀ ਬਜਾਏ ਸਿਰਫ਼ ਇੱਕੋ ਥਾਂ 'ਤੇ ਇਸਨੂੰ ਰੋਟੇਟ (rotate) ਕਰ ਸਕਦੇ ਹੋ।

Swagger ਰਾਹੀਂ ਟੈਸਟਿੰਗ

springdoc-openapi ਡਿਪੈਂਡੈਂਸੀ (dependency) runtime 'ਤੇ ਇੱਕ Swagger UI endpoint ਪ੍ਰਦਾਨ ਕਰਦੀ ਹੈ। ਇੱਕ ਵਾਰ ਜਦੋਂ ਤੁਹਾਡੀ ਐਪਲੀਕੇਸ਼ਨ ਸ਼ੁਰੂ ਹੋ ਜਾਂਦੀ ਹੈ, ਤਾਂ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ /swagger-ui.html ਖੋਲ੍ਹੋ। ਤੁਸੀਂ Goa ਦੀ ਉਦਾਹਰਣ ਨੂੰ ਸਿੱਧੇ ਤੌਰ 'ਤੇ ਭਰ ਸਕਦੇ ਹੋ: destination ਵਜੋਂ "Goa," budget ਵਜੋਂ 25000, days ਵਜੋਂ 5, ਅਤੇ interests ਵਜੋਂ "beaches, food।" Execute 'ਤੇ ਕਲਿੱਕ ਕਰੋ ਅਤੇ JSON itinerary ਨੂੰ ਪ੍ਰਗਟ ਹੁੰਦੇ ਦੇਖੋ। ਇਹ ਤੁਹਾਨੂੰ prompt ਤਬਦੀਲੀਆਂ ਨੂੰ ਵੈਲੀਡੇਟ ਕਰਨ, serialization ਦੀ ਜਾਂਚ ਕਰਨ ਅਤੇ ਯੂਨਿਟ ਟੈਸਟ ਲਿਖਣ ਤੋਂ ਪਹਿਲਾਂ ਫਰੰਟਐਂਡ ਡਿਵੈਲਪਰਾਂ ਨਾਲ ਇੱਕ ਲਾਈਵ ਪਲੇਗਰਾਊਂਡ ਸਾਂਝਾ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦਾ ਹੈ।

ਕੋਡ ਨੂੰ ਦੁਬਾਰਾ ਲਿਖੇ ਬਿਨਾਂ Providers ਬਦਲਣਾ

ਸਟਾਰਟਅੱਪਸ providers ਬਦਲਦੇ ਰਹਿੰਦੇ ਹਨ। ਹੋ ਸਕਦਾ ਹੈ ਕਿ Azure credits ਖਤਮ ਹੋ ਜਾਣ, ਜਾਂ ਤੁਸੀਂ ਲਾਗਤ ਘਟਾਉਣ ਲਈ ਇੱਕ ਸਥਾਨਕ Ollama instance 'ਤੇ inference ਚਲਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ। ਕਿਉਂਕਿ Spring AI ChatModel interface ਨੂੰ abstract ਕਰਦਾ ਹੈ, ਇਸ ਲਈ ਇਹ ਬਦਲਾਅ ਬਹੁਤ ਆਸਾਨ (mechanical) ਹੈ। Maven dependency ਨੂੰ spring-ai-starter-model-azure-openai ਤੋਂ ਬਦਲ ਕੇ ਕਿਸੇ ਹੋਰ starter ਵਿੱਚ ਬਦਲੋ, ਆਪਣੀ properties ਫਾਈਲ ਨੂੰ ਨਵੇਂ endpoint ਅਤੇ key ਨਾਲ ਅਪਡੇਟ ਕਰੋ, ਅਤੇ ਆਪਣੀ service class ਨੂੰ ਉਵੇਂ ਹੀ ਰਹਿਣ ਦਿਓ। ਤੁਹਾਡੀ ਮੋਬਾਈਲ ਐਪ ਦੁਆਰਾ ਦੇਖਿਆ ਜਾਣ ਵਾਲਾ API contract ਬਿਲਕੁਲ ਉਹੀ ਰਹੇਗਾ।

ਉਹ portability ਇਸ architecture ਨੂੰ ਅਸਲ ਉਤਪਾਦਾਂ (real products) ਲਈ ਖਾਸ ਤੌਰ 'ਤੇ ਉਪਯੋਗੀ ਬਣਾਉਂਦੀ ਹੈ। ਤੁਸੀਂ Azure ਨਾਲ ਵਿਆਹ ਨਹੀਂ ਕਰ ਰਹੇ। ਤੁਸੀਂ ਇਸਦੀ ਵਰਤੋਂ ਇੱਕ ਸਾਫ਼ Spring pipeline ਵਿੱਚ ਲੱਗੇ ਇੱਕ ਇੰਜਣ ਵਜੋਂ ਕਰ ਰਹੇ ਹੋ।

ਅਸਲ ਸਿੱਖਿਆ

ਇੱਕ AI ਮਾਡਲ ਤੁਹਾਡੀ ਐਪਲੀਕੇਸ਼ਨ ਨਹੀਂ ਹੈ। ਇਹ ਇੱਕ ਬਾਹਰੀ ਸੇਵਾ (external service) ਹੈ ਜੋ ਅਨਿਸ਼ਚਿਤ ਟੈਕਸਟ ਵਾਪਸ ਕਰਦੀ ਹੈ। ਇਸ ਨਾਲ ਉਸੇ ਸਖ਼ਤੀ ਨਾਲ ਨਿਪਟਾਓ ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਇੱਕ payment gateway ਜਾਂ ਕਿਸੇ third-party weather API ਨਾਲ ਨਿਪਟਾਉਂਦੇ ਹੋ। ਆਪਣੇ credentials ਨੂੰ externalize ਕਰੋ। ਹਰ ਰਿਸਪਾਂਸ ਨੂੰ ਵੈਲੀਡੇਟ ਕਰੋ। Parsing ਤੋਂ ਪਹਿਲਾਂ payload ਨੂੰ ਸਾਫ਼ ਕਰੋ। ਐਰਰਾਂ ਨੂੰ ਗਲੋਬਲੀ ਤਰੀਕੇ ਨਾਲ ਸੰਭਾਲੋ ਤਾਂ ਜੋ ਤੁਹਾਡੇ ਯੂਜ਼ਰਾਂ ਨੂੰ ਕਦੇ ਵੀ stack trace ਨਾ ਦਿਖਾਈ ਦੇਵੇ।

AI ਨੂੰ 25,000 ਰੁਪਏ ਦੇ ਬਜਟ 'ਤੇ Goa itinerary ਬਣਾਉਣ ਦਾ ਰਚਨਾਤਮਕ ਕੰਮ ਕਰਨ ਦਿਓ। ਤੁਸੀਂ plumbing (ਬੁਨਿਆਦੀ ਢਾਂਚਾ) ਸੰਭਾਲੋ। ਜਦੋਂ ਇਹ ਦੋਵੇਂ ਵੱਖਰੇ ਰਹਿੰਦੇ ਹਨ, ਤਾਂ ਤੁਹਾਨੂੰ ਇੱਕ ਅਜਿਹਾ ਸਿਸਟਮ ਮਿਲਦਾ ਹੈ ਜੋ ਅਸਲ ਵਿੱਚ ਕੰਮ ਕਰਦਾ ਹੈ।

ਇਸ ਲੇਖ ਤੋਂ ਪ੍ਰੇਰਿਤ ਅਸਲ walkthrough ਇੱਥੇ ਦੇਖਿਆ ਜਾ ਸਕਦਾ ਹੈ

ਕੀ ਤੁਸੀਂ Spring AI ਅਤੇ ਇਸ ਤਰ੍ਹਾਂ ਦੇ ਪ੍ਰੋਜੈਕਟਾਂ ਬਾਰੇ ਚਰਚਾ ਕਰਨ ਵਿੱਚ ਦਿਲਚਸਪੀ ਰੱਖਦੇ ਹੋ? GyaanSetu learning community ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਵੋ।