ನೀವು ಗೋವಾದ ಪ್ರವಾಸವನ್ನು ಯೋಜಿಸಲು ಬಯಸುತ್ತೀರಿ. ನಿಮ್ಮ ಬಳಿ ಐದು ದಿನಗಳು, 25,000 ರೂಪಾಯಿಗಳ ಬಜೆಟ್ ಮತ್ತು ಸಮುದ್ರ ತೀರ ಹಾಗೂ ಸೀಫುಡ್ (seafood) ಮೇಲಿನ ಸ್ಪಷ್ಟ ಆದ್ಯತೆ ಇದೆ. ಸಾಮಾನ್ಯವಾಗಿ, ಇದರರ್ಥ ಹತ್ತು ಬ್ರೌಸರ್ ಟ್ಯಾಬ್‌ಗಳನ್ನು ತೆರೆಯುವುದು, ಹಳೆಯ ಫೋರಂ ಪೋಸ್ಟ್‌ಗಳನ್ನು ಓದುವುದು ಮತ್ತು ಮ್ಯಾನುಯಲ್ ಆಗಿ ಪ್ರವಾಸದ ವಿವರಗಳನ್ನು (itinerary) ಸಿದ್ಧಪಡಿಸುವುದು ಎಂದರ್ಥ. ಬದಲಾಗಿ, ಕೇವಲ ಒಂದು POST request ಕಳುಹಿಸಿ, ಊಟದ ಸಲಹೆಗಳು, ಚಟುವಟಿಕೆಗಳ ಪಟ್ಟಿ ಮತ್ತು ನಿಖರವಾದ ಬಜೆಟ್ ವಿಂಗಡಣೆಯೊಂದಿಗೆ ರಚನಾತ್ಮಕ ದಿನನಿತ್ಯದ ಯೋಜನೆಯನ್ನು ಪಡೆಯುವುದನ್ನು ಕಲ್ಪಿಸಿಕೊಳ್ಳಿ. ಈ ಪ್ರಾಜೆಕ್ಟ್ ಅಂತಹದ್ದೇ ಅನುಭವವನ್ನು ನೀಡುತ್ತದೆ.

ನಾವು Spring Boot ಮತ್ತು Azure OpenAI ಬಳಸಿ ಒಂದು REST API ಅನ್ನು ನಿರ್ಮಿಸುತ್ತೇವೆ. ಈ API ತಲುಪುವ ಸ್ಥಳ (destination), ಬಜೆಟ್, ಅವಧಿ ಮತ್ತು ಆಸಕ್ತಿಗಳನ್ನು ಸ್ವೀಕರಿಸುತ್ತದೆ. ಇದು ಫ್ರಂಟ್‌ಎಂಡ್ ಅಥವಾ ಮೊಬೈಲ್ ಆಪ್‌ನಲ್ಲಿ ತಕ್ಷಣವೇ ಪ್ರದರ್ಶಿಸಬಹುದಾದ ಸ್ವಚ್ಛವಾದ JSON ಅನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ. ಯಾವುದೇ ಸ್ಕ್ರೇಪಿಂಗ್ (scraping) ಇಲ್ಲ, ಹಾರ್ಡ್‌ಕೋಡ್ ಮಾಡಲಾದ ಪ್ರವಾಸದ ವಿವರಗಳೂ ಇಲ್ಲ. ಕೇವಲ ಪ್ರವಾಸದ ಯೋಜಕನಂತೆ (travel planner) ಕಾರ್ಯನಿರ್ವಹಿಸಲು ಪ್ರಾಂಪ್ಟ್ ಮಾಡಲಾದ AI ಮಾಡೆಲ್ ಮಾತ್ರ ಇರುತ್ತದೆ.

API ಏನು ನೀಡುತ್ತದೆ

ಇದರ ಪ್ರತಿಕ್ರಿಯೆಯು (response) ನೀವು regex ಮೂಲಕ ವಿಂಗಡಿಸಬೇಕಾದ ಮಾರ್ಕ್‌ಡೌನ್ (Markdown) ಪಠ್ಯದ ಬ್ಲಾಕ್ ಆಗಿರುವುದಿಲ್ಲ. ಬದಲಾಗಿ, ಇದು ದೈನಂದಿನ ಚಟುವಟಿಕೆಗಳು, ಊಟದ ಶಿಫಾರಸುಗಳು ಮತ್ತು ಬಜೆಟ್ ವಿಂಗಡಣೆಯನ್ನು ಒಳಗೊಂಡಿರುವ ರಚನಾತ್ಮಕ JSON ಆಬ್ಜೆಕ್ಟ್ ಆಗಿದೆ. ಗೋವಾ ಪ್ರವಾಸಕ್ಕಾಗಿ, ನೀವು ಮೊದಲ ದಿನದ ವಿಭಾಗದಲ್ಲಿ ಬೀಚ್ ಶ್ಯಾಕ್‌ನಲ್ಲಿ ಉಪಾಹಾರಕ್ಕಾಗಿ 500 ರೂಪಾಯಿಗಳು, ಬೆಳಿಗ್ಗೆ ಪಲೋಲೆಮ್‌ನಲ್ಲಿ ಸಮಯ ಮತ್ತು ಸಂಜೆ ಒಂದು ನಿರ್ದಿಷ್ಟ ಪ್ರದೇಶದಲ್ಲಿ ಸೀಫುಡ್ ಡಿನ್ನರ್ ಎಂಬ ವಿವರಗಳನ್ನು ಪಡೆಯಬಹುದು. ಪ್ರತಿ ದಿನವು ಸಮಯದ ಸ್ಲಾಟ್‌ಗಳು, ಅಂದಾಜು ವೆಚ್ಚಗಳು ಮತ್ತು "beach" ಅಥವಾ "food" ನಂತಹ ಟ್ಯಾಗ್‌ಗಳನ್ನು ಹೊಂದಿರುತ್ತದೆ. ಈ ರಚನೆಯು ಮುಖ್ಯವಾಗಿದೆ ಏಕೆಂದರೆ ಆಧುನಿಕ ಟ್ರಾವೆಲ್ ಆಪ್‌ಗಳು ಪ್ಯಾರಾಗ್ರಾಫ್‌ಗಳನ್ನು ವಿಶ್ಲೇಷಿಸಲು (parse) ಬಯಸುವುದಿಲ್ಲ. ಅವುಗಳಿಗೆ RecyclerViews ಅಥವಾ React components ಗೆ ಮ್ಯಾಪ್ ಮಾಡಬಹುದಾದ ಆಬ್ಜೆಕ್ಟ್‌ಗಳು ಬೇಕಾಗಿರುತ್ತವೆ.

ತಂತ್ರಜ್ಞಾನ ಮತ್ತು ಅದು ಏಕೆ ಸೂಕ್ತ (The Stack and Why It Fits)

ಈ ಪ್ರಾಜೆಕ್ಟ್ Spring AI ನೊಂದಿಗೆ Spring Boot 3.5 ಅನ್ನು ಬಳಸುತ್ತದೆ. Spring AI ಇಲ್ಲಿ ಅತ್ಯಂತ ನಿರ್ಣಾಯಕ ಭಾಗವಾಗಿದೆ. ಇದು ಏಕೀಕೃತ ChatModel ಅಬ್‌ಸ್ಟ್ರಾಕ್ಷನ್ ಅನ್ನು ಒದಗಿಸುತ್ತದೆ, ಇದರಿಂದ ನೀವು Azure OpenAI ಗಾಗಿ ನೇರವಾಗಿ ರ (raw) HTTP ಕ್ಲೈಂಟ್‌ಗಳನ್ನು ಬರೆಯುವ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ. ನೀವು ಸೇವೆಗಳ ಕೋಡ್ ಬದಲಿಗೆ ಕೇವಲ ಅವಲಂಬನೆಗಳು (dependencies) ಮತ್ತು ಪ್ರಾಪರ್ಟಿಗಳನ್ನು ಬದಲಾಯಿಸಿದರೆ ಸಾಕು.

ನಿಮ್ಮ ಬಿಲ್ಡ್ ಫೈಲ್‌ನಲ್ಲಿ ನಾಲ್ಕು ಅವಲಂಬನೆಗಳು ಬೇಕಾಗುತ್ತವೆ:

  • REST ಲೇಯರ್ ಗಾಗಿ spring-boot-starter-web.
  • Spring AI ಇಂಟರ್ಫೇಸ್ ಮೂಲಕ LLM ಗೆ ಸಂಪರ್ಕಿಸಲು spring-ai-starter-model-azure-openai.
  • ಸ್ವಯಂಚಾಲಿತ Swagger ಡಾಕ್ಯುಮೆಂಟೇಶನ್ ಗಾಗಿ springdoc-openapi.
  • ನಿಮ್ಮ request ಮತ್ತು response POJOಗಳಲ್ಲಿನ ಬಾಯ್ಲರ್‌ಪ್ಲೇಟ್ (boilerplate) ಕೋಡ್ ಅನ್ನು ಕಡಿಮೆ ಮಾಡಲು Lombok.

Spring AI ನಿಮ್ಮ ಬಿಸಿನೆಸ್ ಲಾಜಿಕ್ ಮತ್ತು LLM ಪ್ರೊವೈಡರ್ ನಡುವೆ ಇರುತ್ತದೆ. ಈ ಸ್ಥಾನೀಕರಣವು ಉದ್ದೇಶಪೂರ್ವಕವಾಗಿದೆ. ಇದು ನಿಮ್ಮ @Service ಕ್ಲಾಸ್‌ಗಳನ್ನು ಸ್ವಚ್ಛವಾಗಿ ಮತ್ತು ಪ್ರೊವೈಡರ್-ಅಲಿಗ್ನಿಕ್ (provider-agnostic) ಆಗಿಡುತ್ತದೆ.

PromptTemplates ಬಳಸಿ Prompt Engineering ಮಾಡುವುದು

Java ಸ್ಟ್ರಿಂಗ್‌ಗಳ ಒಳಗೆ ಪ್ರಾಂಪ್ಟ್‌ಗಳನ್ನು ಹಾರ್ಡ್‌ಕೋಡ್ ಮಾಡುವುದು ನಿರ್ವಹಣೆಗೆ ಕಷ್ಟವಾಗುವ ಸಾಫ್ಟ್‌ವೇರ್ ರಚಿಸಲು ಸುಲಭವಾದ ದಾರಿಯಾಗಿದೆ. ಒಂದು ವೇಳೆ ಪ್ರಾಡಕ್ಟ್ ತಂಡವು AI ಹೆಚ್ಚು ಕ್ಯಾಶುವಲ್ ಆಗಿ ಮಾತನಾಡಬೇಕು ಅಥವಾ ಒಂದು ನಿರ್ದಿಷ್ಟ ಮಿತಿಗಿಂತ ಹೆಚ್ಚಿನ ಬಜೆಟ್ ಅಂದಾಜುಗಳನ್ನು ನಿರಾಕರಿಸಬೇಕು ಎಂದು ನಿರ್ಧರಿಸಿದರೆ, ನೀವು ನಿಮ್ಮ ಸೇವೆಯನ್ನು ಮರು-ಕಂಪೈಲ್ (recompile) ಮಾಡುವ ಅಗತ್ಯವಿರಬಾರದು.

Spring AI PromptTemplate ಅನ್ನು ಒದಗಿಸುತ್ತದೆ. ನೀವು ಪ್ರಾಂಪ್ಟ್ ಸ್ಕೆಲೆಟನ್ ಅನ್ನು ರಿಸೋರ್ಸ್ ಫೈಲ್‌ನಲ್ಲಿ ಅಥವಾ ಮೀಸಲಾದ ಟೆಂಪ್ಲೇಟ್ ಸ್ಟ್ರಿಂಗ್‌ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಿಡಬಹುದು, ಮತ್ತು {destination}, {budget}, {days}, ಮತ್ತು {interests} ನಂತಹ ವೇರಿಯೇಬಲ್‌ಗಳಿಗಾಗಿ ಪ್ಲೇಸ್‌ಹೋಲ್ಡರ್‌ಗಳನ್ನು ಬಿಡಬಹುದು. ರನ್‌ಟೈಮ್‌ನಲ್ಲಿ, ಸೇವೆ ಒಂದು Prompt ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ರಚಿಸುತ್ತದೆ ಮತ್ತು ಬಳಕೆದಾರರ ಮೌಲ್ಯಗಳನ್ನು ಅದಕ್ಕೆ ಸೇರಿಸುತ್ತದೆ (inject).

ಸಿಸ್ಟಮ್ ಮೆಸೇಜ್‌ಗಳನ್ನು ಬಳಕೆದಾರರ ಮೆಸೇಜ್‌ಗಳಿಂದ ಪ್ರತ್ಯೇಕಿಸಿ. ಪರ್ಸೋನಾವನ್ನು (persona) ವ್ಯಾಖ್ಯಾನಿಸಲು ಸಿಸ್ಟಮ್ ಮೆಸೇಜ್ ಬಳಸಿ. ಉದಾಹರಣೆಗೆ, ಮಾಡೆಲ್ ಭಾರತೀಯ ತಾಣಗಳಲ್ಲಿ ಪರಿಣಿತನಾದ, ಬಜೆಟ್ ಬಗ್ಗೆ ಜಾಗರೂಕನಾದ ಮತ್ತು ಮಾರ್ಕ್‌ಡೌನ್ ಫೆನ್ಸ್‌ಗಳಿಲ್ಲದೆ ಕೇವಲ JSON ಅನ್ನು ಮಾತ್ರ ಹಿಂತಿರುಗಿಸುವ ಟ್ರಾವೆಲ್ ಪ್ಲಾನರ್ ಎಂದು ನೀವು ಹೇಳಬಹುದು. ನಿರ್ದಿಷ್ಟ ಪ್ರವಾಸದ ವಿವರಗಳನ್ನು ನೀಡಲು ಬಳಕೆದಾರರ ಮೆಸೇಜ್ ಬಳಸಿ. ಈ ವಿಭಜನೆಯು way API ಕಾಂಟ್ರಾಕ್ಟ್ ಅನ್ನು ಬದಲಾಯಿಸದೆ ಪರ್ಸೋನಾಗಳನ್ನು A/B ಟೆಸ್ಟ್ ಮಾಡಲು ಸಹಾಯ ಮಾಡುತ್ತದೆ.

ಸರ್ವಿಸ್ ಲೇಯರ್: Azure OpenAI ಜೊತೆ ಸಂವಹನ

@Service ಕ್ಲಾಸ್‌ಗೆ ಒಂದು ಕೆಲಸವಿದೆ. ಅದು ಪ್ರಾಂಪ್ಟ್ ಅನ್ನು ನಿರ್ಮಿಸುತ್ತದೆ, ಮಾಡೆಲ್ ಅನ್ನು ಕರೆಯುತ್ತದೆ, ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಸ್ವಚ್ಛಗೊಳಿಸುತ್ತದೆ ಮತ್ತು ಫಲಿತಾಂಶವನ್ನು ಪಾರ್ಸ್ (parse) ಮಾಡುತ್ತದೆ.

Spring AI ನ ChatClient ಅಥವಾ ChatModel ಅನ್ನು ಇಂಜೆಕ್ಟ್ ಮಾಡಿ. ಬರುವ ರಿಕ್ವೆಸ್ಟ್ ಮೌಲ್ಯಗಳೊಂದಿಗೆ PromptTemplate ಅನ್ನು ರೆಂಡರ್ ಮಾಡಿ, ನಂತರ ಚಾಟ್ ಮೆಥಡ್ ಅನ್ನು ಕರೆಯಿರಿ. ಪ್ರತಿಕ್ರಿಯೆಯು String ರೂಪದಲ್ಲಿ ಬರುತ್ತದೆ. ಇಲ್ಲಿಯೇ ಅನೇಕ ಟ್ಯುಟೋರಿಯಲ್‌ಗಳು ಕೊನೆಗೊಳ್ಳುತ್ತವೆ ಮತ್ತು ನೈಜ ಪ್ರೊಡಕ್ಷನ್ ಕೋಡ್ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ.

LLMಗಳು ಕೆಲವೊಮ್ಮೆ ವಿನಯಪೂರ್ವಕವಾದ ಪೀಠಿಕೆಗಳನ್ನು (preambles) ಸೇರಿಸುತ್ತವೆ. "Here is your itinerary" ಎಂದು ಪ್ರಾರಂಭವಾಗಿ ನಂತರ ಟ್ರಿಪಲ್ ಬ್ಯಾಕ್‌ಟಿಕ್‌ಗಳಲ್ಲಿ (triple backticks) ಸುತ್ತಲಾದ JSON ಅನ್ನು ನೀಡುವ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ನೀವು ಪಡೆಯಬಹುದು. ನೀವು ಅದನ್ನು ನೇರವಾಗಿ Jackson ಬಳಿ ಡಿಸೆರಿಯಲೈಸ್ (deserialize) ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿದರೆ, ನಿಮ್ಮ ಆಪ್ ಕ್ರ್ಯಾಶ್ ಆಗುತ್ತದೆ. ರ (raw) ಸ್ಟ್ರಿಂಗ್ ಅನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡುವ, ಮೊದಲ ಆರಂಭಿಕ ಬ್ರೇಸ್ { ಮತ್ತು ಕೊನೆಯ ಮುಕ್ತಾಯ ಬ್ರೇಸ್ } ಅನ್ನು ಕಂಡುಹಿಡಿಯುವ ಮತ್ತು ಕೇವಲ JSON ಪೇಲೋಡ್ ಅನ್ನು ಹೊರತೆಗೆಯುವ ಒಂದು ಸಣ್ಣ ಹೆಲ್ಪರ್ ಮೆಥಡ್ ಅನ್ನು ಸೇರಿಸಿ. ನಂತರ ಹೊರತೆಗೆಯಲಾದ ಬ್ಲಾಕ್ ಅನ್ನು ವ್ಯಾಲಿಡೇಟ್ ಮಾಡಿ. ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಕಂಟ್ರೋಲರ್‌ಗೆ ಹಿಂತಿರುಗಿಸುವ ಮೊದಲು ಅಗತ್ಯ ಫೀಲ್ಡ್‌ಗಳು ಇವೆಯೇ ಮತ್ತು ಸಂಖ್ಯೆಗಳು (numeric values) ಸರಿಯಾಗಿವೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ.

ಈ ಡಿಫೆನ್ಸಿವ್ ಪಾರ್ಸಿಂಗ್ (defensive parsing) ಕಡ್ಡಾಯವಾಗಿದೆ. ಇದು ಒಂದು ಡೆಮೋ ಮತ್ತು ವಿಶ್ವಾಸಾರ್ಹ API ನಡುವಿನ ಗಡಿಯಾಗಿದೆ.

ಪರಿಪಕ್ವ ವ್ಯವಸ್ಥೆಯಂತೆ ದೋಷಗಳನ್ನು ನಿರ್ವಹಿಸುವುದು

ಎಕ್ಸ್‌ಟರ್ನಲ್ APIಗಳು ವಿಫಲವಾಗುತ್ತವೆ. Azure OpenAI ರೇಟ್ ಲಿಮಿಟ್ ದೋಷಗಳು (rate limit errors), ಅಥೆಂಟಿಕೇಶನ್ ವೈಫಲ್ಯಗಳು ಅಥವಾ ತಾತ್ಕಾಲಿಕ 500 ದೋಷಗಳನ್ನು ನೀಡಬಹುದು. ನೀವು ಇವುಗಳನ್ನು ಸ್ಟ್ಯಾಕ್ ಟ್ರೇಸ್‌ಗಳ (stack traces) ರೂಪದಲ್ಲಿ ಬಳಕೆದಾರರಿಗೆ ತೋರಿಸಿದರೆ, ನೀವು ನಿಮ್ಮ ವಿಶ್ವಾಸಾರ್ಹತೆಯನ್ನು ಕಳೆದುಕೊಳ್ಳುತ್ತೀರಿ.

ವಿನಾಯಿತಿಗಳನ್ನು (exceptions) ಜಾಗತಿಕವಾಗಿ intercept ಮಾಡಲು @RestControllerAdvice ಬಳಸಿ. Spring AI exceptions, HttpClientErrorException, ಮತ್ತು ಸಾಮಾನ್ಯ RuntimeExceptionಗಳನ್ನು ಸ್ಥಿರವಾದ error responses ಗೆ ಮ್ಯಾಪ್ ಮಾಡಿ. ಸ್ಪಷ್ಟವಾದ ಸಂದೇಶ, ರೇಟ್ ಲಿಮಿಟ್‌ಗಳಿಗಾಗಿ 429 ನಂತಹ HTTP status ಮತ್ತು ಕ್ಲೈಂಟ್ ಮರುಪ್ರಯತ್ನಿಸಲು ಅಥವಾ ಸಮಸ್ಯೆಯನ್ನು ಲಾಗ್ ಮಾಡಲು ಸಾಕಷ್ಟು ವಿವರಗಳಿರುವ JSON body ಅನ್ನು ಹಿಂತಿರುಗಿಸಿ. ಬಳಕೆದಾರರು "Service temporarily busy. Please retry in 30 seconds," ಎಂಬಂತಹ ಸಂದೇಶವನ್ನು ನೋಡಬೇಕೇ ಹೊರತು, Java class names ಇಂದ ತುಂಬಿದ ಸ್ಕ್ರೀನ್ ಅಲ್ಲ.

ರಹಸ್ಯಗಳನ್ನು (Secrets) ಎಂದಿಗೂ ಹಾರ್ಡ್‌ಕೋಡ್ ಮಾಡಬೇಡಿ

ನಿಮ್ಮ Azure OpenAI API key ಅನ್ನು Git ಗೆ ಸೇರಿಸಲಾದ application.properties ನಲ್ಲಿ ಇಡಬೇಡಿ. ಅದನ್ನು ಹೊರಗೇ ಇರಿಸಿ (Externalize). ನಿಮ್ಮ Spring configuration ನಲ್ಲಿ ಉಲ್ಲೇಖಿಸಲಾದ environment variables ಗಳನ್ನು ಬಳಸಿ, ಉದಾಹರಣೆಗೆ ${AZURE_OPENAI_KEY} ಮತ್ತು ${AZURE_OPENAI_ENDPOINT}. ಅಭಿವೃದ್ಧಿಗಾಗಿ (development) ಸ್ಥಳೀಯ .env ಫೈಲ್ ಅನ್ನು ಇರಿಸಿ, ಅದನ್ನು .gitignore ಗೆ ಸೇರಿಸಿ ಮತ್ತು Spring Boot ನ relaxed binding ಮೂಲಕ ಅದನ್ನು ಲೋಡ್ ಮಾಡಿ. ಒಂದು ವೇಳೆ ಕೀ (key) ಸೋರಿಕೆಯಾದರೆ, ನಿಮ್ಮ artifact ಅನ್ನು ಮರುನಿರ್ಮಿಸುವ ಬದಲು ನೀವು ಅದನ್ನು ಒಂದೇ ಸ್ಥಳದಲ್ಲಿ ಬದಲಾಯಿಸಬಹುದು (rotate).

Swagger ಮೂಲಕ ಪರೀಕ್ಷಿಸುವುದು (Testing)

springdoc-openapi dependency रनಟೈಮ್‌ನಲ್ಲಿ Swagger UI endpoint ಅನ್ನು ಪ್ರದರ್ಶಿಸುತ್ತದೆ. ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ ಪ್ರಾರಂಭವಾದ ನಂತರ, ಬ್ರೌಸರ್‌ನಲ್ಲಿ /swagger-ui.html ಅನ್ನು ತೆರೆಯಿರಿ. ನೀವು Goa ಉದಾಹರಣೆಯನ್ನು ನೇರವಾಗಿ ತುಂಬಬಹುದು: destination "Goa," budget 25000, days 5, interests "beaches, food." 'execute' ಮೇಲೆ ಕ್ಲಿಕ್ ಮಾಡಿ ಮತ್ತು JSON itinerary ಕಾಣಿಸಿಕೊಳ್ಳುವುದನ್ನು ನೋಡಿ. ಇದು ಪ್ರಾಂಪ್ಟ್ ಬದಲಾವಣೆಗಳನ್ನು (prompt changes) ಪರಿಶೀಲಿಸಲು, serialization ಅನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ಮತ್ತು ಎರಡೂ ಕಡೆಯವರು unit test ಬರೆಯುವ ಮೊದಲು ಫ್ರಂಟ್ ಎಂಡ್ (frontend) ಡೆವಲಪರ್‌ಗಳೊಂದಿಗೆ ಲೈವ್ ಪ್ಲೇಗ್ರೌಂಡ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ನಿಮಗೆ ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ.

ಕೋಡ್ ಅನ್ನು ಮರುಬರೆಯದೆ ಪ್ರೊವೈಡರ್‌ಗಳನ್ನು ಬದಲಾಯಿಸುವುದು

ಸ್ಟಾರ್ಟ್‌ಅಪ್‌ಗಳು ಪ್ರೊವೈಡರ್‌ಗಳನ್ನು ಬದಲಾಯಿಸುತ್ತವೆ. ಬಹುಶಃ Azure ಕ್ರೆಡಿಟ್‌ಗಳು ಮುಗಿದಿರಬಹುದು ಅಥವಾ ವೆಚ್ಚವನ್ನು ಕಡಿಮೆ ಮಾಡಲು ನೀವು ಸ್ಥಳೀಯ Ollama instance ಬಳಸಿ inference ನಡೆಸಲು ಬಯಸಬಹುದು. Spring AI, ChatModel interface ಅನ್ನು ಅಬ್‌ಸ್ಟ್ರಾಕ್ಟ್ (abstract) ಮಾಡುವುದರಿಂದ, ಈ ಬದಲಾವಣೆ ಸುಲಭವಾಗಿರುತ್ತದೆ. Maven dependency ಅನ್ನು spring-ai-starter-model-azure-openai ನಿಂದ ಇನ್ನೊಂದು starter ಗೆ ಬದಲಾಯಿಸಿ, ನಿಮ್ಮ properties ಫೈಲ್ ಅನ್ನು ಹೊಸ endpoint ಮತ್ತು key ನೊಂದಿಗೆ ಅಪ್‌ಡೇಟ್ ಮಾಡಿ, ಮತ್ತು ನಿಮ್ಮ service class ಅನ್ನು ಹಾಗೆಯೇ ಬಿಡಿ. ನಿಮ್ಮ ಮೊಬೈಲ್ ಆಪ್ ನೋಡುವ API contract ಅಚ್ಚುಕಟ್ಟಾಗಿ ಅಷ್ಟೇ ಇರುತ್ತದೆ.

ಆ ಪೋರ್ಟಬಿಲಿಟಿ (portability) ಈ ಆರ್ಕಿಟೆಕ್ಚರ್ ಅನ್ನು ನೈಜ ಉತ್ಪನ್ನಗಳಿಗೆ ವಿಶೇಷವಾಗಿ ಉಪಯುಕ್ತವಾಗಿಸುತ್ತದೆ. ನೀವು Azure ಗೆ ಕಟ್ಟಿಬಿದ್ದಿಲ್ಲ. ನೀವು ಅದನ್ನು ಒಂದು ಸ್ವಚ್ಛವಾದ Spring pipeline ಗೆ ಜೋಡಿಸಲಾದ ಒಂದು ಇಂಜಿನ್ ಆಗಿ ಬಳಸುತ್ತಿದ್ದೀರಿ.

ನಿಜವಾದ ಸಾರಾಂಶ (The Real Takeaway)

AI ಮಾಡೆಲ್ ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ ಅಲ್ಲ. ಅದು ಅನಿರೀಕ್ಷಿತ ಪಠ್ಯವನ್ನು ಹಿಂತಿರುಗಿಸುವ ಒಂದು ಬಾಹ್ಯ ಸೇವೆ (external service). ಪೇಮೆಂಟ್ ಗೇಟ್‌ವೇ ಅಥವಾ ಥರ್ಡ್-ಪಾರ್ಟಿ ವೆದರ್ API ಗೆ ನೀವು ನೀಡುವಷ್ಟೇ ಕಟ್ಟುನಿಟ್ಟಿನ ಕ್ರಮವನ್ನು ಇದಕ್ಕೆ ನೀಡಿ. ನಿಮ್ಮ ಕ್ರೆಡೆನ್ಶಿಯಲ್‌ಗಳನ್ನು (credentials) ಹೊರಗೇ ಇರಿಸಿ. ಪ್ರತಿ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು (response) ಪರಿಶೀಲಿಸಿ. ಪಾರ್ಸಿಂಗ್ ಮಾಡುವ ಮೊದಲು ಪೇಲೋಡ್ (payload) ಅನ್ನು ಸ್ವಚ್ಛಗೊಳಿಸಿ. ಎರೆರ್ಸ್‌ಗಳನ್ನು ಜಾಗತಿಕವಾಗಿ ನಿರ್ವಹಿಸಿ (handle errors globally), ಇದರಿಂದ ನಿಮ್ಮ ಬಳಕೆದಾರರು ಎಂದಿಗೂ stack trace ಅನ್ನು ನೋಡುವಂತಿಲ್ಲ.

25,000 ರೂಪಾಯಿ ಬಜೆಟ್‌ನಲ್ಲಿ Goa itinerary ತಯಾರಿಸುವ ಸೃಜನಾತ್ಮಕ ಕೆಲಸವನ್ನು AI ಗೆ ಬಿಡಿ. ನೀವು plumbing (ಮೂಲ ತಾಂತ್ರಿಕ ವ್ಯವಸ್ಥೆ) ಕೆಲಸವನ್ನು ನಿಭಾಯಿಸಿ. ಇವೆರಡೂ ಪ್ರತ್ಯೇಕವಾಗಿರಲಿ, ಆಗ ನೀವು ನಿಜವಾಗಿಯೂ ಕಾರ್ಯಗತಗೊಳಿಸಬಹುದಾದ (ships) ಒಂದು ವ್ಯವಸ್ಥೆಯನ್ನು ಪಡೆಯುತ್ತೀರಿ.

ಈ ಲೇಖನಕ್ಕೆ ಪ್ರೇರಣೆ ನೀಡಿದ ಮೂಲ ವಾಕ್‌ಥ್ರೂ ಅನ್ನು ಇಲ್ಲಿ ಕಾಣಬಹುದು.

Spring AI ಮತ್ತು ಅಂತಹ ಯೋಜನೆಗಳ ಬಗ್ಗೆ ಚರ್ಚಿಸಲು ಆಸಕ್ತಿ ಇದೆಯೇ? GyaanSetu learning community ಗೆ ಸೇರಿ.