{"id":110126,"date":"2025-05-22T22:11:15","date_gmt":"2025-05-22T17:41:15","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/%d8%a8%d9%87%d8%a7%d8%b1-ai-%d9%88-ollama-%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-%da%86%d8%aa-%d8%a8%d8%a7%d8%a8%d8%a7%d8%aa-%d9%85%d9%86%d8%a8%d8%b9-%d8%a8%d8%a7%d8%b2\/"},"modified":"2025-05-22T22:11:15","modified_gmt":"2025-05-22T17:41:15","slug":"%d8%a8%d9%87%d8%a7%d8%b1-ai-%d9%88-ollama-%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-%da%86%d8%aa-%d8%a8%d8%a7%d8%a8%d8%a7%d8%aa-%d9%85%d9%86%d8%a8%d8%b9-%d8%a8%d8%a7%d8%b2","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/%d8%a8%d9%87%d8%a7%d8%b1-ai-%d9%88-ollama-%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-%da%86%d8%aa-%d8%a8%d8%a7%d8%a8%d8%a7%d8%aa-%d9%85%d9%86%d8%a8%d8%b9-%d8%a8%d8%a7%d8%b2\/","title":{"rendered":"\u0628\u0647\u0627\u0631 Ai \u0648 Ollama &#8211; \u0633\u0627\u062e\u062a \u06cc\u06a9 \u0686\u062a \u0628\u0627\u0628\u0627\u062a \u0645\u0646\u0628\u0639 \u0628\u0627\u0632"},"content":{"rendered":"<div data-article-id=\"2466825\" id=\"article-body\">\n<p>\u0645\u0627 \u0627\u0632 \u062a\u0627\u0632\u0647 \u0645\u0646\u062a\u0634\u0631 \u0634\u062f\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f <strong>\u0628\u0647\u0627\u0631 ai 1.0 ga<\/strong> \u0646\u0633\u062e\u0647 \u060c \u0622\u0645\u0627\u062f\u0647 \u0628\u0631\u0627\u06cc <strong>\u062a\u0648\u0644\u06cc\u062f<\/strong>\u060c \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a\u0646 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0686\u062a \u0628\u0627 Spring AI \u060c Ollama \u060c Docker \u0648 \u0627\u0631\u0627\u0626\u0647 \u0645\u062f\u06cc\u0631\u06cc\u062a \u062d\u0627\u0641\u0638\u0647 \u0686\u062a \u062c\u0639\u0628\u0647.<br \/>\u0628\u06af\u0630\u0627\u0631\u06cc\u062f \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u06af\u0627\u0646 \u062c\u0627\u0648\u0627 \u0628\u062a\u0648\u0627\u0646\u0646\u062f \u0628\u0647 \u0633\u0631\u0639\u062a \u0648 \u0628\u0647 \u0631\u0627\u062d\u062a\u06cc \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0631\u0627 \u0628\u0647 \u067e\u0631\u0648\u0698\u0647 \u0647\u0627\u06cc \u062e\u0648\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u0646\u062f.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"\u062a\u063a\u06cc\u06cc\u0631 \u0648\u0636\u0639\u06cc\u062a \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/%d8%a8%d9%87%d8%a7%d8%b1-ai-%d9%88-ollama-%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-%da%86%d8%aa-%d8%a8%d8%a7%d8%a8%d8%a7%d8%aa-%d9%85%d9%86%d8%a8%d8%b9-%d8%a8%d8%a7%d8%b2\/#%D9%88%D8%A7%D8%A8%D8%B3%D8%AA%DA%AF%DB%8C_%D9%87%D8%A7\" >\u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627:<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/%d8%a8%d9%87%d8%a7%d8%b1-ai-%d9%88-ollama-%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-%da%86%d8%aa-%d8%a8%d8%a7%d8%a8%d8%a7%d8%aa-%d9%85%d9%86%d8%a8%d8%b9-%d8%a8%d8%a7%d8%b2\/#%DA%86%D8%B1%D8%A7_%D8%A8%D9%87%D8%A7%D8%B1_ai_ollama%D8%9F\" >\u0686\u0631\u0627 \u0628\u0647\u0627\u0631 ai + ollama\u061f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/%d8%a8%d9%87%d8%a7%d8%b1-ai-%d9%88-ollama-%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-%da%86%d8%aa-%d8%a8%d8%a7%d8%a8%d8%a7%d8%aa-%d9%85%d9%86%d8%a8%d8%b9-%d8%a8%d8%a7%d8%b2\/#1_%D8%AA%D9%86%D8%B8%DB%8C%D9%85_%D9%85%D8%AF%D9%84_%D9%87%D8%A7%DB%8C_Ollama_%D9%88_%D8%A8%D8%A7%D8%B1%DA%AF%DB%8C%D8%B1%DB%8C\" >1. \u062a\u0646\u0638\u06cc\u0645 \u0645\u062f\u0644 \u0647\u0627\u06cc Ollama \u0648 \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/%d8%a8%d9%87%d8%a7%d8%b1-ai-%d9%88-ollama-%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-%da%86%d8%aa-%d8%a8%d8%a7%d8%a8%d8%a7%d8%aa-%d9%85%d9%86%d8%a8%d8%b9-%d8%a8%d8%a7%d8%b2\/#2_%D9%85%D9%87%D9%86%D8%AF%D8%B3%DB%8C_AI_101_%D9%81%D8%B1%D8%A7%D8%AA%D8%B1_%D8%A7%D8%B2_%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86\" >2. \u0645\u0647\u0646\u062f\u0633\u06cc AI 101: \u0641\u0631\u0627\u062a\u0631 \u0627\u0632 \u067e\u0627\u06cc\u062a\u0648\u0646<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/%d8%a8%d9%87%d8%a7%d8%b1-ai-%d9%88-ollama-%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-%da%86%d8%aa-%d8%a8%d8%a7%d8%a8%d8%a7%d8%aa-%d9%85%d9%86%d8%a8%d8%b9-%d8%a8%d8%a7%d8%b2\/#3_%D8%A8%D9%87%D8%A7%D8%B1_AI_Ollama_Java_%D8%A8%D8%A7_LLMS_%D9%85%D9%84%D8%A7%D9%82%D8%A7%D8%AA_%D9%85%DB%8C_%DA%A9%D9%86%D8%AF\" >3. \u0628\u0647\u0627\u0631 AI + Ollama: Java \u0628\u0627 LLMS \u0645\u0644\u0627\u0642\u0627\u062a \u0645\u06cc \u06a9\u0646\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/%d8%a8%d9%87%d8%a7%d8%b1-ai-%d9%88-ollama-%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-%da%86%d8%aa-%d8%a8%d8%a7%d8%a8%d8%a7%d8%aa-%d9%85%d9%86%d8%a8%d8%b9-%d8%a8%d8%a7%d8%b2\/#4_%DA%AF%D9%81%D8%AA%DA%AF%D9%88%DB%8C_%DA%86%D8%AA_%D8%A8%D8%A7_%D8%B1%D9%88%DB%8C%D8%AF%D8%A7%D8%AF%D9%87%D8%A7%DB%8C_%D8%B3%D8%B1%D9%88%D8%B1_SSE\" >4. \u06af\u0641\u062a\u06af\u0648\u06cc \u0686\u062a \u0628\u0627 \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc \u0633\u0631\u0648\u0631 (SSE)<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/%d8%a8%d9%87%d8%a7%d8%b1-ai-%d9%88-ollama-%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-%da%86%d8%aa-%d8%a8%d8%a7%d8%a8%d8%a7%d8%aa-%d9%85%d9%86%d8%a8%d8%b9-%d8%a8%d8%a7%d8%b2\/#%D8%AC%D8%B2%D8%A6%DB%8C%D8%A7%D8%AA_%DA%A9%D9%84%DB%8C%D8%AF%DB%8C\" >\u062c\u0632\u0626\u06cc\u0627\u062a \u06a9\u0644\u06cc\u062f\u06cc:<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/nabfollower.com\/blog\/%d8%a8%d9%87%d8%a7%d8%b1-ai-%d9%88-ollama-%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-%da%86%d8%aa-%d8%a8%d8%a7%d8%a8%d8%a7%d8%aa-%d9%85%d9%86%d8%a8%d8%b9-%d8%a8%d8%a7%d8%b2\/#%D9%85%D8%AD%D8%AF%D9%88%D8%AF%DB%8C%D8%AA_%D8%A8%D8%A7_HTTP11\" >\u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0628\u0627 HTTP\/1.1<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/nabfollower.com\/blog\/%d8%a8%d9%87%d8%a7%d8%b1-ai-%d9%88-ollama-%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-%da%86%d8%aa-%d8%a8%d8%a7%d8%a8%d8%a7%d8%aa-%d9%85%d9%86%d8%a8%d8%b9-%d8%a8%d8%a7%d8%b2\/#%D9%85%D8%AD%D8%AF%D9%88%D8%AF%DB%8C%D8%AA_%D9%87%D8%A7%DB%8C_%D8%A7%D8%AA%D8%B5%D8%A7%D9%84\" >\u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0647\u0627\u06cc \u0627\u062a\u0635\u0627\u0644:<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/nabfollower.com\/blog\/%d8%a8%d9%87%d8%a7%d8%b1-ai-%d9%88-ollama-%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-%da%86%d8%aa-%d8%a8%d8%a7%d8%a8%d8%a7%d8%aa-%d9%85%d9%86%d8%a8%d8%b9-%d8%a8%d8%a7%d8%b2\/#%D8%A7%D8%B1%D8%AA%D9%82%D8%A7%D8%A1_%D8%A8%D9%87_HTTP2_%D8%A8%D8%B1%D8%A7%DB%8C_%D8%B9%D9%85%D9%84%DA%A9%D8%B1%D8%AF\" >\u0627\u0631\u062a\u0642\u0627\u0621 \u0628\u0647 HTTP\/2 \u0628\u0631\u0627\u06cc \u0639\u0645\u0644\u06a9\u0631\u062f<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/nabfollower.com\/blog\/%d8%a8%d9%87%d8%a7%d8%b1-ai-%d9%88-ollama-%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-%da%86%d8%aa-%d8%a8%d8%a7%d8%a8%d8%a7%d8%aa-%d9%85%d9%86%d8%a8%d8%b9-%d8%a8%d8%a7%d8%b2\/#HTTP2_%D8%AA%D9%86%DA%AF%D9%86%D8%A7%D9%87%D8%A7%DB%8C_SSE_%D8%B1%D8%A7_%D8%A8%D8%A7\" >HTTP\/2 \u062a\u0646\u06af\u0646\u0627\u0647\u0627\u06cc SSE \u0631\u0627 \u0628\u0627:<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/nabfollower.com\/blog\/%d8%a8%d9%87%d8%a7%d8%b1-ai-%d9%88-ollama-%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-%da%86%d8%aa-%d8%a8%d8%a7%d8%a8%d8%a7%d8%aa-%d9%85%d9%86%d8%a8%d8%b9-%d8%a8%d8%a7%d8%b2\/#%D9%86%D8%AD%D9%88%D9%87_%D9%81%D8%B9%D8%A7%D9%84_%DA%A9%D8%B1%D8%AF%D9%86_HTTP2_%D8%AF%D8%B1_%D8%A8%D9%88%D8%AA_%D8%A8%D9%87%D8%A7%D8%B1\" >\u0646\u062d\u0648\u0647 \u0641\u0639\u0627\u0644 \u06a9\u0631\u062f\u0646 HTTP\/2 \u062f\u0631 \u0628\u0648\u062a \u0628\u0647\u0627\u0631<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/nabfollower.com\/blog\/%d8%a8%d9%87%d8%a7%d8%b1-ai-%d9%88-ollama-%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-%da%86%d8%aa-%d8%a8%d8%a7%d8%a8%d8%a7%d8%aa-%d9%85%d9%86%d8%a8%d8%b9-%d8%a8%d8%a7%d8%b2\/#%D8%AA%D8%A3%DB%8C%DB%8C%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF_HTTP2_%D9%81%D8%B9%D8%A7%D9%84_%D8%A7%D8%B3%D8%AA_-k_%D8%A8%D8%B1%D8%A7%DB%8C_%D8%A7%D8%B9%D8%AA%D9%85%D8%A7%D8%AF_%D8%A8%D9%87_%DA%AF%D9%88%D8%A7%D9%87%DB%8C%D9%86%D8%A7%D9%85%D9%87_%D8%AE%D9%88%D8%AF_%D8%A7%D9%85%D8%B6%D8%A7_%D8%B4%D8%AF%D9%87\" >\u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f HTTP\/2 \u0641\u0639\u0627\u0644 \u0627\u0633\u062a (-k \u0628\u0631\u0627\u06cc \u0627\u0639\u062a\u0645\u0627\u062f \u0628\u0647 \u06af\u0648\u0627\u0647\u06cc\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0627\u0645\u0636\u0627 \u0634\u062f\u0647)<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/nabfollower.com\/blog\/%d8%a8%d9%87%d8%a7%d8%b1-ai-%d9%88-ollama-%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-%da%86%d8%aa-%d8%a8%d8%a7%d8%a8%d8%a7%d8%aa-%d9%85%d9%86%d8%a8%d8%b9-%d8%a8%d8%a7%d8%b2\/#Frontend\" >Frontend:<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/nabfollower.com\/blog\/%d8%a8%d9%87%d8%a7%d8%b1-ai-%d9%88-ollama-%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-%da%86%d8%aa-%d8%a8%d8%a7%d8%a8%d8%a7%d8%aa-%d9%85%d9%86%d8%a8%d8%b9-%d8%a8%d8%a7%d8%b2\/#%D8%AC%D8%B2%D8%A6%DB%8C%D8%A7%D8%AA_%DA%A9%D9%84%DB%8C%D8%AF%DB%8C-2\" >\u062c\u0632\u0626\u06cc\u0627\u062a \u06a9\u0644\u06cc\u062f\u06cc:<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/nabfollower.com\/blog\/%d8%a8%d9%87%d8%a7%d8%b1-ai-%d9%88-ollama-%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-%da%86%d8%aa-%d8%a8%d8%a7%d8%a8%d8%a7%d8%aa-%d9%85%d9%86%d8%a8%d8%b9-%d8%a8%d8%a7%d8%b2\/#%D8%B1%D9%86%D8%AF%D8%B1_%D8%AC%D9%84%D9%88_%D8%A8%D8%B1%D8%A7%DB%8C_%D8%AE%D8%B1%D9%88%D8%AC%DB%8C_LLM\" >\u0631\u0646\u062f\u0631 \u062c\u0644\u0648 \u0628\u0631\u0627\u06cc \u062e\u0631\u0648\u062c\u06cc LLM<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/nabfollower.com\/blog\/%d8%a8%d9%87%d8%a7%d8%b1-ai-%d9%88-ollama-%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-%da%86%d8%aa-%d8%a8%d8%a7%d8%a8%d8%a7%d8%aa-%d9%85%d9%86%d8%a8%d8%b9-%d8%a8%d8%a7%d8%b2\/#%D9%85%D9%84%D8%A7%D8%AD%D8%B8%D8%A7%D8%AA_%D8%A7%D9%85%D9%86%DB%8C%D8%AA%DB%8C_%DA%A9%D9%84%DB%8C%D8%AF%DB%8C_%D9%87%D8%B1%DA%AF%D8%B2_%D8%A8%D9%87_%D8%AE%D8%B1%D9%88%D8%AC%DB%8C_LLM_%D8%A7%D8%B9%D8%AA%D9%85%D8%A7%D8%AF_%D9%86%DA%A9%D9%86%DB%8C%D8%AF_%D9%88_%D9%86%D9%87_%D9%88%D8%B1%D9%88%D8%AF%DB%8C_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1\" >\u0645\u0644\u0627\u062d\u0638\u0627\u062a \u0627\u0645\u0646\u06cc\u062a\u06cc \u06a9\u0644\u06cc\u062f\u06cc: \u0647\u0631\u06af\u0632 \u0628\u0647 \u062e\u0631\u0648\u062c\u06cc LLM \u0627\u0639\u062a\u0645\u0627\u062f \u0646\u06a9\u0646\u06cc\u062f (\u0648 \u0646\u0647 \u0648\u0631\u0648\u062f\u06cc \u06a9\u0627\u0631\u0628\u0631)<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/nabfollower.com\/blog\/%d8%a8%d9%87%d8%a7%d8%b1-ai-%d9%88-ollama-%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-%da%86%d8%aa-%d8%a8%d8%a7%d8%a8%d8%a7%d8%aa-%d9%85%d9%86%d8%a8%d8%b9-%d8%a8%d8%a7%d8%b2\/#%D9%85%D8%AD%D8%AF%D9%88%D8%AF%DB%8C%D8%AA_%D8%A8%D8%A7_API_EventSource\" >\u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0628\u0627 API EventSource<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/nabfollower.com\/blog\/%d8%a8%d9%87%d8%a7%d8%b1-ai-%d9%88-ollama-%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-%da%86%d8%aa-%d8%a8%d8%a7%d8%a8%d8%a7%d8%aa-%d9%85%d9%86%d8%a8%d8%b9-%d8%a8%d8%a7%d8%b2\/#5_%D8%A8%D9%87%D8%A7%D8%B1_AI_Ollama_Chatbot_%D8%AE%D9%88%D8%AF_%D8%B1%D8%A7_%D8%A8%D8%A7_Docker_%D9%85%D8%B3%D8%AA%D9%82%D8%B1_%DA%A9%D9%86%DB%8C%D8%AF\" >5. \u0628\u0647\u0627\u0631 AI + Ollama Chatbot \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 Docker \u0645\u0633\u062a\u0642\u0631 \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/nabfollower.com\/blog\/%d8%a8%d9%87%d8%a7%d8%b1-ai-%d9%88-ollama-%d8%b3%d8%a7%d8%ae%d8%aa-%db%8c%da%a9-%da%86%d8%aa-%d8%a8%d8%a7%d8%a8%d8%a7%d8%aa-%d9%85%d9%86%d8%a8%d8%b9-%d8%a8%d8%a7%d8%b2\/#%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C_%D8%A2%DB%8C%D9%86%D8%AF%D9%87_%D9%87%D9%88%D8%B4_%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C_%D8%AC%D8%A7%D9%88%D8%A7_%D8%B4%D9%85%D8%A7\" >\u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc: \u0622\u06cc\u0646\u062f\u0647 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u062c\u0627\u0648\u0627 \u0634\u0645\u0627<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D9%88%D8%A7%D8%A8%D8%B3%D8%AA%DA%AF%DB%8C_%D9%87%D8%A7\"><\/span>\n<p>  \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>\u062c\u0627\u0648\u0627 21<\/li>\n<li>\u0648\u0628 \u0628\u0647\u0627\u0631<\/li>\n<li>\u0627\u0648\u0644\u0627\u0645\u0627<\/li>\n<li>\u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 H2<\/li>\n<li>\u0645\u062e\u0632\u0646 \u062d\u0627\u0641\u0638\u0647 \u0686\u062a JDBC\n<\/li>\n<li>\u0645\u062d\u0631\u06a9 \u0628\u0648\u062a \u0628\u0647\u0627\u0631<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"%DA%86%D8%B1%D8%A7_%D8%A8%D9%87%D8%A7%D8%B1_ai_ollama%D8%9F\"><\/span>\n<p>  \u0686\u0631\u0627 \u0628\u0647\u0627\u0631 ai + ollama\u061f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0686\u0634\u0645 \u0627\u0646\u062f\u0627\u0632 \u0645\u0647\u0646\u062f\u0633\u06cc \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u062f\u06cc\u06af\u0631 \u0641\u0642\u0637 \u067e\u0627\u06cc\u062a\u0648\u0646 \u0645\u062d\u0648\u0631 \u0646\u06cc\u0633\u062a. \u0628\u0627 <strong>\u0628\u0647\u0627\u0631 \u0634\u0645\u0627<\/strong>\u060c \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u06af\u0627\u0646 \u062c\u0627\u0648\u0627 \u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u062f\u0644 \u0647\u0627\u06cc \u0645\u0646\u0628\u0639 \u0628\u0627\u0632 \u0645\u0627\u0646\u0646\u062f Llama 3 \u060c Gemma \u060c Deepseek-R1 \u0648 \u0645\u0648\u0627\u0631\u062f \u062f\u06cc\u06af\u0631 \u060c \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u0628\u0627 \u0642\u062f\u0631\u062a AI \u0628\u0633\u0627\u0632\u0646\u062f! <br \/>\u0648 \u0628\u0647\u062a\u0631\u06cc\u0646 \u0642\u0633\u0645\u062a \u0627\u06cc\u0646 \u0627\u0633\u062a: \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0622\u0646\u0647\u0627 \u0645\u06cc\u0632\u0628\u0627\u0646\u06cc \u0645\u062d\u0644\u06cc \u0631\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u062f <strong>\u0627\u0648\u0644\u0627\u0645\u0627<\/strong>\u0628\u0634\u0631<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u060c \u0686\u06af\u0648\u0646\u0647 \u06cc\u0627\u062f \u0645\u06cc \u06af\u06cc\u0631\u06cc\u062f:<\/p>\n<ol>\n<li>Ollama \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0633\u0631\u0648\u0631 \u0645\u062d\u0644\u06cc LLM \u062e\u0648\u062f (Docker) \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u0622\u0646 \u0631\u0627 \u0628\u0627 AI \u0628\u0647\u0627\u0631 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0686\u0627\u0631\u0686\u0648\u0628 \u0645\u0647\u0646\u062f\u0633\u06cc AI \u0645\u0633\u062a\u0642\u0631 \u062f\u0631 \u062c\u0627\u0648\u0627 \u0627\u062f\u063a\u0627\u0645 \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u0628\u0627 \u0633\u0627\u0628\u0642\u0647 \u0645\u06a9\u0627\u0644\u0645\u0647 \u06cc\u06a9 \u062c\u0644\u0633\u0647 \u0686\u0646\u062f \u06a9\u0627\u0631\u0628\u0631\u0647 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u0633\u0627\u062e\u062a <strong>\u062c\u0631\u06cc\u0627\u0646 \u0686\u062a \u0628\u0627\u0628\u0627\u062a<\/strong> \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc \u0633\u0631\u0648\u0631 SENT (SSE) \u0648 \u06cc\u06a9 \u062c\u0628\u0647\u0647 \u0622\u0633\u0627\u0646 (HTML\/CSS\/JS).<\/li>\n<li>dockerizing \u0628\u0631\u0627\u06cc \u062a\u0648\u0633\u0639\u0647 \u0645\u062d\u0644\u06cc \u0648 \u0627\u0633\u062a\u0641\u0627\u062f\u0647<\/li>\n<\/ol>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0634\u06cc\u0631\u062c\u0647 \u0628\u0632\u0646\u06cc\u0645!<\/p>\n<hr\/>\n<h2><span class=\"ez-toc-section\" id=\"1_%D8%AA%D9%86%D8%B8%DB%8C%D9%85_%D9%85%D8%AF%D9%84_%D9%87%D8%A7%DB%8C_Ollama_%D9%88_%D8%A8%D8%A7%D8%B1%DA%AF%DB%8C%D8%B1%DB%8C\"><\/span>\n<p>  1. \u062a\u0646\u0638\u06cc\u0645 \u0645\u062f\u0644 \u0647\u0627\u06cc Ollama \u0648 \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u062f\u0644 \u0647\u0627\u06cc \u062c\u0645\u0639 \u0648 \u062c\u0648\u0631 \u0631\u0627 \u0628\u0627 \u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627\u06cc \u06a9\u0645 \u0648 \u0628\u06cc\u0634 1B \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u0645. \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0647\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u0634\u062f\u0647 \u062f\u0631 \u0645\u062a\u0646 \u060c \u0645\u062f\u0644 \u0647\u0627\u06cc \u06a9\u0648\u0686\u06a9 \u0627\u0646\u062a\u062e\u0627\u0628 \u062e\u0648\u0628\u06cc \u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639 \u06a9\u0627\u0631 \u0647\u0633\u062a\u0646\u062f.<br \/>\u0627\u0648\u0644\u0627\u0645\u0627 \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f LLM \u0647\u0627\u06cc \u0645\u0646\u0628\u0639 \u0628\u0627\u0632 \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u0645\u062d\u0644\u06cc \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0646\u062d\u0648\u0647 \u0634\u0631\u0648\u0639 \u06a9\u0627\u0631 \u0622\u0648\u0631\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a:<br \/>\u0646\u0635\u0628 Ollama (\u0627\u0632 \u0637\u0631\u06cc\u0642 Docker)<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>docker run <span class=\"nt\">-d<\/span> <span class=\"nt\">-v<\/span> .\/ollama\/ollama-server:\/root\/.ollama <span class=\"nt\">-p<\/span> 11434:11434 <span class=\"nt\">--name<\/span> ollama ollama\/ollama \n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><strong>\u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u0645\u062f\u0644 \u0647\u0627 (\u0627\u0646\u062a\u062e\u0627\u0628 \u06cc\u06a9 \u06cc\u0627 \u0686\u0646\u062f)<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>docker <span class=\"nb\">exec <\/span>ollama ollama pull llama3.2:1b      <span class=\"c\"># Meta's Llama 3  <\/span>\ndocker <span class=\"nb\">exec <\/span>ollama ollama pull gemma3:1b        <span class=\"c\"># Google's Gemma<\/span>\ndocker <span class=\"nb\">exec <\/span>ollama ollama pull deepseek-r1:1.5b <span class=\"c\"># Deepseek's R1<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><strong>\u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u062f\u0631 \u062d\u0627\u0644 \u0627\u062c\u0631\u0627 \u0627\u0633\u062a:<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>curl http:\/\/localhost:11434\/api\/generate <span class=\"nt\">-d<\/span> <span class=\"s1\">'{  \n  \"model\": \"llama3.2:1b\",  \n  \"prompt\": \"Hello, world!\"  \n}'<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<hr\/>\n<h2><span class=\"ez-toc-section\" id=\"2_%D9%85%D9%87%D9%86%D8%AF%D8%B3%DB%8C_AI_101_%D9%81%D8%B1%D8%A7%D8%AA%D8%B1_%D8%A7%D8%B2_%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86\"><\/span>\n<p>  2. \u0645\u0647\u0646\u062f\u0633\u06cc AI 101: \u0641\u0631\u0627\u062a\u0631 \u0627\u0632 \u067e\u0627\u06cc\u062a\u0648\u0646<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u067e\u0627\u06cc\u062a\u0648\u0646 \u0628\u0631 \u0627\u0628\u0632\u0627\u0631 AI \u062d\u0627\u06a9\u0645 \u0627\u0633\u062a \u060c <strong>\u062c\u0627\u0648\u0627 \u062f\u0631 \u062d\u0627\u0644 \u062c\u0644\u0628 \u062a\u0648\u062c\u0647 \u0627\u0633\u062a<\/strong> \u0628\u0627 \u0686\u0627\u0631\u0686\u0648\u0628 \u0647\u0627\u06cc\u06cc \u0645\u0627\u0646\u0646\u062f \u0628\u0647\u0627\u0631 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc. <br \/>\u0645\u0641\u0627\u0647\u06cc\u0645 \u06a9\u0644\u06cc\u062f\u06cc:<\/p>\n<p><strong>\u0645\u062f\u0644\u0647\u0627\u06cc \u067e\u0627\u06cc\u0647<\/strong>: LLMS \u0627\u0632 \u0642\u0628\u0644 \u0622\u0645\u0648\u0632\u0634 \u062f\u06cc\u062f\u0647 (\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 \u060c \u0644\u0627\u0645\u0627 3) \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f.<br \/><strong>API \u0647\u0627\u06cc \u0627\u0633\u062a\u0646\u0628\u0627\u0637<\/strong>: \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc\u06cc \u0645\u0627\u0646\u0646\u062f Ollama \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u0627\u06cc\u0646 \u0645\u062f\u0644 \u0647\u0627 \u0631\u0627 \u0628\u0635\u0648\u0631\u062a \u0645\u062d\u0644\u06cc \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f.<br \/><strong>\u0645\u0647\u0646\u062f\u0633\u06cc \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc<\/strong>: \u0647\u0646\u0631 \u0627\u062f\u063a\u0627\u0645 LLM \u0647\u0627 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u062f\u0646\u06cc\u0627\u06cc \u0648\u0627\u0642\u0639\u06cc (\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 \u060c \u0686\u062a \u0628\u0627\u0628\u0627\u062a \u060c \u0633\u06cc\u0633\u062a\u0645 \u0647\u0627\u06cc RAG).<\/p>\n<hr\/>\n<h2><span class=\"ez-toc-section\" id=\"3_%D8%A8%D9%87%D8%A7%D8%B1_AI_Ollama_Java_%D8%A8%D8%A7_LLMS_%D9%85%D9%84%D8%A7%D9%82%D8%A7%D8%AA_%D9%85%DB%8C_%DA%A9%D9%86%D8%AF\"><\/span>\n<p>  3. \u0628\u0647\u0627\u0631 AI + Ollama: Java \u0628\u0627 LLMS \u0645\u0644\u0627\u0642\u0627\u062a \u0645\u06cc \u06a9\u0646\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0647\u0627\u0631 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0628\u0647\u062a\u0631\u06cc\u0646 \u0627\u0646\u062a\u062e\u0627\u0628 \u0628\u0631\u0627\u06cc \u0622\u0648\u0631\u062f\u0646 \u0642\u0627\u0628\u0644\u06cc\u062a \u0647\u0627\u06cc \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0628\u0647 \u0627\u06a9\u0648\u0633\u06cc\u0633\u062a\u0645 \u0628\u0647\u0627\u0631 \u0627\u0633\u062a. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0646\u062d\u0648\u0647 \u0627\u062a\u0635\u0627\u0644 \u0622\u0646 \u0628\u0647 \u0627\u0648\u0644\u0627\u0645\u0627 \u0622\u0648\u0631\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<ul>\n<li>\u0645\u0631\u062d\u0644\u0647 3.1: AI \u0628\u0647\u0627\u0631 \u0631\u0627 \u0628\u0647 \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f\n<\/li>\n<\/ul>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight xml\"><code><span class=\"c\"><!-- use Ollama as LLM inference server and Model provider --><\/span>\n<span class=\"nt\"><dependency\/><\/span>\n    <span class=\"nt\"><groupid\/><\/span>org.springframework.ai<span class=\"nt\"\/>\n    <span class=\"nt\"><artifactid\/><\/span>spring-ai-starter-model-ollama<span class=\"nt\"\/>\n<span class=\"nt\"\/>\n<span class=\"c\"><!-- use JDBC to store messages in a relational database. --><\/span>\n    <span class=\"nt\"><dependency\/><\/span>\n    <span class=\"nt\"><groupid\/><\/span>org.springframework.ai<span class=\"nt\"\/>\n    <span class=\"nt\"><artifactid\/><\/span>spring-ai-starter-model-chat-memory-repository-jdbc<span class=\"nt\"\/>\n<span class=\"nt\"\/>\n<span class=\"nt\"><dependency\/><\/span>\n    <span class=\"nt\"><groupid\/><\/span>com.h2database<span class=\"nt\"\/>\n    <span class=\"nt\"><artifactid\/><\/span>h2<span class=\"nt\"\/>\n    <span class=\"nt\"><scope\/><\/span>runtime<span class=\"nt\"\/>\n<span class=\"nt\"\/>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<ul>\n<li>\u0645\u0631\u062d\u0644\u0647 3.2: \u0627\u0648\u0644\u0627\u0645\u0627 \u0631\u0627 \u062f\u0631 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f <code>application.yml<\/code>\n<\/li>\n<\/ul>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight yaml\"><code><span class=\"na\">spring<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">application<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">demo-chatbot<\/span>\n  <span class=\"na\">ai<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">ollama<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">base-url<\/span><span class=\"pi\">:<\/span> <span class=\"s\">http:\/\/localhost:11434<\/span>\n      <span class=\"na\">chat<\/span><span class=\"pi\">:<\/span>\n        <span class=\"na\">model<\/span><span class=\"pi\">:<\/span> <span class=\"s\">llama3.2:1b<\/span> <span class=\"c1\"># deepseek-r1:1.5b, gemma3:1b<\/span>\n    <span class=\"na\">chat<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">memory<\/span><span class=\"pi\">:<\/span>\n        <span class=\"na\">repository<\/span><span class=\"pi\">:<\/span>\n          <span class=\"na\">jdbc<\/span><span class=\"pi\">:<\/span>\n            <span class=\"c1\"># https:\/\/docs.spring.io\/spring-ai\/reference\/1.0\/api\/chat-memory.html#_schema_initialization<\/span>\n            <span class=\"na\">initialize-schema<\/span><span class=\"pi\">:<\/span> <span class=\"s\">always<\/span>\n            <span class=\"na\">schema<\/span><span class=\"pi\">:<\/span> <span class=\"s\">classpath:sql\/schema-h2.sql<\/span>\n  <span class=\"na\">datasource<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">url<\/span><span class=\"pi\">:<\/span> <span class=\"s\">jdbc:h2:mem:~\/demo-chatbot<\/span>\n    <span class=\"na\">driverClassName<\/span><span class=\"pi\">:<\/span> <span class=\"s\">org.h2.Driver<\/span>\n    <span class=\"na\">username<\/span><span class=\"pi\">:<\/span> <span class=\"s\">sa<\/span>\n    <span class=\"na\">password<\/span><span class=\"pi\">:<\/span> <span class=\"s\">password<\/span>\n  <span class=\"na\">h2<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">console<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">enabled<\/span><span class=\"pi\">:<\/span> <span class=\"kc\">true<\/span>\n      <span class=\"na\">path<\/span><span class=\"pi\">:<\/span> <span class=\"s\">\/h2<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<ul>\n<li>\u0645\u0631\u062d\u0644\u0647 3.3: \u0628\u0627 LLM \u0627\u0632 \u062c\u0627\u0648\u0627 \u062a\u0645\u0627\u0633 \u0628\u06af\u06cc\u0631\u06cc\u062f<\/li>\n<\/ul>\n<p>\u062f\u0631 <code>ChatClient<\/code> \u06cc\u06a9 API \u0645\u0633\u0644\u0637 \u0628\u0631\u0627\u06cc \u0628\u0631\u0642\u0631\u0627\u0631\u06cc \u0627\u0631\u062a\u0628\u0627\u0637 \u0628\u0627 \u06cc\u06a9 \u0645\u062f\u0644 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f.<br \/>\u062f\u0631 <code>Default System Prompt<\/code> \u06cc\u06a9 \u0627\u0644\u06af\u0648\u06cc \u0633\u0631\u06cc\u0639 \u0633\u0627\u062f\u0647 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0644\u062d\u0646 \u0631\u0627 \u0628\u0631\u0627\u06cc \u067e\u0627\u0633\u062e \u0647\u0627 \u062a\u0646\u0638\u06cc\u0645 \u0645\u06cc \u06a9\u0646\u062f.<br \/>\u062f\u0631 <code>Advisors API<\/code> \u06cc\u06a9 \u0631\u0648\u0634 \u0627\u0646\u0639\u0637\u0627\u0641 \u067e\u0630\u06cc\u0631 \u0628\u0631\u0627\u06cc \u0631\u0647\u06af\u06cc\u0631\u06cc \u060c \u0627\u0635\u0644\u0627\u062d \u0648 \u062a\u0642\u0648\u06cc\u062a \u062a\u0639\u0627\u0645\u0644 \u0628\u0627 \u06cc\u06a9 \u0645\u062f\u0644 \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc \u06a9\u0646\u062f.<br \/>(LLMS) \u0628\u062f\u0648\u0646 \u062a\u0627\u0628\u0639\u06cc\u062a \u0647\u0633\u062a\u0646\u062f \u060c \u0628\u0647 \u0627\u06cc\u0646 \u0645\u0639\u0646\u06cc \u06a9\u0647 \u0622\u0646\u0647\u0627 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u062a\u0639\u0627\u0645\u0644 \u0642\u0628\u0644\u06cc \u0631\u0627 \u062d\u0641\u0638 \u0646\u0645\u06cc \u06a9\u0646\u0646\u062f.<br \/>\u0628\u0647\u0627\u0631 ai \u062e\u0648\u062f\u06a9\u0627\u0631 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc <code>ChatMemory<\/code> \u0644\u0648\u0628\u06cc\u0627 \u06a9\u0647 \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u067e\u06cc\u0627\u0645 \u0647\u0627 \u0631\u0627 \u062f\u0631 \u0686\u0646\u062f\u06cc\u0646 \u062a\u0639\u0627\u0645\u0644 \u0630\u062e\u06cc\u0631\u0647 \u0648 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc \u06a9\u0646\u06cc\u062f. \u0628\u0631\u0627\u06cc <strong>H2<\/strong> \u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u0637\u0631\u062d \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f. \u0622\u0646 \u0631\u0627 \u062f\u0631\u0648\u0646 \u0622\u0646 \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u062f: <code>src\/main\/resources\/sql\/schema-h2.sql<\/code><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight sql\"><code><span class=\"k\">CREATE<\/span> <span class=\"k\">TABLE<\/span> <span class=\"n\">IF<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">EXISTS<\/span> <span class=\"n\">SPRING_AI_CHAT_MEMORY<\/span> <span class=\"p\">(<\/span>\n    <span class=\"n\">conversation_id<\/span> <span class=\"nb\">VARCHAR<\/span><span class=\"p\">(<\/span><span class=\"mi\">36<\/span><span class=\"p\">)<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span><span class=\"p\">,<\/span>\n    <span class=\"n\">content<\/span> <span class=\"nb\">TEXT<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span><span class=\"p\">,<\/span>\n    <span class=\"k\">type<\/span> <span class=\"nb\">VARCHAR<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span> <span class=\"k\">CHECK<\/span> <span class=\"p\">(<\/span><span class=\"k\">type<\/span> <span class=\"k\">IN<\/span> <span class=\"p\">(<\/span><span class=\"s1\">'USER'<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'ASSISTANT'<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'SYSTEM'<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'TOOL'<\/span><span class=\"p\">)),<\/span>\n    <span class=\"nv\">\"timestamp\"<\/span> <span class=\"nb\">TIMESTAMP<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">NULL<\/span>\n    <span class=\"p\">);<\/span>\n\n<span class=\"k\">CREATE<\/span> <span class=\"k\">INDEX<\/span> <span class=\"n\">IF<\/span> <span class=\"k\">NOT<\/span> <span class=\"k\">EXISTS<\/span> <span class=\"n\">SPRING_AI_CHAT_MEMORY_CONVERSATION_ID_TIMESTAMP_IDX<\/span>\n<span class=\"k\">ON<\/span> <span class=\"n\">SPRING_AI_CHAT_MEMORY<\/span><span class=\"p\">(<\/span><span class=\"n\">conversation_id<\/span><span class=\"p\">,<\/span> <span class=\"nv\">\"timestamp\"<\/span><span class=\"p\">);<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight java\"><code><span class=\"nd\">@Configuration<\/span>\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">ChatConfig<\/span> <span class=\"o\">{<\/span>\n\n    <span class=\"nd\">@Bean<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"nc\">ChatClient<\/span> <span class=\"nf\">chatClient<\/span><span class=\"o\">(<\/span><span class=\"nc\">ChatClient<\/span><span class=\"o\">.<\/span><span class=\"na\">Builder<\/span> <span class=\"n\">builder<\/span><span class=\"o\">,<\/span> <span class=\"nc\">ChatMemory<\/span> <span class=\"n\">chatMemory<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"nc\">String<\/span> <span class=\"n\">defaultSystemPrompt<\/span> <span class=\"o\">=<\/span> <span class=\"sh\">\"\"\"\n                Your are a useful AI assistant, your responsibility is provide users questions\n                about a variety of topics.\n                When answering a question, always greet first and state your name as JavaChat\n                When unsure about the answer, simply state that you don\u00b4t know.\n                \"\"\"<\/span><span class=\"o\">;<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">builder<\/span>\n                <span class=\"o\">.<\/span><span class=\"na\">defaultSystem<\/span><span class=\"o\">(<\/span><span class=\"n\">defaultSystemPrompt<\/span><span class=\"o\">)<\/span>\n                <span class=\"o\">.<\/span><span class=\"na\">defaultAdvisors<\/span><span class=\"o\">(<\/span>\n                        <span class=\"k\">new<\/span> <span class=\"nf\">SimpleLoggerAdvisor<\/span><span class=\"o\">(),<\/span>                <span class=\"c1\">\/\/simply logs requests and responses with a Model<\/span>\n                        <span class=\"k\">new<\/span> <span class=\"nf\">PromptChatMemoryAdvisor<\/span><span class=\"o\">(<\/span><span class=\"n\">chatMemory<\/span><span class=\"o\">)<\/span>  <span class=\"c1\">\/\/let Spring AI manage long term memory in the DB<\/span>\n                        <span class=\"o\">)<\/span>\n                <span class=\"o\">.<\/span><span class=\"na\">build<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight java\"><code><span class=\"nd\">@RequestMapping<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/api\/chat\"<\/span><span class=\"o\">)<\/span>\n<span class=\"nd\">@RestController<\/span>\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">ChatController<\/span> <span class=\"o\">{<\/span>\n\n    <span class=\"nd\">@Autowired<\/span>\n    <span class=\"kd\">private<\/span> <span class=\"nc\">ChatClient<\/span> <span class=\"n\">chatClient<\/span><span class=\"o\">;<\/span>\n\n    <span class=\"nd\">@GetMapping<\/span>\n    <span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"nf\">chat<\/span><span class=\"o\">(<\/span><span class=\"nd\">@RequestParam<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">question<\/span><span class=\"o\">,<\/span> <span class=\"nd\">@RequestParam<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">chatId<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">chatClient<\/span>\n                <span class=\"o\">.<\/span><span class=\"na\">prompt<\/span><span class=\"o\">()<\/span>\n                <span class=\"o\">.<\/span><span class=\"na\">user<\/span><span class=\"o\">(<\/span><span class=\"n\">question<\/span><span class=\"o\">)<\/span>\n                <span class=\"o\">.<\/span><span class=\"na\">advisors<\/span><span class=\"o\">(<\/span><span class=\"n\">advisor<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"n\">advisor<\/span>\n                        <span class=\"o\">.<\/span><span class=\"na\">param<\/span><span class=\"o\">(<\/span><span class=\"nc\">ChatMemory<\/span><span class=\"o\">.<\/span><span class=\"na\">CONVERSATION_ID<\/span><span class=\"o\">,<\/span> <span class=\"n\">chatId<\/span><span class=\"o\">))<\/span>\n                <span class=\"o\">.<\/span><span class=\"na\">call<\/span><span class=\"o\">()<\/span>\n                <span class=\"o\">.<\/span><span class=\"na\">content<\/span><span class=\"o\">();<\/span>\n    <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><strong>\u0622\u0646 \u0631\u0627 \u0627\u0645\u062a\u062d\u0627\u0646 \u06a9\u0646\u06cc\u062f<\/strong>: <code>curl \"http:\/\/localhost:8080\/api\/chat?question=Tell%20me%20a%20joke\"<\/code><\/p>\n<hr\/>\n<h2><span class=\"ez-toc-section\" id=\"4_%DA%AF%D9%81%D8%AA%DA%AF%D9%88%DB%8C_%DA%86%D8%AA_%D8%A8%D8%A7_%D8%B1%D9%88%DB%8C%D8%AF%D8%A7%D8%AF%D9%87%D8%A7%DB%8C_%D8%B3%D8%B1%D9%88%D8%B1_SSE\"><\/span>\n<p>  4. \u06af\u0641\u062a\u06af\u0648\u06cc \u0686\u062a \u0628\u0627 \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc \u0633\u0631\u0648\u0631 (SSE)<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>SSE \u06cc\u06a9 \u067e\u0631\u0648\u062a\u06a9\u0644 \u0633\u0628\u06a9 \u0628\u0631\u0627\u06cc <strong>\u062f\u0631 \u0632\u0645\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc<\/strong>\u0628\u0627 <strong>\u062c\u0631\u06cc\u0627\u0646 \u06cc\u06a9 \u0637\u0631\u0641\u0647<\/strong> \u0627\u0632 \u0633\u0631\u0648\u0631 \u0628\u0647 \u0645\u0634\u062a\u0631\u06cc (\u0645\u0646\u0627\u0633\u0628 \u0628\u0631\u0627\u06cc chatbots). \u0628\u0631 \u062e\u0644\u0627\u0641 WebSockets (\u062f\u0648 \u0637\u0631\u0641\u0647) \u060c SSE \u0628\u0631\u0627\u06cc \u0645\u0648\u0627\u0631\u062f\u06cc \u0645\u0627\u0646\u0646\u062f \u067e\u062e\u0634 LLM \u0633\u0627\u062f\u0647 \u062a\u0631 \u0627\u0633\u062a.<br \/>SSE \u0647\u0645\u0686\u0646\u06cc\u0646 UX \u0628\u0647\u062a\u0631\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0646\u0647\u0627\u06cc\u06cc \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc \u06a9\u0646\u062f \u060c \u0632\u06cc\u0631\u0627 \u067e\u0627\u0633\u062e \u0647\u0627 \u0628\u0647 \u0645\u062d\u0636 \u0622\u0645\u0627\u062f\u0647 \u0634\u062f\u0646 \u0645\u0646\u062a\u0634\u0631 \u0645\u06cc \u0634\u0648\u0646\u062f (\u0628\u0631\u062e\u06cc \u0627\u0632 \u067e\u0627\u0633\u062e \u0647\u0627\u06cc \u067e\u06cc\u0686\u06cc\u062f\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u06cc\u06a9 \u062f\u0642\u06cc\u0642\u0647 \u06cc\u0627 \u0628\u06cc\u0634\u062a\u0631 \u0637\u0648\u0644 \u0628\u06a9\u0634\u062f). \u0628\u06cc\u0627\u06cc\u06cc\u062f \u067e\u0627\u0633\u062e \u0647\u0627 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 SSE \u067e\u062e\u0634 \u06a9\u0646\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight java\"><code><span class=\"nd\">@GetMapping<\/span><span class=\"o\">(<\/span><span class=\"n\">value<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"\/stream\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">produces<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">MediaType<\/span><span class=\"o\">.<\/span><span class=\"na\">TEXT_EVENT_STREAM_VALUE<\/span><span class=\"o\">)<\/span>\n<span class=\"kd\">public<\/span> <span class=\"nc\">Flux<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">ChunkResponseDTO<\/span><span class=\"o\">&gt;<\/span> <span class=\"nf\">streamChat<\/span><span class=\"o\">(<\/span><span class=\"nd\">@RequestParam<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">question<\/span><span class=\"o\">,<\/span> <span class=\"nd\">@RequestParam<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">chatId<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"n\">chatClient<\/span>\n            <span class=\"o\">.<\/span><span class=\"na\">prompt<\/span><span class=\"o\">()<\/span>\n            <span class=\"o\">.<\/span><span class=\"na\">user<\/span><span class=\"o\">(<\/span><span class=\"n\">question<\/span><span class=\"o\">)<\/span>\n            <span class=\"o\">.<\/span><span class=\"na\">advisors<\/span><span class=\"o\">(<\/span><span class=\"n\">advisor<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"n\">advisor<\/span>\n                <span class=\"o\">.<\/span><span class=\"na\">param<\/span><span class=\"o\">(<\/span><span class=\"nc\">ChatMemory<\/span><span class=\"o\">.<\/span><span class=\"na\">CONVERSATION_ID<\/span><span class=\"o\">,<\/span> <span class=\"n\">chatId<\/span><span class=\"o\">))<\/span>\n            <span class=\"o\">.<\/span><span class=\"na\">stream<\/span><span class=\"o\">()<\/span>\n            <span class=\"o\">.<\/span><span class=\"na\">content<\/span><span class=\"o\">()<\/span>\n            <span class=\"o\">.<\/span><span class=\"na\">map<\/span><span class=\"o\">(<\/span><span class=\"n\">chunk<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">ChunkResponseDTO<\/span><span class=\"o\">(<\/span><span class=\"n\">chunk<\/span><span class=\"o\">));<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D8%AC%D8%B2%D8%A6%DB%8C%D8%A7%D8%AA_%DA%A9%D9%84%DB%8C%D8%AF%DB%8C\"><\/span>\n<p>  \u062c\u0632\u0626\u06cc\u0627\u062a \u06a9\u0644\u06cc\u062f\u06cc:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>\n<strong>text_event_stream_value<\/strong>: \u0647\u062f\u0631 <code>text\/event-stream<\/code> SSE \u0631\u0627 \u0641\u0639\u0627\u0644 \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<li>\n<strong>\u0642\u0627\u0644\u0628 SSE<\/strong>: \u0647\u0631 \u067e\u06cc\u0627\u0645 \u0628\u0627\u06cc\u062f \u0628\u0647 \u067e\u0627\u06cc\u0627\u0646 \u0628\u0631\u0633\u062f <code>\\n\\n<\/code>\u0628\u0634\u0631 \u067e\u06cc\u0634\u0648\u0646\u062f \u0628\u0627 <code>data:<\/code> \u0628\u0631\u0627\u06cc \u0627\u0646\u0637\u0628\u0627\u0642<\/li>\n<li>\n<strong>\u062c\u0631\u06cc\u0627\u0646 \u0647\u0627\u06cc \u0648\u0627\u06a9\u0646\u0634\u06cc<\/strong>: <code>Flux<\/code> (\u0627\u0632 \u067e\u0631\u0648\u0698\u0647 \u0631\u0627\u06a9\u062a\u0648\u0631) \u062c\u0631\u06cc\u0627\u0646 \u062c\u0631\u06cc\u0627\u0646 \u0646\u0627\u0647\u0645\u0632\u0645\u0627\u0646 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u062f\u0647\u062f.\n<\/li>\n<\/ul>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight java\"><code><span class=\"kd\">public<\/span> <span class=\"n\">record<\/span> <span class=\"nf\">ChunkResponseDTO<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">value<\/span><span class=\"o\">)<\/span> <span class=\"o\">{}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<hr\/>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D8%AD%D8%AF%D9%88%D8%AF%DB%8C%D8%AA_%D8%A8%D8%A7_HTTP11\"><\/span>\n<p>  \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0628\u0627 HTTP\/1.1<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h4><span class=\"ez-toc-section\" id=\"%D9%85%D8%AD%D8%AF%D9%88%D8%AF%DB%8C%D8%AA_%D9%87%D8%A7%DB%8C_%D8%A7%D8%AA%D8%B5%D8%A7%D9%84\"><\/span>\n<p>  \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0647\u0627\u06cc \u0627\u062a\u0635\u0627\u0644:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<ul>\n<li>\u0645\u0631\u0648\u0631\u06af\u0631\u0647\u0627 \u0641\u0642\u0637 6 \u0627\u062a\u0635\u0627\u0644 \u0647\u0645\u0632\u0645\u0627\u0646 HTTP\/1.1 \u0631\u0627 \u062f\u0631 \u0647\u0631 \u062f\u0627\u0645\u0646\u0647 \u0645\u062c\u0627\u0632 \u0645\u06cc \u06a9\u0646\u0646\u062f.<\/li>\n<li>SSE \u06cc\u06a9 \u0627\u062a\u0635\u0627\u0644 \u062f\u0631 \u0647\u0631 \u062c\u0631\u06cc\u0627\u0646 \u0645\u0635\u0631\u0641 \u0645\u06cc \u06a9\u0646\u062f \u060c \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0647\u0627\u06cc \u062f\u06cc\u06af\u0631 \u0631\u0627 \u0645\u0633\u062f\u0648\u062f \u06a9\u0646\u062f.<\/li>\n<\/ul>\n<hr\/>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A7%D8%B1%D8%AA%D9%82%D8%A7%D8%A1_%D8%A8%D9%87_HTTP2_%D8%A8%D8%B1%D8%A7%DB%8C_%D8%B9%D9%85%D9%84%DA%A9%D8%B1%D8%AF\"><\/span>\n<p>  \u0627\u0631\u062a\u0642\u0627\u0621 \u0628\u0647 HTTP\/2 \u0628\u0631\u0627\u06cc \u0639\u0645\u0644\u06a9\u0631\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h4><span class=\"ez-toc-section\" id=\"HTTP2_%D8%AA%D9%86%DA%AF%D9%86%D8%A7%D9%87%D8%A7%DB%8C_SSE_%D8%B1%D8%A7_%D8%A8%D8%A7\"><\/span>\n<p>  HTTP\/2 \u062a\u0646\u06af\u0646\u0627\u0647\u0627\u06cc SSE \u0631\u0627 \u0628\u0627:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p><strong>\u0686\u0646\u062f \u0628\u0631\u0627\u0628\u0631<\/strong>: \u0686\u0646\u062f\u06cc\u0646 \u062c\u0631\u06cc\u0627\u0646 \u0628\u06cc\u0634 \u0627\u0632 \u06cc\u06a9 \u0627\u062a\u0635\u0627\u0644 TCP. \u062d\u062f\u0627\u06a9\u062b\u0631 \u062a\u0639\u062f\u0627\u062f \u062c\u0631\u06cc\u0627\u0646\u0647\u0627\u06cc HTTP \u0647\u0645\u0632\u0645\u0627\u0646 \u0628\u06cc\u0646 \u0633\u0631\u0648\u0631 \u0648 \u0645\u0634\u062a\u0631\u06cc \u0645\u0630\u0627\u06a9\u0631\u0647 \u0645\u06cc \u0634\u0648\u062f (\u067e\u06cc\u0634 \u0641\u0631\u0636 \u062a\u0627 100)<\/p>\n<h4><span class=\"ez-toc-section\" id=\"%D9%86%D8%AD%D9%88%D9%87_%D9%81%D8%B9%D8%A7%D9%84_%DA%A9%D8%B1%D8%AF%D9%86_HTTP2_%D8%AF%D8%B1_%D8%A8%D9%88%D8%AA_%D8%A8%D9%87%D8%A7%D8%B1\"><\/span>\n<p>  \u0646\u062d\u0648\u0647 \u0641\u0639\u0627\u0644 \u06a9\u0631\u062f\u0646 HTTP\/2 \u062f\u0631 \u0628\u0648\u062a \u0628\u0647\u0627\u0631<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<ul>\n<li>\u0645\u0631\u062d\u0644\u0647 4.1: \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc HTTP\/2 \u062f\u0631 <code>application.yml<\/code>\n<\/li>\n<\/ul>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight yaml\"><code><span class=\"na\">server<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">http2<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">enabled<\/span><span class=\"pi\">:<\/span> <span class=\"kc\">true<\/span>\n  <span class=\"na\">ssl<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">enabled<\/span><span class=\"pi\">:<\/span> <span class=\"kc\">true<\/span>\n    <span class=\"na\">key-store<\/span><span class=\"pi\">:<\/span> <span class=\"s\">classpath:keystore.p12<\/span>\n    <span class=\"na\">key-store-password<\/span><span class=\"pi\">:<\/span> <span class=\"s\">yourpassword<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<ul>\n<li>\u0645\u0631\u062d\u0644\u0647 4.2: \u06cc\u06a9 \u06af\u0648\u0627\u0647\u06cc\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0627\u0645\u0636\u0627 \u06a9\u0646\u06cc\u062f (<strong>\u0641\u0642\u0637 \u0628\u0631\u0627\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634<\/strong>):\n<\/li>\n<\/ul>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>keytool <span class=\"nt\">-genkeypair<\/span> <span class=\"nt\">-alias<\/span> mydomain <span class=\"nt\">-keyalg<\/span> RSA <span class=\"nt\">-keysize<\/span> 2048 <span class=\"nt\">-storetype<\/span> PKCS12 <span class=\"nt\">-keystore<\/span> keystore.p12 <span class=\"nt\">-validity<\/span> 365\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h4><span class=\"ez-toc-section\" id=\"%D8%AA%D8%A3%DB%8C%DB%8C%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF_HTTP2_%D9%81%D8%B9%D8%A7%D9%84_%D8%A7%D8%B3%D8%AA_-k_%D8%A8%D8%B1%D8%A7%DB%8C_%D8%A7%D8%B9%D8%AA%D9%85%D8%A7%D8%AF_%D8%A8%D9%87_%DA%AF%D9%88%D8%A7%D9%87%DB%8C%D9%86%D8%A7%D9%85%D9%87_%D8%AE%D9%88%D8%AF_%D8%A7%D9%85%D8%B6%D8%A7_%D8%B4%D8%AF%D9%87\"><\/span>\n<p>  \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f HTTP\/2 \u0641\u0639\u0627\u0644 \u0627\u0633\u062a (-k \u0628\u0631\u0627\u06cc \u0627\u0639\u062a\u0645\u0627\u062f \u0628\u0647 \u06af\u0648\u0627\u0647\u06cc\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0627\u0645\u0636\u0627 \u0634\u062f\u0647)<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p><code>curl --head -k https:\/\/localhost:8080\/actuator\/health<\/code><\/p>\n<hr\/>\n<h3><span class=\"ez-toc-section\" id=\"Frontend\"><\/span>\n<p>  Frontend:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0634\u0631\u0648\u0639 \u0628\u0627 JavaScript:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"kd\">const<\/span> <span class=\"nx\">chatStream<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"nx\">question<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">eventSource<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">EventSource<\/span><span class=\"p\">(<\/span><span class=\"s2\">`https:\/\/localhost:8080\/api\/chat\/stream?chatId=1&amp;question=<\/span><span class=\"p\">${<\/span><span class=\"nf\">encodeURIComponent<\/span><span class=\"p\">(<\/span><span class=\"nx\">question<\/span><span class=\"p\">)}<\/span><span class=\"s2\">`<\/span><span class=\"p\">);<\/span>\n\n  <span class=\"nx\">eventSource<\/span><span class=\"p\">.<\/span><span class=\"nx\">onmessage<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n\n    <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">New message:<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">JSON<\/span><span class=\"p\">.<\/span><span class=\"nf\">parse<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span><span class=\"p\">).<\/span><span class=\"nx\">value<\/span><span class=\"p\">);<\/span>\n    <span class=\"c1\">\/\/ Append to UI (e.g., a chat div)<\/span>\n    <span class=\"nb\">document<\/span><span class=\"p\">.<\/span><span class=\"nf\">getElementById<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">messages<\/span><span class=\"dl\">'<\/span><span class=\"p\">).<\/span><span class=\"nx\">innerHTML<\/span> <span class=\"o\">+=<\/span> <span class=\"nx\">JSON<\/span><span class=\"p\">.<\/span><span class=\"nf\">parse<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span><span class=\"p\">).<\/span><span class=\"nx\">value<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">};<\/span>\n\n  <span class=\"nx\">eventSource<\/span><span class=\"p\">.<\/span><span class=\"nx\">onerror<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">error<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">SSE error:<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">e<\/span><span class=\"p\">);<\/span>\n    <span class=\"nx\">eventSource<\/span><span class=\"p\">.<\/span><span class=\"nf\">close<\/span><span class=\"p\">();<\/span>\n  <span class=\"p\">};<\/span>\n<span class=\"p\">};<\/span>\n\n<span class=\"c1\">\/\/ Usage<\/span>\n<span class=\"nf\">chatStream<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Tell me about Java<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D8%AC%D8%B2%D8%A6%DB%8C%D8%A7%D8%AA_%DA%A9%D9%84%DB%8C%D8%AF%DB%8C-2\"><\/span>\n<p>  \u062c\u0632\u0626\u06cc\u0627\u062a \u06a9\u0644\u06cc\u062f\u06cc:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><code>EventSource<\/code>: API \u0645\u0631\u0648\u0631\u06af\u0631 \u0628\u0648\u0645\u06cc \u0628\u0631\u0627\u06cc SSE (\u0647\u06cc\u0686 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0627\u06cc \u0644\u0627\u0632\u0645 \u0646\u06cc\u0633\u062a).<br \/><strong>\u0627\u062a\u0635\u0627\u0644 \u0645\u062c\u062f\u062f \u062e\u0648\u062f\u06a9\u0627\u0631<\/strong>: \u0627\u06af\u0631 \u0627\u062a\u0635\u0627\u0644 \u06a9\u0627\u0647\u0634 \u06cc\u0627\u0628\u062f \u060c \u0645\u0646\u0637\u0642 \u0622\u0632\u0645\u0627\u06cc\u0634 \u0645\u062c\u062f\u062f \u062f\u0627\u062e\u0644\u06cc.<\/p>\n<hr\/>\n<h4><span class=\"ez-toc-section\" id=\"%D8%B1%D9%86%D8%AF%D8%B1_%D8%AC%D9%84%D9%88_%D8%A8%D8%B1%D8%A7%DB%8C_%D8%AE%D8%B1%D9%88%D8%AC%DB%8C_LLM\"><\/span>\n<p>  \u0631\u0646\u062f\u0631 \u062c\u0644\u0648 \u0628\u0631\u0627\u06cc \u062e\u0631\u0648\u062c\u06cc LLM<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p><strong>\u067e\u0627\u0633\u062e \u0647\u0627\u06cc LLM \u0627\u063a\u0644\u0628 \u0634\u0627\u0645\u0644 Markdown \u06cc\u0627 HTML \u0627\u0633\u062a<\/strong> (\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 \u060c <code>**bold**<\/code>\u0628\u0627 <code><script\/><\/code>), which can lead to <code>XSS vulnerabilities<\/code> if rendered <em>naively<\/em>. Here\u2019s how to secure your frontend:\n<ul>\n<li>Step 4.3: Sanitize Markdown\/HTML <strong>(Critical!)<\/strong>\nUse DOMPurify to sanitize raw LLM output before rendering:\n<\/li>\n<\/ul>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight html\"><code><span class=\"nt\"><script><![CDATA[<span class=\"na\">src=]]><\/script><\/span><span class=\"s\">\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/dompurify\/3.0.6\/purify.min.js\"<\/span><span class=\"nt\">><\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"nx\">eventSource<\/span><span class=\"p\">.<\/span><span class=\"nx\">onmessage<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">chunkResponse<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">JSON<\/span><span class=\"p\">.<\/span><span class=\"nf\">parse<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span><span class=\"p\">).<\/span><span class=\"nx\">value<\/span><span class=\"p\">);<\/span>\n    <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">New message:<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">chunkResponse<\/span><span class=\"p\">);<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">sanitized<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">DOMPurify<\/span><span class=\"p\">.<\/span><span class=\"nf\">sanitize<\/span><span class=\"p\">(<\/span><span class=\"nx\">chunkResponse<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ Strips malicious scripts<\/span>\n    <span class=\"c1\">\/\/ Append to UI (e.g., a chat div)<\/span>\n    <span class=\"nb\">document<\/span><span class=\"p\">.<\/span><span class=\"nf\">getElementById<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">messages<\/span><span class=\"dl\">'<\/span><span class=\"p\">).<\/span><span class=\"nx\">innerHTML<\/span> <span class=\"o\">+=<\/span> <span class=\"nx\">sanitized<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">};<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<ul>\n<li>\u0645\u0631\u062d\u0644\u0647 4.4: \u0628\u0631\u0627\u06cc \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0627\u0632 \u0639\u0644\u0627\u0645\u062a \u06af\u0630\u0627\u0631\u06cc (\u0627\u062e\u062a\u06cc\u0627\u0631\u06cc)<\/li>\n<\/ul>\n<p>\u0627\u06af\u0631 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f <strong>\u0628\u0627 \u062e\u06cc\u0627\u0644 \u0631\u0627\u062d\u062a \u0639\u0644\u0627\u0645\u062a \u06af\u0630\u0627\u0631\u06cc \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u06cc\u062f<\/strong>\u060c \u0627\u0632 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0627\u06cc \u0645\u0627\u0646\u0646\u062f Marked + Dompurify \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight html\"><code><span class=\"nt\"><script><![CDATA[<span class=\"na\">src=]]><\/script><\/span><span class=\"s\">\"https:\/\/cdn.jsdelivr.net\/npm\/marked\/marked.min.js\"<\/span><span class=\"nt\">&gt;<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code>  <span class=\"kd\">let<\/span> <span class=\"nx\">chunkResponses<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">''<\/span><span class=\"p\">;<\/span>\n  <span class=\"nx\">eventSource<\/span><span class=\"p\">.<\/span><span class=\"nx\">onmessage<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">chunkResponses<\/span> <span class=\"o\">+=<\/span> <span class=\"nx\">JSON<\/span><span class=\"p\">.<\/span><span class=\"nf\">parse<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span><span class=\"p\">).<\/span><span class=\"nx\">value<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ Sanitize all chunks received so far.<\/span>\n    <span class=\"nx\">DOMPurify<\/span><span class=\"p\">.<\/span><span class=\"nf\">sanitize<\/span><span class=\"p\">(<\/span><span class=\"nx\">chunkResponses<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"c1\">\/\/ Check if the output was insecure.<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">DOMPurify<\/span><span class=\"p\">.<\/span><span class=\"nx\">removed<\/span><span class=\"p\">.<\/span><span class=\"nx\">length<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"c1\">\/\/ If the output was insecure, immediately stop what you were doing.<\/span>\n      <span class=\"c1\">\/\/ Reset the parser and flush the remaining Markdown.<\/span>\n      <span class=\"nx\">chunkResponses<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">''<\/span><span class=\"p\">;<\/span>\n      <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"c1\">\/\/ Append to UI (e.g., a chat div)<\/span>\n    <span class=\"nb\">document<\/span><span class=\"p\">.<\/span><span class=\"nf\">getElementById<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">messages<\/span><span class=\"dl\">'<\/span><span class=\"p\">).<\/span><span class=\"nx\">innerHTML<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">marked<\/span><span class=\"p\">.<\/span><span class=\"nf\">parse<\/span><span class=\"p\">(<\/span><span class=\"nx\">chunkResponses<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">};<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<hr\/>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D9%84%D8%A7%D8%AD%D8%B8%D8%A7%D8%AA_%D8%A7%D9%85%D9%86%DB%8C%D8%AA%DB%8C_%DA%A9%D9%84%DB%8C%D8%AF%DB%8C_%D9%87%D8%B1%DA%AF%D8%B2_%D8%A8%D9%87_%D8%AE%D8%B1%D9%88%D8%AC%DB%8C_LLM_%D8%A7%D8%B9%D8%AA%D9%85%D8%A7%D8%AF_%D9%86%DA%A9%D9%86%DB%8C%D8%AF_%D9%88_%D9%86%D9%87_%D9%88%D8%B1%D9%88%D8%AF%DB%8C_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1\"><\/span>\n<p>  \u0645\u0644\u0627\u062d\u0638\u0627\u062a \u0627\u0645\u0646\u06cc\u062a\u06cc \u06a9\u0644\u06cc\u062f\u06cc: \u0647\u0631\u06af\u0632 \u0628\u0647 \u062e\u0631\u0648\u062c\u06cc LLM \u0627\u0639\u062a\u0645\u0627\u062f \u0646\u06a9\u0646\u06cc\u062f (\u0648 \u0646\u0647 \u0648\u0631\u0648\u062f\u06cc \u06a9\u0627\u0631\u0628\u0631)\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>\u0641\u0631\u0636 \u06a9\u0646\u06cc\u062f \u062a\u0645\u0627\u0645 \u067e\u0627\u0633\u062e \u0647\u0627\u06cc LLM \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u062d\u0627\u0648\u06cc \u06a9\u062f \u0645\u062e\u0631\u0628 (\u062d\u062a\u06cc \u0646\u0627\u062e\u0648\u0627\u0633\u062a\u0647) \u0628\u0627\u0634\u062f.<\/li>\n<li>\u0641\u0631\u0636 \u06a9\u0646\u06cc\u062f \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0633\u0639\u06cc \u0645\u06cc \u06a9\u0646\u0646\u062f \u06a9\u062f \u0634\u0645\u0627 \u0631\u0627 \u0628\u0634\u06a9\u0646\u0646\u062f \u0648 \u0627\u0645\u0646\u06cc\u062a \u0634\u0645\u0627 \u0631\u0627 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u0646\u062f.<\/li>\n<li>\u062d\u0645\u0644\u0647 \u0645\u062b\u0627\u0644: \u0633\u0644\u0627\u0645 <code><script><![CDATA[fetch('\/steal-cookie')]]><\/script><\/code>\n<\/li>\n<\/ul>\n<hr\/>\n<h4><span class=\"ez-toc-section\" id=\"%D9%85%D8%AD%D8%AF%D9%88%D8%AF%DB%8C%D8%AA_%D8%A8%D8%A7_API_EventSource\"><\/span>\n<p>  \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0628\u0627 API EventSource<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>\u062d\u062a\u06cc \u0627\u06af\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 SSE \u062f\u0631 \u0633\u0645\u062a \u0645\u0634\u062a\u0631\u06cc \u0622\u0633\u0627\u0646 \u0628\u0627\u0634\u062f \u060c API EventSource \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0647\u0627\u06cc\u06cc \u062f\u0627\u0631\u062f:<\/p>\n<ul>\n<li>\n<strong>\u0628\u062f\u0648\u0646 \u0647\u062f\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0633\u0641\u0627\u0631\u0634\u06cc<\/strong>: \u0647\u062f\u0631\u0647\u0627\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0633\u0641\u0627\u0631\u0634\u06cc \u0645\u062c\u0627\u0632 \u0646\u06cc\u0633\u062a\u0646\u062f.<\/li>\n<li>\n<strong>http \u0641\u0642\u0637 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u06cc\u062f<\/strong>: \u0647\u06cc\u0686 \u0631\u0627\u0647\u06cc \u0628\u0631\u0627\u06cc \u0645\u0634\u062e\u0635 \u06a9\u0631\u062f\u0646 \u0631\u0648\u0634 HTTP \u062f\u06cc\u06af\u0631 \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0631\u062f.<\/li>\n<li>\n<strong>\u0628\u062f\u0648\u0646 \u0628\u062f\u0646\u0647 \u062f\u0631\u062e\u0648\u0627\u0633\u062a<\/strong>: \u062a\u0645\u0627\u0645 \u067e\u06cc\u0627\u0645 \u0647\u0627\u06cc \u06af\u067e \u0628\u0627\u06cc\u062f \u062f\u0631 URL \u0628\u0627\u0634\u062f \u06a9\u0647 \u062f\u0631 \u0627\u06a9\u062b\u0631 \u0645\u0631\u0648\u0631\u06af\u0631\u0647\u0627 \u0628\u0647 2000 \u06a9\u0627\u0631\u0627\u06a9\u062a\u0631 \u0645\u062d\u062f\u0648\u062f \u0645\u06cc \u0634\u0648\u062f.<\/li>\n<li>\n<strong>\u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0647\u0627\u06cc \u067e\u0633\u0648\u0646\u062f \u0631\u0627 \u0628\u0631\u0627\u06cc EventSource \u0648 SSE \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f<\/strong>: Fetch Source \u060c Fetch API + getReader ()\n<\/li>\n<\/ul>\n<hr\/>\n<ul>\n<li>\u0645\u0631\u062d\u0644\u0647 4.5: \u0634\u0631\u0648\u0639 \u0633\u0627\u062e\u062a\u0627\u0631 HTML<\/li>\n<\/ul>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0633\u0627\u062e\u062a\u0627\u0631 HTML \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u06a9\u0647 \u0634\u0627\u0645\u0644 \u06cc\u06a9 \u0641\u0631\u0645 \u0628\u0631\u0627\u06cc \u0648\u0631\u0648\u062f\u06cc \u06a9\u0627\u0631\u0628\u0631 \u060c \u06cc\u06a9 \u0638\u0631\u0641 \u0628\u0631\u0627\u06cc \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u067e\u062e\u0634 \u0634\u062f\u0647 \u0648 \u06cc\u06a9 \u0646\u0648\u0627\u0631 \u062c\u0627\u0646\u0628\u06cc \u0628\u0631\u0627\u06cc \u062a\u0627\u0631\u06cc\u062e\u0686\u0647 \u067e\u06cc\u0627\u0645 \u0627\u0633\u062a.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight html\"><code><span class=\"cp\"\/>\n<span class=\"nt\"> <span class=\"na\">lang=<\/span><span class=\"s\">\"en\"<\/span><span class=\"nt\">&gt;<\/span>\n<span class=\"nt\"\/>\n    <span class=\"nt\"><title\/><\/span>Spring AI Chat<span class=\"nt\"\/>\n    <span class=\"nt\"><link\/> <span class=\"na\">rel=<\/span><span class=\"s\">\"stylesheet\"<\/span> <span class=\"na\">href=<\/span><span class=\"s\">\"layout.css\"<\/span><span class=\"nt\">&gt;<\/span>\n<span class=\"nt\"\/>\n<span class=\"nt\"\/>\n<span class=\"c\"><!-- Sidebar for chat history --><\/span>\n<span class=\"nt\"><div> <span class=\"na\">id=<\/span><span class=\"s\">\"sidebar\"<\/span><span class=\"nt\">&gt;<\/span>\n    <span class=\"nt\"><h3\/><\/span>Chat History<span class=\"nt\"\/>\n    <span class=\"nt\"\/>\n<span class=\"nt\"\/><\/div><\/span>\n\n<span class=\"c\"><!-- Main chat area --><\/span>\n<span class=\"nt\"><div> <span class=\"na\">id=<\/span><span class=\"s\">\"chat-container\"<\/span><span class=\"nt\">&gt;<\/span>\n    <span class=\"nt\"><p> <span class=\"na\">id=<\/span><span class=\"s\">\"messages\"<\/span><span class=\"nt\">&gt;<\/span><\/p><\/span>\n    <span class=\"nt\"\/>\n<span class=\"nt\"\/><\/div><\/span>\n\n<span class=\"nt\"><script><![CDATA[<span class=\"na\">src=]]><\/script><\/span><span class=\"s\">\"main.js\"<\/span><span class=\"nt\">&gt;<\/span> <span class=\"nt\"\/>\n<span class=\"nt\"><script><![CDATA[<span class=\"na\">src=]]><\/script><\/span><span class=\"s\">\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/dompurify\/3.0.6\/purify.min.js\"<\/span><span class=\"nt\">&gt;<\/span>\n<span class=\"nt\"><script><![CDATA[<span class=\"na\">src=]]><\/script><\/span><span class=\"s\">\"https:\/\/cdn.jsdelivr.net\/npm\/marked\/marked.min.js\"<\/span><span class=\"nt\">&gt;<\/span>\n<span class=\"nt\"\/>\n<span class=\"nt\"\/>\n\n<\/span><\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>HTML \u0631\u0627 \u062f\u0631 <code>src\/main\/resources\/static\/index.html<\/code><br \/>\u062c\u0627\u0648\u0627 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0631\u0627 \u062f\u0631 <code>src\/main\/resources\/static\/js\/main.js<\/code><\/p>\n<hr\/>\n<h2><span class=\"ez-toc-section\" id=\"5_%D8%A8%D9%87%D8%A7%D8%B1_AI_Ollama_Chatbot_%D8%AE%D9%88%D8%AF_%D8%B1%D8%A7_%D8%A8%D8%A7_Docker_%D9%85%D8%B3%D8%AA%D9%82%D8%B1_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  5. \u0628\u0647\u0627\u0631 AI + Ollama Chatbot \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 Docker \u0645\u0633\u062a\u0642\u0631 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>\u0645\u0631\u062d\u0644\u0647 5.1 Docker Compose Setup<\/li>\n<\/ul>\n<p>\u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u0646 <code>ollama-docker-compose.yaml<\/code><br \/><em>(PS \u0627\u06af\u0631 \u062f\u0633\u062a\u06af\u0627\u0647 \u0634\u0645\u0627 \u0627\u0632 GPU \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc \u06a9\u0646\u062f \u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0634\u062a\u0627\u0628 GPU \u0631\u0627 \u062f\u0631 \u062f\u0627\u062e\u0644 \u0638\u0631\u0648\u0641 Docker \u0641\u0639\u0627\u0644 \u06a9\u0646\u06cc\u062f. \u0627\u0633\u0646\u0627\u062f \u062a\u0635\u0648\u06cc\u0631 Ollama)<\/em><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight yaml\"><code><span class=\"na\">services<\/span><span class=\"pi\">:<\/span>\n  <span class=\"c1\"># Ollama LLM inference server<\/span>\n  <span class=\"na\">ollama<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span> <span class=\"c1\"># Ollama with persistent storage (no redownloading models).<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s\">.\/ollama\/ollama-server:\/root\/.ollama<\/span>\n    <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ollama<\/span>\n    <span class=\"na\">pull_policy<\/span><span class=\"pi\">:<\/span> <span class=\"s\">always<\/span>\n    <span class=\"na\">tty<\/span><span class=\"pi\">:<\/span> <span class=\"kc\">true<\/span>\n    <span class=\"na\">restart<\/span><span class=\"pi\">:<\/span> <span class=\"s\">unless-stopped<\/span>\n    <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">docker.io\/ollama\/ollama:latest<\/span>\n    <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s\">11434:11434<\/span>\n    <span class=\"na\">environment<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s\">OLLAMA_KEEP_ALIVE=24h<\/span>\n    <span class=\"c1\"># Enable GPU support<\/span>\n    <span class=\"na\">deploy<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">resources<\/span><span class=\"pi\">:<\/span>\n        <span class=\"na\">reservations<\/span><span class=\"pi\">:<\/span>\n          <span class=\"na\">devices<\/span><span class=\"pi\">:<\/span>\n            <span class=\"pi\">-<\/span> <span class=\"na\">driver<\/span><span class=\"pi\">:<\/span> <span class=\"s\">nvidia<\/span>\n              <span class=\"na\">count<\/span><span class=\"pi\">:<\/span> <span class=\"s\">all<\/span>\n              <span class=\"na\">capabilities<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">[<\/span><span class=\"nv\">gpu<\/span><span class=\"pi\">]<\/span>\n  <span class=\"c1\"># Spring AI Backend<\/span>\n  <span class=\"na\">chat-app<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">context<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.<\/span> <span class=\"c1\"># Dockerfile in the root folder<\/span>\n    <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">chat-app<\/span>\n    <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">8080:8080\"<\/span>\n    <span class=\"na\">environment<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s\">SPRING_AI_OLLAMA_BASE_URL=http:\/\/ollama:11434<\/span>\n    <span class=\"na\">depends_on<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"s\">ollama<\/span>\n\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<ul>\n<li>\u0645\u0631\u062d\u0644\u0647 5.2 Boot Boot Dockerfile\n<\/li>\n<\/ul>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"c\"># Maven build stage<\/span>\nFROM maven:3.9.9-eclipse-temurin-21-alpine as build\nWORKDIR \/app\nCOPY pom.xml <span class=\"nb\">.<\/span>\nRUN mvn dependency:go-offline\nCOPY src\/ .\/src\/\nRUN mvn clean package\n\n<span class=\"c\"># Spring Boot package stage<\/span>\nFROM eclipse-temurin:21-jre-alpine\nCOPY <span class=\"nt\">--from<\/span><span class=\"o\">=<\/span>build app\/target\/<span class=\"k\">*<\/span>.jar app.jar\nEXPOSE 8080\nENTRYPOINT <span class=\"o\">[<\/span><span class=\"s2\">\"java\"<\/span>, <span class=\"s2\">\"-jar\"<\/span>, <span class=\"s2\">\"app.jar\"<\/span><span class=\"o\">]<\/span>\n\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<ul>\n<li>\u0647\u0645\u0647 \u0686\u06cc\u0632 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 <code>docker-compose build &amp;&amp; docker-compose up -d<\/code>\n<\/li>\n<li>\u062d\u0631\u06a9\u062a \u0628\u0647: <code>https:\/\/localhost:8080<\/code> \u0648 \u062c\u0644\u0633\u0647 \u0686\u062a \u062e\u0648\u062f \u0631\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u062f<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frv5ufznlvf0mdliwbpal.gif\" loading=\"lazy\" width=\"720\" height=\"358\" alt=\"\" title=\"\"><\/p>\n<ul>\n<li>\u0627\u06af\u0631 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0628\u0628\u06cc\u0646\u06cc\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u067e\u06cc\u0627\u0645 \u0647\u0627 \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc \u0634\u0648\u0646\u062f \u060c \u0628\u0647 \u06a9\u0646\u0633\u0648\u0644 H2 \u0628\u0631\u0648\u06cc\u062f <code>https:\/\/localhost:8080\/h2<\/code>\n<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr7wn23kzhu7wmthj5xrw.JPG\" alt=\"\u0628\u0647\u0627\u0631\" loading=\"lazy\" width=\"800\" height=\"267\" title=\"\"><\/p>\n<hr\/>\n<h2><span class=\"ez-toc-section\" id=\"%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C_%D8%A2%DB%8C%D9%86%D8%AF%D9%87_%D9%87%D9%88%D8%B4_%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C_%D8%AC%D8%A7%D9%88%D8%A7_%D8%B4%D9%85%D8%A7\"><\/span>\n<p>  \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc: \u0622\u06cc\u0646\u062f\u0647 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u062c\u0627\u0648\u0627 \u0634\u0645\u0627<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><strong>\u0645\u0639\u0645\u0627\u0631\u06cc \u0646\u0647\u0627\u06cc\u06cc<\/strong><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmgoeijn273kxgcod3i74.jpg\" alt=\"\u0627\u0633\u067e\u0631\u06cc\u0646\u06af\u0627\u06cc-\u0627\u0648\u0644\u0627\" loading=\"lazy\" width=\"800\" height=\"287\" title=\"\"><\/p>\n<p>\u0634\u0645\u0627 \u0641\u0642\u0637 \u06cc\u06a9 <strong>\u0645\u06cc\u0632\u0628\u0627\u0646 \u0645\u062d\u0644\u06cc \u060c \u0686\u062a \u0628\u0627\u0628\u0627\u062a \u0645\u0646\u0628\u0639 \u0628\u0627\u0632<\/strong> \u0628\u0627 \u0628\u0647\u0627\u0631 AI \u0648 Ollama \u060c \u0647\u06cc\u0686 \u0647\u0632\u06cc\u0646\u0647 API OpenAi \u06cc\u0627 \u067e\u0627\u06cc\u062a\u0648\u0646 \u0644\u0627\u0632\u0645 \u0646\u06cc\u0633\u062a!<br \/>SSE + http\/2 + \u0628\u0647\u0627\u0631 ai = <strong>\u062c\u0631\u06cc\u0627\u0646 LLM \u0645\u0642\u06cc\u0627\u0633 \u067e\u0630\u06cc\u0631 \u0648 \u062f\u0631 \u0632\u0645\u0627\u0646 \u0648\u0627\u0642\u0639\u06cc<\/strong>\u0628\u0634\u0631<\/p>\n<p><strong>\u06a9\u062c\u0627 \u0628\u0631\u0648\u06cc\u0645\u061f<\/strong><\/p>\n<ul>\n<li>\u06a9\u062f \u06a9\u0627\u0645\u0644 \u0631\u0627 \u067e\u0631\u062f\u0627\u062e\u062a \u06a9\u0646\u06cc\u062f\n<\/li>\n<li>\u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0631\u062f\u0646 <strong>RAG (\u0646\u0633\u0644 \u0628\u0627\u0632\u06cc\u0627\u0628\u06cc-\u0622\u0645\u0631\u06cc\u0643\u0627)<\/strong> \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 API \u0645\u062f\u0644 \u062a\u0639\u0628\u06cc\u0647 \u0634\u062f\u0647 AI \u0628\u0647\u0627\u0631 AI \u0648 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0628\u0631\u062f\u0627\u0631.<\/li>\n<\/ul>\n<p><strong>\u0686\u0647 \u0686\u06cc\u0632\u06cc \u0645\u06cc \u0633\u0627\u0632\u06cc\u062f\u061f<\/strong> \u0627\u0641\u06a9\u0627\u0631 \u062e\u0648\u062f \u0631\u0627 \u062f\u0631 \u0646\u0638\u0631\u0627\u062a \u0628\u0647 \u0627\u0634\u062a\u0631\u0627\u06a9 \u0628\u06af\u0630\u0627\u0631\u06cc\u062f! \ud83d\udc47<\/p>\n<p><em>(PS \u0645\u0646 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0622\u0645\u0648\u0632\u0634 \u0628\u06cc\u0634\u062a\u0631 Java + AI \u062f\u0646\u0628\u0627\u0644 \u06a9\u0646\u06cc\u062f!)<\/em><\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0645\u0627 \u0627\u0632 \u062a\u0627\u0632\u0647 \u0645\u0646\u062a\u0634\u0631 \u0634\u062f\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f \u0628\u0647\u0627\u0631 ai 1.0 ga \u0646\u0633\u062e\u0647 \u060c \u0622\u0645\u0627\u062f\u0647 \u0628\u0631\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f\u060c \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a\u0646 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0686\u062a \u0628\u0627 Spring AI \u060c Ollama \u060c Docker \u0648 \u0627\u0631\u0627\u0626\u0647 \u0645\u062f\u06cc\u0631\u06cc\u062a \u062d\u0627\u0641\u0638\u0647 \u0686\u062a \u062c\u0639\u0628\u0647.\u0628\u06af\u0630\u0627\u0631\u06cc\u062f \u062a\u0648\u0633\u0639\u0647 \u062f\u0647\u0646\u062f\u06af\u0627\u0646 \u062c\u0627\u0648\u0627 \u0628\u062a\u0648\u0627\u0646\u0646\u062f \u0628\u0647 \u0633\u0631\u0639\u062a \u0648 \u0628\u0647 \u0631\u0627\u062d\u062a\u06cc \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06cc \u0631\u0627 \u0628\u0647 \u067e\u0631\u0648\u0698\u0647 \u0647\u0627\u06cc \u062e\u0648\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u0646\u062f. \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627: &hellip;<\/p>\n","protected":false},"author":2,"featured_media":110127,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/media2.dev.to\/dynamic\/image\/width=1000,height=500,fit=cover,gravity=auto,format=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvxpfrs6hro6kfa8ufmf6.jpg","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-110126","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/110126","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=110126"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/110126\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/110127"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=110126"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=110126"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=110126"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}