{"id":462333,"date":"2025-06-07T15:00:14","date_gmt":"2025-06-07T15:00:14","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=462333"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=462333","title":{"rendered":"<span>\u0421\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0444\u0438\u0437\u0438\u043a\u0443 \u0438 \u043b\u0438\u0440\u0438\u043a\u0443. \u041a\u0430\u043a \u044f \u0441\u043e\u0431\u0440\u0430\u043b \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0441\u0442\u0438\u0445\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Flask, sqlite-vec \u0438 Hugging Face<\/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<blockquote>\n<p>\u041b\u044e\u0431\u043b\u044e \u044f \u043a\u043e\u0434\u0438\u0442\u044c \u0438 \u0441\u0442\u0438\u0445\u0438 \u2014<br \/>\u0412\u043e\u0442, \u0432 \u043e\u0431\u0449\u0435\u043c, \u0432\u0441\u0435 \u043c\u043e\u0438 \u0433\u0440\u0435\u0445\u0438&#8230;<\/p>\n<p>\u0410. \u0421. \u041f\u0443\u0448\u043a\u0438\u043d<\/p>\n<\/blockquote>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u042f \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0438\u043d \u0425\u0430\u0431\u0430\u0437\u043d\u044f, <a href=\"https:\/\/t.me\/habaznya_math\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/a> \u0438 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 <a href=\"https:\/\/t.me\/habaznyaclub\" rel=\"noopener noreferrer nofollow\">\u0430\u0432\u0442\u043e\u0440<\/a> (\u0447\u0442\u043e \u0431\u044b \u044d\u0442\u043e \u043d\u0438 \u0437\u043d\u0430\u0447\u0438\u043b\u043e).<\/p>\n<p>N-\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u0443\u0432\u043b\u0451\u043a\u0441\u044f NLP (Natural Language Processing), \u0447\u0442\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0434\u043b\u044f \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u0434\u0438\u0442 (\u0438\u043b\u0438 \u043a\u043e\u0434\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0438\u0448\u0435\u0442).<\/p>\n<p>\u041f\u043e\u0447\u0438\u0442\u0430\u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0438 \u043f\u0430\u0440\u0443 \u0432\u0432\u043e\u0434\u043d\u044b\u0445 \u043a\u043d\u0438\u0436\u0435\u043a, \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430 <a href=\"https:\/\/fpmidpo.mipt.ru\/programs\/ppk\/nlp\" rel=\"noopener noreferrer nofollow\">\u0414\u041f\u041e \u0432 \u041c\u0424\u0422\u0418<\/a>. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u044b\u043f\u0443\u0441\u043a\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0441\u0435\u0431\u0435 \u0437\u0430\u0434\u0430\u0447\u0443 \u2014 \u0441\u043e\u0437\u0434\u0430\u0442\u044c <a href=\"https:\/\/habaznya.ru\/poe3\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0441\u0442\u0438\u0445\u043e\u0432<\/a>. \u0414\u043b\u044f \u043f\u0435\u0441\u0435\u043d \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0435\u0441\u0442\u044c, \u0434\u043b\u044f \u043a\u043d\u0438\u0433 \u2014 \u0435\u0441\u0442\u044c, \u0434\u043b\u044f \u0444\u0438\u043b\u044c\u043c\u043e\u0432 \u2014 \u0435\u0441\u0442\u044c, \u0434\u043b\u044f \u0441\u0442\u0438\u0445\u043e\u0432 \u2014 \u043d\u0435\u0442. \u041d\u0435\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043a. \u0410 \u0437\u043d\u0430\u0447\u0438\u0442, \u044d\u0442\u043e\u043c\u0443 \u0433\u043e\u0440\u043e\u0434\u0443 \u043d\u0443\u0436\u0435\u043d \u0433\u0435\u0440\u043e\u0439! <s>\u0427\u0438\u043f \u0438 \u0414\u0435\u0439\u043b<\/s> \u041e\u0431\u0435\u0437\u044c\u044f\u043d\u043a\u0430 \u0441 \u041f\u0438\u0442\u043e\u043d\u043e\u043c \u0441\u043f\u0435\u0448\u0430\u0442 \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c!<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7c1\/13a\/da8\/7c113ada880e8fbba611382b8d2fce9e.jpg\" width=\"736\" height=\"437\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/7c1\/13a\/da8\/7c113ada880e8fbba611382b8d2fce9e.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7c1\/13a\/da8\/7c113ada880e8fbba611382b8d2fce9e.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u043e \u0445\u043e\u0434\u0443 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0441\u043e\u0431\u0440\u0430\u043b \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0435 \u0441 Kaggle, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Flask, sqlite-vec, \u044d\u043d\u043a\u043e\u0434\u0435\u0440 \u0441 Hugging Face \u0438 \u0447\u0438\u0441\u0442\u044b\u0439 (\u043d\u0443 \u043f\u043e\u0447\u0442\u0438) HTML.<\/p>\n<h3>0. \u041a\u0430\u043a \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/h3>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/07e\/d4a\/40a\/07ed4a40a3f9f419bc7c58c79b289169.jpg\" alt=\"\u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432 \u0446\u0435\u043b\u043e\u043c. \u0421\u0435\u0439\u0447\u0430\u0441 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\" title=\"\u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432 \u0446\u0435\u043b\u043e\u043c. \u0421\u0435\u0439\u0447\u0430\u0441 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\" width=\"1920\" height=\"1080\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/07e\/d4a\/40a\/07ed4a40a3f9f419bc7c58c79b289169.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/07e\/d4a\/40a\/07ed4a40a3f9f419bc7c58c79b289169.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432 \u0446\u0435\u043b\u043e\u043c. \u0421\u0435\u0439\u0447\u0430\u0441 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e<\/figcaption><\/div>\n<\/figure>\n<p>\u0411\u0435\u0440\u0451\u043c \u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0438\u0445\u043e\u0432 (\u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u044d\u0442\u043e Data). \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/huggingface.co\/sentence-transformers\/distiluse-base-multilingual-cased-v1\" rel=\"noopener noreferrer nofollow\">\u044d\u043d\u043a\u043e\u0434\u0435\u0440\u0430<\/a> \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Sentence-Transformers (BERT-model) \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0441\u0442\u0438\u0445\u0438 \u0432 512-\u043c\u0435\u0440\u043d\u044b\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u044b. \u0421\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u044b \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0438\u043c \u0442\u0435\u043a\u0441\u0442\u044b \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u0443\u044e \u0431\u0430\u0437\u0443 (Vector base).<\/p>\n<p>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c (User) \u0432\u0432\u043e\u0434\u0438\u0442 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 (App) \u0441\u0442\u0438\u0445\u043e\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0435. \u041c\u043e\u0434\u0435\u043b\u044c (BERT-model) \u043d\u0430 \u043b\u0435\u0442\u0443 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0435\u0433\u043e \u0432 \u0432\u0435\u043a\u0442\u043e\u0440 (\u0441\u0442\u0438\u0445\u043e\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0435, \u0430 \u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f). \u042d\u0442\u043e\u0442 \u0432\u0435\u043a\u0442\u043e\u0440 \u0441\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0441 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u0431\u0430\u0437\u044b (Vector base). \u0421\u0438\u0441\u0442\u0435\u043c\u0430 (App) \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0442\u0440\u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0441\u0445\u043e\u0436\u0438\u0445 \u043f\u043e \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u043c\u0443 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u0432\u0435\u043a\u0442\u043e\u0440\u0430, \u0431\u0435\u0440\u0451\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0438\u043c \u0442\u0435\u043a\u0441\u0442\u044b (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439, \u0435\u0441\u043b\u0438 \u043e\u043d \u0435\u0441\u0442\u044c \u0432 \u0431\u0430\u0437\u0435) \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e (User) \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439.<\/p>\n<p>\u0424\u0443\u0445. \u0412\u044b \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u043d\u044f\u043b\u0438? \u042f \u0442\u043e\u0436\u0435 \u043d\u0435\u0442. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<h2>1. \u0414\u0430\u0442\u0430\u0441\u0435\u0442<\/h2>\n<p>\u00abContent is King\u00bb \u2014 \u0441\u043a\u0430\u0437\u0430\u043b \u0411\u0438\u043b\u043b \u0413\u0435\u0439\u0442\u0441 \u0435\u0449\u0451 \u0432 1994 \u0433\u043e\u0434\u0443 \u0438, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0431\u044b\u043b \u043f\u0440\u0430\u0432. \u0414\u0430\u0442\u0430\u0441\u0435\u0442 \u2014 \u0443\u0436\u0435 \u043f\u043e\u043b\u0434\u0435\u043b\u0430, \u0438 \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u0435\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p>\u0414\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u041c\u041d\u041e\u0413\u041e, \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0427\u0418\u0421\u0422\u042b\u041c\u0418. \u0410 \u0435\u0449\u0451 \u0438\u0445 \u043d\u0430\u0434\u043e \u0425\u0420\u0410\u041d\u0418\u0422\u042c \u0432 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435.<\/p>\n<p>\u042f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u0447\u0430\u0442\u044c \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e. \u041d\u0430\u0448\u0451\u043b \u043d\u0430 Kaggle <a href=\"https:\/\/www.kaggle.com\/datasets\/greencools\/russianpoetry\/data\" rel=\"noopener noreferrer nofollow\">\u0434\u0430\u0442\u0430\u0441\u0435\u0442<\/a>:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a8b\/985\/57a\/a8b98557a36c206195b3d9de875b2ec1.png\" alt=\"\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0442\u0438\u0445\u0438, \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u044a\u0451\u043c \u2014 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u0433\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u0430\u043a \u043d\u0435\u043b\u044c\u0437\u044f \u043b\u0443\u0447\u0448\u0435\" title=\"\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0442\u0438\u0445\u0438, \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u044a\u0451\u043c \u2014 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u0433\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u0430\u043a \u043d\u0435\u043b\u044c\u0437\u044f \u043b\u0443\u0447\u0448\u0435\" width=\"1575\" height=\"141\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/a8b\/985\/57a\/a8b98557a36c206195b3d9de875b2ec1.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a8b\/985\/57a\/a8b98557a36c206195b3d9de875b2ec1.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0442\u0438\u0445\u0438, \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u044a\u0451\u043c \u2014 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u0433\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u0430\u043a \u043d\u0435\u043b\u044c\u0437\u044f \u043b\u0443\u0447\u0448\u0435<\/figcaption><\/div>\n<\/figure>\n<h2>2. \u0412\u0435\u043a\u0442\u043e\u0440\u043d\u0430\u044f \u0431\u0430\u0437\u0430<\/h2>\n<p>\u0414\u043b\u044f \u043c\u0430\u0448\u0438\u043d\u044b \u0442\u0435\u043a\u0441\u0442\u044b \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b. \u0414\u0443\u0448\u0435\u0432\u043d\u044b\u0445 \u043f\u043e\u0440\u044b\u0432\u043e\u0432 \u043e\u043d\u0430 \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 (\u043f\u043e\u043a\u0430), \u0438 \u0432\u0438\u0440\u0448\u0430\u043c\u0438 \u0432 \u0440\u0435\u0441\u0442\u043e\u0440\u0430\u043d\u0435 \u043f\u043e\u0434 \u043b\u0443\u043d\u043e\u0439 (\u0441 \u0431\u043e\u043a\u0430\u043b\u044c\u0447\u0438\u043a\u043e\u043c \u0432\u0438\u043d\u0430) \u0435\u0451 \u043d\u0435 \u0441\u043e\u0431\u043b\u0430\u0437\u043d\u0438\u0448\u044c. \u0422\u0435\u043a\u0441\u0442\u044b \u043d\u0430\u0434\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043e\u0442 \u043d\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u044b \u043c\u0430\u0448\u0438\u043d\u0430 \u0443\u0436\u0435 \u043a\u043b\u044e\u043d\u0435\u0442. \u0414\u0435\u043b\u043e \u043f\u043e\u0448\u043b\u043e.<\/p>\n<p>\u041c\u0435\u0442\u043e\u0434\u043e\u043c \u043f\u0440\u043e\u0431 \u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b \u0441\u0432\u043e\u0439 \u0432\u044b\u0431\u043e\u0440 \u043d\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 sqlite-vec. \u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435?<\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c \u0441\u0435\u0432\u0435\u0440\u0430\u043c \u0443\u0434\u043b\u0438\u043d\u0438\u043b \u0431\u044b \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043a\u043b\u0438\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u043b\u043e\u0434\u0438\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 (\u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0449\u0451 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f) \u2014 \u0447\u0435\u043c \u043f\u0440\u043e\u0449\u0435, \u0442\u0435\u043c \u043b\u0443\u0447\u0448\u0435.<\/p>\n<p>\u0411\u0430\u0437\u0443 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432 Google Colab. \u0413\u0440\u0443\u0437\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u0434\u0430\u0442\u0430\u0441\u0435\u0442, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c:<\/p>\n<pre><code class=\"python\">!pip install sqlite-vec import sqlite3 import sqlite_vec import pandas as pd import numpy as np from sentence_transformers import SentenceTransformer from typing import List  model = SentenceTransformer('distiluse-base-multilingual-cased-v1', device='cpu')  df = pd.read_csv('russianPoetryWithTheme.csv')<\/code><\/pre>\n<p>\u0418\u0437 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u0430 \u0432\u044b\u0447\u043b\u0435\u043d\u044f\u0435\u043c \u0430\u0432\u0442\u043e\u0440\u0430, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u0442\u0435\u043a\u0441\u0442, \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u043c \u0432 \u0435\u0434\u0438\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438 \u0442\u0430\u043a\u0438\u0445 \u0441\u0442\u0440\u043e\u043a:<\/p>\n<pre><code class=\"python\">texts = [] for idx in range(16694):   author = df.iloc[idx]['author']   name = df.iloc[idx]['name']   text = df.iloc[idx]['text']   texts.append(author + '\\n' + str(name) + '\\n' + text)  def get_normalized_embeddings(texts: List[str]) -&gt; np.ndarray:     embeddings = model.encode(texts, convert_to_numpy=True)     return embeddings \/ np.linalg.norm(embeddings, axis=1, keepdims=True)  embeddings = get_normalized_embeddings(texts)<\/code><\/pre>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0431\u0430\u0437\u0443 &#171;vectors.db&#187; \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0432 \u043d\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u043f\u0430\u0440\u044b \u00ab\u0432\u0435\u043a\u0442\u043e\u0440 \u2014 \u0442\u0435\u043a\u0441\u0442\u00bb:<\/p>\n<pre><code class=\"python\">db = sqlite3.connect(\"vectors.db\") db.enable_load_extension(True) sqlite_vec.load(db) db.enable_load_extension(False)  db.execute(\"\"\"     CREATE VIRTUAL TABLE documents USING vec0(         embedding float[512],         text text     ) \"\"\")<\/code><\/pre>\n<p>\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0431\u0430\u0437\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u0438 \u0442\u0435\u043a\u0441\u0442\u0430\u043c\u0438:<\/p>\n<pre><code class=\"python\">from tqdm.notebook import tqdm BATCH_SIZE = 1 with db:     for i in tqdm(range(0, len(texts), BATCH_SIZE)):         batch = [             (j+1,              embeddings[j].tobytes(),              texts[j])             for j in range(i, min(i+BATCH_SIZE, len(texts)))         ]         db.executemany(             \"INSERT INTO documents(rowid, embedding, text) VALUES (?, ?, ?)\",             batch         )<\/code><\/pre>\n<p>\u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b &#171;vectors.db&#187;.<\/p>\n<h2>3. \u0412\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 Flask<\/h2>\n<p>\u0418\u0442\u0430\u043a, \u043f\u043e\u0434\u043e\u0448\u043b\u0438 \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443 \u2014 \u043f\u0438\u0448\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 Flask. \u0412\u044b\u0431\u0440\u0430\u043b \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u043b\u044b\u0448\u0430\u043b \u043e \u043d\u0451\u043c \u043a\u0430\u043a \u043e \u0437\u043e\u043b\u043e\u0442\u043e\u0439 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u043e\u0439 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u2014 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043d\u043e\u0432\u0438\u0447\u043a\u0430.<\/p>\n<p>\u041f\u043e\u043c\u043d\u0438\u043c: \u0447\u0435\u043c \u043f\u0440\u043e\u0449\u0435 \u2014 \u0442\u0435\u043c \u043b\u0443\u0447\u0448\u0435, \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u0441 \u043a\u043e\u0434\u043e\u043c, \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0448\u0432\u043e\u0432 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043b\u0430\u0442\u0430\u0442\u044c, \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0441\u043e\u0431\u0435\u0440\u0451\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0434\u043e\u0444\u0430\u043c\u0438\u043d\u0447\u0438\u043a. \u0414\u0440\u0443\u0437\u044c\u044f \u0441\u043a\u0430\u0436\u0443\u0442: \u00ab\u0442\u044b \u0433\u0435\u043d\u0438\u0439!\u00bb \u0420\u0430\u0431\u043e\u0442\u043e\u0434\u0430\u0442\u0435\u043b\u0438 \u0437\u0430\u0432\u0430\u043b\u044f\u0442 \u0431\u0430\u043a\u0441\u0430\u043c\u0438! (\u0420\u0430\u0431\u043e\u0442\u043e\u0434\u0430\u0442\u0435\u043b\u0438, \u0430\u0443, \u043e\u0442\u0437\u043e\u0432\u0438\u0442\u0435\u0441\u044c! \u041f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438&#8230; \u0433\u0435\u043d\u0438\u0439&#8230; \u0431\u044d\u043a\u0435\u043d\u0434\u0430 \u0436\u0435&#8230; \u0432\u044b \u0447\u0442\u043e&#8230; \u0440\u0430\u0437\u0432\u0435&#8230; \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435&#8230; \u0433\u0435\u043d\u0438\u0439&#8230; \u0431\u044d\u043a\u0435\u043d\u0434\u0430&#8230;\ud83d\ude22)<\/p>\n<p>\u041f\u043e Flask \u043d\u0430\u0448\u0451\u043b <a href=\"https:\/\/youtube.com\/playlist?list=PL7yh-TELLS1EyAye_UMnlsTGKxg8uatkM&amp;si=nPkX-w3pUgZWu1O0\" rel=\"noopener noreferrer nofollow\">\u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0432\u0432\u043e\u0434\u043d\u044b\u0439 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0438 \u0437\u0430\u043a\u0440\u044b\u043b \u0431\u0430\u0437\u0443 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0411\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u043f\u043e\u043a\u0430 \u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0437\u0432\u0435\u0437\u0434\u043e\u043b\u0451\u0442. <\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 &#171;main.py&#187;.<\/p>\n<pre><code class=\"python\">from flask import Flask, render_template, request from translation_pipe import translation from get_vec_db import search_similar_texts  app = Flask(__name__, template_folder='templates')  @app.route(\"\/\", methods=['GET']) def text_form():     return render_template('index.html')  @app.route(\"\/poe3\", methods=['GET', 'POST']) def similarity_form():     if request.method == 'GET':         return render_template('poe3.html')     elif request.method == 'POST':         text = request.form.get('textarea')         results = search_similar_texts(text, top_k=3)         text_match = []         for row in results:             row_list = row[1].split('\\n')             text_match.append([row[2], row_list]) #f\"\u0414\u043e\u043b\u044f \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u0438: {row[2]:.4f}, \u0422\u0435\u043a\u0441\u0442: {row[1]}...\")         return render_template('validation.html', text_match=text_match)  @app.route(\"\/validation\", methods=['GET', 'POST']) def validation_form():     if request.method == 'GET':         return render_template('poe3.html')     elif request.method == 'POST':         try:             score = float(request.form.get('validarea'))         except Exception:             return render_template('poe3.html', text_valid=['\u041d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439 \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0441\u043d\u043e\u0432\u0430!'])          with open('validation.txt', 'r', encoding='utf-8') as f:             validate_list = list(map(float, f.readlines()))         validate_list[0] += 3.0         validate_list[1] += score         validate_list[2] = (validate_list[1]\/validate_list[0])*100         to_file = str(validate_list[0]) + '\\n' + str(validate_list[1]) + '\\n' + str(validate_list[2])         with open('validation.txt', 'w', encoding='utf-8') as f:             f.write(to_file)         return render_template('congrats.html', text_valid=['\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u043e\u0446\u0435\u043d\u043a\u0443!'])  @app.route(\"\/score\", methods=['GET']) def get_score():     with open('validation.txt', 'r', encoding='utf-8') as f:         score_list = list(map(float, f.readlines()))     return render_template('score.html', score_list=score_list)  if __name__ == \"__main__\":     port = 8080     app.run(debug=True, host='0.0.0.0', port=port)<\/code><\/pre>\n<p>\u041e\u043d \u0443\u043c\u0435\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043b\u044e\u0431\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438\u0437 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430. <\/p>\n<p>&#171;\/&#187; \u2014 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 GET, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441\u0430\u0439\u0442\u0430 (\u043d\u0435 \u0438\u043c\u0435\u044e\u0449\u0443\u044e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443). <\/p>\n<p>&#171;\/poe3&#187; \u2014 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441 \u043e\u043a\u043e\u0448\u043a\u043e\u043c \u0438 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0438\u0445\u043e\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0435, \u0432\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c: \u043e\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e &#171;search_similar_texts()&#187;, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0440\u0438 \u0441\u0445\u043e\u0436\u0438\u0445 \u0442\u0435\u043a\u0441\u0442\u0430. \u042d\u0442\u0443 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044e \u043c\u044b \u0437\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 &#171;validation.html&#187;, \u043a\u0443\u0434\u0430 \u0438 \u0440\u0435\u0434\u0438\u0440\u0435\u043a\u0442\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041e\u043d \u0432\u0438\u0434\u0438\u0442 \u0432\u044b\u0434\u0430\u0447\u0443, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044e.<\/p>\n<p>&#171;main.py&#187; \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0424\u0443\u043d\u043a\u0446\u0438\u044f &#171;search_similar_texts()&#187; \u0437\u0430\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u0430 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c &#171;get_vec_db.py&#187;, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">import sqlite3 import sqlite_vec import numpy as np from sentence_transformers import SentenceTransformer from typing import List  model = SentenceTransformer('distiluse-base-multilingual-cased-v1', use_auth_token=False) db = sqlite3.connect('vectors.db', check_same_thread=False) db.enable_load_extension(True) sqlite_vec.load(db) db.enable_load_extension(False)   def search_similar_texts(query_text: str, top_k: int = 5) -&gt; List[tuple]:     query_embedding = model.encode(query_text, convert_to_numpy=True)     query_embedding = query_embedding \/ np.linalg.norm(query_embedding)      rows = db.execute(         \"SELECT rowid, text, embedding FROM documents\"     ).fetchall()      res = []      for r in rows:         stored_vec = np.frombuffer(r[2], dtype=np.float32)         similarity = np.dot(query_embedding, stored_vec)         res.append((r[0], r[1], float(similarity)))      return sorted(res, key=lambda x: x[2], reverse=True)[:top_k]<\/code><\/pre>\n<p>\u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a &#171;main.py&#187;. \u0410 \u0442\u043e\u0447\u043d\u0435\u0435 \u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 &#171;\/validation&#187;, \u0433\u0434\u0435 \u043c\u044b \u043f\u0440\u043e\u0441\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0434\u0430\u0447\u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439. \u0417\u0434\u0435\u0441\u044c \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435.<\/p>\n<h2>4. \u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f<\/h2>\n<p>\u0425\u044c\u044e\u0441\u0442\u043e\u043d, \u0443 \u043d\u0430\u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u043a\u0430\u043a \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0434\u0430\u0447\u0438, \u0435\u0441\u043b\u0438 \u043c\u0430\u0448\u0438\u043d\u0430 \u0440\u0430\u0432\u043d\u043e\u0434\u0443\u0448\u043d\u0430 \u043a \u0432\u0438\u0440\u0448\u0430\u043c \u043f\u043e\u0434 \u043b\u0443\u043d\u043e\u0439 \u0438 \u043b\u0438\u0440\u0438\u043a\u0430 \u0435\u0439 \u0434\u043e \u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0438? \u0427\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u044b\u0434\u0430\u043b\u0430 \u00ab\u0445\u043e\u0440\u043e\u0448\u0443\u044e\u00bb \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044e? \u041a\u0430\u043a\u043e\u0432\u044b \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0438? \u041c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u044c \u00ab\u0441\u0445\u043e\u0436\u0435\u0441\u0442\u044c\u00bb \u0434\u0432\u0443\u0445 \u0441\u0442\u0438\u0445\u043e\u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u043e. \u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u2014 \u0432\u043e\u043f\u0440\u043e\u0441 \u0432\u043a\u0443\u0441\u043e\u0432.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 3 \u0431\u0430\u043b\u043b\u0430. \u0417\u043d\u0430\u0447\u0438\u0442, \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u043b\u043b\u043e\u0432 = 3*(\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0432\u0448\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0443). <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e <s>\u0437\u043b\u044b\u0435<\/s> \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0441\u0442\u0430\u0432\u044f\u0442 \u00ab\u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435\u00bb \u0431\u0430\u043b\u043b\u044b: 1, 2, 3. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043e\u0431\u0449\u0435\u0435 \u00ab\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435\u00bb \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u043b\u043b\u043e\u0432 \u043c\u0435\u043d\u044c\u0448\u0435 \u00ab\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e\u00bb. \u041a\u0442\u043e \u0432 \u0448\u043a\u043e\u043b\u0435 \u0443\u0447\u0438\u043b \u0434\u043e\u043b\u0438 \u0438 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u044b \u043f\u043e\u0439\u043c\u0451\u0442, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u043b\u044c\u0448\u0435: \u0434\u0435\u043b\u0438\u043c \u00ab\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435\u00bb \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u043b\u043b\u043e\u0432 \u043d\u0430 \u00ab\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435\u00bb, \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u043d\u0430 100 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u043d\u0442 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \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\/4e8\/3ba\/563\/4e83ba563cb766797c0ebd7ccdb27399.PNG\" alt=\"\u041f\u0440\u043e\u0446\u0435\u043d\u0442... \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0432\u0448\u0438\u0435... \u0434\u0435\u043b\u0438\u043c... \u043a\u0430\u043a\u043e\u0435 \u043d\u0435\u0431\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0435...\" title=\"\u041f\u0440\u043e\u0446\u0435\u043d\u0442... \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0432\u0448\u0438\u0435... \u0434\u0435\u043b\u0438\u043c... \u043a\u0430\u043a\u043e\u0435 \u043d\u0435\u0431\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0435...\" width=\"776\" height=\"498\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/4e8\/3ba\/563\/4e83ba563cb766797c0ebd7ccdb27399.PNG 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4e8\/3ba\/563\/4e83ba563cb766797c0ebd7ccdb27399.PNG 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u0440\u043e\u0446\u0435\u043d\u0442&#8230; \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0432\u0448\u0438\u0435&#8230; \u0434\u0435\u043b\u0438\u043c&#8230; \u043a\u0430\u043a\u043e\u0435 \u043d\u0435\u0431\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0435&#8230;<\/figcaption><\/div>\n<\/figure>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0438\u043c \u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u0430 &#171;\/validation&#187;. \u0412 \u043d\u0451\u043c \u0432\u0441\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0432\u044b\u0448\u0435 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441 txt-\u0444\u0430\u0439\u043b\u043e\u043c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0445\u0440\u0430\u043d\u0438\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0431\u0430\u043b\u043b\u043e\u0432. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0431\u0430\u043b\u043b\u044b, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u044b\u0435 \u0431\u0430\u043b\u043b\u044b \u0432 \u0444\u0430\u0439\u043b, \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b. \u041f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0443 \u0432\u0432\u0438\u0434\u0443 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0435\u0433\u043e \u043a\u043e\u043f\u0438\u044f \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0434\u0435\u043f\u043b\u043e\u0435 \u0441 \u0442\u0435\u043a\u0443\u0449\u0438\u043c\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u0431\u0430\u043b\u043b\u043e\u0432.<\/p>\n<p>\u0418\u0445, \u043a\u0441\u0442\u0430\u0442\u0438, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443 &#171;\/score&#187;, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u043e\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0448\u0438\u043c &#171;main.py&#187;. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 txt-\u0444\u0430\u0439\u043b \u0441 \u0431\u0430\u043b\u043b\u0430\u043c\u0438 \u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442 \u043e\u0442\u0447\u0451\u0442 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d6f\/0b1\/6f9\/d6f0b16f93ff9102045ade313d7a05f9.png\" alt=\"\u0420\u0430\u0441\u043a\u0438\u0434\u0430\u043b \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e \u0441\u0432\u043e\u0438\u043c \u0441\u043e\u0446\u0441\u0435\u0442\u044f\u043c. \u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 score \u0442\u0430\u043a\u043e\u0439. \u0421\u0438\u0441\u0442\u0435\u043c\u0443 \u043e\u0446\u0435\u043d\u0438\u043b\u0438 134 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430\" title=\"\u0420\u0430\u0441\u043a\u0438\u0434\u0430\u043b \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e \u0441\u0432\u043e\u0438\u043c \u0441\u043e\u0446\u0441\u0435\u0442\u044f\u043c. \u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 score \u0442\u0430\u043a\u043e\u0439. \u0421\u0438\u0441\u0442\u0435\u043c\u0443 \u043e\u0446\u0435\u043d\u0438\u043b\u0438 134 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430\" width=\"327\" height=\"166\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/d6f\/0b1\/6f9\/d6f0b16f93ff9102045ade313d7a05f9.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d6f\/0b1\/6f9\/d6f0b16f93ff9102045ade313d7a05f9.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0430\u0441\u043a\u0438\u0434\u0430\u043b \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e \u0441\u0432\u043e\u0438\u043c \u0441\u043e\u0446\u0441\u0435\u0442\u044f\u043c. \u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 score \u0442\u0430\u043a\u043e\u0439. \u0421\u0438\u0441\u0442\u0435\u043c\u0443 \u043e\u0446\u0435\u043d\u0438\u043b\u0438 134 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445.<\/p>\n<h2>5. HTML + Jinja2 = \u2764\ufe0f<\/h2>\n<p>Jinja2 \u2013 \u0441\u0435\u0440\u044b\u0439 \u043a\u0430\u0440\u0434\u0438\u043d\u0430\u043b \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e. \u0414\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043e\u043d \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u043b \u043d\u0430\u0448\u0438\u043c \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u043e\u043c, \u0430 \u043c\u044b \u0438 \u043d\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u043b\u0438. \u0415\u0433\u043e \u0432\u043e\u0442\u0447\u0438\u043d\u0430 \u2014 HTML-\u0448\u0430\u0431\u043b\u043e\u043d\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c Python-\u043a\u043e\u0434. \u0418\u043c\u0435\u043d\u043d\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u0430\u043a\u043e\u043c\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438\u0437 &#171;main.py&#187; \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0432 HTML-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 Python, \u0430 \u0442\u0435 \u0431\u0443\u0434\u0443\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0441 \u043d\u0438\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p>\u042f \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u0432\u044b \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043b\u0438. \u041f\u0440\u0438\u0432\u0435\u0434\u0443 \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043a\u043e\u0434 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 &#171;score.html&#187;, \u0441\u043a\u0440\u0438\u043d \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0432\u0438\u0434\u0435\u043b\u0438:<\/p>\n<pre><code class=\"python\">{% extends \"base.html\" %} {% block title %}\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438{% endblock %}  {% block content %}     &lt;h1&gt;\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438&lt;\/h1&gt;      &lt;div&gt;\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430: {{ score_list[0] }}&lt;\/div&gt;     &lt;br&gt;     &lt;div&gt;\u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430: {{ score_list[1] }}&lt;\/div&gt;     &lt;br&gt;     &lt;div&gt;\u0422\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0432 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u0430\u0445: {{ score_list[2] }} %&lt;\/div&gt;     &lt;br&gt;  {% endblock %}<\/code><\/pre>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0445\u0438\u0442\u0440\u043e\u0443\u043c\u043d\u043e\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u044f \u043c\u043e\u0433\u0443 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432 \u044d\u0442\u043e\u043c HTML-\u043a\u043e\u0434\u0435 \u043f\u0438\u0442\u043e\u043d\u043e\u0432\u0441\u043a\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u2014 \u0438 \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p>\u0415\u0449\u0451 \u043e\u0434\u0438\u043d \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u0440\u044b\u0432\u043e\u0447\u0435\u043a. \u0421\u0442\u0440\u043e\u0447\u043a\u0430 &#171;{% extends &#171;base.html&#187; %}&#187; \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0448\u0430\u0431\u043b\u043e\u043d \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u043c\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u0443 &#171;base.html&#187;, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0440\u0443\u043a\u0430\u043c\u0438 \u043d\u0435 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043c\u043e\u0438 \u0441\u043e\u0446\u0441\u0435\u0442\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u043f\u043e\u0434\u043f\u0438\u0448\u0438\u0442\u0435\u0441\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0430\u043c \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u043c\u043e\u044f \u0441\u0442\u0430\u0442\u044c\u044f, \u0438 \u0432\u043e\u043e\u0431\u0449\u0435, \u044f \u0441\u043c\u0435\u0448\u043d\u043e\u0439, \u0432\u0435\u0434\u044c \u043f\u0440\u0430\u0432\u0434\u0430?\ud83d\ude0a)<\/p>\n<pre><code class=\"python\">&lt;!DOCTYPE html&gt; &lt;html lang=\"en, ru\"&gt; &lt;head&gt;     &lt;meta charset=\"UTF-8\"&gt;     &lt;title&gt;{% block title %}Default Title{% endblock %}&lt;\/title&gt; &lt;\/head&gt; &lt;body&gt;     &lt;p&gt;&lt;\/p&gt;     {% block content %}{% endblock %}     &lt;br&gt;     &lt;br&gt;     &lt;a href=\"https:\/\/t.me\/habaznyaclub\"&gt;\u043e\u0442\u043a\u0440\u043e\u0432\u0435\u043d\u0438\u044f \u0442\u0435\u0445\u043d\u0430\u0440\u044f \u043e \u043f\u043e\u044d\u0437\u0438\u0438 \ud83d\udcd6&lt;\/a&gt;     &lt;br&gt;     &lt;br&gt;     &lt;a href=\"https:\/\/t.me\/habaznya_math\"&gt;\u043e\u0442\u043a\u0440\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u043e\u044d\u0442\u0430 \u043e \u043a\u043e\u0434\u0435, AI, NLP \ud83d\udee0&lt;\/a&gt; &lt;\/body&gt; &lt;\/html&gt;<\/code><\/pre>\n<p>\u041d\u0443 \u0432\u0441\u0451-\u0432\u0441\u0451, \u043d\u0435 \u043f\u043b\u0430\u0447\u044c\u0442\u0435, \u043c\u044b \u0443\u0436\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438, \u0432\u0441\u0451 \u043f\u043e\u0437\u0430\u0434\u0438. \u042f \u0436\u0435 \u0441\u043a\u0430\u0437\u0430\u043b: \u043a\u0430\u043a \u043a\u043e\u043c\u0430\u0440\u0438\u043a \u0443\u043a\u0443\u0441\u0438\u0442. \u0418 \u043d\u0438\u0447\u0435\u0433\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u2014 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0434\u0430?<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/298\/45f\/6d2\/29845f6d2079fe739d0c7540ba56b6ed.PNG\" alt=\"\u0423\u0441\u0442\u0430\u043b\u044c\" title=\"\u0423\u0441\u0442\u0430\u043b\u044c\" width=\"840\" height=\"557\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/298\/45f\/6d2\/29845f6d2079fe739d0c7540ba56b6ed.PNG 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/298\/45f\/6d2\/29845f6d2079fe739d0c7540ba56b6ed.PNG 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0423\u0441\u0442\u0430\u043b\u044c<\/figcaption><\/div>\n<\/figure>\n<h2>6. \u0411\u043e\u043d\u0443\u0441-\u0442\u0440\u0435\u043a: \u0434\u0435\u043f\u043b\u043e\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440<\/h2>\n<p>\u0415\u0441\u0442\u044c \u0432\u0435\u0449\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0440\u0430\u043c\u043a\u0438 \u043d\u0430\u0448\u0435\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u0431\u043e\u0442\u0430 Flask \u0438 Jinja2, \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 sqlite-vec \u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u044d\u043d\u043a\u043e\u0434\u0435\u0440\u043e\u0432 Hugging Face. \u0414\u0435\u0442\u0430\u043b\u0438 \u0434\u0435\u043f\u043b\u043e\u044f \u2014 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u0432\u0435\u0449\u0435\u0439.  \u0412 \u0441\u0435\u0442\u0438 \u043a\u0443\u0447\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u2014 \u0433\u0443\u0433\u043b\u0438\u0442\u0435, \u0447\u0430\u0442\u0431\u043e\u0442\u044c\u0442\u0435, \u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0441\u0432\u043e\u0435\u0433\u043e \u0445\u043e\u0441\u0442\u0435\u0440\u0430.<\/p>\n<p>\u0423 \u043c\u043e\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0430\u044f \u043a\u043b\u0430\u0441\u0441\u043d\u0430\u044f \u0444\u0438\u0447\u0430 \u2014 \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0434\u0435\u043f\u043b\u043e\u0439 \u0438\u0437 git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. \u0414\u0435\u043b\u0430\u0435\u0448\u044c \u043d\u043e\u0432\u044b\u0439 push, \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u0434\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u043d\u0430 \u043b\u0435\u0442\u0443, \u0434\u0435\u043f\u043b\u043e\u0438\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0430\u043c. \u0417\u0432\u0443\u0447\u0438\u0442 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e, \u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0434\u0435\u043f\u043b\u043e\u0439, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435, \u0443 \u043c\u0435\u043d\u044f \u0443\u0448\u043b\u043e \u0435\u0434\u0432\u0430 \u043b\u0438 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0447\u0435\u043c \u043d\u0430 \u0441\u0430\u043c \u043f\u0440\u043e\u0435\u043a\u0442.<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u0432 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0432\u044b \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u0432\u0441\u0435 \u043d\u0435\u0446\u0435\u043d\u0437\u0443\u0440\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u043d\u0430\u0435\u0442\u0435. \u0423\u0434\u0430\u0447\u0438!<\/p>\n<h2>7. \u041d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u0432\u044b\u0432\u043e\u0434<\/h2>\n<p>\u0418\u0442\u0430\u043a, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0432\u0448\u0438\u0441\u044c \u0441 \u0430\u0437\u0430\u043c\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432 Flask \u0438 Jinja2, \u043f\u043e\u0447\u0438\u0442\u0430\u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e sqlite-vec, \u043d\u0430\u0443\u0447\u0438\u0432\u0448\u0438\u0441\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u044d\u043d\u043a\u043e\u0434\u0435\u0440\u0430\u043c\u0438 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 (fine-tuning \u043d\u0435 \u0434\u0435\u043b\u0430\u043b\u0438), \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0438 \u043f\u0430\u0440\u0443 \u043c\u0435\u0442\u0440\u043e\u0432 \u043d\u0435\u0440\u0432\u043e\u0432 \u043d\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0434\u0435\u043f\u043b\u043e\u0439, \u043c\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e <a href=\"https:\/\/habaznya.ru\/poe3\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0441\u0442\u0438\u0445\u043e\u0432<\/a>. \u0422\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0443 \u043d\u0435\u0451 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u2014 67%, \u043d\u043e \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u044f \u043d\u0435\u043f\u043b\u043e\u0445\u043e.<\/p>\n<p>\u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044f \u043e\u043f\u044b\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043f\u043e\u043d\u044f\u043b \u0432\u0430\u0436\u043d\u0443\u044e \u0432\u0435\u0449\u044c. \u042d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 \u0442\u0435\u043a\u0441\u0442\u0430, \u0430 \u043d\u0435 \u0441\u0442\u0438\u043b\u0438\u0441\u0442\u0438\u043a\u0443, \u0440\u0438\u0442\u043c, \u0441\u043e\u0437\u0432\u0443\u0447\u0438\u044f.<\/p>\n<p>\u042f \u0432\u0432\u043e\u0436\u0443 \u043f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0435 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u0441\u0442\u0438\u0445\u043e\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0442\u043e\u0447\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432 \u0431\u0430\u0437\u0435, \u043d\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u044e \u0435\u0433\u043e \u0432 \u0432\u044b\u0434\u0430\u0447\u0435. \u0418\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e, \u043d\u043e \u043d\u0435 \u043f\u0435\u0440\u0432\u044b\u043c. \u0427\u0442\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442? \u0412\u0435\u043a\u0442\u043e\u0440 \u0434\u0432\u0443\u0445 \u0441\u0442\u0440\u043e\u0447\u0435\u043a \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0432\u043e\u0431\u0440\u0430\u0442\u044c \u0432 \u0441\u0435\u0431\u044f \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 \u0432\u0441\u0435\u0433\u043e \u0441\u0442\u0438\u0445\u043e\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u043b\u0451\u043a \u043e\u0442 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0446\u0435\u043b\u043e\u0433\u043e \u0441\u0442\u0438\u0445\u043e\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0420\u0435\u0447\u044c \u0438\u0434\u0451\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u0426\u0435\u043b\u043e\u0435-\u043a-\u0446\u0435\u043b\u043e\u043c\u0443. \u041a\u0430\u043a \u0432 \u00ab\u042f\u043d\u0434\u0435\u043a\u0441 \u041c\u0443\u0437\u044b\u043a\u0435\u00bb. \u0410 \u043d\u0435 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0443, \u043a\u0430\u043a \u0432 \u00ab\u0428\u0430\u0437\u0430\u043c\u0435\u00bb.<\/p>\n<hr\/>\n<p>\u0421 \u0432\u0430\u043c\u0438 \u0431\u044b\u043b\u0438 \u041e\u0431\u0435\u0437\u044c\u044f\u043d\u043a\u0430 \u0438 \u041f\u0438\u0442\u043e\u043d. \u0415\u0441\u043b\u0438 \u0431\u044b\u043b\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0438\u043b\u0438, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u0441\u043c\u0435\u0448\u043d\u043e, \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u0435\u0441\u044c \u0441\u0442\u0430\u0442\u044c\u0435\u0439 \u0441 \u0434\u0440\u0443\u0437\u044c\u044f\u043c\u0438, \u043d\u0430\u043a\u0438\u0434\u0430\u0439\u0442\u0435 \u0440\u0435\u0430\u043a\u0446\u0438\u0439 \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432, \u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u0430\u0436\u0435 \u043f\u043e\u0434\u043f\u0438\u0448\u0438\u0442\u0435\u0441\u044c \u043d\u0430 \u043c\u043e\u0438 \u043e\u0442\u043a\u0440\u043e\u0432\u0435\u043d\u0438\u044f <a href=\"https:\/\/t.me\/habaznyaclub\" rel=\"noopener noreferrer nofollow\">\u0442\u0435\u0445\u043d\u0430\u0440\u044f \u043e \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0435<\/a> \u0438\/\u0438\u043b\u0438 <a href=\"https:\/\/t.me\/habaznya_math\" rel=\"noopener noreferrer nofollow\">\u043b\u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043e \u043a\u043e\u0434\u0435<\/a>.<\/p>\n<p>\u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432 \u043c\u043e\u0438\u0445 \u043a\u0430\u043d\u0430\u043b\u0430\u0445 \u0431\u0443\u0434\u0435\u0442 \u043b\u044e\u0434\u0435\u0439, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u0443\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u044f \u0434\u0435\u043b\u043e\u0432\u043e\u0439 \u0438 \u0443\u043c\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0446. \u041d\u043e \u043c\u044b-\u0442\u043e \u0441 \u0432\u0430\u043c\u0438 \u0437\u043d\u0430\u0435\u043c \u043f\u0440\u0430\u0432\u0434\u0443\ud83d\ude09<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f8b\/dd2\/d84\/f8bdd2d848a2724b095a1e1f045fe3ea.jpg\" alt=\"\u041a\u043b\u0430\u0446-\u043a\u043b\u0430\u0446\" title=\"\u041a\u043b\u0430\u0446-\u043a\u043b\u0430\u0446\" width=\"535\" height=\"268\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f8b\/dd2\/d84\/f8bdd2d848a2724b095a1e1f045fe3ea.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f8b\/dd2\/d84\/f8bdd2d848a2724b095a1e1f045fe3ea.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041a\u043b\u0430\u0446-\u043a\u043b\u0430\u0446<\/figcaption><\/div>\n<\/figure>\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\/916476\/\"> https:\/\/habr.com\/ru\/articles\/916476\/<\/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<blockquote>\n<p>\u041b\u044e\u0431\u043b\u044e \u044f \u043a\u043e\u0434\u0438\u0442\u044c \u0438 \u0441\u0442\u0438\u0445\u0438 \u2014<br \/>\u0412\u043e\u0442, \u0432 \u043e\u0431\u0449\u0435\u043c, \u0432\u0441\u0435 \u043c\u043e\u0438 \u0433\u0440\u0435\u0445\u0438&#8230;<\/p>\n<p>\u0410. \u0421. \u041f\u0443\u0448\u043a\u0438\u043d<\/p>\n<\/blockquote>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u042f \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0438\u043d \u0425\u0430\u0431\u0430\u0437\u043d\u044f, <a href=\"https:\/\/t.me\/habaznya_math\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/a> \u0438 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 <a href=\"https:\/\/t.me\/habaznyaclub\" rel=\"noopener noreferrer nofollow\">\u0430\u0432\u0442\u043e\u0440<\/a> (\u0447\u0442\u043e \u0431\u044b \u044d\u0442\u043e \u043d\u0438 \u0437\u043d\u0430\u0447\u0438\u043b\u043e).<\/p>\n<p>N-\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 \u0443\u0432\u043b\u0451\u043a\u0441\u044f NLP (Natural Language Processing), \u0447\u0442\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0434\u043b\u044f \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u0434\u0438\u0442 (\u0438\u043b\u0438 \u043a\u043e\u0434\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0438\u0448\u0435\u0442).<\/p>\n<p>\u041f\u043e\u0447\u0438\u0442\u0430\u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0438 \u043f\u0430\u0440\u0443 \u0432\u0432\u043e\u0434\u043d\u044b\u0445 \u043a\u043d\u0438\u0436\u0435\u043a, \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430 <a href=\"https:\/\/fpmidpo.mipt.ru\/programs\/ppk\/nlp\" rel=\"noopener noreferrer nofollow\">\u0414\u041f\u041e \u0432 \u041c\u0424\u0422\u0418<\/a>. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u044b\u043f\u0443\u0441\u043a\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0441\u0435\u0431\u0435 \u0437\u0430\u0434\u0430\u0447\u0443 \u2014 \u0441\u043e\u0437\u0434\u0430\u0442\u044c <a href=\"https:\/\/habaznya.ru\/poe3\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0441\u0442\u0438\u0445\u043e\u0432<\/a>. \u0414\u043b\u044f \u043f\u0435\u0441\u0435\u043d \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0435\u0441\u0442\u044c, \u0434\u043b\u044f \u043a\u043d\u0438\u0433 \u2014 \u0435\u0441\u0442\u044c, \u0434\u043b\u044f \u0444\u0438\u043b\u044c\u043c\u043e\u0432 \u2014 \u0435\u0441\u0442\u044c, \u0434\u043b\u044f \u0441\u0442\u0438\u0445\u043e\u0432 \u2014 \u043d\u0435\u0442. \u041d\u0435\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043a. \u0410 \u0437\u043d\u0430\u0447\u0438\u0442, \u044d\u0442\u043e\u043c\u0443 \u0433\u043e\u0440\u043e\u0434\u0443 \u043d\u0443\u0436\u0435\u043d \u0433\u0435\u0440\u043e\u0439! <s>\u0427\u0438\u043f \u0438 \u0414\u0435\u0439\u043b<\/s> \u041e\u0431\u0435\u0437\u044c\u044f\u043d\u043a\u0430 \u0441 \u041f\u0438\u0442\u043e\u043d\u043e\u043c \u0441\u043f\u0435\u0448\u0430\u0442 \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c!<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041f\u043e \u0445\u043e\u0434\u0443 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0441\u043e\u0431\u0440\u0430\u043b \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0435 \u0441 Kaggle, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Flask, sqlite-vec, \u044d\u043d\u043a\u043e\u0434\u0435\u0440 \u0441 Hugging Face \u0438 \u0447\u0438\u0441\u0442\u044b\u0439 (\u043d\u0443 \u043f\u043e\u0447\u0442\u0438) HTML.<\/p>\n<h3>0. \u041a\u0430\u043a \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/h3>\n<figure class=\"full-width\">\n<div><figcaption>\u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432 \u0446\u0435\u043b\u043e\u043c. \u0421\u0435\u0439\u0447\u0430\u0441 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e<\/figcaption><\/div>\n<\/figure>\n<p>\u0411\u0435\u0440\u0451\u043c \u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0438\u0445\u043e\u0432 (\u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u044d\u0442\u043e Data). \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/huggingface.co\/sentence-transformers\/distiluse-base-multilingual-cased-v1\" rel=\"noopener noreferrer nofollow\">\u044d\u043d\u043a\u043e\u0434\u0435\u0440\u0430<\/a> \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Sentence-Transformers (BERT-model) \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0441\u0442\u0438\u0445\u0438 \u0432 512-\u043c\u0435\u0440\u043d\u044b\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u044b. \u0421\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u044b \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0438\u043c \u0442\u0435\u043a\u0441\u0442\u044b \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u0443\u044e \u0431\u0430\u0437\u0443 (Vector base).<\/p>\n<p>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c (User) \u0432\u0432\u043e\u0434\u0438\u0442 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 (App) \u0441\u0442\u0438\u0445\u043e\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0435. \u041c\u043e\u0434\u0435\u043b\u044c (BERT-model) \u043d\u0430 \u043b\u0435\u0442\u0443 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0435\u0433\u043e \u0432 \u0432\u0435\u043a\u0442\u043e\u0440 (\u0441\u0442\u0438\u0445\u043e\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0435, \u0430 \u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f). \u042d\u0442\u043e\u0442 \u0432\u0435\u043a\u0442\u043e\u0440 \u0441\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0441 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u0431\u0430\u0437\u044b (Vector base). \u0421\u0438\u0441\u0442\u0435\u043c\u0430 (App) \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0442\u0440\u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0441\u0445\u043e\u0436\u0438\u0445 \u043f\u043e \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u043c\u0443 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u0432\u0435\u043a\u0442\u043e\u0440\u0430, \u0431\u0435\u0440\u0451\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0438\u043c \u0442\u0435\u043a\u0441\u0442\u044b (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439, \u0435\u0441\u043b\u0438 \u043e\u043d \u0435\u0441\u0442\u044c \u0432 \u0431\u0430\u0437\u0435) \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e (User) \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439.<\/p>\n<p>\u0424\u0443\u0445. \u0412\u044b \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u043d\u044f\u043b\u0438? \u042f \u0442\u043e\u0436\u0435 \u043d\u0435\u0442. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<h2>1. \u0414\u0430\u0442\u0430\u0441\u0435\u0442<\/h2>\n<p>\u00abContent is King\u00bb \u2014 \u0441\u043a\u0430\u0437\u0430\u043b \u0411\u0438\u043b\u043b \u0413\u0435\u0439\u0442\u0441 \u0435\u0449\u0451 \u0432 1994 \u0433\u043e\u0434\u0443 \u0438, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0431\u044b\u043b \u043f\u0440\u0430\u0432. \u0414\u0430\u0442\u0430\u0441\u0435\u0442 \u2014 \u0443\u0436\u0435 \u043f\u043e\u043b\u0434\u0435\u043b\u0430, \u0438 \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u0435\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p>\u0414\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u041c\u041d\u041e\u0413\u041e, \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0427\u0418\u0421\u0422\u042b\u041c\u0418. \u0410 \u0435\u0449\u0451 \u0438\u0445 \u043d\u0430\u0434\u043e \u0425\u0420\u0410\u041d\u0418\u0422\u042c \u0432 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435.<\/p>\n<p>\u042f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u0447\u0430\u0442\u044c \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e. \u041d\u0430\u0448\u0451\u043b \u043d\u0430 Kaggle <a href=\"https:\/\/www.kaggle.com\/datasets\/greencools\/russianpoetry\/data\" rel=\"noopener noreferrer nofollow\">\u0434\u0430\u0442\u0430\u0441\u0435\u0442<\/a>:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0442\u0438\u0445\u0438, \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u044a\u0451\u043c \u2014 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u0433\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u0430\u043a \u043d\u0435\u043b\u044c\u0437\u044f \u043b\u0443\u0447\u0448\u0435<\/figcaption><\/div>\n<\/figure>\n<h2>2. \u0412\u0435\u043a\u0442\u043e\u0440\u043d\u0430\u044f \u0431\u0430\u0437\u0430<\/h2>\n<p>\u0414\u043b\u044f \u043c\u0430\u0448\u0438\u043d\u044b \u0442\u0435\u043a\u0441\u0442\u044b \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b. \u0414\u0443\u0448\u0435\u0432\u043d\u044b\u0445 \u043f\u043e\u0440\u044b\u0432\u043e\u0432 \u043e\u043d\u0430 \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 (\u043f\u043e\u043a\u0430), \u0438 \u0432\u0438\u0440\u0448\u0430\u043c\u0438 \u0432 \u0440\u0435\u0441\u0442\u043e\u0440\u0430\u043d\u0435 \u043f\u043e\u0434 \u043b\u0443\u043d\u043e\u0439 (\u0441 \u0431\u043e\u043a\u0430\u043b\u044c\u0447\u0438\u043a\u043e\u043c \u0432\u0438\u043d\u0430) \u0435\u0451 \u043d\u0435 \u0441\u043e\u0431\u043b\u0430\u0437\u043d\u0438\u0448\u044c. \u0422\u0435\u043a\u0441\u0442\u044b \u043d\u0430\u0434\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043e\u0442 \u043d\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u044b \u043c\u0430\u0448\u0438\u043d\u0430 \u0443\u0436\u0435 \u043a\u043b\u044e\u043d\u0435\u0442. \u0414\u0435\u043b\u043e \u043f\u043e\u0448\u043b\u043e.<\/p>\n<p>\u041c\u0435\u0442\u043e\u0434\u043e\u043c \u043f\u0440\u043e\u0431 \u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b \u0441\u0432\u043e\u0439 \u0432\u044b\u0431\u043e\u0440 \u043d\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 sqlite-vec. \u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435?<\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c \u0441\u0435\u0432\u0435\u0440\u0430\u043c \u0443\u0434\u043b\u0438\u043d\u0438\u043b \u0431\u044b \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043a\u043b\u0438\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u043b\u043e\u0434\u0438\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 (\u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0449\u0451 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f) \u2014 \u0447\u0435\u043c \u043f\u0440\u043e\u0449\u0435, \u0442\u0435\u043c \u043b\u0443\u0447\u0448\u0435.<\/p>\n<p>\u0411\u0430\u0437\u0443 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432 Google Colab. \u0413\u0440\u0443\u0437\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u0434\u0430\u0442\u0430\u0441\u0435\u0442, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c:<\/p>\n<pre><code class=\"python\">!pip install sqlite-vec import sqlite3 import sqlite_vec import pandas as pd import numpy as np from sentence_transformers import SentenceTransformer from typing import List  model = SentenceTransformer('distiluse-base-multilingual-cased-v1', device='cpu')  df = pd.read_csv('russianPoetryWithTheme.csv')<\/code><\/pre>\n<p>\u0418\u0437 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u0430\u0442\u0430\u0444\u0440\u0435\u0439\u043c\u0430 \u0432\u044b\u0447\u043b\u0435\u043d\u044f\u0435\u043c \u0430\u0432\u0442\u043e\u0440\u0430, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u0442\u0435\u043a\u0441\u0442, \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u043c \u0432 \u0435\u0434\u0438\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438 \u0442\u0430\u043a\u0438\u0445 \u0441\u0442\u0440\u043e\u043a:<\/p>\n<pre><code class=\"python\">texts = [] for idx in range(16694):   author = df.iloc[idx]['author']   name = df.iloc[idx]['name']   text = df.iloc[idx]['text']   texts.append(author + '\\n' + str(name) + '\\n' + text)  def get_normalized_embeddings(texts: List[str]) -&gt; np.ndarray:     embeddings = model.encode(texts, convert_to_numpy=True)     return embeddings \/ np.linalg.norm(embeddings, axis=1, keepdims=True)  embeddings = get_normalized_embeddings(texts)<\/code><\/pre>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0431\u0430\u0437\u0443 &#171;vectors.db&#187; \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0432 \u043d\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u043f\u0430\u0440\u044b \u00ab\u0432\u0435\u043a\u0442\u043e\u0440 \u2014 \u0442\u0435\u043a\u0441\u0442\u00bb:<\/p>\n<pre><code class=\"python\">db = sqlite3.connect(\"vectors.db\") db.enable_load_extension(True) sqlite_vec.load(db) db.enable_load_extension(False)  db.execute(\"\"\"     CREATE VIRTUAL TABLE documents USING vec0(         embedding float[512],         text text     ) \"\"\")<\/code><\/pre>\n<p>\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0431\u0430\u0437\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u0438 \u0442\u0435\u043a\u0441\u0442\u0430\u043c\u0438:<\/p>\n<pre><code class=\"python\">from tqdm.notebook import tqdm BATCH_SIZE = 1 with db:     for i in tqdm(range(0, len(texts), BATCH_SIZE)):         batch = [             (j+1,              embeddings[j].tobytes(),              texts[j])             for j in range(i, min(i+BATCH_SIZE, len(texts)))         ]         db.executemany(             \"INSERT INTO documents(rowid, embedding, text) VALUES (?, ?, ?)\",             batch         )<\/code><\/pre>\n<p>\u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b &#171;vectors.db&#187;.<\/p>\n<h2>3. \u0412\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 Flask<\/h2>\n<p>\u0418\u0442\u0430\u043a, \u043f\u043e\u0434\u043e\u0448\u043b\u0438 \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443 \u2014 \u043f\u0438\u0448\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 Flask. \u0412\u044b\u0431\u0440\u0430\u043b \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u043b\u044b\u0448\u0430\u043b \u043e \u043d\u0451\u043c \u043a\u0430\u043a \u043e \u0437\u043e\u043b\u043e\u0442\u043e\u0439 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u043e\u0439 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u2014 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043d\u043e\u0432\u0438\u0447\u043a\u0430.<\/p>\n<p>\u041f\u043e\u043c\u043d\u0438\u043c: \u0447\u0435\u043c \u043f\u0440\u043e\u0449\u0435 \u2014 \u0442\u0435\u043c \u043b\u0443\u0447\u0448\u0435, \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u0441 \u043a\u043e\u0434\u043e\u043c, \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0448\u0432\u043e\u0432 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043b\u0430\u0442\u0430\u0442\u044c, \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0441\u043e\u0431\u0435\u0440\u0451\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0434\u043e\u0444\u0430\u043c\u0438\u043d\u0447\u0438\u043a. \u0414\u0440\u0443\u0437\u044c\u044f \u0441\u043a\u0430\u0436\u0443\u0442: \u00ab\u0442\u044b \u0433\u0435\u043d\u0438\u0439!\u00bb \u0420\u0430\u0431\u043e\u0442\u043e\u0434\u0430\u0442\u0435\u043b\u0438 \u0437\u0430\u0432\u0430\u043b\u044f\u0442 \u0431\u0430\u043a\u0441\u0430\u043c\u0438! (\u0420\u0430\u0431\u043e\u0442\u043e\u0434\u0430\u0442\u0435\u043b\u0438, \u0430\u0443, \u043e\u0442\u0437\u043e\u0432\u0438\u0442\u0435\u0441\u044c! \u041f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438&#8230; \u0433\u0435\u043d\u0438\u0439&#8230; \u0431\u044d\u043a\u0435\u043d\u0434\u0430 \u0436\u0435&#8230; \u0432\u044b \u0447\u0442\u043e&#8230; \u0440\u0430\u0437\u0432\u0435&#8230; \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435&#8230; \u0433\u0435\u043d\u0438\u0439&#8230; \u0431\u044d\u043a\u0435\u043d\u0434\u0430&#8230;\ud83d\ude22)<\/p>\n<p>\u041f\u043e Flask \u043d\u0430\u0448\u0451\u043b <a href=\"https:\/\/youtube.com\/playlist?list=PL7yh-TELLS1EyAye_UMnlsTGKxg8uatkM&amp;si=nPkX-w3pUgZWu1O0\" rel=\"noopener noreferrer nofollow\">\u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0432\u0432\u043e\u0434\u043d\u044b\u0439 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0438 \u0437\u0430\u043a\u0440\u044b\u043b \u0431\u0430\u0437\u0443 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0411\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u043f\u043e\u043a\u0430 \u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0437\u0432\u0435\u0437\u0434\u043e\u043b\u0451\u0442. <\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 &#171;main.py&#187;.<\/p>\n<pre><code class=\"python\">from flask import Flask, render_template, request from translation_pipe import translation from get_vec_db import search_similar_texts  app = Flask(__name__, template_folder='templates')  @app.route(\"\/\", methods=['GET']) def text_form():     return render_template('index.html')  @app.route(\"\/poe3\", methods=['GET', 'POST']) def similarity_form():     if request.method == 'GET':         return render_template('poe3.html')     elif request.method == 'POST':         text = request.form.get('textarea')         results = search_similar_texts(text, top_k=3)         text_match = []         for row in results:             row_list = row[1].split('\\n')             text_match.append([row[2], row_list]) #f\"\u0414\u043e\u043b\u044f \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u0438: {row[2]:.4f}, \u0422\u0435\u043a\u0441\u0442: {row[1]}...\")         return render_template('validation.html', text_match=text_match)  @app.route(\"\/validation\", methods=['GET', 'POST']) def validation_form():     if request.method == 'GET':         return render_template('poe3.html')     elif request.method == 'POST':         try:             score = float(request.form.get('validarea'))         except Exception:             return render_template('poe3.html', text_valid=['\u041d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439 \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0441\u043d\u043e\u0432\u0430!'])          with open('validation.txt', 'r', encoding='utf-8') as f:             validate_list = list(map(float, f.readlines()))         validate_list[0] += 3.0         validate_list[1] += score         validate_list[2] = (validate_list[1]\/validate_list[0])*100         to_file = str(validate_list[0]) + '\\n' + str(validate_list[1]) + '\\n' + str(validate_list[2])         with open('validation.txt', 'w', encoding='utf-8') as f:             f.write(to_file)         return render_template('congrats.html', text_valid=['\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u043e\u0446\u0435\u043d\u043a\u0443!'])  @app.route(\"\/score\", methods=['GET']) def get_score():     with open('validation.txt', 'r', encoding='utf-8') as f:         score_list = list(map(float, f.readlines()))     return render_template('score.html', score_list=score_list)  if __name__ == \"__main__\":     port = 8080     app.run(debug=True, host='0.0.0.0', port=port)<\/code><\/pre>\n<p>\u041e\u043d \u0443\u043c\u0435\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043b\u044e\u0431\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438\u0437 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430. <\/p>\n<p>&#171;\/&#187; \u2014 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 GET, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441\u0430\u0439\u0442\u0430 (\u043d\u0435 \u0438\u043c\u0435\u044e\u0449\u0443\u044e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443). <\/p>\n<p>&#171;\/poe3&#187; \u2014 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441 \u043e\u043a\u043e\u0448\u043a\u043e\u043c \u0438 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0438\u0445\u043e\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0435, \u0432\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c: \u043e\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e &#171;search_similar_texts()&#187;, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0440\u0438 \u0441\u0445\u043e\u0436\u0438\u0445 \u0442\u0435\u043a\u0441\u0442\u0430. \u042d\u0442\u0443 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044e \u043c\u044b \u0437\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 &#171;validation.html&#187;, \u043a\u0443\u0434\u0430 \u0438 \u0440\u0435\u0434\u0438\u0440\u0435\u043a\u0442\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041e\u043d \u0432\u0438\u0434\u0438\u0442 \u0432\u044b\u0434\u0430\u0447\u0443, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044e.<\/p>\n<p>&#171;main.py&#187; \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0424\u0443\u043d\u043a\u0446\u0438\u044f &#171;search_similar_texts()&#187; \u0437\u0430\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u0430 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c &#171;get_vec_db.py&#187;, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">import sqlite3 import sqlite_vec import numpy as np from sentence_transformers import SentenceTransformer from typing import List  model = SentenceTransformer('distiluse-base-multilingual-cased-v1', use_auth_token=False) db = sqlite3.connect('vectors.db', check_same_thread=False) db.enable_load_extension(True) sqlite_vec.load(db) db.enable_load_extension(False)   def search_similar_texts(query_text: str, top_k: int = 5) -&gt; List[tuple]:     query_embedding = model.encode(query_text, convert_to_numpy=True)     query_embedding = query_embedding \/ np.linalg.norm(query_embedding)      rows = db.execute(         \"SELECT rowid, text, embedding FROM documents\"     ).fetchall()      res = []      for r in rows:         stored_vec = np.frombuffer(r[2], dtype=np.float32)         similarity = np.dot(query_embedding, stored_vec)         res.append((r[0], r[1], float(similarity)))      return sorted(res, key=lambda x: x[2], reverse=True)[:top_k]<\/code><\/pre>\n<p>\u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a &#171;main.py&#187;. \u0410 \u0442\u043e\u0447\u043d\u0435\u0435 \u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 &#171;\/validation&#187;, \u0433\u0434\u0435 \u043c\u044b \u043f\u0440\u043e\u0441\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0434\u0430\u0447\u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439. \u0417\u0434\u0435\u0441\u044c \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435.<\/p>\n<h2>4. \u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f<\/h2>\n<p>\u0425\u044c\u044e\u0441\u0442\u043e\u043d, \u0443 \u043d\u0430\u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u043a\u0430\u043a \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0434\u0430\u0447\u0438, \u0435\u0441\u043b\u0438 \u043c\u0430\u0448\u0438\u043d\u0430 \u0440\u0430\u0432\u043d\u043e\u0434\u0443\u0448\u043d\u0430 \u043a \u0432\u0438\u0440\u0448\u0430\u043c \u043f\u043e\u0434 \u043b\u0443\u043d\u043e\u0439 \u0438 \u043b\u0438\u0440\u0438\u043a\u0430 \u0435\u0439 \u0434\u043e \u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0438? \u0427\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u044b\u0434\u0430\u043b\u0430 \u00ab\u0445\u043e\u0440\u043e\u0448\u0443\u044e\u00bb \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044e? \u041a\u0430\u043a\u043e\u0432\u044b \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0438? \u041c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u044c \u00ab\u0441\u0445\u043e\u0436\u0435\u0441\u0442\u044c\u00bb \u0434\u0432\u0443\u0445 \u0441\u0442\u0438\u0445\u043e\u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u043e. \u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u2014 \u0432\u043e\u043f\u0440\u043e\u0441 \u0432\u043a\u0443\u0441\u043e\u0432.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 3 \u0431\u0430\u043b\u043b\u0430. \u0417\u043d\u0430\u0447\u0438\u0442, \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u043b\u043b\u043e\u0432 = 3*(\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0432\u0448\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0443). <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e <s>\u0437\u043b\u044b\u0435<\/s> \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0441\u0442\u0430\u0432\u044f\u0442 \u00ab\u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435\u00bb \u0431\u0430\u043b\u043b\u044b: 1, 2, 3. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043e\u0431\u0449\u0435\u0435 \u00ab\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435\u00bb \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u043b\u043b\u043e\u0432 \u043c\u0435\u043d\u044c\u0448\u0435 \u00ab\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e\u00bb. \u041a\u0442\u043e \u0432 \u0448\u043a\u043e\u043b\u0435 \u0443\u0447\u0438\u043b \u0434\u043e\u043b\u0438 \u0438 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u044b \u043f\u043e\u0439\u043c\u0451\u0442, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u043b\u044c\u0448\u0435: \u0434\u0435\u043b\u0438\u043c \u00ab\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435\u00bb \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u043b\u043b\u043e\u0432 \u043d\u0430 \u00ab\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435\u00bb, \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u043d\u0430 100 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u043d\u0442 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u0440\u043e\u0446\u0435\u043d\u0442&#8230; \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0432\u0448\u0438\u0435&#8230; \u0434\u0435\u043b\u0438\u043c&#8230; \u043a\u0430\u043a\u043e\u0435 \u043d\u0435\u0431\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0435&#8230;<\/figcaption><\/div>\n<\/figure>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0438\u043c \u0438<\/p>\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-462333","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/462333","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=462333"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/462333\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=462333"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=462333"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=462333"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}