{"id":473455,"date":"2025-09-02T16:34:14","date_gmt":"2025-09-02T16:34:14","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=473455"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=473455","title":{"rendered":"<span>RAG \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u0411\u0414: \u041d\u0415 \u0421\u0438\u0437\u0438\u0444\u043e\u0432 LLM \u043d\u0430 Java \u0438 Spring Ai<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0411\u0440\u043e\u043c\u0431\u0438\u043d \u0410\u043d\u0434\u0440\u0435\u0439, \u0438 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0437\u0431\u0435\u0440\u0443 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 RAG-\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u043a\u0430\u043a \u043e\u043d\u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0443\u043b\u0443\u0447\u0448\u0430\u0442\u044c \u043f\u043e\u0438\u0441\u043a. \u041f\u043e\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Spring AI, \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 LLM. \u0422\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0448\u044c \u0442\u0435\u043e\u0440\u0438\u044e \u0438 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 Java \u0438 Spring Boot \u2014 \u043e\u0442 \u0438\u0434\u0435\u0438 \u0434\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430. \u0411\u0435\u0437 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0443\u043b \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0451\u0442\u043a\u0438\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u0438 \u043a\u043e\u0434.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/494\/156\/ff5\/494156ff5baf45e616e3bac224925fac.png\" alt=\"\" title=\"\" width=\"1244\" height=\"756\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/494\/156\/ff5\/494156ff5baf45e616e3bac224925fac.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/494\/156\/ff5\/494156ff5baf45e616e3bac224925fac.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h3>\u041e \u0447\u0451\u043c \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f?<\/h3>\n<p>\u041e\u0442\u0432\u0435\u0442\u0438\u043c \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b:<\/p>\n<ul>\n<li>\n<p><strong>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/strong> \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d\u0438 \u043d\u0435\u0437\u0430\u043c\u0435\u043d\u0438\u043c\u044b \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441 \u0418\u0418.<\/p>\n<\/li>\n<li>\n<p><strong>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 embeddings<\/strong> \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u0435\u0437 \u043d\u0438\u0445 RAG-\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0435\u0440\u044f\u044e\u0442 \u0441\u0432\u043e\u044e \u0441\u0438\u043b\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441<\/strong> \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u0437\u043d\u0430\u043d\u0438\u0439 \u043f\u043e \u0441\u043c\u044b\u0441\u043b\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Spring Boot, Spring AI \u0438 Qdrant.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441<\/strong> \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u0440\u0435\u043f\u043b\u0451\u043d\u043d\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 LLM \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Spring AI.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u043f\u043e\u0441\u043e\u0431\u044b \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c RAG<\/strong>: \u043a\u0430\u043a \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043a <strong>\u0441\u043e\u0431\u0440\u0430\u0442\u044c<\/strong> \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435 \u0432 <strong>\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443<\/strong>, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u043d\u043e <strong>\u0447\u0435\u0441\u0442\u043d\u043e <\/strong>\u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0440\u0435\u0437\u044e\u043c\u0435.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435: \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d RAG?<\/h3>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435: \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c LLM (\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u044f\u0437\u044b\u043a\u043e\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u043c\u0435\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442, \u043d\u043e \u0431\u0435\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442: \u00ab\u041a\u0430\u043a \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443 X \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 Y?\u00bb.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c, \u0442\u0438\u043a\u0435\u0442\u0430\u043c \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u043e\u043d\u0430 \u043b\u0438\u0431\u043e \u0432\u044b\u0434\u0443\u043c\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 (\u0433\u0430\u043b\u043b\u044e\u0446\u0438\u043d\u0430\u0446\u0438\u044f), \u043b\u0438\u0431\u043e \u0447\u0435\u0441\u0442\u043d\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u0435\u0442\u0441\u044f: <em>\u00ab\u041d\u0435 \u0437\u043d\u0430\u044e\u00bb<\/em>. RAG \u0440\u0435\u0448\u0430\u0435\u0442 \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0443\u0436\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ca9\/994\/402\/ca99944022b2fc259f88b6dfe6ee2c88.png\" alt=\"\u041e\u043d \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u0442\u0451\u0440, \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u043b\u0435\u0444\u0443\u0435\u0442 \u2014 \u043e\u043d \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0432 \u043a\u0443\u0440\u0441\u0435 \u043f\u0440\u043e \u043d\u0430\u0448 payment service\" title=\"\u041e\u043d \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u0442\u0451\u0440, \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u043b\u0435\u0444\u0443\u0435\u0442 \u2014 \u043e\u043d \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0432 \u043a\u0443\u0440\u0441\u0435 \u043f\u0440\u043e \u043d\u0430\u0448 payment service\" width=\"1440\" height=\"669\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/ca9\/994\/402\/ca99944022b2fc259f88b6dfe6ee2c88.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ca9\/994\/402\/ca99944022b2fc259f88b6dfe6ee2c88.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041e\u043d \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u0442\u0451\u0440, \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u043b\u0435\u0444\u0443\u0435\u0442 \u2014 \u043e\u043d \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0432 \u043a\u0443\u0440\u0441\u0435 \u043f\u0440\u043e \u043d\u0430\u0448 payment service<\/figcaption><\/div>\n<\/figure>\n<p><strong>RAG <\/strong>\u0440\u0435\u0448\u0430\u0435\u0442 \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u044f \u0434\u0432\u0430 \u044d\u0442\u0430\u043f\u0430:<\/p>\n<ol>\n<li>\n<p><strong>Retrieval (\u043f\u043e\u0438\u0441\u043a)<\/strong>: \u041d\u0430\u0445\u043e\u0434\u0438\u0442 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0431\u0430\u0437\u0435 \u0437\u043d\u0430\u043d\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430. \u042d\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0438 \u0442\u043e\u0447\u043d\u0435\u0435, \u0447\u0435\u043c \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0441\u043b\u043e\u0432\u0430\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>Augmented Generation (\u043f\u043e\u0434\u043a\u0440\u0435\u043f\u043b\u0451\u043d\u043d\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f)<\/strong>: \u041f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 LLM, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u0442\u043e\u0447\u043d\u044b\u0439 \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u043a\u043b\u044e\u0447 \u043a \u0443\u0441\u043f\u0435\u0445\u0443 RAG \u2014 \u044d\u0442\u043e <strong>\u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438<\/strong> \u0438 <strong>\u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/strong>. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e \u0432\u043d\u0435\u0434\u0440\u0438\u0432 \u0435\u0451 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 <a href=\"https:\/\/habr.com\/p\/912502\/\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u043e\u0432<\/a>. \u0417\u0435\u043b\u0451\u043d\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c \u044f \u0432\u044b\u0434\u0435\u043b\u0438\u043b <strong>Retrieval<\/strong> \u0431\u043b\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0437\u0430 \u043f\u043e\u0438\u0441\u043a \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0441\u0438\u043d\u0438\u043c \u2014 \u0431\u043b\u043e\u043a <strong>Agumented Generation<\/strong> \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u0440\u0435\u043f\u043b\u0451\u043d\u043d\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8b4\/2f8\/68a\/8b42f868adf6f2ea111ddd7216a4631c.png\" alt=\"\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 RAG-\u0441\u0438\u0441\u0442\u0435\u043c\u044b\" title=\"\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 RAG-\u0441\u0438\u0441\u0442\u0435\u043c\u044b\" width=\"1248\" height=\"703\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/8b4\/2f8\/68a\/8b42f868adf6f2ea111ddd7216a4631c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8b4\/2f8\/68a\/8b42f868adf6f2ea111ddd7216a4631c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 RAG-\u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/figcaption><\/div>\n<\/figure>\n<h4>\u041a\u043e\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c RAG?<\/h4>\n<p>RAG \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0430\u043c, \u0433\u0434\u0435 \u043c\u043d\u043e\u0433\u043e \u043d\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445: \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b, \u0442\u0438\u043a\u0435\u0442\u044b, \u0440\u0435\u0433\u043b\u0430\u043c\u0435\u043d\u0442\u044b. \u041e\u043d \u0434\u0430\u0451\u0442 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0431\u0435\u0437 \u0434\u043e\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u2014 \u044d\u0442\u043e \u0434\u043e\u0440\u043e\u0433\u043e \u0438 \u0442\u0440\u0443\u0434\u043e\u0451\u043c\u043a\u043e. \u0415\u0449\u0451 RAG \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u0440\u0438\u0441\u043a \u0433\u0430\u043b\u043b\u044e\u0446\u0438\u043d\u0430\u0446\u0438\u0439 LLM, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e\u0434\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0435\u0439 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442.<\/p>\n<h3>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f<\/h3>\n<h4>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 embeddings?<\/h4>\n<p>\u042d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438 \u2014 \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u0441\u043c\u044b\u0441\u043b \u0442\u0435\u043a\u0441\u0442\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>    \u00ab\u041f\u043e\u0435\u0437\u0434 \u043f\u0440\u0438\u0431\u044b\u043b \u043d\u0430 \u0441\u0442\u0430\u043d\u0446\u0438\u044e\u00bb = <code>[0.27, -0.41, 0.88, ...]<\/code><br \/>    \u00ab\u041f\u043e\u0435\u0437\u0434 \u043f\u043e\u0434\u044a\u0435\u0445\u0430\u043b \u043a \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u00bb = <code>[0.26, -0.40, 0.87, ...]<\/code><\/p>\n<p>    \u00ab\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043b\u0435\u0433\u043b\u0430 \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439\u00bb = <code>[-0.11, 0.17, -0.56, ...]<\/code><br \/>    \u00ab\u0411\u0414 \u0443\u0448\u043b\u0430 \u0432 \u0437\u0430\u043a\u0430\u0442 \u043d\u0430 \u043f\u0438\u043a\u0435\u00bb = <code>[-0.08, 0.16, -0.51, ...]<\/code><\/p>\n<p>\u042d\u0442\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u044b \u0431\u043b\u0438\u0437\u043a\u0438 \u043f\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044e, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0445 \u0441\u043c\u044b\u0441\u043b \u043f\u043e\u0445\u043e\u0436. \u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a\u0438\u043c\u0438 \u043a\u0430\u043a:<\/p>\n<ul>\n<li>\n<p><strong>\u041a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u0435 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e<\/strong>: <img decoding=\"async\" class=\"formula inline\" source=\"cos(\u03b8) = (A\u00b7B)\/(|A|\u00b7|B|)\" alt=\"cos(\u03b8) = (A\u00b7B)\/(|A|\u00b7|B|)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/614\/ed2\/948\/614ed2948f3761876c66bcc9d9038bc3.svg\" width=\"228\" height=\"22\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/614\/ed2\/948\/614ed2948f3761876c66bcc9d9038bc3.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/614\/ed2\/948\/614ed2948f3761876c66bcc9d9038bc3.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u0433\u0434\u0435 A \u0438 B \u2014 \u0432\u0435\u043a\u0442\u043e\u0440\u044b. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0442 -1 (\u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u044b\u0439 \u0441\u043c\u044b\u0441\u043b) \u0434\u043e 1 (\u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u0439 \u0441\u043c\u044b\u0441\u043b).<\/p>\n<\/li>\n<li>\n<p><strong>\u0415\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435<\/strong>: <img decoding=\"async\" class=\"formula inline\" source=\"\u221a\u03a3(Ai - Bi)\u00b2\" alt=\"\u221a\u03a3(Ai - Bi)\u00b2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d3b\/ce8\/579\/d3bce85797985182ff257c378241ecb4.svg\" width=\"118\" height=\"23\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d3b\/ce8\/579\/d3bce85797985182ff257c378241ecb4.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d3b\/ce8\/579\/d3bce85797985182ff257c378241ecb4.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u0433\u0434\u0435 \u043c\u0435\u043d\u044c\u0448\u0435\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u044c.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438? <\/strong>\u041c\u043e\u0434\u0435\u043b\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 BERT, \u043e\u0431\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0443\u043b\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438 \u0441\u043c\u044b\u0441\u043b \u0441\u043b\u043e\u0432. \u0422\u0435\u043a\u0441\u0442 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u044b \u2014 \u0441\u043b\u043e\u0432\u0430 \u0438\u043b\u0438 \u0438\u0445 \u0447\u0430\u0441\u0442\u0438. \u042d\u0442\u0438 \u0442\u043e\u043a\u0435\u043d\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0447\u0435\u0440\u0435\u0437 \u0441\u043b\u043e\u0438 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u0430, \u0438 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435.<\/p>\n<h2>\u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u044b \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445?<\/h2>\n<p>\u0412\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u044f\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u2014 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438. \u0418\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435: \u0431\u043b\u0438\u0437\u043a\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 \u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442 \u0441\u0445\u043e\u0436\u0438\u0439 \u0441\u043c\u044b\u0441\u043b, \u0430 \u0434\u0430\u043b\u0451\u043a\u0438\u0435 \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430 \u2014 \u0440\u0430\u0437\u043d\u044b\u0439. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0438\u0441\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u043f\u043e \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044e \u0441\u043b\u043e\u0432, \u0430 \u043f\u043e \u0441\u043c\u044b\u0441\u043b\u0443. \u042d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u044b\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u0411\u0414 \u0443\u0434\u043e\u0431\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 LLM \u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/080\/96b\/33a\/08096b33a3d63a38c0e44e8b0977d2a1.png\" alt=\"\u0412\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e IT-\u043a\u043e\u043c\u043f\u0435\u0442\u0435\u043d\u0446\u0438\u0439 \u0438 \u0438\u0445 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0435\" title=\"\u0412\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e IT-\u043a\u043e\u043c\u043f\u0435\u0442\u0435\u043d\u0446\u0438\u0439 \u0438 \u0438\u0445 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0435\" width=\"738\" height=\"517\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/080\/96b\/33a\/08096b33a3d63a38c0e44e8b0977d2a1.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/080\/96b\/33a\/08096b33a3d63a38c0e44e8b0977d2a1.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0412\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e IT-\u043a\u043e\u043c\u043f\u0435\u0442\u0435\u043d\u0446\u0438\u0439 \u0438 \u0438\u0445 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0435<\/figcaption><\/div>\n<\/figure>\n<p><strong>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 JSON-\u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u0411\u0414:<\/strong><\/p>\n<ul>\n<li>\n<p><strong>ID<\/strong> \u2014 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>Vector (Embedding)<\/strong> \u2014 \u0441\u0430\u043c \u0432\u0435\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0445 \u0441\u043e\u0441\u0435\u0434\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p><strong>Payload (Metadata)<\/strong> \u2014 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0447\u0430\u0441\u0442\u043e JSON): \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443, \u0442\u0438\u043f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430, \u0430\u0432\u0442\u043e\u0440, \u0434\u0430\u0442\u0430 \u0438 \u0442.\u0434.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/strong> \u2014 \u0441\u0430\u043c \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0438\u043b\u0438 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041f\u0440\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c: <\/strong>\u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430\u0445, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b <strong>\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/strong>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 API-\u043a\u043b\u044e\u0447\u0430\u043c\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0434\u043b\u044f \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443 \u043c\u0435\u0442\u043a\u0443 <code>access_level<\/code> \u0438\u043b\u0438 <code>access_role<\/code>, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0443\u044e, \u043a\u0442\u043e \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0430\u0432\u043e \u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440, \u043b\u0438\u0431\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0430.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1d8\/6f2\/c40\/1d86f2c40ebc9f32d2a09c5ad8b19c86.png\" alt=\"\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u0430\u044f JSON-\u043f\u043e\u0434\u043e\u0431\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\" title=\"\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u0430\u044f JSON-\u043f\u043e\u0434\u043e\u0431\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\" width=\"924\" height=\"588\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/1d8\/6f2\/c40\/1d86f2c40ebc9f32d2a09c5ad8b19c86.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1d8\/6f2\/c40\/1d86f2c40ebc9f32d2a09c5ad8b19c86.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u0430\u044f JSON-\u043f\u043e\u0434\u043e\u0431\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430<\/figcaption><\/div>\n<\/figure>\n<p><strong>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0438\u0441\u043a: <\/strong>\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u044b \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u044e\u0442\u0441\u044f. \u0417\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0442\u0430\u043a\u0436\u0435 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0432\u0435\u043a\u0442\u043e\u0440 \u0438 \u0431\u0430\u0437\u0430 \u0438\u0449\u0435\u0442 \u0441\u0430\u043c\u044b\u0435 \u0431\u043b\u0438\u0437\u043a\u0438\u0435 \u043a \u043d\u0435\u043c\u0443 \u043f\u043e \u0441\u043c\u044b\u0441\u043b\u0443. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0432\u0440\u043e\u0434\u0435 HNSW (\u043e\u0431\u0445\u043e\u0434 \u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430) \u0438\u043b\u0438 IVF (\u043e\u0431\u0445\u043e\u0434 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432) \u0434\u0435\u043b\u0430\u044e\u0442 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u2014 \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439.<\/p>\n<h2>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 Java \u0438 Spring Ai<\/h2>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 RAG \u043d\u0430 Java \u0438 Spring AI \u043d\u0443\u0436\u043d\u044b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u0412 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<details class=\"spoiler\">\n<summary>pom.xml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"xml\">&lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;io.grpc&lt;\/groupId&gt; &lt;artifactId&gt;grpc-services&lt;\/artifactId&gt; &lt;\/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.grpc&lt;\/groupId&gt; &lt;artifactId&gt;spring-grpc-spring-boot-starter&lt;\/artifactId&gt; &lt;\/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.ai&lt;\/groupId&gt; &lt;artifactId&gt;spring-ai-starter-vector-store-qdrant&lt;\/artifactId&gt; &lt;\/dependency&gt;         \/\/ \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435: lombok, spring-boot \u0438 \u0442\u0434 &lt;\/dependencies&gt; &lt;dependencyManagement&gt; &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.ai&lt;\/groupId&gt; &lt;artifactId&gt;spring-ai-bom&lt;\/artifactId&gt; &lt;version&gt;${spring-ai.version}&lt;\/version&gt; &lt;type&gt;pom&lt;\/type&gt; &lt;scope&gt;import&lt;\/scope&gt; &lt;\/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.grpc&lt;\/groupId&gt; &lt;artifactId&gt;spring-grpc-dependencies&lt;\/artifactId&gt; &lt;version&gt;${spring-grpc.version}&lt;\/version&gt; &lt;type&gt;pom&lt;\/type&gt; &lt;scope&gt;import&lt;\/scope&gt; &lt;\/dependency&gt; &lt;\/dependencies&gt; &lt;\/dependencyManagement&gt;<\/code><\/pre>\n<\/div>\n<\/details>\n<h3>\u041f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u0432 \u0432\u0435\u043a\u0442\u043e\u0440<\/h3>\n<p><strong>Spring AI<\/strong> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 EmbeddingModel. \u0421\u0440\u0435\u0434\u0438 \u043d\u0438\u0445: <code>OpenAiEmbeddingModel<\/code>, <code>OllamaEmbeddingModel<\/code>, <code>PostgresMlEmbeddingModel<\/code> \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 <code>spring-ai-starter-model-&lt;modelName&gt;<\/code>. \u042d\u0442\u043e \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0442 \u0440\u0443\u0447\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <code>call()<\/code> \u0438\u043b\u0438 <code>embed()<\/code>, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044f \u0435\u0434\u0438\u043d\u044b\u0439 API \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432.<\/p>\n<p>\u0414\u043b\u044f <strong>\u0440\u0443\u0441\u0441\u043a\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430<\/strong> \u043c\u044b \u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043d\u0430 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 <strong>\u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438<\/strong>. \u0421\u0435\u0439\u0447\u0430\u0441 \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0432\u044b\u0431\u043e\u0440 \u2014 \u043c\u043e\u0434\u0435\u043b\u044c <a href=\"https:\/\/huggingface.co\/ai-forever\/ru-en-RoSBERTa\" rel=\"noopener noreferrer nofollow\">ru-en-RoSBERTa<\/a> \u043d\u0430 Hugging Face: \u043e\u043d\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0430 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u0438 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c \u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0434\u0432\u0443\u044f\u0437\u044b\u0447\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u043d\u0444\u0438\u0433 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438 RoSBERTa<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">@Configuration @FieldDefaults(level = AccessLevel.PRIVATE) public class RosbertaClientConfig {      @Value(\"${huggingface.token}\")     String hfToken;      @Value(\"${huggingface.rosberta.url}\")     String rosbertaUrl;      @Bean     public RestClient ruEnHuggingFaceRestClient() {         if (hfToken == null || hfToken.isBlank()) {             throw new IllegalStateException(\"huggingface token is not set\");         }                  return RestClient.builder()                 .baseUrl(rosbertaUrl)                 .defaultHeader(\"Authorization\", \"Bearer \" + hfToken)                 .build();     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041a\u043b\u0430\u0441\u0441 <code>RosbertaEmbeddingModel<\/code> \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043e\u0434\u0435\u043b\u044c\u044e. \u0412 <code>call<\/code> \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441 \u043a API Hugging Face: \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c <code>\"search_query\"<\/code>, \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 payload \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f POST-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u0447\u0435\u0440\u0435\u0437 <code>RestClient<\/code>. \u0412 \u043e\u0442\u0432\u0435\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0447\u0438\u0441\u0435\u043b (\u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433). \u041c\u0435\u0442\u043e\u0434 <code>embed<\/code> \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u043c\u0435\u0442\u043e\u0434\u0443 <code>call<\/code>, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0442\u0435\u043a\u0441\u0442 \u0438\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430. \u041f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e, \u0430 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0439 API.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043b\u0430\u0441\u0441 RosbertaEmbeddingModel<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">@Service @RequiredArgsConstructor @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public class RosbertaEmbeddingModel extends AbstractEmbeddingModel {     RestClient restClient;      @Override     public @NotNull EmbeddingResponse call(@NotNull EmbeddingRequest request) {         var payload = Map.of(             \"inputs\", \"search_query: \" + request.getInstructions().get(0),             \"parameters\",              Map.of(\"pooling_method\", \"cls\", \"normalize_embeddings\", true)         );          List&lt;Double&gt; responseList = restClient.post()                 .contentType(MediaType.APPLICATION_JSON)                 .body(payload)                 .retrieve()                 .body(new ParameterizedTypeReference&lt;&gt;() {});          float[] floats = convertDoubleListToFloatArray(responseList);          return new EmbeddingResponse(List.of(new Embedding(floats, 0)));     }      @Override     public @NotNull float[] embed(@NotNull Document document) {         return call(new EmbeddingRequest(List.of(document.getFormattedContent()), null))                 .getResults().getFirst().getOutput();     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0447\u0435\u0440\u0435\u0437 Postman, \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0432 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u043d\u0430\u0448\u0435\u043c\u0443 API:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/315\/373\/d2c\/315373d2cf1db8858724d5f4204b84c3.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440: \u0442\u0435\u043a\u0441\u0442 \u0438 \u0435\u0433\u043e \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0439 \u0432\u0435\u043a\u0442\u043e\u0440\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440: \u0442\u0435\u043a\u0441\u0442 \u0438 \u0435\u0433\u043e \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0439 \u0432\u0435\u043a\u0442\u043e\u0440\" width=\"815\" height=\"612\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/315\/373\/d2c\/315373d2cf1db8858724d5f4204b84c3.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/315\/373\/d2c\/315373d2cf1db8858724d5f4204b84c3.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440: \u0442\u0435\u043a\u0441\u0442 \u0438 \u0435\u0433\u043e \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0439 \u0432\u0435\u043a\u0442\u043e\u0440<\/figcaption><\/div>\n<\/figure>\n<h3>\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435<\/h3>\n<p>\u041f\u043e\u0434\u043d\u0438\u043c\u0435\u043c <strong>Qdrant<\/strong> \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>docker-compose.yml<\/code>:<\/p>\n<details class=\"spoiler\">\n<summary>docker-compose.yml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">services:   qdrant:     image: qdrant\/qdrant:latest     restart: always     container_name: qdrant     ports:       - 6333:6333       - 6334:6334     expose:       - 6333       - 6334       - 6335     configs:       - source: qdrant_config         target: \/qdrant\/config\/production.yaml     volumes:       - .\/qdrant_data:\/qdrant\/storage  configs:   qdrant_config:     content: |       log_level: INFO<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0420\u0430\u043d\u0435\u0435 \u043c\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u043f\u0430\u043a\u0435\u0442\u044b Spring AI \u0438 gRPC \u2014 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Qdrant \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c. \u0414\u043b\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430: \u0437\u0430\u0434\u0430\u0442\u044c \u0435\u0451 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e. Spring \u0443\u043c\u0435\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c <code>QdrantVectorStore<\/code>, \u0435\u0441\u043b\u0438 \u0432 <code>application.yml<\/code> \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u0438\u0434\u0430:\u00bb<\/p>\n<pre><code class=\"yaml\">spring:   ai:     vectorstore:       qdrant:         host: &lt;qdrant host&gt;         port: &lt;qdrant grpc port&gt;         api-key: &lt;qdrant api key&gt;         collection-name: &lt;collection name&gt;         use-tls: false         initialize-schema: true<\/code><\/pre>\n<p>\u0420\u0443\u0447\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u0430 \u0438 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043d\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0433\u043e <code>EmbeddingModel<\/code>, \u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u2014 <code>RosbertaEmbeddingModel<\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0432 <code>@Bean QdrantVectorStore<\/code>.<\/p>\n<details class=\"spoiler\">\n<summary>class QdrantConfig<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">@Slf4j @Configuration @FieldDefaults(level = AccessLevel.PRIVATE) public class QdrantConfig {      @Value(\"${qdrant.host:localhost}\")     String qdrantHost;      @Value(\"${qdrant.port:6334}\")     int qdrantPort;      @Value(\"${qdrant.collection-name:incidents}\")     String collectionName;      @Value(\"${qdrant.api-key:}\")     String apiKey;      @Bean     @Primary     public QdrantClient qdrantClient() {         QdrantGrpcClient.Builder builder = QdrantGrpcClient                   .newBuilder(qdrantHost, qdrantPort, false);         if (apiKey != null &amp;&amp; !apiKey.trim().isEmpty()) {             builder.withApiKey(apiKey);         }         return new QdrantClient(builder.build());     }      @Bean     @Primary     public QdrantVectorStore qdrantVectorStore(QdrantClient qdrantClient,                                                RosbertaEmbeddingModel rosbertaEmbeddingModel) {         QdrantVectorStore voStore = QdrantVectorStore                 .builder(qdrantClient, rosbertaEmbeddingModel)                 .collectionName(collectionName)                 .initializeSchema(true)                 .build();          return voStore;     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041d\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u044b \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0435\u0433\u043e. \u041f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0432 embedding \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 <code>EmbeddingModel<\/code> \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043b\u0430\u0441\u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 Qdrant<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">@Slf4j @Service @RequiredArgsConstructor @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public class IncidentEmbeddingService {      QdrantVectorStore qdrantVectorStore;      public void storeIncident(String text, List&lt;String&gt; tags) {         Map&lt;String, Object&gt; metadata = new HashMap&lt;&gt;();         metadata.put(\"tags\", tags);         metadata.put(\"timestamp\", System.currentTimeMillis());          Document document = new Document(text, metadata);         qdrantVectorStore.doAdd(List.of(document));     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c <strong>Qdrant Web UI<\/strong> \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9b0\/6e3\/4be\/9b06e34be2646c3aa8e73a784b1c7b11.png\" alt=\"\u0421\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0439 Point \u0438 \u0435\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 Qdrant\" title=\"\u0421\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0439 Point \u0438 \u0435\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 Qdrant\" width=\"1086\" height=\"869\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/9b0\/6e3\/4be\/9b06e34be2646c3aa8e73a784b1c7b11.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9b0\/6e3\/4be\/9b06e34be2646c3aa8e73a784b1c7b11.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0439 Point \u0438 \u0435\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 Qdrant<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0431\u043e\u0433\u0430\u0442\u0438\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0435\u043c \u0436\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c. \u0427\u0442\u043e\u0431\u044b \u0433\u0440\u0430\u0444 \u0431\u044b\u043b \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435, \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0430\u043c\u044b\u0435 \u0432\u0430\u0436\u043d\u044b\u0435 \u0441\u0432\u044f\u0437\u0438, \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0432 \u043e\u0441\u0442\u043e\u0432\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/70c\/0fa\/159\/70c0fa15951b79f4d60f4fda1a8453da.png\" alt=\"\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435\/\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0441\u0442\u043e\u0432\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0438\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0432 Qdrant\" title=\"\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435\/\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0441\u0442\u043e\u0432\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0438\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0432 Qdrant\" width=\"1185\" height=\"612\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/70c\/0fa\/159\/70c0fa15951b79f4d60f4fda1a8453da.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/70c\/0fa\/159\/70c0fa15951b79f4d60f4fda1a8453da.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435\/\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0441\u0442\u043e\u0432\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0438\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0432 Qdrant<\/figcaption><\/div>\n<\/figure>\n<h3>\u041f\u043e\u0438\u0441\u043a \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u043f\u043e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u043b\u0438 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 <code>\/incidents\/similar<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>limit<\/code> \u0437\u0430\u0434\u0430\u0451\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432.<\/p>\n<details class=\"spoiler\">\n<summary>\u042d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">@PostMapping(path = \"\/incidents\/similar\", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity&lt;List&lt;Document&gt;&gt; getSimilarIncidents(         @RequestBody String query,         @RequestParam(defaultValue = \"3\") int limit) {     try {         List&lt;Document&gt; responseDocuments = incidentEmbeddingService                                         .searchSimilarIncidents(query, limit);         return ResponseEntity.ok(responseDocuments);     } catch (Exception e) {         return ResponseEntity.internalServerError().build();     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>searchSimilarIncidents<\/code> \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 (<code>SearchRequest<\/code>) \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0438 <code>topK<\/code>. \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0432 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0441 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u0432 \u0431\u0430\u0437\u0435. \u0412\u043d\u0443\u0442\u0440\u0438 Qdrant \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u0431\u043b\u0438\u0437\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u2014 \u0443\u0433\u043e\u043b \u043c\u0435\u0436\u0434\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u041c\u0435\u0442\u043e\u0434 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 Qdrant<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public List&lt;Document&gt; searchSimilarIncidents(String query, Integer limit) {     SearchRequest searchRequest = SearchRequest.builder()             .query(query)             .topK(limit)             \/\/.filterExtension(\"key == 'value'\")             \/\/.similarityThreshold(0.6)             .build();     return qdrantVectorStore.similaritySearch(searchRequest); }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043a API \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <em>k<\/em> \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0431\u043b\u0438\u0437\u043a\u0438\u0445 \u043f\u043e \u0441\u043c\u044b\u0441\u043b\u0443. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043c\u0435\u0442\u0440\u0438\u043a\u0438: <code>distance<\/code> \u2014 \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 (\u0447\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435, \u0442\u0435\u043c \u0431\u043b\u0438\u0436\u0435 \u043f\u043e \u0441\u043c\u044b\u0441\u043b\u0443) \u0438<code>score = 1 - distance<\/code>. \u042d\u0442\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u043d\u0436\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2d4\/fd1\/f27\/2d4fd1f27ea422984ce010d8abf1821d.png\" alt=\"\u041e\u0442\u0432\u0435\u0442 API: \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432\" title=\"\u041e\u0442\u0432\u0435\u0442 API: \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432\" width=\"948\" height=\"759\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/2d4\/fd1\/f27\/2d4fd1f27ea422984ce010d8abf1821d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2d4\/fd1\/f27\/2d4fd1f27ea422984ce010d8abf1821d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041e\u0442\u0432\u0435\u0442 API: \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<p>\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u0433\u043e \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u0430 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043b\u0443\u0447\u0448\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \u2014 <strong>\u0431\u0435\u0440\u0451\u043c k \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0445 \u0441\u043e\u0441\u0435\u0434\u0435\u0439<\/strong> \u0438 \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u043c \u043f\u043e\u0438\u0441\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e RAG Fusion. \u041e \u043d\u0451\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043f\u0440\u043e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u0430.<\/p>\n<h3>\u041f\u043e\u0434\u043a\u0440\u0435\u043f\u043b\u0451\u043d\u043d\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430<\/h3>\n<p>Spring AI \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 LLM, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, OpenAI, Gemini, LLaMA, Amazon AI \u0438 \u0434\u0440\u0443\u0433\u0438\u0435. \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b <code>ChatModel<\/code> \u0438 <code>ChatClient<\/code> \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e. \u042d\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 RAG-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0438 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430\u043c\u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e. \u0418\u0437 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0445 LLM-\u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043d\u0435 \u0431\u0435\u0437 \u0442\u0440\u0443\u0434\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f GigaChat \u0438 YandexGPT.<\/p>\n<h4>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f<\/h4>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Open AI \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0432 <code>pom.xml<\/code>:<\/p>\n<pre><code class=\"xml\">&lt;dependency&gt; &lt;groupId&gt;org.springframework.ai&lt;\/groupId&gt; &lt;artifactId&gt;spring-ai-starter-model-openai&lt;\/artifactId&gt; &lt;\/dependency&gt;<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b: <strong>\u043c\u043e\u0434\u0435\u043b\u044c<\/strong>, <strong>\u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0443<\/strong> \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438, <strong>\u043b\u0438\u043c\u0438\u0442 \u0442\u043e\u043a\u0435\u043d\u043e\u0432<\/strong> \u0432 \u043e\u0442\u0432\u0435\u0442\u0435, <strong>API-\u043a\u043b\u044e\u0447<\/strong> \u0438 <strong>URL<\/strong> \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u043e\u0432.<\/p>\n<pre><code class=\"yaml\">spring:   ai:     openai:       api-key: sk-&lt;OPEN_AI_API_KEY&gt;       base-url: &lt;OPEN_AI_API_URL&gt;       chat:         completions-path: \/v1\/chat\/completions         options:           model: gpt-5           temperature: 1           max-completion-tokens: 1000<\/code><\/pre>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>temperature<\/code> \u0432 LLM (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0432 OpenAI) \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0442\u0435\u043f\u0435\u043d\u044c\u044e \u00ab\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0441\u0442\u0438\u00bb \u0438\u043b\u0438 \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0435\u043a\u0441\u0442\u0430. \u041f\u0440\u0438 <code>temperature = 0<\/code> \u043c\u043e\u0434\u0435\u043b\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u0430\u043c\u044b\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442. \u041f\u0440\u0438 <code>temperature &gt; 1<\/code> \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u2014 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435, \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b.<\/p>\n<p>\u041d\u0435 \u0432\u0441\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>temperature<\/code>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, gpt-5 \u0432\u0435\u0440\u043d\u0443\u043b \u043c\u043d\u0435<br \/><code>Unsupported value. Only the default (1) value is supported<\/code>. <\/p>\n<p>\u0417\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0449\u0438\u0439 \u044d\u0442\u0430\u043f \u2014 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u0438\u043d\u0430<code>ChatClient<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 LLM.<\/p>\n<pre><code class=\"java\">@Configuration public class ChatClientConfig {     @Bean     public ChatClient chatClient(ChatClient.Builder builder) {         return builder                 .defaultAdvisors(                         new SimpleLoggerAdvisor()                 )                 .build();     } }<\/code><\/pre>\n<h4>\u041f\u043e\u043b\u043d\u044b\u0439 \u0446\u0438\u043a\u043b: \u043e\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0434\u043e \u043e\u0442\u0432\u0435\u0442\u0430 LLM<\/h4>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u0442\u044b\u0440\u0435 \u0448\u0430\u0433\u0430:<\/p>\n<ol>\n<li>\n<p><strong>\u041f\u0440\u0435\u0434\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430:<\/strong> \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043c \u0432\u043e\u043f\u0440\u043e\u0441 \u0432 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0432\u0438\u0434 \u2014 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0442\u0435\u043a\u0441\u0442, \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0438, \u0443\u0431\u0438\u0440\u0430\u0435\u043c \u043b\u0438\u0448\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u0443\u0442\u043e\u0447\u043d\u044f\u0435\u043c \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0438. \u0422\u0430\u043a\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u043c <code>n<\/code> <strong>\u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445<\/strong> \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b.<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0438 \u043f\u043e\u0438\u0441\u043a<\/strong>: \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u044b \u0438 \u0438\u0449\u0435\u043c <code>k<\/code> <strong>\u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0431\u043b\u0438\u0437\u043a\u0438\u0445<\/strong> \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0438\u043c\u0435\u0435\u043c <code>n \u00d7 k<\/code> \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><strong>\u0420\u0430\u043d\u0436\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/strong>: \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u043e <strong>\u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u0438<\/strong>, \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b, \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u0434\u043a\u0440\u0435\u043f\u043b\u0451\u043d\u043d\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f<\/strong>: \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 <strong>\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442<\/strong> \u0432 LLM, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043d\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 <strong>\u043e\u0442\u0432\u0435\u0442<\/strong> \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/34e\/48d\/0d4\/34e48d0d42188b952d4f715769647699.png\" alt=\"\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u0446\u0438\u043a\u043b \u0440\u0430\u0431\u043e\u0442\u044b RAG-\u0441\u0438\u0441\u0442\u0435\u043c\u044b\" title=\"\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u0446\u0438\u043a\u043b \u0440\u0430\u0431\u043e\u0442\u044b RAG-\u0441\u0438\u0441\u0442\u0435\u043c\u044b\" width=\"1600\" height=\"684\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/34e\/48d\/0d4\/34e48d0d42188b952d4f715769647699.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/34e\/48d\/0d4\/34e48d0d42188b952d4f715769647699.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u0446\u0438\u043a\u043b \u0440\u0430\u0431\u043e\u0442\u044b RAG-\u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c LLM \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043f\u0435\u0440\u0435\u0434\u0430\u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u043f\u0442, \u0433\u0434\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0443\u043f\u043b\u043e\u0442\u043d\u0435\u043d\u0438\u044e, \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0443 \u0432\u044b\u0432\u043e\u0434\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u043f\u0442 \u0438 \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0435\u0434\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">private static final String PREPROCESSED_SYSTEM_PROMPT =      \"\u0422\u044b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 \u043f\u043e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0430\u043c. \"   + \"\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0439 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0412\u041e\u041f\u0420\u041e\u0421 \u043f\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c:\\n\"   + \"1) \u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f:\\n\"   + \"   - \u0423\u0434\u0430\u043b\u0438 \u0441\u043f\u0435\u0446\u0441\u0438\u043c\u0432\u043e\u043b\u044b (\u043e\u0441\u0442\u0430\u0432\u044c \u0442\u043e\u043b\u044c\u043a\u043e !?.,)\\n\"   + \"   - \u0423\u0431\u0435\u0440\u0438 \u043b\u0438\u0448\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u0435\u043b\u044b \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044b \u0441\u0442\u0440\u043e\u043a\\n\"   + \"   - \u041f\u0440\u0438\u0432\u0435\u0434\u0438 \u0432\u0441\u0435 \u043a\u0430\u0432\u044b\u0447\u043a\u0438 \u043a \u0432\u0438\u0434\u0443 \\\\\\\"\\\\\\\"\\n\"   + \"   - \u0420\u0430\u0441\u0448\u0438\u0444\u0440\u0443\u0439 \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u044f: \u00ab\u043d-\u0440\u00bb \u2192 \u00ab\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440\u00bb, \u00ab\u0442.\u0434.\u00bb \u2192 \u00ab\u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435\u00bb\\n\"   + \"2) \u0421\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u043f\u043b\u043e\u0442\u043d\u0435\u043d\u0438\u0435:\\n\"   + \"   - \u0421\u043e\u0445\u0440\u0430\u043d\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b, \u0447\u0438\u0441\u043b\u0430, \u0438\u043c\u0435\u043d\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439\\n\"   + \"   - \u0423\u0434\u0430\u043b\u0438 \u0441\u0442\u043e\u043f-\u0441\u043b\u043e\u0432\u0430 (\u00ab\u043e\u0447\u0435\u043d\u044c\u00bb, \u00ab\u043f\u0440\u043e\u0441\u0442\u043e\u00bb, \u00ab\u043d\u0443\u00bb) \u0438 \u0432\u0432\u043e\u0434\u043d\u044b\u0435 \u0444\u0440\u0430\u0437\u044b (\u00ab\u043a\u0441\u0442\u0430\u0442\u0438\u00bb, \u00ab\u0432 \u043e\u0431\u0449\u0435\u043c\u00bb)\\n\"   + \"   - \u0423\u0441\u0442\u0440\u0430\u043d\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044b, \u0441\u0434\u0435\u043b\u0430\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0443 \u0442\u043e\u0447\u043d\u043e\u0439 \u0438 \u0451\u043c\u043a\u043e\u0439\\n\"   + \"   - \u0417\u0430\u043c\u0435\u043d\u044f\u0439 \u043c\u0435\u0441\u0442\u043e\u0438\u043c\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0440\u0435\u0444\u0435\u0440\u0435\u043d\u0441\u044b (\u043d\u0430\u043f\u0440. \u00ab\u043e\u043d\u00bb \u2192 \u00ab\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438\u00bb)\\n\"   + \"3) \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f:\\n\"   + \"   - \u0414\u043e\u0431\u0430\u0432\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0435 \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u044f \u0432 [\u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0445 \u0441\u043a\u043e\u0431\u043a\u0430\u0445], \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0441\u0442\u044c\\n\"   + \"   - \u0414\u0435\u043b\u0430\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0441\u0430\u043c\u043e\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u043c: \u00ab\u041a\u0430\u043a \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442?\u00bb \u2192 \u00ab\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438?\u00bb\\n\"   + \"\u0424\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430:\\n\"   + \"   - \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0432\u0435\u0434\u0438 \u0422\u041e\u041b\u042c\u041a\u041e \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043e\u0447\u0438\u0449\u0435\u043d\u043d\u044b\u0439 \u0438 \u0443\u0442\u043e\u0447\u043d\u0451\u043d\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 (\u0431\u0435\u0437 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432)\\n\"   + \"   - \u0415\u0441\u043b\u0438 \u0432\u043e\u043f\u0440\u043e\u0441 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u043c\u044b\u0441\u043b\u043e\u0432\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439, \u0440\u0430\u0437\u0434\u0435\u043b\u0438 \u0438\u0445 \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439\\n\"   + \"   - \u0417\u0430\u0442\u0435\u043c \u0432\u044b\u0432\u0435\u0434\u0438 3 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0438, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0441\u043c\u044b\u0441\u043b:\\n\"   + \"\u0412\u044b\u0432\u043e\u0434 \u0422\u041e\u041b\u042c\u041a\u041e \u0432 JSON \u0441 \u043f\u043e\u043b\u044f\u043c\u0438:\\n\"   + \"{\\\\\\\"normalized\\\\\\\": \\\\\\\"&lt;\u0441\u0442\u0440\u043e\u043a\u0430&gt;\\\\\\\",\\\\\\\"alternatives\\\\\\\": [\\\\\\\"&lt;\u0441\u0442\u0440\u043e\u043a\u0430&gt;\\\\\\\",\\\\\\\"&lt;\u0441\u0442\u0440\u043e\u043a\u0430&gt;\\\\\\\",\\\\\\\"&lt;\u0441\u0442\u0440\u043e\u043a\u0430&gt;\"]}\"   + \"\u0411\u0435\u0437 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0439 \u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u043d\u0435 JSON\";  public PreprocessedQuestion preprocessQuestion(String question) {     String raw = chatClient.prompt(new Prompt(         List.of(new SystemMessage(PREPROCESSED_SYSTEM_PROMPT),                 new UserMessage(question))     )).call().content();      \/\/ \u041f\u0430\u0440\u0441\u0438\u043c \u043e\u0442\u0432\u0435\u0442 LLM \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b     return extractVariants(raw); }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0440\u0430\u043d\u043d\u0435\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u2014 <code>searchSimilarDocuments(variant, topK)<\/code>. \u0414\u0430\u043b\u0435\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u043d\u0436\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b. \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u2014 \u0443\u0431\u0440\u0430\u0442\u044c \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b \u0438 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e <code>score<\/code>.<\/p>\n<details class=\"spoiler\">\n<summary>\u041c\u0435\u0442\u043e\u0434 \u0440\u0430\u043d\u0436\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">private List&lt;Document&gt; rankDocuments(List&lt;Document&gt; documents) {     Map&lt;String, Document&gt; uniqueDocs = documents.stream()             .collect(Collectors.toMap(                 Document::getId,                 d -&gt; d,                 (d1, d2) -&gt; d1.getScore() &gt;= d2.getScore() ? d1 : d2             ));      List&lt;Document&gt; ranked = uniqueDocs.values().stream()             .sorted(Comparator.comparingDouble(Document::getScore).reversed())             .toList();      return ranked; }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u0442\u0430\u043f \u2014 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441 \u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432 LLM, \u0432\u0437\u0430\u043c\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u043e\u0442\u0432\u0435\u0442.<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u043f\u0442 \u0438 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0434\u043a\u0440\u0435\u043f\u043b\u0451\u043d\u043d\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">String AG_SYSTEM_PROMPT = \"\"\"     \u0422\u044b \u044d\u043a\u0441\u043f\u0435\u0440\u0442 \u043f\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u044b\u0445 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0445 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.     \u041d\u0430 \u0432\u0445\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0448\u044c:     1) \u0412\u043e\u043f\u0440\u043e\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.     2) \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0438\u0437 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432.          \u0417\u0430\u0434\u0430\u0447\u0430:     - \u0421\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441, \u043e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442.     - \u0415\u0441\u043b\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u2014 \u0447\u0435\u0441\u0442\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0438 \u043e\u0431 \u044d\u0442\u043e\u043c.     - \u041e\u0442\u0432\u0435\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u044f\u0441\u043d\u044b\u043c, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0438 \u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043a\u0440\u0430\u0442\u043a\u0438\u043c.     - \u041d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0439 \u043b\u0438\u0448\u043d\u0438\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438. \"\"\";  public String generateAnswerFromContext(String userQuestion, String context) {     SystemMessage systemMessage = new SystemMessage(AG_SYSTEM_PROMPT);     String userContent = \"\u0412\u043e\u043f\u0440\u043e\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f: \" + userQuestion                                + \"\\n\\n\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432:\\n\" + context;      UserMessage userMessage = new UserMessage(userContent);     Prompt prompt = new Prompt(List.of(systemMessage, userMessage));      String response = chatClient.prompt(prompt).call().content();      return response.strip(); }<\/code><\/pre>\n<\/div>\n<\/details>\n<h3>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b<\/h3>\n<p>\u0421\u0434\u0435\u043b\u0430\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0432\u0435\u0434\u0451\u0442 \u0441\u0435\u0431\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u2014 \u0432\u043e\u043f\u0440\u043e\u0441 \u043a LLM \u0431\u0435\u0437 RAG-\u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0439:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/259\/b93\/629\/259b93629f9b9c4a8637d4de04835a28.png\" alt=\"\u0411\u0435\u0437 RAG LLM \u043d\u0435 \u0434\u0430\u0451\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\" title=\"\u0411\u0435\u0437 RAG LLM \u043d\u0435 \u0434\u0430\u0451\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\" width=\"813\" height=\"415\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/259\/b93\/629\/259b93629f9b9c4a8637d4de04835a28.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/259\/b93\/629\/259b93629f9b9c4a8637d4de04835a28.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0411\u0435\u0437 RAG LLM \u043d\u0435 \u0434\u0430\u0451\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 api \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439 RAG-\u0441\u0438\u0441\u0442\u0435\u043c\u044b:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/302\/bef\/6d4\/302bef6d420145c4d7fa6ee53de6af78.png\" alt=\"\u041f\u0440\u044f\u043c\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0432 \u0431\u0430\u0437\u0435 \u043d\u0435\u0442, \u043d\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u0435\u0440\u043d\u0443\u043b\u0430 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u044b \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u2014 \u0447\u0435\u0441\u0442\u043d\u044b\u0439, \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\" title=\"\u041f\u0440\u044f\u043c\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0432 \u0431\u0430\u0437\u0435 \u043d\u0435\u0442, \u043d\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u0435\u0440\u043d\u0443\u043b\u0430 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u044b \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u2014 \u0447\u0435\u0441\u0442\u043d\u044b\u0439, \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\" width=\"813\" height=\"500\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/302\/bef\/6d4\/302bef6d420145c4d7fa6ee53de6af78.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/302\/bef\/6d4\/302bef6d420145c4d7fa6ee53de6af78.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u0440\u044f\u043c\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0432 \u0431\u0430\u0437\u0435 \u043d\u0435\u0442, \u043d\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u0435\u0440\u043d\u0443\u043b\u0430 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u044b \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u2014 \u0447\u0435\u0441\u0442\u043d\u044b\u0439, \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0432\u0435\u0434\u0451\u0442 \u0441\u0435\u0431\u044f \u043c\u043e\u0434\u0435\u043b\u044c, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0435\u0451 \u0435\u0441\u0442\u044c \u0432\u0435\u0441\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/080\/144\/6d5\/0801446d53f7767cd103e8c23af58c1b.png\" alt=\"\u041e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441, \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u2014 \u0432\u0441\u0451, \u043a\u0430\u043a \u0438 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c\" title=\"\u041e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441, \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u2014 \u0432\u0441\u0451, \u043a\u0430\u043a \u0438 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c\" width=\"813\" height=\"345\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/080\/144\/6d5\/0801446d53f7767cd103e8c23af58c1b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/080\/144\/6d5\/0801446d53f7767cd103e8c23af58c1b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441, \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u2014 \u0432\u0441\u0451, \u043a\u0430\u043a \u0438 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c<\/figcaption><\/div>\n<\/figure>\n<h3>\u0421\u043f\u043e\u0441\u043e\u0431\u044b \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u0430<\/h3>\n<p>\u0427\u0430\u0441\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043c\u044b \u0443\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0438, \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0432\u0435\u0441\u044c \u043d\u0430\u0431\u043e\u0440 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0435\u0435.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/630\/ba8\/82e\/630ba882ed8d560ffeeba49f32e6631d.png\" alt=\"\u0414\u0430\u0436\u0435 \u0432 \u0431\u0435\u0437\u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0439 \u043f\u0443\u0441\u0442\u044b\u043d\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043e\u0442\u0432\u0435\u0442\u044b. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0438\u0448\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043e\u0432\u0435\u0442\u0441\u043a\u0438\u0439...\" title=\"\u0414\u0430\u0436\u0435 \u0432 \u0431\u0435\u0437\u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0439 \u043f\u0443\u0441\u0442\u044b\u043d\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043e\u0442\u0432\u0435\u0442\u044b. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0438\u0448\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043e\u0432\u0435\u0442\u0441\u043a\u0438\u0439...\" width=\"1778\" height=\"730\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/630\/ba8\/82e\/630ba882ed8d560ffeeba49f32e6631d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/630\/ba8\/82e\/630ba882ed8d560ffeeba49f32e6631d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0430\u0436\u0435 \u0432 \u0431\u0435\u0437\u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0439 \u043f\u0443\u0441\u0442\u044b\u043d\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043e\u0442\u0432\u0435\u0442\u044b. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0438\u0448\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043e\u0432\u0435\u0442\u0441\u043a\u0438\u0439&#8230;<\/figcaption><\/div>\n<\/figure>\n<h4>\u041f\u0440\u0435\u0434\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438 \u043e\u0447\u0438\u0441\u0442\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430<\/h4>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433 \u2014 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441: \u0443\u0431\u0440\u0430\u0442\u044c \u00ab\u0448\u0443\u043c\u00bb, \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0438, \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u043b\u0435\u043c\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e. \u042d\u0442\u043e \u0434\u0430\u0451\u0442 \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430.<\/p>\n<p>\u0427\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 RAG Fusion: \u043f\u0440\u043e\u0441\u0438\u043c LLM \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043e\u0447\u0438\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0438\u0441\u043a. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c <code>[\u0447\u0438\u0441\u043b\u043e \u043f\u0440\u0435\u0434\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432] \u00d7 [\u0447\u0438\u0441\u043b\u043e \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432]<\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u043d\u0436\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0432 \u043e\u0431\u0449\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442.<\/p>\n<p>\u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043f\u0440\u0435\u0434\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0430\u043a\u0436\u0435 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a \u043f\u0440\u043e\u0441\u044c\u0431\u0443, \u0432\u043e\u043f\u0440\u043e\u0441 \u0438\u043b\u0438 \u0436\u0430\u043b\u043e\u0431\u0443, \u043b\u0438\u0431\u043e \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u0430\u043c (\u0431\u0443\u0445\u0433\u0430\u043b\u0442\u0435\u0440\u0438\u044f, HR). \u0412 \u043d\u0430\u0448\u0435\u0439 Java-\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0430\u043a\u0443\u044e \u043c\u0435\u0442\u0430\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b\u0438 \u0432 \u043a\u043b\u044e\u0447\u0435 <code>tags<\/code>.<\/p>\n<h4>\u0410\u043d\u0441\u0430\u043c\u0431\u043b\u0438<\/h4>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0430\u043d\u0441\u0430\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043e\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0438 \u0430\u043d\u0441\u0430\u043c\u0431\u043b\u0438 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 LLM \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432-\u0440\u0435\u0442\u0440\u0438\u0432\u0435\u0440\u043e\u0432. \u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0431\u044b\u043b\u0430 \u0441\u0432\u044f\u0437\u043a\u0430 \u00ab\u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440 \u2014 \u0432\u0435\u043a\u0442\u043e\u0440 \u2014 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u00bb (<strong>Dense Retriever<\/strong>). \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u043e\u0438\u0441\u043a\u0430 (<strong>Sparse Retriever<\/strong>), \u0433\u0434\u0435 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0447\u0430\u0441\u0442\u043e\u0442\u0435 \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u0432 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fdc\/aec\/d2e\/fdcaecd2ede75a1b26543dec3d8aab61.png\" alt=\"RAG \u0441 \u0430\u043d\u0441\u0430\u043c\u0431\u043b\u0435\u043c \u0431\u0443\u0440\u043b\u0430\u043a\u043e\u0432: \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0442\u044f\u043d\u0443\u0442 \u043f\u043e\u0438\u0441\u043a \u043a \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438\" title=\"RAG \u0441 \u0430\u043d\u0441\u0430\u043c\u0431\u043b\u0435\u043c \u0431\u0443\u0440\u043b\u0430\u043a\u043e\u0432: \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0442\u044f\u043d\u0443\u0442 \u043f\u043e\u0438\u0441\u043a \u043a \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438\" width=\"1444\" height=\"725\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/fdc\/aec\/d2e\/fdcaecd2ede75a1b26543dec3d8aab61.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fdc\/aec\/d2e\/fdcaecd2ede75a1b26543dec3d8aab61.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>RAG \u0441 \u0430\u043d\u0441\u0430\u043c\u0431\u043b\u0435\u043c \u0431\u0443\u0440\u043b\u0430\u043a\u043e\u0432: \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0442\u044f\u043d\u0443\u0442 \u043f\u043e\u0438\u0441\u043a \u043a \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438<\/figcaption><\/div>\n<\/figure>\n<h4>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0448\u0430\u0433 \u043f\u043e\u0438\u0441\u043a\u0430 \u2014 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435<\/h4>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442, \u043c\u043e\u0436\u043d\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e <strong>\u0447\u0435\u0440\u043d\u043e\u0432\u044b\u0445<\/strong> \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0440\u0430\u043d\u0436\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043a\u0430\u043a <strong>\u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438<\/strong> \u0434\u043b\u044f LLM. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 \u043e\u043f\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438 \u0434\u0430\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442. \u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c <strong>zero-shot<\/strong>, <strong>few-shot<\/strong> \u0438 \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0438\u043a\u0438.<\/p>\n<h4>\u041e\u0446\u0435\u043d\u043a\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430<\/h4>\n<p>\u041e\u0446\u0435\u043d\u043a\u0430 RAG \u2014 \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u0432\u0430\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u0438\u0437\u0432\u043b\u0435\u0447\u0451\u043d\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0435, \u0438 \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0432\u0435\u0442 \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u0438\u0445. <br \/>\u0414\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f <code>precision \u0438 recall<\/code>. \u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u2014 <code>faithfulness\/groundedness<\/code>, \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0441 \u044d\u0442\u0430\u043b\u043e\u043d\u043e\u043c \u0438\u043b\u0438 \u043e\u0446\u0435\u043d\u043a\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 LLM-\u043c\u043e\u0434\u0435\u043b\u044c\u044e.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0441\u043c\u043e\u0442\u0440\u044f\u0442 \u043f\u043e\u0440\u043e\u0433 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e<code> logits<\/code> \u2014 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0432 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u0435. \u042d\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0432\u0435\u0440\u0435\u043d\u0430 \u0432 \u043e\u0442\u0432\u0435\u0442\u0435, \u0438 \u043f\u0440\u0438 \u043d\u0438\u0437\u043a\u043e\u0439 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0447\u0435\u0441\u0442\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435: <em>\u00ab\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u043e\u0442\u0432\u0435\u0442\u00bb<\/em>.<\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438, \u043a\u0430\u043a \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e RAG-\u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043d\u0430 Java \u0438 Spring AI: \u043e\u0442 \u0442\u0435\u043e\u0440\u0438\u0438 \u0434\u043e \u043a\u043e\u0434\u0430, \u043e\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0445 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0434\u043e \u0430\u043d\u0441\u0430\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u0442\u0432\u0435\u0442\u043e\u0432. \u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u043f\u043e\u0434 \u0441\u0432\u043e\u0438 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/31c\/096\/bb5\/31c096bb5bca0192a32514108e12715b.png\" alt=\"\u041e\u043d \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0431\u0443\u0440\u043b\u0430\u043a, \u043d\u0435 \u0440\u044b\u0431\u0430\u043a, \u043d\u0435 \u0421\u0438\u0437\u0438\u0444, \u0430 \u043f\u0443\u0442\u043d\u0438\u043a, \u043e\u0441\u0442\u0430\u0432\u0438\u0432\u0448\u0438\u0439 \u043f\u0443\u0441\u0442\u044b\u043d\u044e \u043f\u043e\u0437\u0430\u0434\u0438\" title=\"\u041e\u043d \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0431\u0443\u0440\u043b\u0430\u043a, \u043d\u0435 \u0440\u044b\u0431\u0430\u043a, \u043d\u0435 \u0421\u0438\u0437\u0438\u0444, \u0430 \u043f\u0443\u0442\u043d\u0438\u043a, \u043e\u0441\u0442\u0430\u0432\u0438\u0432\u0448\u0438\u0439 \u043f\u0443\u0441\u0442\u044b\u043d\u044e \u043f\u043e\u0437\u0430\u0434\u0438\" width=\"1551\" height=\"713\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/31c\/096\/bb5\/31c096bb5bca0192a32514108e12715b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/31c\/096\/bb5\/31c096bb5bca0192a32514108e12715b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041e\u043d \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0431\u0443\u0440\u043b\u0430\u043a, \u043d\u0435 \u0440\u044b\u0431\u0430\u043a, \u043d\u0435 \u0421\u0438\u0437\u0438\u0444, \u0430 \u043f\u0443\u0442\u043d\u0438\u043a, \u043e\u0441\u0442\u0430\u0432\u0438\u0432\u0448\u0438\u0439 \u043f\u0443\u0441\u0442\u044b\u043d\u044e \u043f\u043e\u0437\u0430\u0434\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0441\u0442\u0430\u0442\u044c\u044f \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0438 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u044f\u044e\u0449\u0435\u0439. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u0438\u0434\u0435\u0438 \u0438\u043b\u0438 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f \u2014 \u0434\u0435\u043b\u0438\u0442\u0435\u0441\u044c \u0438\u043c\u0438 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445. \u0411\u0443\u0434\u0443 \u0440\u0430\u0434 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043a\u0440\u0438\u0442\u0438\u043a\u0435: \u0432\u043c\u0435\u0441\u0442\u0435 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043d\u0430\u0448 \u043f\u0443\u0442\u044c \u0435\u0449\u0451 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435 \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u0435\u0435.<\/p>\n<p>\u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0439\u0442\u0435\u0441\u044c \u043a \u043c\u043e\u0435\u043c\u0443\u00a0<a href=\"https:\/\/t.me\/devbrombin\" rel=\"noopener noreferrer nofollow\">Telegram-\u043a\u0430\u043d\u0430\u043b\u0443<\/a>, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b. <br \/>\u0414\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0438 \u0432 \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435!<\/p>\n<p>\u00a9 2025 \u041e\u041e\u041e \u00ab\u041c\u0422 \u0424\u0418\u041d\u0410\u041d\u0421\u00bb<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/924100\/\"> https:\/\/habr.com\/ru\/articles\/924100\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0411\u0440\u043e\u043c\u0431\u0438\u043d \u0410\u043d\u0434\u0440\u0435\u0439, \u0438 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0437\u0431\u0435\u0440\u0443 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 RAG-\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u043a\u0430\u043a \u043e\u043d\u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0443\u043b\u0443\u0447\u0448\u0430\u0442\u044c \u043f\u043e\u0438\u0441\u043a. \u041f\u043e\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Spring AI, \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 LLM. \u0422\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0448\u044c \u0442\u0435\u043e\u0440\u0438\u044e \u0438 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 Java \u0438 Spring Boot \u2014 \u043e\u0442 \u0438\u0434\u0435\u0438 \u0434\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430. \u0411\u0435\u0437 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0443\u043b \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0451\u0442\u043a\u0438\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u0438 \u043a\u043e\u0434.<\/p>\n<figure class=\"full-width\"><\/figure>\n<h3>\u041e \u0447\u0451\u043c \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f?<\/h3>\n<p>\u041e\u0442\u0432\u0435\u0442\u0438\u043c \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b:<\/p>\n<ul>\n<li>\n<p><strong>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/strong> \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d\u0438 \u043d\u0435\u0437\u0430\u043c\u0435\u043d\u0438\u043c\u044b \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441 \u0418\u0418.<\/p>\n<\/li>\n<li>\n<p><strong>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 embeddings<\/strong> \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u0435\u0437 \u043d\u0438\u0445 RAG-\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0435\u0440\u044f\u044e\u0442 \u0441\u0432\u043e\u044e \u0441\u0438\u043b\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441<\/strong> \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u0437\u043d\u0430\u043d\u0438\u0439 \u043f\u043e \u0441\u043c\u044b\u0441\u043b\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Spring Boot, Spring AI \u0438 Qdrant.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441<\/strong> \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u0440\u0435\u043f\u043b\u0451\u043d\u043d\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 LLM \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Spring AI.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u043f\u043e\u0441\u043e\u0431\u044b \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c RAG<\/strong>: \u043a\u0430\u043a \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043a <strong>\u0441\u043e\u0431\u0440\u0430\u0442\u044c<\/strong> \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435 \u0432 <strong>\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443<\/strong>, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u043d\u043e <strong>\u0447\u0435\u0441\u0442\u043d\u043e <\/strong>\u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0440\u0435\u0437\u044e\u043c\u0435.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435: \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d RAG?<\/h3>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435: \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c LLM (\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u044f\u0437\u044b\u043a\u043e\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u043c\u0435\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442, \u043d\u043e \u0431\u0435\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442: \u00ab\u041a\u0430\u043a \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443 X \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 Y?\u00bb.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c, \u0442\u0438\u043a\u0435\u0442\u0430\u043c \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u043e\u043d\u0430 \u043b\u0438\u0431\u043e \u0432\u044b\u0434\u0443\u043c\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 (\u0433\u0430\u043b\u043b\u044e\u0446\u0438\u043d\u0430\u0446\u0438\u044f), \u043b\u0438\u0431\u043e \u0447\u0435\u0441\u0442\u043d\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u0435\u0442\u0441\u044f: <em>\u00ab\u041d\u0435 \u0437\u043d\u0430\u044e\u00bb<\/em>. RAG \u0440\u0435\u0448\u0430\u0435\u0442 \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0443\u0436\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041e\u043d \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u0442\u0451\u0440, \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u043b\u0435\u0444\u0443\u0435\u0442 \u2014 \u043e\u043d \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0432 \u043a\u0443\u0440\u0441\u0435 \u043f\u0440\u043e \u043d\u0430\u0448 payment service<\/figcaption><\/div>\n<\/figure>\n<p><strong>RAG <\/strong>\u0440\u0435\u0448\u0430\u0435\u0442 \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u044f \u0434\u0432\u0430 \u044d\u0442\u0430\u043f\u0430:<\/p>\n<ol>\n<li>\n<p><strong>Retrieval (\u043f\u043e\u0438\u0441\u043a)<\/strong>: \u041d\u0430\u0445\u043e\u0434\u0438\u0442 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0431\u0430\u0437\u0435 \u0437\u043d\u0430\u043d\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430. \u042d\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0438 \u0442\u043e\u0447\u043d\u0435\u0435, \u0447\u0435\u043c \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0441\u043b\u043e\u0432\u0430\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>Augmented Generation (\u043f\u043e\u0434\u043a\u0440\u0435\u043f\u043b\u0451\u043d\u043d\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f)<\/strong>: \u041f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 LLM, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u0442\u043e\u0447\u043d\u044b\u0439 \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u043a\u043b\u044e\u0447 \u043a \u0443\u0441\u043f\u0435\u0445\u0443 RAG \u2014 \u044d\u0442\u043e <strong>\u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438<\/strong> \u0438 <strong>\u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/strong>. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e \u0432\u043d\u0435\u0434\u0440\u0438\u0432 \u0435\u0451 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 <a href=\"https:\/\/habr.com\/p\/912502\/\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u043e\u0432<\/a>. \u0417\u0435\u043b\u0451\u043d\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c \u044f \u0432\u044b\u0434\u0435\u043b\u0438\u043b <strong>Retrieval<\/strong> \u0431\u043b\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0437\u0430 \u043f\u043e\u0438\u0441\u043a \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0441\u0438\u043d\u0438\u043c \u2014 \u0431\u043b\u043e\u043a <strong>Agumented Generation<\/strong> \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u0440\u0435\u043f\u043b\u0451\u043d\u043d\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 RAG-\u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/figcaption><\/div>\n<\/figure>\n<h4>\u041a\u043e\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c RAG?<\/h4>\n<p>RAG \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0430\u043c, \u0433\u0434\u0435 \u043c\u043d\u043e\u0433\u043e \u043d\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445: \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b, \u0442\u0438\u043a\u0435\u0442\u044b, \u0440\u0435\u0433\u043b\u0430\u043c\u0435\u043d\u0442\u044b. \u041e\u043d \u0434\u0430\u0451\u0442 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0431\u0435\u0437 \u0434\u043e\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u2014 \u044d\u0442\u043e \u0434\u043e\u0440\u043e\u0433\u043e \u0438 \u0442\u0440\u0443\u0434\u043e\u0451\u043c\u043a\u043e. \u0415\u0449\u0451 RAG \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u0440\u0438\u0441\u043a \u0433\u0430\u043b\u043b\u044e\u0446\u0438\u043d\u0430\u0446\u0438\u0439 LLM, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e\u0434\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0435\u0439 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442.<\/p>\n<h3>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f<\/h3>\n<h4>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 embeddings?<\/h4>\n<p>\u042d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438 \u2014 \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u0441\u043c\u044b\u0441\u043b \u0442\u0435\u043a\u0441\u0442\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>    \u00ab\u041f\u043e\u0435\u0437\u0434 \u043f\u0440\u0438\u0431\u044b\u043b \u043d\u0430 \u0441\u0442\u0430\u043d\u0446\u0438\u044e\u00bb = <code>[0.27, -0.41, 0.88, ...]<\/code><br \/>    \u00ab\u041f\u043e\u0435\u0437\u0434 \u043f\u043e\u0434\u044a\u0435\u0445\u0430\u043b \u043a \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u00bb = <code>[0.26, -0.40, 0.87, ...]<\/code><\/p>\n<p>    \u00ab\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043b\u0435\u0433\u043b\u0430 \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439\u00bb = <code>[-0.11, 0.17, -0.56, ...]<\/code><br \/>    \u00ab\u0411\u0414 \u0443\u0448\u043b\u0430 \u0432 \u0437\u0430\u043a\u0430\u0442 \u043d\u0430 \u043f\u0438\u043a\u0435\u00bb = <code>[-0.08, 0.16, -0.51, ...]<\/code><\/p>\n<p>\u042d\u0442\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u044b \u0431\u043b\u0438\u0437\u043a\u0438 \u043f\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044e, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0445 \u0441\u043c\u044b\u0441\u043b \u043f\u043e\u0445\u043e\u0436. \u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a\u0438\u043c\u0438 \u043a\u0430\u043a:<\/p>\n<ul>\n<li>\n<p><strong>\u041a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u0435 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e<\/strong>: , \u0433\u0434\u0435 A \u0438 B \u2014 \u0432\u0435\u043a\u0442\u043e\u0440\u044b. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0442 -1 (\u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u044b\u0439 \u0441\u043c\u044b\u0441\u043b) \u0434\u043e 1 (\u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u0439 \u0441\u043c\u044b\u0441\u043b).<\/p>\n<\/li>\n<li>\n<p><strong>\u0415\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435<\/strong>: , \u0433\u0434\u0435 \u043c\u0435\u043d\u044c\u0448\u0435\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u044c.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438? <\/strong>\u041c\u043e\u0434\u0435\u043b\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 BERT, \u043e\u0431\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0443\u043b\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438 \u0441\u043c\u044b\u0441\u043b \u0441\u043b\u043e\u0432. \u0422\u0435\u043a\u0441\u0442 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u044b \u2014 \u0441\u043b\u043e\u0432\u0430 \u0438\u043b\u0438 \u0438\u0445 \u0447\u0430\u0441\u0442\u0438. \u042d\u0442\u0438 \u0442\u043e\u043a\u0435\u043d\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0447\u0435\u0440\u0435\u0437 \u0441\u043b\u043e\u0438 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u0430, \u0438 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435.<\/p>\n<h2>\u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u044b \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445?<\/h2>\n<p>\u0412\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u044f\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u2014 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438. \u0418\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435: \u0431\u043b\u0438\u0437\u043a\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 \u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442 \u0441\u0445\u043e\u0436\u0438\u0439 \u0441\u043c\u044b\u0441\u043b, \u0430 \u0434\u0430\u043b\u0451\u043a\u0438\u0435 \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430 \u2014 \u0440\u0430\u0437\u043d\u044b\u0439. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0438\u0441\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u043f\u043e \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044e \u0441\u043b\u043e\u0432, \u0430 \u043f\u043e \u0441\u043c\u044b\u0441\u043b\u0443. \u042d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u044b\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u0411\u0414 \u0443\u0434\u043e\u0431\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 LLM \u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0412\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e IT-\u043a\u043e\u043c\u043f\u0435\u0442\u0435\u043d\u0446\u0438\u0439 \u0438 \u0438\u0445 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0435<\/figcaption><\/div>\n<\/figure>\n<p><strong>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 JSON-\u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u0411\u0414:<\/strong><\/p>\n<ul>\n<li>\n<p><strong>ID<\/strong> \u2014 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>Vector (Embedding)<\/strong> \u2014 \u0441\u0430\u043c \u0432\u0435\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0445 \u0441\u043e\u0441\u0435\u0434\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p><strong>Payload (Metadata)<\/strong> \u2014 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0447\u0430\u0441\u0442\u043e JSON): \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443, \u0442\u0438\u043f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430, \u0430\u0432\u0442\u043e\u0440, \u0434\u0430\u0442\u0430 \u0438 \u0442.\u0434.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/strong> \u2014 \u0441\u0430\u043c \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0438\u043b\u0438 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041f\u0440\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c: <\/strong>\u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430\u0445, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b <strong>\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/strong>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 API-\u043a\u043b\u044e\u0447\u0430\u043c\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0434\u043b\u044f \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0443 \u043c\u0435\u0442\u043a\u0443 <code>access_level<\/code> \u0438\u043b\u0438 <code>access_role<\/code>, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0443\u044e, \u043a\u0442\u043e \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0430\u0432\u043e \u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440, \u043b\u0438\u0431\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0430.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u0430\u044f JSON-\u043f\u043e\u0434\u043e\u0431\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430<\/figcaption><\/div>\n<\/figure>\n<p><strong>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0438\u0441\u043a: <\/strong>\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u044b \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u044e\u0442\u0441\u044f. \u0417\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0442\u0430\u043a\u0436\u0435 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0432\u0435\u043a\u0442\u043e\u0440 \u0438 \u0431\u0430\u0437\u0430 \u0438\u0449\u0435\u0442 \u0441\u0430\u043c\u044b\u0435 \u0431\u043b\u0438\u0437\u043a\u0438\u0435 \u043a \u043d\u0435\u043c\u0443 \u043f\u043e \u0441\u043c\u044b\u0441\u043b\u0443. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0432\u0440\u043e\u0434\u0435 HNSW (\u043e\u0431\u0445\u043e\u0434 \u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430) \u0438\u043b\u0438 IVF (\u043e\u0431\u0445\u043e\u0434 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432) \u0434\u0435\u043b\u0430\u044e\u0442 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u2014 \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439.<\/p>\n<h2>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 Java \u0438 Spring Ai<\/h2>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 RAG \u043d\u0430 Java \u0438 Spring AI \u043d\u0443\u0436\u043d\u044b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u0412 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<details class=\"spoiler\">\n<summary>pom.xml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"xml\">&lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;io.grpc&lt;\/groupId&gt; &lt;artifactId&gt;grpc-services&lt;\/artifactId&gt; &lt;\/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.grpc&lt;\/groupId&gt; &lt;artifactId&gt;spring-grpc-spring-boot-starter&lt;\/artifactId&gt; &lt;\/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.ai&lt;\/groupId&gt; &lt;artifactId&gt;spring-ai-starter-vector-store-qdrant&lt;\/artifactId&gt; &lt;\/dependency&gt;         \/\/ \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435: lombok, spring-boot \u0438 \u0442\u0434 &lt;\/dependencies&gt; &lt;dependencyManagement&gt; &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.ai&lt;\/groupId&gt; &lt;artifactId&gt;spring-ai-bom&lt;\/artifactId&gt; &lt;version&gt;${spring-ai.version}&lt;\/version&gt; &lt;type&gt;pom&lt;\/type&gt; &lt;scope&gt;import&lt;\/scope&gt; &lt;\/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.grpc&lt;\/groupId&gt; &lt;artifactId&gt;spring-grpc-dependencies&lt;\/artifactId&gt; &lt;version&gt;${spring-grpc.version}&lt;\/version&gt; &lt;type&gt;pom&lt;\/type&gt; &lt;scope&gt;import&lt;\/scope&gt; &lt;\/dependency&gt; &lt;\/dependencies&gt; &lt;\/dependencyManagement&gt;<\/code><\/pre>\n<\/div>\n<\/details>\n<h3>\u041f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u0432 \u0432\u0435\u043a\u0442\u043e\u0440<\/h3>\n<p><strong>Spring AI<\/strong> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438 \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 EmbeddingModel. \u0421\u0440\u0435\u0434\u0438 \u043d\u0438\u0445: <code>OpenAiEmbeddingModel<\/code>, <code>OllamaEmbeddingModel<\/code>, <code>PostgresMlEmbeddingModel<\/code> \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 <code>spring-ai-starter-model-&lt;modelName&gt;<\/code>. \u042d\u0442\u043e \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0442 \u0440\u0443\u0447\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <code>call()<\/code> \u0438\u043b\u0438 <code>embed()<\/code>, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044f \u0435\u0434\u0438\u043d\u044b\u0439 API \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432.<\/p>\n<p>\u0414\u043b\u044f <strong>\u0440\u0443\u0441\u0441\u043a\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430<\/strong> \u043c\u044b \u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043d\u0430 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 <strong>\u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438<\/strong>. \u0421\u0435\u0439\u0447\u0430\u0441 \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0432\u044b\u0431\u043e\u0440 \u2014 \u043c\u043e\u0434\u0435\u043b\u044c <a href=\"https:\/\/huggingface.co\/ai-forever\/ru-en-RoSBERTa\" rel=\"noopener noreferrer nofollow\">ru-en-RoSBERTa<\/a> \u043d\u0430 Hugging Face: \u043e\u043d\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0430 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u0438 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c \u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0434\u0432\u0443\u044f\u0437\u044b\u0447\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u043d\u0444\u0438\u0433 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438 RoSBERTa<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">@Configuration @FieldDefaults(level = AccessLevel.PRIVATE) public class RosbertaClientConfig {      @Value(\"${huggingface.token}\")     String hfToken;      @Value(\"${huggingface.rosberta.url}\")     String rosbertaUrl;      @Bean     public RestClient ruEnHuggingFaceRestClient() {         if (hfToken == null || hfToken.isBlank()) {             throw new IllegalStateException(\"huggingface token is not set\");         }                  return RestClient.builder()                 .baseUrl(rosbertaUrl)                 .defaultHeader(\"Authorization\", \"Bearer \" + hfToken)                 .build();     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041a\u043b\u0430\u0441\u0441 <code>RosbertaEmbeddingModel<\/code> \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043e\u0434\u0435\u043b\u044c\u044e. \u0412 <code>call<\/code> \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441 \u043a API Hugging Face: \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c <code>\"search_query\"<\/code>, \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 payload \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f POST-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u0447\u0435\u0440\u0435\u0437 <code>RestClient<\/code>. \u0412 \u043e\u0442\u0432\u0435\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0447\u0438\u0441\u0435\u043b (\u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433). \u041c\u0435\u0442\u043e\u0434 <code>embed<\/code> \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u043c\u0435\u0442\u043e\u0434\u0443 <code>call<\/code>, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0442\u0435\u043a\u0441\u0442 \u0438\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430. \u041f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e, \u0430 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0439 API.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043b\u0430\u0441\u0441 RosbertaEmbeddingModel<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">@Service @RequiredArgsConstructor @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public class RosbertaEmbeddingModel extends AbstractEmbeddingModel {     RestClient restClient;      @Override     public @NotNull EmbeddingResponse call(@NotNull EmbeddingRequest request) {         var payload = Map.of(             \"inputs\", \"search_query: \" + request.getInstructions().get(0),             \"parameters\",              Map.of(\"pooling_method\", \"cls\", \"normalize_embeddings\", true)         );          List&lt;Double&gt; responseList = restClient.post()                 .contentType(MediaType.APPLICATION_JSON)                 .body(payload)                 .retrieve()                 .body(new ParameterizedTypeReference&lt;&gt;() {});          float[] floats = convertDoubleListToFloatArray(responseList);          return new EmbeddingResponse(List.of(new Embedding(floats, 0)));     }      @Override     public @NotNull float[] embed(@NotNull Document document) {         return call(new EmbeddingRequest(List.of(document.getFormattedContent()), null))                 .getResults().getFirst().getOutput();     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0447\u0435\u0440\u0435\u0437 Postman, \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0432 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u043d\u0430\u0448\u0435\u043c\u0443 API:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440: \u0442\u0435\u043a\u0441\u0442 \u0438 \u0435\u0433\u043e \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0439 \u0432\u0435\u043a\u0442\u043e\u0440<\/figcaption><\/div>\n<\/figure>\n<h3>\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435<\/h3>\n<p>\u041f\u043e\u0434\u043d\u0438\u043c\u0435\u043c <strong>Qdrant<\/strong> \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>docker-compose.yml<\/code>:<\/p>\n<details class=\"spoiler\">\n<summary>docker-compose.yml<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"yaml\">services:   qdrant:     image: qdrant\/qdrant:latest     restart: always     container_name: qdrant     ports:       - 6333:6333       - 6334:6334     expose:       - 6333       - 6334       - 6335     configs:       - source: qdrant_config         target: \/qdrant\/config\/production.yaml     volumes:       - .\/qdrant_data:\/qdrant\/storage  configs:   qdrant_config:     content: |       log_level: INFO<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0420\u0430\u043d\u0435\u0435 \u043c\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u043f\u0430\u043a\u0435\u0442\u044b Spring AI \u0438 gRPC \u2014 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Qdrant \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c. \u0414\u043b\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430: \u0437\u0430\u0434\u0430\u0442\u044c \u0435\u0451 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e. Spring \u0443\u043c\u0435\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c <code>QdrantVectorStore<\/code>, \u0435\u0441\u043b\u0438 \u0432 <code>application.yml<\/code> \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u0438\u0434\u0430:\u00bb<\/p>\n<pre><code class=\"yaml\">spring:   ai:     vectorstore:       qdrant:         host: &lt;qdrant<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-473455","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/473455","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=473455"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/473455\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=473455"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=473455"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=473455"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}