{"id":495858,"date":"2026-09-24T08:01:45","date_gmt":"2026-09-24T08:01:45","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=495858"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=495858","title":{"rendered":"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0440\u0430\u0437\u0431\u043e\u0440 \u0440\u0435\u0437\u044e\u043c\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e LLM, Python \u0438 FMC"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/92b\/3eb\/3b4\/92b3eb3b4e5f7e386866e0390124bb5e.jpg\" width=\"1560\" height=\"880\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/92b\/3eb\/3b4\/92b3eb3b4e5f7e386866e0390124bb5e.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/92b\/3eb\/3b4\/92b3eb3b4e5f7e386866e0390124bb5e.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432 \u0434\u0435\u043d\u044c \u0432\u0430\u043c \u043f\u0440\u0438\u0441\u044b\u043b\u0430\u044e\u0442 400 \u0440\u0435\u0437\u044e\u043c\u0435 \u043d\u0430 \u043e\u0434\u043d\u0443 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u044e, \u00ab\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0441\u0435\u0445\u00bb \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f. \u0417\u0430\u0442\u043e \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u044f\u043c\u043e \u043a\u0430\u043a \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u043e\u0434 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e!<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u044f \u0438 \u043e\u0433\u0440\u043e\u043c\u043d\u0430\u044f \u043f\u0430\u0447\u043a\u0430 PDF-\u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u0440\u0435\u0437\u044e\u043c\u0435. \u041d\u0430\u0434\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0432 \u043a\u0430\u043a\u0438\u0445 \u0438\u0437 \u043d\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044e\u0442\u0441\u044f \u043d\u0443\u0436\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u0435\u0442\u0435\u043d\u0446\u0438\u0438, \u0433\u0434\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0438 \u043a\u043e\u0433\u043e \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0430\u043c \u043d\u0430\u0439\u043c \u0438\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u043e\u0442\u043a\u0430\u0437\u043e\u0432. \u0412 \u043a\u0435\u0439\u0441\u0435 \u043d\u0438\u0436\u0435 LLM \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0432\u044b\u0436\u0438\u043c\u043a\u0443 \u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u0442\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0437\u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043c.<\/p>\n<p>\u041f\u043e \u0438\u0434\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u0418\u0418\u0448\u043d\u0438\u0446\u0443, \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0442\u0443\u0434\u0430 \u043f\u0430\u0447\u043a\u0443 \u0440\u0435\u0437\u044e\u043c\u0435 \u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. \u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f, \u0430 \u0435\u0440\u0443\u043d\u0434\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043d\u0435 \u043d\u0443\u0436\u0435\u043d API, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438 \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0435\u0437\u044e\u043c\u0435. \u0414\u043b\u044f \u043c\u0435\u043d\u044f \u0442\u0443\u0442 \u0432\u0430\u0436\u0435\u043d \u0438\u043c\u0435\u043d\u043d\u043e \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438. \u042f \u043d\u0435 \u0445\u043e\u0447\u0443 \u0438\u0441\u043a\u0430\u0442\u044c GPU, \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u0430 \u043c\u043e\u0434\u0435\u043b\u0438, \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e CUDA, \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c vLLM, \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0432\u043b\u0435\u0437\u0435\u0442 \u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u044c, \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 ML-\u0437\u043e\u043e\u043f\u0430\u0440\u043a \u0438 \u0432\u044b\u044f\u0441\u043d\u044f\u0442\u044c, \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0432\u0441\u0435 \u0441\u043d\u043e\u0432\u0430 \u0443\u043f\u0430\u043b\u043e.<\/p>\n<blockquote>\n<p>\u0421\u0442\u0430\u0442\u044c\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0420\u043e\u043c\u0430\u043d \u0428\u0443\u0431\u0438\u043d, CTO \u0438 \u0430\u0432\u0442\u043e\u0440 Telegram-\u043a\u0430\u043d\u0430\u043b\u0430 Bash Days.<\/p>\n<\/blockquote>\n<h2>\u0418\u0434\u0435\u044f \u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/h2>\n<p>\u0414\u0430, \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0434\u043e\u043c\u0430\u0448\u043d\u0438\u0439 LLM-\u0441\u0442\u0435\u043a, \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0434\u043e \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u043a\u0440\u0438\u0437\u0438\u0441\u043e\u0432 \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e, \u043d\u043e \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u043d\u0435 \u043d\u0435 \u043f\u043e\u0434\u043e\u0448\u043b\u043e. \u041e\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u044d\u0442\u0443 \u043c\u0430\u0445\u0438\u043d\u0443 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0439, \u0430 \u044f \u0447\u0430\u0441\u0442\u0435\u043d\u044c\u043a\u043e \u043d\u0430\u0445\u043e\u0436\u0443\u0441\u044c \u0432 \u043f\u0435\u0440\u0435\u043b\u0435\u0442\u0430\u0445 \u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u0442\u0440\u0435\u0432\u043e\u0436\u0443\u0441\u044c, \u0435\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0434\u043e\u043c\u0430 \u00ab\u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0439 \u0443\u0442\u044e\u0433\u00bb. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0431\u043e\u0440 \u043f\u0430\u043b <a href=\"https:\/\/selectel.ru\/services\/cloud\/foundation-models-catalog\/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=fmc_article_resume_240926_content\">\u043d\u0430 FMC<\/a>. \u0412\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043c\u043e\u0441\u043a\u043e\u0432\u0441\u043a\u0438\u0445 \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u043e\u0432 Selectel, \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442 \u043c\u043e\u0435 \u044d\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0432 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0438 \u0432 \u043b\u044e\u0431\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u0422\u043e \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e! Self-hosted \u2014 \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u043f\u043e\u0434 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u0441\u0435 \u0436\u0435 \u043b\u0443\u0447\u0448\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u0435\u0435.<\/p>\n<p>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u043c\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043c\u043e\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435, \u0441\u0435\u0440\u0432\u0438\u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442 \u044d\u0442\u0438 \u0437\u043e\u043d\u044b. \u0422\u043e \u0435\u0441\u0442\u044c Selectel \u0434\u0430\u0435\u0442 \u043c\u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442, \u0430 \u044f \u0443\u0436\u0435 \u0440\u0435\u0448\u0430\u044e, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u0441\u0432\u043e\u0435\u043c \u043a\u043e\u0434\u0435.<\/p>\n<blockquote>\n<p>\u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u043e\u0435\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, FMC \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 public preview. \u0418\u043d\u0444\u0435\u0440\u0435\u043d\u0441-\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e, \u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<\/blockquote>\n<p>\u041d\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0432\u0437\u044f\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438, \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0442\u0435\u043a\u0441\u0442 \u0438\u0437 \u0440\u0435\u0437\u044e\u043c\u0435, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430 \u043f\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044f\u043c \u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u043e\u0442\u0447\u0435\u0442 \u0434\u043b\u044f HR. \u0412\u0430\u0436\u043d\u043e \u2014 \u043d\u0435 \u0443\u043b\u0443\u0447\u0448\u0430\u0442\u044c \u0440\u0435\u0437\u044e\u043c\u0435, \u043d\u0435 \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430, \u043d\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e, \u0432\u043e\u0437\u0440\u0430\u0441\u0442 \u0438\u043b\u0438 \u0441\u0435\u043c\u0435\u0439\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0410 \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u0438\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0441 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438.<\/p>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0430\u043f\u043a\u0438 \u0441 400 \u0440\u0435\u0437\u044e\u043c\u0435 \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>\u041a\u0430\u043d\u0434\u0438\u0434\u0430\u0442<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0418\u0442\u043e\u0433<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">resume-001.pdf<\/p>\n<\/td>\n<td>\n<p align=\"left\">88\/100<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u043e\u0444\u0438\u043b\u044e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">resume-002.pdf<\/p>\n<\/td>\n<td>\n<p align=\"left\">61\/100<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0443\u0447\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">resume-003.pdf<\/p>\n<\/td>\n<td>\n<p align=\"left\">34\/100<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">resume-004.pdf<\/p>\n<\/td>\n<td>\n<p align=\"left\">42\/100<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043c\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0441\u043b\u043e\u0432, \u043c\u0430\u043b\u043e \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">resume-005.pdf<\/p>\n<\/td>\n<td>\n<p align=\"left\">84\/100<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u043e\u0444\u0438\u043b\u044e<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0431\u0430\u043b\u043b\u0443 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432\u0438\u0434\u043d\u044b \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430:<\/p>\n<blockquote>\n<p>\u041a\u0440\u0438\u0442\u0435\u0440\u0438\u0439: <strong>CI\/CD<\/strong><br \/>\u0423\u0440\u043e\u0432\u0435\u043d\u044c: 4 \u0438\u0437 4<\/p>\n<p>\u0414\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430:<\/p>\n<ul>\n<li>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b GitLab CI pipeline \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f 18 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u043a\u0440\u0430\u0442\u0438\u043b \u0432\u0440\u0435\u043c\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u0441 35 \u0434\u043e 12 \u043c\u0438\u043d\u0443\u0442.<\/p>\n<\/li>\n<\/ul>\n<\/blockquote>\n<p>\u0415\u0441\u043b\u0438 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u043d\u0435\u0442, \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u0447\u0435\u0441\u0442\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c: \u00ab\u0412 \u0442\u0435\u043a\u0441\u0442\u0435 \u0440\u0435\u0437\u044e\u043c\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e\u00bb, \u0430 \u043d\u0435 \u0434\u043e\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c \u043e\u043f\u044b\u0442 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430.<\/p>\n<p>\u0414\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0440\u0435\u0437\u044e\u043c\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u0430\u044f text-to-text-\u043c\u043e\u0434\u0435\u043b\u044c. \u041d\u0430 \u0432\u0445\u043e\u0434 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u044e, \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0438 \u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442, \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 JSON. \u041d\u0438\u043a\u0430\u043a\u0438\u0435 model tools \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f. \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 Python:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ec8\/ed7\/550\/ec8ed7550c0bec332c5f0ebfe1e15237.png\" width=\"875\" height=\"71\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/ec8\/ed7\/550\/ec8ed7550c0bec332c5f0ebfe1e15237.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ec8\/ed7\/550\/ec8ed7550c0bec332c5f0ebfe1e15237.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041c\u043e\u0434\u0435\u043b\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u0430\u043c\u0430 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438\u043b\u0438 \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430 \u0432 \u043a\u0430\u0434\u0440\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u041e\u043d\u0430 \u0440\u0435\u0448\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u2014 \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043e\u0446\u0435\u043d\u043a\u0443 \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044f\u043c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0437 \u0440\u0435\u0437\u044e\u043c\u0435.<\/p>\n<p>\u0414\u043b\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u044f \u0432\u0437\u044f\u043b t-tech\/T-pro-it-2.1. \u041c\u043e\u0434\u0435\u043b\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0432 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 FMC \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 T-lite, Qwen, Gemma \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 text-to-text-\u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438.<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0430? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443 \u043c\u0435\u043d\u044f \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u044b\u0435. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432 \u0440\u0435\u0437\u044e\u043c\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439, \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0430\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. \u041e\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u043d\u0435 \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u043a\u0438\u0439 \u0442\u0435\u043a\u0441\u0442, \u0430 \u0441\u0442\u0440\u043e\u0433\u043e\u0435 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438:<\/p>\n<ul>\n<li>\n<p>\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u0432,<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043e\u043f\u044b\u0442,<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430,<\/p>\n<\/li>\n<li>\n<p>\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 JSON,<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0431\u0430\u043b\u043b \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0443\u043d\u043a\u0442 \u0442\u0443\u0442 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u0435\u043d. \u041c\u043e\u0434\u0435\u043b\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430, \u0438\u0442\u043e\u0433\u043e\u0432\u0443\u044e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 Python. \u0418\u043d\u0430\u0447\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u043e\u0446\u0435\u043d\u043a\u0438 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u0432 \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u0432 78 \u0431\u0430\u043b\u043b\u043e\u0432, \u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0430\u0437 \u2014 \u0432 83. \u041c\u043e\u0434\u0435\u043b\u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u0438\u0434\u043d\u0435\u0435, \u043d\u043e \u043c\u0435\u043d\u044f \u0442\u0430\u043a\u043e\u0439 \u0433\u0438\u0434\u0440\u043e\u043c\u0435\u0442\u0446\u0435\u043d\u0442\u0440 \u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442.<\/p>\n<p>\u041f\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bbe\/2e7\/671\/bbe2e7671f02c20eacc955748cdf37d4.png\" width=\"875\" height=\"365\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/bbe\/2e7\/671\/bbe2e7671f02c20eacc955748cdf37d4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bbe\/2e7\/671\/bbe2e7671f02c20eacc955748cdf37d4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>LLM \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430. \u041e\u043d\u0430 \u043d\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c, \u043d\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043a\u0430\u0434\u0440\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438 \u043d\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0431\u0430\u043b\u043b. \u0412\u0441\u0435 \u043e\u043f\u0430\u0441\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u043a\u043e\u0434\u0435. \u0420\u043e\u0431\u043e\u0442\u0443 \u043e\u0442\u0434\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u0443\u044e \u0440\u0443\u0442\u0438\u043d\u0443, \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>\u0414\u043b\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u044f \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u044e DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430 \u0443\u0440\u043e\u0432\u043d\u044f middle. \u0422\u0430\u043a \u043c\u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0449\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u0432\u0434\u0440\u0443\u0433 \u0440\u0435\u0448\u0438\u0442, \u0447\u0442\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0441 \u0447\u0435\u0442\u044b\u0440\u044c\u043c\u044f \u0433\u043e\u0434\u0430\u043c\u0438 Django \u0438 \u043e\u0434\u043d\u0438\u043c \u0434\u043e\u043c\u0430\u0448\u043d\u0438\u043c Docker Compose \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 Kubernetes.<\/p>\n<p>\u041c\u043e\u043a \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438 (\u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435 \u0437\u0430\u043a\u0438\u043d\u0435\u043c \u0435\u0433\u043e \u0432 <code>\/vacancies\/middle-devops.yaml<\/code>):<\/p>\n<pre><code class=\"yaml\">id: middle-devopstitle: Middle DevOps \u0438\u043d\u0436\u0435\u043d\u0435\u0440description: |  \u0418\u0449\u0435\u043c DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0438 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439  \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.  \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438:  - \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Linux-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432;  - \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438;  - \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 CI\/CD;  - \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439;  - \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430 production-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b;  - \u0443\u0447\u0430\u0441\u0442\u0438\u0435 \u0432 \u0440\u0430\u0437\u0431\u043e\u0440\u0435 \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u043e\u0432.scoring_scale:  0: \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439 \u0432 \u0440\u0435\u0437\u044e\u043c\u0435 \u043d\u0435\u0442  1: \u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u0430  2: \u0415\u0441\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u043f\u044b\u0442  3: \u0415\u0441\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u044b\u0439 production-\u043e\u043f\u044b\u0442  4: \u0415\u0441\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043e\u043f\u044b\u0442, \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u0440\u0438\u043c\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442criteria:  - id: linux_productiontitle: \u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Linux \u0432 productionrequired: trueweight: 20expected_evidence:  - \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u0435 production-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432  - \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c  - systemd  - \u0441\u0435\u0442\u044c  - \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b  - \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438  - id: automationtitle: \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438required: trueweight: 15expected_evidence:  - Ansible  - SaltStack  - Puppet  - \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438  - id: containerstitle: \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438required: trueweight: 15expected_evidence:  - Docker  - Docker Compose  - \u0441\u0431\u043e\u0440\u043a\u0430 \u043e\u0431\u0440\u0430\u0437\u043e\u0432      - \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432  - id: ci_cdtitle: \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 CI\/CDrequired: trueweight: 15expected_evidence:  - GitLab CI  - Jenkins  - GitHub Actions  - Argo CD  - \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0435\u043f\u043b\u043e\u044f  - id: monitoringtitle: \u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435required: trueweight: 10expected_evidence:  - Prometheus  - Grafana  - Zabbix  - Loki  - Alertmanager  - id: troubleshootingtitle: \u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043crequired: trueweight: 10expected_evidence:  - \u0440\u0430\u0437\u0431\u043e\u0440 \u0430\u0432\u0430\u0440\u0438\u0439  - \u043f\u043e\u0438\u0441\u043a \u043f\u0435\u0440\u0432\u043e\u043f\u0440\u0438\u0447\u0438\u043d\u044b  - \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043b\u043e\u0433\u0430\u043c\u0438 \u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c\u0438  - \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f  - id: kubernetestitle: Kubernetesrequired: falseweight: 10expected_evidence:  - \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430  - Helm  - \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435  - \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430  - id: terraform_cloudtitle: Terraform \u0438 \u043e\u0431\u043b\u0430\u0447\u043d\u0430\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430required: falseweight: 5expected_evidence:  - Terraform  - OpenStack  - Selectel  - Yandex Cloud  - AWS  - \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u0431\u043b\u0430\u043a\u0430<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0443\u043c\u043c\u0430 \u0432\u0441\u0435\u0445 \u0432\u0435\u0441\u043e\u0432 == 100. \u041a\u0430\u0436\u0434\u044b\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439 \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u0442 \u043e\u0442 0 \u0434\u043e 4. Python \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432 \u0431\u0430\u043b\u043b\u044b: \u0431\u0430\u043b\u043b\u044b \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044f = \u0432\u0435\u0441 \u00d7 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \/ 4.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code>Linux production\u0412\u0435\u0441: 20\u0423\u0440\u043e\u0432\u0435\u043d\u044c: 3 \u0438\u0437 420 \u00d7 3 \/ 4 = 15 \u0431\u0430\u043b\u043b\u043e\u0432<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430? \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u0445\u043e\u0442\u0435\u043b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u043e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u043c\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438:<\/p>\n<pre><code class=\"python\">if \"kubernetes\" in resume.lower():score += 10<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u043e \u0442\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0435\u0442 \u043d\u0435\u0443\u0432\u044f\u0437\u043e\u0447\u043a\u0430 \u0441 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u043c, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0431\u043b\u043e\u043a:<\/p>\n<pre><code>\u041d\u0430\u0432\u044b\u043a\u0438:Linux, Docker, Kubernetes, Terraform, Ansible, GitLab CI, Jenkins, Prometheus, Grafana, AWS, Azure, GCP, OpenStack, Helm, Argo CD, Python, Bash, Go.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u043d \u0432\u0441\u0435\u0445 \u043e\u0431\u043c\u0430\u043d\u0435\u0442 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0430\u043b\u043b, \u0445\u043e\u0442\u044f \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u044f\u0441\u043d\u043e:<\/p>\n<ul>\n<li>\n<p>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043b\u0438 \u043e\u043d \u044d\u0442\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u0440\u0430\u0431\u043e\u0442\u0435,<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043b \u043b\u0438 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e,<\/p>\n<\/li>\n<li>\n<p>\u0432\u0438\u0434\u0435\u043b \u043b\u0438 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d,<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u0432\u0435\u0447\u0430\u043b \u043b\u0438 \u0437\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442,<\/p>\n<\/li>\n<li>\n<p>\u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043b \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0441\u0438\u043b\u044c\u043d\u044b\u0439 SRE \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Ansible, \u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 SaltStack. \u041f\u043e\u0438\u0441\u043a \u043f\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0441\u043b\u043e\u0432\u0430\u043c \u0441\u043a\u0430\u0436\u0435\u0442: \u00abAnsible \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u2014 \u043d\u043e\u043b\u044c \u0431\u0430\u043b\u043b\u043e\u0432\u00bb. \u0410 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u044f\u0432\u0438\u0442\u044c, \u0447\u0442\u043e SaltStack \u0440\u0435\u0448\u0430\u0435\u0442 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043b\u0430\u0441\u0441 \u0437\u0430\u0434\u0430\u0447 \u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u043e\u043f\u044b\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0412\u043e\u0442 \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u044f\u043c \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0438 \u0432 \u0442\u0435\u043c\u0443. \u0414\u043b\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u043d\u0435 \u0441\u0442\u0430\u043b \u0431\u0440\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u0440\u0435\u0437\u044e\u043c\u0435. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b \u043f\u044f\u0442\u044c \u0441\u0438\u043d\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 PDF \u0441 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c\u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c\u0438. \u0422\u0430\u043a \u044f \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0431\u0435\u0437 \u0441\u043b\u0438\u0432\u0430 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0431\u0443\u0434\u0443 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043c\u043e\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043d\u0430\u0439\u0442\u0438. \u041d\u0443 \u0438\u043b\u0438 \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u043d\u0430\u0440\u043e\u0434\u044c\u0435 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043c\u043e\u043a\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u0420\u0435\u0437\u044e\u043c\u0435 \u21161: \u0441\u0438\u043b\u044c\u043d\u044b\u0439 DevOps<\/summary>\n<div class=\"spoiler__content\">\n<p><strong>DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440<\/strong><\/p>\n<p>\u041e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b: 4 \u0433\u043e\u0434\u0430<\/p>\n<p>\u041e\u041e\u041e \u00ab\u0420\u043e\u0433\u0430 \u0438 \u043a\u043e\u043f\u044b\u0442\u0430\u00bb<\/p>\n<p>DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440<\/p>\n<p>\u041c\u0430\u0439 2023 \u2014 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f<\/p>\n<ul>\n<li>\n<p>\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b 60 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d Ubuntu \u0438 Debian<\/p>\n<\/li>\n<li>\n<p>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 Ansible<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b GitLab CI pipeline \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f 18 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0432\u0435\u043b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 Docker \u0438 Docker Compose<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u043a\u0440\u0430\u0442\u0438\u043b \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u0441 35 \u0434\u043e 12 \u043c\u0438\u043d\u0443\u0442<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u043b Prometheus, Grafana, Loki \u0438 Alertmanager<\/p>\n<\/li>\n<li>\n<p>\u0423\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0432 \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0438 production-\u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u043e\u0432 \u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 postmortem<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0438\u0437 \u0432\u043e\u0441\u044c\u043c\u0438 worker \u0443\u0437\u043b\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0432\u0430\u043b \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b \u0432 OpenStack \u0447\u0435\u0440\u0435\u0437 Terraform<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430\u0432\u044b\u043a\u0438:<br \/>Linux, Bash, Python, Ansible, Terraform, Docker, Kubernetes, GitLab CI, Prometheus, Grafana, Loki.<\/p>\n<p>\u0420\u0443\u0447\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u2014 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u043e\u0444\u0438\u043b\u044e \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438.<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0420\u0435\u0437\u044e\u043c\u0435 \u21162: \u0441\u0438\u043b\u044c\u043d\u044b\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440<\/summary>\n<div class=\"spoiler__content\">\n<p><strong>\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440<\/strong><\/p>\n<p>\u041e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b: 6 \u043b\u0435\u0442<\/p>\n<p>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f<\/p>\n<p>\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440<\/p>\n<p>2019 \u2014 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f<\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b \u0441\u0435\u0440\u0432\u0435\u0440\u044b CentOS \u0438 Ubuntu<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043b nginx, systemd, DNS \u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b Bash \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0434\u043b\u044f \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u043b Zabbix \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0438 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u043b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0434\u0438\u0441\u043a\u0430\u043c\u0438, \u0441\u0435\u0442\u044c\u044e \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u043b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 Docker<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b GitLab CI \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0434\u0432\u0443\u0445 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u041f\u0438\u0441\u0430\u043b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 Ansible playbook<\/p>\n<\/li>\n<\/ul>\n<p>Kubernetes \u0438 Terraform \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b<\/p>\n<p>\u0420\u0443\u0447\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u2014 \u0435\u0441\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0430\u044f Linux-\u0431\u0430\u0437\u0430, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0443\u0447\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430.<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0420\u0435\u0437\u044e\u043c\u0435 \u21163: backend-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a<\/summary>\n<div class=\"spoiler__content\">\n<p><strong>Python-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a<\/strong><\/p>\n<p>\u041e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b: 4 \u0433\u043e\u0434\u0430<\/p>\n<ul>\n<li>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b backend \u043d\u0430 Python, Django \u0438 FastAPI<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b PostgreSQL \u0438 Redis<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u043b Docker-\u043e\u0431\u0440\u0430\u0437\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e workflow \u0432 GitHub Actions<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043b \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 Ubuntu<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u043b \u0441 Sentry \u0438 \u043b\u043e\u0433\u0430\u043c\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430\u0432\u044b\u043a\u0438:<br \/>Python, Django, FastAPI, Docker, PostgreSQL, Redis, GitHub Actions.<\/p>\n<p>\u0420\u0443\u0447\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u2014 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u043f\u0440\u043e\u0444\u0438\u043b\u044e \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438. \u041d\u0435 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442 \u043f\u043b\u043e\u0445\u043e\u0439. \u041f\u0440\u043e\u0441\u0442\u043e \u0432 \u0440\u0435\u0437\u044e\u043c\u0435 \u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438.<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0420\u0435\u0437\u044e\u043c\u0435 \u21164: \u0445\u0438\u0442\u0440\u044b\u0439 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u043e\u043d\u0435\u0440 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0441\u043b\u043e\u0432<\/summary>\n<div class=\"spoiler__content\">\n<p><strong>DevOps \/ SRE \/ Cloud Engineer<\/strong><\/p>\n<p>\u041d\u0430\u0432\u044b\u043a\u0438:<br \/>Linux, Docker, Kubernetes, Terraform, Ansible, Jenkins, GitLab CI, Prometheus, Grafana, Loki, ELK, AWS, Azure, GCP, OpenStack, Helm, Argo CD, Python, Bash, Go.<\/p>\n<p>\u041e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b:<\/p>\n<p>\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440<br \/>2023\u20132025<\/p>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438, \u043e\u0431\u043b\u0430\u043a\u0430\u043c\u0438, \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u043e\u043c.<\/p>\n<p>\u0420\u0443\u0447\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u2014 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0443\u0447\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430. \u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u043c\u043d\u043e\u0433\u043e, \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u0442. \u042d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u0441\u0442 \u043d\u0430 \u0442\u043e, \u0441\u043c\u043e\u0436\u0435\u0442 \u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u043e\u0442 \u043a\u0435\u0439\u0432\u043e\u0440\u0434-\u0441\u0442\u0430\u0444\u0438\u043d\u0433\u0430 (\u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043e\u0431\u043e\u0439\u0442\u0438 ATS).<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0420\u0435\u0437\u044e\u043c\u0435 \u21165: SRE \u0441 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u0441\u0442\u0435\u043a\u043e\u043c<\/summary>\n<div class=\"spoiler__content\">\n<p><strong>Site Reliability Engineer<\/strong><\/p>\n<p>\u041e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b: 3 \u0433\u043e\u0434\u0430<\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b Linux \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043a\u0440\u0443\u043f\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430<\/p>\n<\/li>\n<li>\n<p>\u0423\u043f\u0440\u0430\u0432\u043b\u044f\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 SaltStack<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u043b Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b \u0438 Helm-\u0447\u0430\u0440\u0442\u044b<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u043b Argo CD \u0434\u043b\u044f GitOps \u0434\u0435\u043f\u043b\u043e\u044f<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0432\u0430\u043b \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 AWS \u0447\u0435\u0440\u0435\u0437 Terraform<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u0442\u0440\u043e\u0438\u043b \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043d\u0430 Prometheus \u0438 Grafana<\/p>\n<\/li>\n<li>\n<p>\u0421\u043d\u0438\u0437\u0438\u043b MTTR production-\u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u043e\u0432 \u0441 50 \u0434\u043e 20 \u043c\u0438\u043d\u0443\u0442<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u043e\u0434\u0438\u043b \u0440\u0430\u0437\u0431\u043e\u0440 \u0430\u0432\u0430\u0440\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b \u0442\u0438\u043f\u043e\u0432\u044b\u0435 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430\u0432\u044b\u043a\u0438:<\/p>\n<p>Linux, SaltStack, Kubernetes, Helm, Argo CD, Terraform, AWS, Prometheus, Grafana, Python.<\/p>\n<p>\u0420\u0443\u0447\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u2014 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u043e\u0444\u0438\u043b\u044e \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438. Ansible \u0438 GitLab CI \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u044b, \u043d\u043e \u0435\u0441\u0442\u044c \u0431\u043b\u0438\u0437\u043a\u0438\u0439 \u0438 \u0441\u0438\u043b\u044c\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u0441 SaltStack \u0438 Argo CD.<\/p>\n<\/div>\n<\/details>\n<p>\u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0441\u043b\u043e\u0432, \u043e\u043d\u0430 \u0437\u0430\u043d\u0438\u0436\u0430\u0435\u0442 \u043e\u0446\u0435\u043d\u043a\u0443.<\/p>\n<p>\u0422\u0430\u043a, \u0431\u043e\u043b\u0432\u0430\u043d\u043a\u0438 \u0433\u043e\u0442\u043e\u0432\u044b, \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u0438\u0441\u0443\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0442\u0430\u043a:<\/p>\n<pre><code>resume-matcher\/\u251c\u2500\u2500 .env\u251c\u2500\u2500 requirements.txt\u251c\u2500\u2500 vacancies\/\u2502   \u2514\u2500\u2500 middle-devops.yaml\u251c\u2500\u2500 resumes\/\u2502   \u251c\u2500\u2500 resume-001.pdf\u2502   \u251c\u2500\u2500 resume-002.pdf\u2502   \u251c\u2500\u2500 resume-003.pdf\u2502   \u251c\u2500\u2500 resume-004.pdf\u2502   \u2514\u2500\u2500 resume-005.pdf\u251c\u2500\u2500 results\/\u251c\u2500\u2500 templates\/\u2502   \u2514\u2500\u2500 report.html.j2\u2514\u2500\u2500 src\/\u251c\u2500\u2500 __init__.py\u251c\u2500\u2500 models.py\u251c\u2500\u2500 pdf_parser.py\u251c\u2500\u2500 anonymizer.py\u251c\u2500\u2500 fmc_client.py\u251c\u2500\u2500 scoring.py\u251c\u2500\u2500 report.py\u2514\u2500\u2500 main.py<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h2>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441 \u0432 \u043e\u0431\u043b\u0430\u043a\u0435<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441-\u0441\u0435\u0440\u0432\u0438\u0441. \u0418\u0434\u0435\u043c <a href=\"https:\/\/my.selectel.ru\/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=myselectel_article_resume_240926_content\">\u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/a> \u2192 <strong>\u041f\u0440\u043e\u0434\u0443\u043a\u0442\u044b<\/strong> \u2192 <strong>Foundation Models Catalog<\/strong> \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f64\/949\/53e\/f6494953ec95447ebce81a3abaae6741.png\" width=\"875\" height=\"637\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f64\/949\/53e\/f6494953ec95447ebce81a3abaae6741.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f64\/949\/53e\/f6494953ec95447ebce81a3abaae6741.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0414\u043b\u044f \u0442\u0435\u0441\u0442\u0430 \u044f \u0432\u044b\u0431\u0440\u0430\u043b:<\/p>\n<ul>\n<li>\n<p>\u041c\u043e\u0434\u0435\u043b\u044c: t-pro-it-2-1,<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0441\u0442\u0430\u043d\u0441\u044b: 1,<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435: \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435,<\/p>\n<\/li>\n<li>\n<p>GPU: 4 x NVIDIA L4 (24 \u0413\u0411),<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442: 16 384.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e02\/b2f\/0db\/e02b2f0dbc78dba40ab56e8234ef5f35.png\" width=\"875\" height=\"498\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/e02\/b2f\/0db\/e02b2f0dbc78dba40ab56e8234ef5f35.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e02\/b2f\/0db\/e02b2f0dbc78dba40ab56e8234ef5f35.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/48e\/d26\/dbb\/48ed26dbbc3b54083df1f4a6b5f02cbe.png\" width=\"875\" height=\"581\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/48e\/d26\/dbb\/48ed26dbbc3b54083df1f4a6b5f02cbe.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/48e\/d26\/dbb\/48ed26dbbc3b54083df1f4a6b5f02cbe.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f, \u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043e\u043a\u043e\u043b\u043e 15 \u043c\u0438\u043d\u0443\u0442, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u0431\u0435\u0440\u0438\u0442\u0435\u0441\u044c \u0442\u0435\u0440\u043f\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u043f\u0435\u0439\u0442\u0435 \u043a\u043e\u0444\u0435\u0439\u043a\u0443.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ebd\/932\/681\/ebd932681bfbe4d61b64555c5ea05d2a.png\" width=\"875\" height=\"559\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/ebd\/932\/681\/ebd932681bfbe4d61b64555c5ea05d2a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ebd\/932\/681\/ebd932681bfbe4d61b64555c5ea05d2a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e<a href=\"https:\/\/docs.selectel.ru\/foundation-models-catalog\/manage\/connection-example\/open-webui?pk_vid=7094a1055d383cf1178634508835e739\"> \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u0433\u0440\u043e\u043c\u043e\u0437\u0434\u0438\u0442\u044c WebUI<\/a>. \u041d\u043e \u0432 \u043c\u043e\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e\u043d\u043e \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u043e\u0442 \u0448\u0430\u0433 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044e.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d60\/3fb\/599\/d603fb599ef728f5bbe3e676de8f596e.png\" width=\"875\" height=\"236\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/d60\/3fb\/599\/d603fb599ef728f5bbe3e676de8f596e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d60\/3fb\/599\/d603fb599ef728f5bbe3e676de8f596e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0435\u0440\u0432\u0438\u0441 \u0432\u044b\u0434\u0430\u043b \u043a\u0440\u0435\u0434\u044b:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/848\/78a\/900\/84878a90087277947aebad0213549e2b.png\" width=\"875\" height=\"666\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/848\/78a\/900\/84878a90087277947aebad0213549e2b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/848\/78a\/900\/84878a90087277947aebad0213549e2b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f97\/406\/e30\/f97406e30aff4dc7eb66aab398a64200.png\" width=\"875\" height=\"403\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f97\/406\/e30\/f97406e30aff4dc7eb66aab398a64200.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f97\/406\/e30\/f97406e30aff4dc7eb66aab398a64200.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<blockquote>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441-\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 API-\u043a\u043b\u044e\u0447\u0438. \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u043b\u044e\u0447 \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438.<\/p>\n<\/blockquote>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c .env-\u0444\u0430\u0439\u043b \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u043a\u0440\u0435\u0434\u0430\u043c\u0438:<\/p>\n<pre><code class=\"bash\">FMC_ENDPOINT=https:\/\/6a42e1c7-9ac8-423e-8eb1-be4dd09c66e5.wc.ru-7.inference.selcloud.ruFMC_API_KEY=1234567890FMC_MODEL=t-pro-it-2-1<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0441\u0440\u0430\u0437\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0432 .gitignore, API-\u043a\u043b\u044e\u0447\u0443 \u0434\u0435\u043b\u0430\u0442\u044c \u0432 Git \u043d\u0435\u0447\u0435\u0433\u043e.<\/p>\n<pre><code>.env.venv\/__pycache__\/results\/<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0447\u0435\u0440\u0435\u0437 curl, \u0447\u0442\u043e\u0431\u044b \u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0438 \u043d\u0435 \u0433\u043e\u0440\u043e\u0434\u0438\u0442\u044c \u043e\u0433\u043e\u0440\u043e\u0434 \u0441 \u0431\u0430\u0433\u0430\u043c\u0438.<\/p>\n<pre><code class=\"bash\">curl https:\/\/6a42e1c7-9ac8-423e-8eb1-be4dd09c66e5.wc.ru-7.inference.selcloud.ru\/v1\/completions \\-H \"Authorization: Bearer 1234567890\" \\-H \"Content-Type: application\/json\" \\-d '{  \"model\": \"t-pro-it-2-1\",  \"prompt\": \"Say this is a test\",  \"temperature\": 0,  \"max_tokens\": 7}'<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/400\/b39\/621\/400b39621f40969bcd30389b42933162.png\" width=\"875\" height=\"114\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/400\/b39\/621\/400b39621f40969bcd30389b42933162.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/400\/b39\/621\/400b39621f40969bcd30389b42933162.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u0440\u043e\u0448\u0435\u043b, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0438 \u0441\u043c\u0430\u0436\u0435\u043c JQ:<\/p>\n<pre><code class=\"bash\">cd ~\/dev\/resume-matchersource .envcurl -sS \\  \"${FMC_ENDPOINT}\/v1\/chat\/completions\" \\  -H \"Authorization: Bearer ${FMC_API_KEY}\" \\  -H \"Content-Type: application\/json\" \\  -d \"{\\\"model\\\": \\\"${FMC_MODEL}\\\",\\\"temperature\\\": 0,\\\"max_tokens\\\": 700,\\\"messages\\\": [  {    \\\"role\\\": \\\"system\\\",    \\\"content\\\": \\\"\u0422\u044b \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0448\u044c \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u0438\u0437 \u0440\u0435\u0437\u044e\u043c\u0435.\\\"  },  {    \\\"role\\\": \\\"user\\\",    \\\"content\\\": \\\"\u0412\u0435\u0440\u043d\u0438 JSON \u0441 \u043e\u0434\u043d\u0438\u043c \u043f\u043e\u043b\u0435\u043c status \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c ok.\\\"  }]  }\" |jq -r '.choices[0].message.content'<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d, \u043c\u043e\u0436\u043d\u043e \u0435\u0445\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/53a\/cc1\/1ac\/53acc11acdf649563ba4e0dc481b5330.png\" width=\"875\" height=\"601\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/53a\/cc1\/1ac\/53acc11acdf649563ba4e0dc481b5330.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/53a\/cc1\/1ac\/53acc11acdf649563ba4e0dc481b5330.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<blockquote>\n<p>FMC \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Chat API \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <code>\/v1\/chat\/completions<\/code>, Bearer-\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u043e\u0442\u0432\u0435\u0442\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 OpenAI API. \u042d\u043d\u0434\u043f\u043e\u0438\u043d\u0442, API-\u043a\u043b\u044e\u0447 \u0438 \u0438\u043c\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437 \u043f\u0430\u043d\u0435\u043b\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<\/blockquote>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 <code>401 Unauthorized<\/code>, \u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0439\u0442\u0435 \u043a\u0440\u0435\u0434\u044b. \u0412\u043e\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u044b \u0438 \u043d\u0443\u0436\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u0432\u0441\u044f \u0437\u0430\u0434\u0443\u043c\u043a\u0430 \u043d\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0430\u0441\u044c \u0432 \u0442\u044b\u043a\u0432\u0443.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<pre><code class=\"bash\">python3 -m venv .venvsource .venv\/bin\/activate<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u043a\u0435\u0442\u044b:<\/p>\n<pre><code class=\"bash\">pip install pymupdf requests pydantic python-dotenv pyyaml jinja2<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ec3\/353\/0c1\/ec33530c1c8f51b3be823d8dfea2355b.png\" width=\"875\" height=\"317\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/ec3\/353\/0c1\/ec33530c1c8f51b3be823d8dfea2355b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ec3\/353\/0c1\/ec33530c1c8f51b3be823d8dfea2355b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041d\u0430\u0431\u043e\u0440 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u044f \u0432\u044b\u0431\u0440\u0430\u043b, \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>pymupdf \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0438\u0437 PDF,<\/p>\n<\/li>\n<li>\n<p>requests \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a FMC,<\/p>\n<\/li>\n<li>\n<p>pydantic \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u0438,<\/p>\n<\/li>\n<li>\n<p>pyyaml \u0447\u0438\u0442\u0430\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438,<\/p>\n<\/li>\n<li>\n<p>jinja2 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 HTML-\u043e\u0442\u0447\u0435\u0442,<\/p>\n<\/li>\n<li>\n<p>python-dotenv \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u041d\u0430 \u0440\u043e\u043b\u044c Python-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u044f \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u044e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043f\u0440\u043e\u0444\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u0430 \u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043a\u0430\u043a \u043b\u0430\u043f\u0448\u0430. \u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043e\u0434 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0438 \u043c\u0435\u043d\u044f \u043e\u043d \u0432\u043f\u043e\u043b\u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c src\/pdf_parser.py:<\/p>\n<pre><code class=\"python\">from __future__ import annotationsimport refrom pathlib import Pathfrom typing import castimport pymupdf as fitzclass PdfTextError(RuntimeError):passdef normalize_text(text: str) -&gt; str:text = text.replace(\"\\u00a0\", \" \")text = text.replace(\"\\u200b\", \"\")text = text.replace(\"\\xad\", \"\")lines = [    re.sub(r\"[ \\t]+\", \" \", line).strip()    for line in text.splitlines()]text = \"\\n\".join(lines)text = re.sub(r\"\\n{3,}\", \"\\n\\n\", text)return text.strip()def extract_pdf_text(pdf_path: Path) -&gt; str:if not pdf_path.is_file():    raise FileNotFoundError(        f\"PDF \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d: {pdf_path}\"    )pages: list[str] = []try:    with fitz.open(pdf_path) as document:        if document.page_count == 0:            raise PdfTextError(                \"\u0412 PDF \u043d\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\"            )        for page_index in range(            document.page_count        ):            page_number = page_index + 1            page = document.load_page(                page_index            )            page_text = cast(                str,                page.get_text(                    \"text\",                    sort=True,                ),            )            page_text = normalize_text(                page_text            )            if not page_text:                continue            pages.append(                f\"--- \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 {page_number} ---\\n\"                f\"{page_text}\"            )except fitz.FileDataError as error:    raise PdfTextError(            f\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c PDF: {error}\"    ) from errorresult = \"\\n\\n\".join(pages).strip()if len(result) &lt; 300:    raise PdfTextError(        \"\u0418\u0437 PDF \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0430\u043b\u043e \u0442\u0435\u043a\u0441\u0442\u0430. \"        \"\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043a\u0430\u043d\u043e\u043c \"        \"\u0431\u0435\u0437 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u044f.\"    )return result<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c:<\/p>\n<pre><code class=\"python\">from pathlib import Pathfrom src.pdf_parser import extract_pdf_texttext = extract_pdf_text(Path(\"resumes\/resume-001.pdf\"))print(text[:1500])<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c:<\/p>\n<pre><code>--- \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 1 --- DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u041e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b: 4 \u0433\u043e\u0434\u0430 \u041e\u041e\u041e \u00ab\u0420\u043e\u0433\u0430 \u0438 \u043a\u043e\u043f\u044b\u0442\u0430\u00bb DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u041c\u0430\u0439 2022 \u2014 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b 60 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d Ubuntu \u0438 Debian.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>PyMuPDF \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 OCR. \u0415\u0441\u043b\u0438 PDF \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043e\u0442\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u044f \u0442\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0431\u044b\u0442\u044c. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044f \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e \u043f\u0443\u0441\u0442\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0432 \u043c\u043e\u0434\u0435\u043b\u044c, \u0430 \u043f\u043e\u043c\u0435\u0449\u0430\u044e \u0440\u0435\u0437\u044e\u043c\u0435 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0440\u0443\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:<\/p>\n<pre><code>extraction_quality: poorverdict: manual_review<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c Tesseract \u0438\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e OCR-\u043c\u043e\u0434\u0435\u043b\u044c, \u043d\u043e \u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0435\u043a\u0442 \u0431\u044b\u043b\u0430 \u043e\u0434\u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0435 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e PDF \u0441 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c \u0441\u043b\u043e\u0435\u043c.<\/p>\n<div class=\"floating-image\">\n<figure class=\"float \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dbd\/50d\/bb6\/dbd50dbb6316408a3d20c62b3ced3f3c.gif\" alt=\"\" title=\"\" width=\"200\" height=\"200\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dbd\/50d\/bb6\/dbd50dbb6316408a3d20c62b3ced3f3c.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dbd\/50d\/bb6\/dbd50dbb6316408a3d20c62b3ced3f3c.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p><strong>\u0418\u0418\u2011\u0440\u043e\u0443\u0442\u0435\u0440\u00a0\u2014 \u0434\u043e\u0441\u0442\u0443\u043f \u043a 300+ \u043c\u043e\u0434\u0435\u043b\u044f\u043c \u0438\u0437\u00a0\u043e\u0434\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438<\/strong><\/p>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0435 OpenAI\u2011\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 \u0448\u043b\u044e\u0437 \u043f\u043e\u00a0\u0435\u0434\u0438\u043d\u043e\u043c\u0443 API\u2011\u043a\u043b\u044e\u0447\u0443. \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0439\u0442\u0435 \u0441\u043a\u0432\u043e\u0437\u043d\u0443\u044e \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0443, \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0439\u0442\u0435\u00a0\u043b\u0438\u043c\u0438\u0442\u044b \u0438 \u043a\u0432\u043e\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b.<\/p>\n<p><a href=\"https:\/\/promo.selectel.ru\/ai-router\/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=airouter_article_resume_240926_banner_ord\"><strong>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0418\u0418\u2011\u0440\u043e\u0443\u0442\u0435\u0440\u00a0\u2192<\/strong><\/a><\/p>\n<\/div>\n<h3>\u041e\u0431\u0435\u0437\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442<\/h3>\n<p>\u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c \u0440\u0435\u0437\u044e\u043c\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<ul>\n<li>\n<p>\u0438\u043c\u044f;<\/p>\n<\/li>\n<li>\n<p>\u0442\u0435\u043b\u0435\u0444\u043e\u043d;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0447\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0430\u0434\u0440\u0435\u0441;<\/p>\n<\/li>\n<li>\n<p>\u0434\u0430\u0442\u0430 \u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>\u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u043e\u0446\u0441\u0435\u0442\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u043e\u043d\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b, \u0434\u0430 \u0438 \u0442\u0440\u0443\u0434\u043e\u0432\u043e\u0435 \u0437\u0430\u043a\u043e\u043d\u043e\u0434\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u043f\u043e \u043e\u0431\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430\u043c, \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c \u0441 \u0434\u0435\u043b\u043e\u0432\u044b\u043c\u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430\u043c\u0438 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430. \u042d\u0442\u043e \u0447\u0430\u0441\u0442\u044c \u0446\u0438\u0442\u0430\u0442\u044b \u0438\u0437 \u041a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0430\u043d\u0442\u0430.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c src\/anonymizer.py:<\/p>\n<pre><code class=\"python\">from __future__ import annotations import reEMAIL_PATTERN = re.compile(r\"\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b\",flags=re.IGNORECASE,)PHONE_PATTERN = re.compile(r\"(?&lt;!\\d)(?:\\+7|8)\"r\"[\\s\\-()]*(?:\\d[\\s\\-()]*){10}(?!\\d)\")URL_PATTERN = re.compile(r\"(?:https?:\/\/|www\\.|t\\.me\/)\\S+\",flags=re.IGNORECASE,)SENSITIVE_LINE_PATTERN = re.compile(r\"^(?:\"r\"\u0434\u0430\u0442\u0430 \u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f|\"r\"\u0432\u043e\u0437\u0440\u0430\u0441\u0442|\"r\"\u043f\u043e\u043b|\"r\"\u0441\u0435\u043c\u0435\u0439\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435|\"r\"\u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0441\u0442\u0432\u043e|\"r\"\u0430\u0434\u0440\u0435\u0441|\"r\"\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u043e\u0436\u0438\u0432\u0430\u043d\u0438\u044f\"r\")\\s*:.*$\",flags=re.IGNORECASE | re.MULTILINE,)def anonymize_resume(text: str) -&gt; str:result = EMAIL_PATTERN.sub(    \"[EMAIL REMOVED]\",    text,)result = PHONE_PATTERN.sub(    \"[PHONE REMOVED]\",    result,)result = URL_PATTERN.sub(    \"[LINK REMOVED]\",    result,)result = SENSITIVE_LINE_PATTERN.sub(    \"[PERSONAL DATA REMOVED]\",    result,)return result<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0433\u043e\u0432\u043e\u0440\u044e\u0441\u044c, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0443 \u043c\u0435\u043d\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0438\u043b\u044c\u0442\u0440, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d-\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043e\u0431\u0435\u0437\u043b\u0438\u0447\u0438\u0432\u0430\u043d\u0438\u044f. \u0424\u0438\u043b\u044c\u0442\u0440 \u0443\u0434\u0430\u043b\u0438\u0442 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439 \u0442\u0435\u043b\u0435\u0444\u043e\u043d \u0438 email, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0442\u044c \u0438\u043c\u044f \u0438\u043b\u0438 \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441. \u0412 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u0442\u0430\u043a\u043e\u0439 \u044d\u0442\u0430\u043f \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0443\u0441\u0438\u043b\u0438\u0432\u0430\u0442\u044c \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441 \u044e\u0440\u0438\u0441\u0442\u0430\u043c\u0438 \u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u0430\u043c\u0438 \u043f\u043e \u0418\u0411. \u041d\u043e \u0434\u043b\u044f \u0441\u0438\u043d\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.<\/p>\n<h3>\u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u043e\u0442\u0432\u0435\u0442<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c src\/models.py:<\/p>\n<pre><code class=\"python\">from __future__ import annotationsfrom typing import Literalfrom pydantic import (BaseModel,Field,field_validator,)CriterionStatus = Literal[\"confirmed\",\"partial\",\"not_found\",\"contradicted\",]class CriterionAssessment(BaseModel):id: strlevel: int = Field(    ge=0,    le=4,)status: CriterionStatusevidence: list[str] = Field(    default_factory=list,    max_length=5,)comment: str = Field(    min_length=1,    max_length=800,)@field_validator(\"evidence\")@classmethoddef clean_evidence(    cls,    values: list[str],) -&gt; list[str]:    result = []    for value in values:        value = value.strip()        if value and value not in result:            result.append(value)    return resultclass ModelAssessment(BaseModel):candidate_summary: str = Field(    min_length=1,    max_length=1000,)extraction_quality: Literal[    \"good\",    \"partial\",    \"poor\",]criteria: list[CriterionAssessment]missing_required: list[str] = Field(    default_factory=list,)unclear_points: list[str] = Field(    default_factory=list,    max_length=10,)interview_questions: list[str] = Field(    default_factory=list,    max_length=10,)short_reason: str = Field(    min_length=1,    max_length=1200,)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 pydantic \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:<\/p>\n<ul>\n<li>\n<p>\u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u0435\u0439,<\/p>\n<\/li>\n<li>\n<p>\u0442\u0438\u043f\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439,<\/p>\n<\/li>\n<li>\n<p>\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0443\u0440\u043e\u0432\u043d\u044f \u043e\u0442 0 \u0434\u043e 4,<\/p>\n<\/li>\n<li>\n<p>\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u044b,<\/p>\n<\/li>\n<li>\n<p>\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432 \u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u043e\u0434\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code class=\"python\">{   \"level\": \"\u043e\u0442\u043b\u0438\u0447\u043d\u043e\"}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u043e\u0439.<\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u043c\u043f\u0442<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u043c\u0442. \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b src\/fmc_client.py \u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0438\u0448\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e:<\/p>\n<pre><code class=\"python\">SYSTEM_PROMPT = \"\"\"\u0422\u044b \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0448\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430\u0438\u0437 \u0440\u0435\u0437\u044e\u043c\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438.\u042d\u0442\u043e \u043d\u0435 \u043e\u0446\u0435\u043d\u043a\u0430 \u043b\u0438\u0447\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430 \u0438 \u043d\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u043d\u0430\u0439\u043c\u0435 \u0438\u043b\u0438 \u043e\u0442\u043a\u0430\u0437\u0435.\u041e\u0446\u0435\u043d\u0438\u0432\u0430\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0432\u043d\u043e \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442\u0432 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u0435 \u0440\u0435\u0437\u044e\u043c\u0435.\u041f\u0440\u0430\u0432\u0438\u043b\u0430:1. \u041d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0439 \u0438\u043c\u044f, \u043f\u043e\u043b, \u0432\u043e\u0437\u0440\u0430\u0441\u0442, \u0441\u0435\u043c\u0435\u0439\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435,   \u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0441\u0442\u0432\u043e, \u0430\u0434\u0440\u0435\u0441, \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438.2. \u041d\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0439 \u043e\u043f\u044b\u0442, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u0442 \u0432 \u0440\u0435\u0437\u044e\u043c\u0435.3. \u0423\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0431\u0435\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0435\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f   \u0434\u0430\u0435\u0442 \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 1 \u0431\u0430\u043b\u043b\u0430.4. \u0421\u0442\u0430\u0442\u0443\u0441 not_found \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435   \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0432 \u0442\u0435\u043a\u0441\u0442\u0435. \u041e\u043d \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442   \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u043d\u0430\u0432\u044b\u043a\u043e\u043c.5. \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u0439 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044b.   \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:   - SaltStack \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u043e\u043f\u044b\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439;   - Argo CD \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u043e\u043f\u044b\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0435\u043f\u043b\u043e\u044f \u0438 GitOps;   - Zabbix \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u043e\u043f\u044b\u0442 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430.6. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044f \u043f\u0440\u0438\u0432\u043e\u0434\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u0434\u043e\u0441\u043b\u043e\u0432\u043d\u044b\u0435   \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0438\u0437 \u0440\u0435\u0437\u044e\u043c\u0435.7. \u041d\u0435 \u0434\u0430\u0432\u0430\u0439 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438 \u043f\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044e \u0440\u0435\u0437\u044e\u043c\u0435.8. \u041d\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0439 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u043d\u0430\u0439\u043c\u0435 \u0438\u043b\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043e\u0442\u043a\u0430\u0437\u0435.9. \u041d\u0435 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0439 \u043e\u0431\u0449\u0438\u0439 \u0431\u0430\u043b\u043b.10. \u0412\u0435\u0440\u043d\u0438 \u0442\u043e\u043b\u044c\u043a\u043e JSON \u0431\u0435\u0437 Markdown, \u0432\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0439.\u0428\u043a\u0430\u043b\u0430 \u0443\u0440\u043e\u0432\u043d\u044f:0 \u2014 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u043d\u0435\u0442 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f;1 \u2014 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u0430;2 \u2014 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u043f\u044b\u0442;3 \u2014 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u044b\u0439 production-\u043e\u043f\u044b\u0442;4 \u2014 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043e\u043f\u044b\u0442, \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u0437\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u0440\u0438\u043c\u043e\u0435 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435.\"\"\".strip()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u043c\u043f\u0442 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c:<\/p>\n<blockquote>\n<p>\u041a\u0420\u0418\u0422\u0415\u0420\u0418\u0418 \u0412\u0410\u041a\u0410\u041d\u0421\u0418\u0418<br \/>&#8230;<br \/>\u0422\u0415\u041a\u0421\u0422 \u0420\u0415\u0417\u042e\u041c\u0415<br \/>&#8230;<br \/>\u041e\u0416\u0418\u0414\u0410\u0415\u041c\u0410\u042f JSON-\u0421\u0425\u0415\u041c\u0410<br \/> &#8230;  <\/p>\n<\/blockquote>\n<p>\u0422\u0430\u043a \u043c\u043e\u0434\u0435\u043b\u044c \u0437\u043d\u0430\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u044f \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c.<\/p>\n<h3>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c FMC<\/h3>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0444\u0430\u0439\u043b src\/fmc_client.py:<\/p>\n<pre><code class=\"python\">from __future__ import annotationsimport jsonimport osimport reimport timefrom typing import Anyimport requestsfrom src.models import ModelAssessmentclass FmcError(RuntimeError):passdef extract_json_object(raw_content: str,) -&gt; dict[str, Any]:raw_content = raw_content.strip()raw_content = re.sub(    r\"^```(?:json)?\\s*\",    \"\",    raw_content,    flags=re.IGNORECASE,)raw_content = re.sub(    r\"\\s*```$\",    \"\",    raw_content,)start = raw_content.find(\"{\")end = raw_content.rfind(\"}\")if start == -1 or end == -1 or end &lt; start:    raise FmcError(        \"\u041c\u043e\u0434\u0435\u043b\u044c \u043d\u0435 \u0432\u0435\u0440\u043d\u0443\u043b\u0430 JSON-\u043e\u0431\u044a\u0435\u043a\u0442\"    )try:    parsed = json.loads(        raw_content[start:end + 1]    )except json.JSONDecodeError as error:    raise FmcError(        f\"\u041d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 JSON: {error}\"    ) from errorif not isinstance(parsed, dict):    raise FmcError(        \"\u041a\u043e\u0440\u043d\u0435\u043c \u043e\u0442\u0432\u0435\u0442\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c JSON-\u043e\u0431\u044a\u0435\u043a\u0442\"    )return parsedclass FmcClient:def __init__(self) -&gt; None:    self.endpoint = os.environ[        \"FMC_ENDPOINT\"    ].rstrip(\"\/\")    self.api_key = os.environ[        \"FMC_API_KEY\"    ]    self.model = os.environ[        \"FMC_MODEL\"    ]    self.session = requests.Session()    self.session.headers.update(        {            \"Authorization\": (                f\"Bearer {self.api_key}\"            ),            \"Content-Type\": (                \"application\/json\"            ),        }    )def analyze(    self,    vacancy: dict[str, Any],    resume_text: str,) -&gt; tuple[ModelAssessment, float]:    response_schema = (        ModelAssessment.model_json_schema()    )    user_prompt = (        \"\u041a\u0420\u0418\u0422\u0415\u0420\u0418\u0418 \u0412\u0410\u041a\u0410\u041d\u0421\u0418\u0418:\\n\"        + json.dumps(            vacancy,            ensure_ascii=False,            indent=2,        )        + \"\\n\\n\u0422\u0415\u041a\u0421\u0422 \u0420\u0415\u0417\u042e\u041c\u0415:\\n\"        + resume_text        + \"\\n\\n\u041e\u0416\u0418\u0414\u0410\u0415\u041c\u0410\u042f JSON-\u0421\u0425\u0415\u041c\u0410:\\n\"        + json.dumps(            response_schema,            ensure_ascii=False,            indent=2,        )    )    payload = {        \"model\": self.model,        \"temperature\": 0,        \"max_tokens\": 700,        \"messages\": [            {                \"role\": \"system\",                \"content\": SYSTEM_PROMPT,            },            {                \"role\": \"user\",                \"content\": user_prompt,            },        ],        }    started = time.perf_counter()    response = self.session.post(        (            f\"{self.endpoint}\"            \"\/v1\/chat\/completions\"        ),        json=payload,        timeout=240,    )    elapsed = (        time.perf_counter()        - started    )    if not response.ok:        raise FmcError(            f\"FMC API error \"            f\"{response.status_code}: \"            f\"{response.text}\"        )    try:        response_payload = (            response.json()        )        raw_content = (            response_payload[\"choices\"][0]            [\"message\"][\"content\"]        )    except (            ValueError,        KeyError,        IndexError,        TypeError,    ) as error:        raise FmcError(            \"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442 FMC\"        ) from error    parsed = extract_json_object(        raw_content    )    assessment = (        ModelAssessment.model_validate(            parsed        )    )    return assessment, elapsed<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>temperature<\/code> \u044f \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e \u0432 \u043d\u043e\u043b\u044c, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<p>\u041d\u043e \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0435 \u043f\u043e\u043b\u043d\u0430\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u0441\u0442\u044c \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0437\u0436\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0445.<\/p>\n<h3>\u041d\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0446\u0438\u0442\u0430\u0442\u0430\u043c \u043c\u043e\u0434\u0435\u043b\u0438<\/h3>\n<p>\u0412 \u043e\u0442\u0432\u0435\u0442\u0435 \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0438\u0437 \u0440\u0435\u0437\u044e\u043c\u0435. \u041d\u043e \u0447\u0442\u043e \u043c\u0435\u0448\u0430\u0435\u0442 \u0435\u0439 \u043c\u0435\u043d\u044f \u043e\u0431\u043c\u0430\u043d\u0443\u0442\u044c \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u0443\u044e \u0446\u0438\u0442\u0430\u0442\u0443? \u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u044d\u0442\u043e\u0433\u043e, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e:<\/p>\n<pre><code class=\"python\">import refrom dataclasses import dataclassfrom src.models import ModelAssessment@dataclassclass EvidenceCheck:total: intmatched: intmissing: list[str]def normalize_for_matching(text: str,) -&gt; str:text = text.lower()text = text.replace(\"\u0451\", \"\u0435\")text = re.sub(r\"\\s+\", \" \", text)return text.strip()def check_evidence(resume_text: str,assessment: ModelAssessment,) -&gt; EvidenceCheck:normalized_resume = (    normalize_for_matching(        resume_text    ))total = 0matched = 0missing: list[str] = []for criterion in assessment.criteria:        for evidence in criterion.evidence:        total += 1        normalized_evidence = (            normalize_for_matching(                evidence            )        )        if (            normalized_evidence            in normalized_resume        ):            matched += 1        else:            missing.append(evidence)return EvidenceCheck(    total=total,    matched=matched,    missing=missing,)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u0435\u0440\u043d\u0443\u043b\u0430 <code>\u0421\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043b Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440<\/code>, \u0430 \u0432 \u0440\u0435\u0437\u044e\u043c\u0435 \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0435\u0442, \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043d\u0435\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u043d\u043e\u0435. \u042d\u0442\u043e \u043d\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430: \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0443\u0431\u0440\u0430\u0442\u044c \u0437\u043d\u0430\u043a \u043f\u0440\u0435\u043f\u0438\u043d\u0430\u043d\u0438\u044f \u0438\u043b\u0438 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0446\u0438\u0442\u0430\u0442\u0443. \u041d\u043e \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u043b \u0434\u043e\u0441\u043b\u043e\u0432\u043d\u044b\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0435.<\/p>\n<h3>\u0421\u0447\u0438\u0442\u0430\u0435\u043c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0431\u0430\u043b\u043b<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b src\/scoring.py:<\/p>\n<pre><code class=\"python\">from __future__ import annotationsfrom typing import Anyfrom src.models import ModelAssessmentdef calculate_result(vacancy: dict[str, Any],assessment: ModelAssessment,) -&gt; dict[str, Any]:criteria_config = {    item[\"id\"]: item    for item in vacancy[\"criteria\"]}model_results = {    item.id: item    for item in assessment.criteria}weighted_score = 0.0required_gaps: list[str] = []criterion_results = []for criterion_id, config in (    criteria_config.items()):    model_result = (        model_results.get(            criterion_id        )    )    if model_result is None:        level = 0        status = \"not_found\"        evidence: list[str] = []        comment = (            \"\u041c\u043e\u0434\u0435\u043b\u044c \u043d\u0435 \u0432\u0435\u0440\u043d\u0443\u043b\u0430 \"            \"\u043e\u0446\u0435\u043d\u043a\u0443 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044f\"        )    else:        level = model_result.level        status = model_result.status        evidence = model_result.evidence        comment = model_result.comment    weight = int(config[\"weight\"])    points = (        weight * level \/ 4    )    weighted_score += points    if (        bool(config[\"required\"])        and level &lt; 2    ):        required_gaps.append(            criterion_id        )    criterion_results.append(        {            \"id\": criterion_id,            \"title\": config[\"title\"],            \"required\": bool(                config[\"required\"]            ),            \"weight\": weight,            \"level\": level,            \"status\": status,            \"points\": round(                points,                2,            ),            \"evidence\": evidence,            \"comment\": comment,        }    )fit_score = round(    weighted_score)if (    assessment.extraction_quality    != \"good\"):    verdict = \"manual_review\"elif (    fit_score &gt;= 75    and not required_gaps):    verdict = \"match\"elif (    fit_score &gt;= 50    and len(required_gaps) &lt;= 1):    verdict = \"manual_review\"else:    verdict = \"no_match\"return {    \"fit_score\": fit_score,    \"verdict\": verdict,    \"candidate_summary\": (        assessment.candidate_summary    ),    \"criteria\": criterion_results,    \"required_gaps\": required_gaps,    \"unclear_points\": (        assessment.unclear_points    ),    \"interview_questions\": (        assessment.interview_questions    ),    \"short_reason\": (        assessment.short_reason    ),    \"extraction_quality\": (        assessment.extraction_quality    ),}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u0430\u043a \u0442\u0440\u0430\u043a\u0442\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b:<\/p>\n<ul>\n<li>\n<p><code>match<\/code> \u2014 \u0432 \u0440\u0435\u0437\u044e\u043c\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430 \u0432 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435.<\/p>\n<\/li>\n<li>\n<p><code>manual_review<\/code> \u2014 \u0435\u0441\u0442\u044c \u0441\u043f\u043e\u0440\u043d\u044b\u0435 \u043c\u0435\u0441\u0442\u0430, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u043b\u0438 \u043d\u0435\u043f\u043e\u043b\u043d\u043e\u0435 \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439. \u0422\u0430\u043a\u043e\u0435 \u0440\u0435\u0437\u044e\u043c\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<\/li>\n<li>\n<p><code>no_match<\/code> \u2014 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439 \u043f\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u043f\u0440\u043e\u0444\u0438\u043b\u044e \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, <code>no_match<\/code> \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0443 \u043e\u0442\u043a\u0430\u0437. \u042d\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430 \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0440\u0443\u0431\u0440\u0438\u043a\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 HR \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c.<\/p>\n<h3>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u044e<\/h3>\n<pre><code class=\"python\">from __future__ import annotationsfrom pathlib import Pathfrom typing import Anyimport yamldef load_vacancy(path: Path,) -&gt; dict[str, Any]:with path.open(    encoding=\"utf-8\") as file:    vacancy = yaml.safe_load(        file    )if not isinstance(vacancy, dict):    raise ValueError(        \"\u0412\u0430\u043a\u0430\u043d\u0441\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \"        \"YAML-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c\"    )criteria = vacancy.get(    \"criteria\")if not isinstance(criteria, list):    raise ValueError(        \"\u0412 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \"        \"\u0441\u043f\u0438\u0441\u043e\u043a criteria\"    )weight_sum = sum(    int(item[\"weight\"])    for item in criteria)if weight_sum != 100:    raise ValueError(        \"\u0421\u0443\u043c\u043c\u0430 \u0432\u0435\u0441\u043e\u0432 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u0432 \"        f\"\u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c 100, \u0441\u0435\u0439\u0447\u0430\u0441: \"        f\"{weight_sum}\"    )return vacancy<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0443\u043c\u043c\u044b \u0432\u0435\u0441\u043e\u0432 \u0441\u043f\u0430\u0441\u0435\u0442 \u043e\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f 115 \u0438\u0437 100. \u041d\u0430\u043c \u0442\u0430\u043a\u043e\u0435, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0443\u0442 \u043b\u0443\u0447\u0448\u0435 \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0449\u0438\u0442\u044c \u0441\u043e \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u043a \u0434\u0435\u0442\u0430\u043b\u044f\u043c.<\/p>\n<h3>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c HTML-\u043e\u0442\u0447\u0435\u0442<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c templates\/report.html:<\/p>\n<pre><code class=\"xml\">&lt;!doctype html&gt;&lt;html lang=\"ru\"&gt;&lt;head&gt;  &lt;meta charset=\"utf-8\"&gt;  &lt;metaname=\"viewport\"content=\"width=device-width, initial-scale=1\"  &gt;  &lt;title&gt;{{ candidate_id }} \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438  &lt;\/title&gt;  &lt;style&gt;:root {  color-scheme: dark;  --background: #080a0f;  --panel: #0d1016;  --panel-light: #151920;  --border: #303640;  --text: #e5e7eb;  --muted: #a4a9b3;  --accent: #c9ff35;  --warning: #ffca58;  --danger: #ff7070;}* {  box-sizing: border-box;}body {  margin: 0;  padding: 40px 24px;  color: var(--text);  background: var(--background);  font-family:    Inter,    system-ui,    -apple-system,    sans-serif;  line-height: 1.55;}main {  max-width: 1280px;  margin: 0 auto;}h1,h2,h3 {  margin-top: 0;}h1 {  margin-bottom: 8px;  font-size: 32px;}.muted {  color: var(--muted);    }.summary-grid {  display: grid;  grid-template-columns:    repeat(3, minmax(0, 1fr));  gap: 16px;  margin: 32px 0;}.card {  padding: 24px;  border: 1px solid var(--border);  background: var(--panel);}.card__label {  color: var(--muted);  font-size: 13px;  text-transform: uppercase;  letter-spacing: 0.08em;}.card__value {  margin-top: 10px;  color: var(--accent);  font-family: monospace;  font-size: 30px;  font-weight: 700;}table {  width: 100%;  border-collapse: collapse;  margin: 32px 0;  background: var(--panel);}th,td {  padding: 18px;  border-bottom:    1px solid var(--border);  text-align: left;  vertical-align: top;}th {  color: var(--muted);  background: var(--panel-light);  font-size: 12px;  text-transform: uppercase;  letter-spacing: 0.06em;}.points {  color: var(--accent);  font-family: monospace;  font-weight: 700;  white-space: nowrap;}.status {  display: inline-block;  padding: 4px 9px;  border: 1px solid var(--border);  font-family: monospace;  font-size: 12px;}.status--confirmed {  color: var(--accent);}.status--partial {  color: var(--warning);}.status--not_found,.status--contradicted {  color: var(--danger);}.evidence {  margin: 10px 0 0;  padding-left: 20px;  color: var(--muted);}.two-columns {  display: grid;  grid-template-columns:    repeat(2, minmax(0, 1fr));  gap: 24px;  margin-top: 32px;}.list {  margin: 0;  padding-left: 24px;}.list li + li {  margin-top: 12px;}.verdict {  color: var(--accent);  font-size: 20px;  font-weight: 700;}@media (max-width: 800px) {  .summary-grid,  .two-columns {    grid-template-columns: 1fr;  }  body {    padding: 24px 12px;  }  th,  td {    padding: 12px;  }}  &lt;\/style&gt;&lt;\/head&gt;&lt;body&gt;&lt;main&gt;  &lt;h1&gt;\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438&lt;\/h1&gt;  &lt;p class=\"muted\"&gt;{{ vacancy_title }} \u00b7 {{ candidate_id }}  &lt;\/p&gt;  &lt;div class=\"summary-grid\"&gt;&lt;section class=\"card\"&gt;  &lt;div class=\"card__label\"&gt;    \u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0431\u0430\u043b\u043b  &lt;\/div&gt;  &lt;div class=\"card__value\"&gt;        {{ result.fit_score }}\/100  &lt;\/div&gt;&lt;\/section&gt;&lt;section class=\"card\"&gt;  &lt;div class=\"card__label\"&gt;    \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442  &lt;\/div&gt;  &lt;div class=\"card__value\"&gt;    {{ result.verdict }}  &lt;\/div&gt;&lt;\/section&gt;&lt;section class=\"card\"&gt;  &lt;div class=\"card__label\"&gt;    \u0412\u0440\u0435\u043c\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438  &lt;\/div&gt;  &lt;div class=\"card__value\"&gt;    {{ \"%.2f\"|format(latency) }} \u0441  &lt;\/div&gt;&lt;\/section&gt;  &lt;\/div&gt;  &lt;section class=\"card\"&gt;&lt;h2&gt;\u041a\u0440\u0430\u0442\u043a\u0430\u044f \u0432\u044b\u0436\u0438\u043c\u043a\u0430&lt;\/h2&gt;&lt;p&gt;  {{ result.candidate_summary }}&lt;\/p&gt;&lt;p class=\"muted\"&gt;  {{ result.short_reason }}&lt;\/p&gt;  &lt;\/section&gt;  &lt;table&gt;&lt;thead&gt;  &lt;tr&gt;    &lt;th&gt;\u041a\u0440\u0438\u0442\u0435\u0440\u0438\u0439&lt;\/th&gt;    &lt;th&gt;\u0421\u0442\u0430\u0442\u0443\u0441&lt;\/th&gt;    &lt;th&gt;\u0411\u0430\u043b\u043b\u044b&lt;\/th&gt;    &lt;th&gt;\u0414\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430&lt;\/th&gt;  &lt;\/tr&gt;&lt;\/thead&gt;&lt;tbody&gt;{% for criterion in result.criteria %}  &lt;tr&gt;    &lt;td&gt;      &lt;strong&gt;        {{ criterion.title }}      &lt;\/strong&gt;      {% if criterion.required %}        &lt;div class=\"muted\"&gt;          \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439        &lt;\/div&gt;      {% endif %}    &lt;\/td&gt;    &lt;td&gt;      &lt;span        class=\"          status          status--{{ criterion.status }}        \"      &gt;        {{ criterion.status }}      &lt;\/span&gt;      &lt;p class=\"muted\"&gt;        {{ criterion.comment }}      &lt;\/p&gt;    &lt;\/td&gt;    &lt;td class=\"points\"&gt;      {{ criterion.points }}      \/      {{ criterion.weight }}        &lt;\/td&gt;    &lt;td&gt;      {% if criterion.evidence %}        &lt;ul class=\"evidence\"&gt;        {% for evidence in criterion.evidence %}          &lt;li&gt;{{ evidence }}&lt;\/li&gt;        {% endfor %}        &lt;\/ul&gt;      {% else %}            &lt;span class=\"muted\"&gt;          \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e        &lt;\/span&gt;      {% endif %}    &lt;\/td&gt;  &lt;\/tr&gt;{% endfor %}&lt;\/tbody&gt;  &lt;\/table&gt;  &lt;div class=\"two-columns\"&gt;&lt;section class=\"card\"&gt;  &lt;h2&gt;\u0427\u0442\u043e \u043d\u0430\u0434\u043e \u0443\u0442\u043e\u0447\u043d\u0438\u0442\u044c&lt;\/h2&gt;  {% if result.unclear_points %}    &lt;ul class=\"list\"&gt;    {% for item in result.unclear_points %}      &lt;li&gt;{{ item }}&lt;\/li&gt;    {% endfor %}    &lt;\/ul&gt;  {% else %}    &lt;p class=\"muted\"&gt;      \u042f\u0432\u043d\u044b\u0445 \u0441\u043f\u043e\u0440\u043d\u044b\u0445 \u043c\u0435\u0441\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.    &lt;\/p&gt;  {% endif %}&lt;\/section&gt;&lt;section class=\"card\"&gt;  &lt;h2&gt;\u0412\u043e\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e&lt;\/h2&gt;  {% if result.interview_questions %}    &lt;ul class=\"list\"&gt;    {% for question in result.interview_questions %}      &lt;li&gt;{{ question }}&lt;\/li&gt;    {% endfor %}    &lt;\/ul&gt;  {% else %}    &lt;p class=\"muted\"&gt;      \u0412\u043e\u043f\u0440\u043e\u0441\u044b \u043d\u0435 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u044b.    &lt;\/p&gt;  {% endif %}&lt;\/section&gt;  &lt;\/div&gt;&lt;\/main&gt;&lt;\/body&gt;&lt;\/html&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043c \u043e\u0442\u0447\u0435\u0442<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c src\/report.py:<\/p>\n<pre><code class=\"python\">from __future__ import annotationsfrom pathlib import Pathfrom typing import Anyfrom jinja2 import (Environment,FileSystemLoader,select_autoescape,)def render_report(candidate_id: str,vacancy_title: str,result: dict[str, Any],latency: float,output_path: Path,) -&gt; None:environment = Environment(    loader=FileSystemLoader(        \"templates\"    ),    autoescape=select_autoescape(        [\"html\", \"xml\"]    ),)template = environment.get_template(    \"report.html.j2\")html = template.render(    candidate_id=candidate_id,    vacancy_title=vacancy_title,    result=result,    latency=latency,)output_path.parent.mkdir(    parents=True,    exist_ok=True,)output_path.write_text(    html,    encoding=\"utf-8\",)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u0432 \u043e\u0434\u0438\u043d \u0437\u0430\u043f\u0443\u0441\u043a<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c src\/main.py:<\/p>\n<pre><code class=\"python\">from __future__ import annotationsimport argparseimport csvimport jsonfrom pathlib import Pathfrom typing import Anyfrom dotenv import load_dotenvfrom src.anonymizer import (anonymize_resume,)from src.fmc_client import (FmcClient,FmcError,)from src.pdf_parser import (PdfTextError,extract_pdf_text,)from src.report import render_reportfrom src.scoring import (calculate_result,)def load_vacancy(path: Path,) -&gt; dict[str, Any]:import yamlwith path.open(    encoding=\"utf-8\") as file:    vacancy = yaml.safe_load(        file    )if not isinstance(vacancy, dict):    raise ValueError(        \"\u0412\u0430\u043a\u0430\u043d\u0441\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \"        \"YAML-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c\"    )criteria = vacancy.get(    \"criteria\")    if not isinstance(criteria, list):    raise ValueError(        \"\u0412 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438 \u043d\u0435\u0442 criteria\"    )weight_sum = sum(    int(item[\"weight\"])    for item in criteria)if weight_sum != 100:    raise ValueError(        \"\u0421\u0443\u043c\u043c\u0430 \u0432\u0435\u0441\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c 100, \"        f\"\u0441\u0435\u0439\u0447\u0430\u0441: {weight_sum}\"    )return vacancydef save_json(path: Path,payload: dict[str, Any],) -&gt; None:path.parent.mkdir(    parents=True,    exist_ok=True,)path.write_text(    json.dumps(        payload,        ensure_ascii=False,        indent=2,    ),    encoding=\"utf-8\",)def write_summary_csv(rows: list[dict[str, Any]],output_path: Path,) -&gt; None:output_path.parent.mkdir(    parents=True,    exist_ok=True,)with output_path.open(    \"w\",    encoding=\"utf-8\",    newline=\"\",) as file:    writer = csv.DictWriter(        file,        fieldnames=[            \"candidate_id\",            \"fit_score\",            \"verdict\",            \"latency_seconds\",            \"required_gaps\",            \"error\",        ],    )    writer.writeheader()    writer.writerows(rows)def process_resume(pdf_path: Path,vacancy: dict[str, Any],client: FmcClient,results_dir: Path,) -&gt; dict[str, Any]:candidate_id = pdf_path.stemtry:    raw_text = extract_pdf_text(        pdf_path    )    clean_text = anonymize_resume(        raw_text    )    assessment, latency = (        client.analyze(            vacancy=vacancy,            resume_text=clean_text,        )    )    result = calculate_result(        vacancy=vacancy,        assessment=assessment,    )    result[\"candidate_id\"] = (        candidate_id    )    result[\"source_file\"] = (        pdf_path.name    )    result[\"latency_seconds\"] = (        round(latency, 3)    )    save_json(        (            results_dir            \/ f\"{candidate_id}.json\"        ),        result,        )    render_report(        candidate_id=candidate_id,        vacancy_title=vacancy[\"title\"],        result=result,        latency=latency,        output_path=(            results_dir            \/ f\"{candidate_id}.html\"        ),    )    return {        \"candidate_id\": candidate_id,        \"fit_score\": result[\"fit_score\"],        \"verdict\": result[\"verdict\"],        \"latency_seconds\": round(            latency,            3,        ),        \"required_gaps\": \",\".join(            result[\"required_gaps\"]        ),        \"error\": \"\",    }except (    PdfTextError,    FmcError,    ValueError,) as error:    return {        \"candidate_id\": candidate_id,        \"fit_score\": \"\",        \"verdict\": \"manual_review\",        \"latency_seconds\": \"\",        \"required_gaps\": \"\",        \"error\": str(error),    }def main() -&gt; None:load_dotenv()parser = argparse.ArgumentParser()parser.add_argument(    \"--vacancy\",    type=Path,    required=True,)parser.add_argument(    \"--resumes\",    type=Path,    required=True,)parser.add_argument(    \"--results\",    type=Path,    default=Path(\"results\"),)args = parser.parse_args()vacancy = load_vacancy(    args.vacancy)pdf_files = sorted(    args.resumes.glob(\"*.pdf\"))if not pdf_files:    raise RuntimeError(        \"\u0412 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u043d\u0435\u0442 PDF\"    )client = FmcClient()summary_rows = []for number, pdf_path in enumerate(    pdf_files,    start=1,):    print(        f\"[{number}\/{len(pdf_files)}] \"        f\"{pdf_path.name}\"    )    row = process_resume(        pdf_path=pdf_path,        vacancy=vacancy,        client=client,        results_dir=args.results,    )    summary_rows.append(row)    print(        f\"  verdict={row['verdict']} \"        f\"score={row['fit_score']}\"    )write_summary_csv(    summary_rows,    args.results \/ \"summary.csv\",)if __name__ == \"__main__\":main()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eea\/610\/c4a\/eea610c4a1e5ecbd9f94b074f66dc73f.png\" width=\"875\" height=\"1207\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/eea\/610\/c4a\/eea610c4a1e5ecbd9f94b074f66dc73f.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eea\/610\/c4a\/eea610c4a1e5ecbd9f94b074f66dc73f.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h2>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441<\/h2>\n<pre><code class=\"bash\">source .venv\/bin\/activatepython3 -m src.main --vacancy vacancies\/middle-devops.yaml --resumes resumes --results results<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043f\u0443\u0441\u0442\u044f \u043f\u0430\u0440\u0443 \u043c\u0438\u043d\u0443\u0442, \u0432 \u043f\u0430\u043f\u043a\u0435 results \u0432\u0438\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u0441\u0430\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/df9\/46d\/e1f\/df946de1fdc8f0feb4313bdeb6326b06.png\" width=\"875\" height=\"200\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/df9\/46d\/e1f\/df946de1fdc8f0feb4313bdeb6326b06.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/df9\/46d\/e1f\/df946de1fdc8f0feb4313bdeb6326b06.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/979\/b99\/01e\/979b9901e073dc5864a31fe65cdefdaf.png\" width=\"875\" height=\"397\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/979\/b99\/01e\/979b9901e073dc5864a31fe65cdefdaf.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/979\/b99\/01e\/979b9901e073dc5864a31fe65cdefdaf.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u044d\u0442\u043e \u0443\u0441\u043f\u0435\u0445. \u041e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442! \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0435 \u043e\u0442\u0447\u0435\u0442\u044b \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0440\u0435\u0437\u044e\u043c\u0435:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/280\/d96\/a8c\/280d96a8c4109f90d10ea55e2b0809de.png\" width=\"875\" height=\"1210\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/280\/d96\/a8c\/280d96a8c4109f90d10ea55e2b0809de.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/280\/d96\/a8c\/280d96a8c4109f90d10ea55e2b0809de.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/48e\/0c9\/7d7\/48e0c97d7a633953170404434bd4524a.png\" width=\"875\" height=\"1156\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/48e\/0c9\/7d7\/48e0c97d7a633953170404434bd4524a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/48e\/0c9\/7d7\/48e0c97d7a633953170404434bd4524a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/912\/7f8\/6ad\/9127f86ad08a68ba6997e3aad0beccbc.png\" width=\"875\" height=\"1162\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/912\/7f8\/6ad\/9127f86ad08a68ba6997e3aad0beccbc.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/912\/7f8\/6ad\/9127f86ad08a68ba6997e3aad0beccbc.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/288\/4e9\/6c1\/2884e96c14edea2524053311c415883c.png\" width=\"875\" height=\"1244\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/288\/4e9\/6c1\/2884e96c14edea2524053311c415883c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/288\/4e9\/6c1\/2884e96c14edea2524053311c415883c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/df7\/576\/832\/df7576832eea6f29310f4c1a1977bab6.png\" width=\"875\" height=\"1174\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/df7\/576\/832\/df7576832eea6f29310f4c1a1977bab6.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/df7\/576\/832\/df7576832eea6f29310f4c1a1977bab6.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041d\u0435 \u0441\u0442\u0430\u043b \u0431\u044b \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u044f\u043c \u0433\u043e\u0442\u043e\u0432\u0430\u044f ATS, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u043a \u0441\u0435\u0431\u0435 \u0432 CRM \u0438 \u043f\u0430\u0447\u043a\u0430\u043c\u0438 \u043e\u0442\u0441\u0435\u0438\u0432\u0430\u0442\u044c \u0432\u0430\u0439\u0431\u043a\u043e\u0434\u0435\u0440\u043e\u0432.<\/p>\n<p>\u0412\u043e\u0442 \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0443 \u21165, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0431\u0440\u0430\u043b 78 \u0431\u0430\u043b\u043b\u043e\u0432:<\/p>\n<pre><code class=\"json\">{  \"fit_score\": 78,  \"verdict\": \"match\",  \"candidate_summary\": \"Site Reliability Engineer \u0441 3 \u0433\u043e\u0434\u0430\u043c\u0438 \u043e\u043f\u044b\u0442\u0430 \u0432 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 Linux, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438, Kubernetes, CI\/CD \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0435 \u0432 production.\",  \"criteria\": [{  \"id\": \"linux_production\",  \"title\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Linux \u0432 production\",  \"required\": true,  \"weight\": 20,  \"level\": 3,  \"status\": \"confirmed\",  \"points\": 15.0,  \"evidence\": [    \"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b Linux-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043a\u0440\u0443\u043f\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430.\"  ],  \"comment\": \"production \u043e\u043f\u044b\u0442\"},{  \"id\": \"automation\",  \"title\": \"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\",  \"required\": true,  \"weight\": 15,  \"level\": 3,  \"status\": \"confirmed\",  \"points\": 11.25,  \"evidence\": [    \"\u0423\u043f\u0440\u0430\u0432\u043b\u044f\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 SaltStack.\"  ],  \"comment\": \"SaltStack \u0432 production\"},{  \"id\": \"containers\",  \"title\": \"\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438\",  \"required\": true,  \"weight\": 15,  \"level\": 3,  \"status\": \"confirmed\",  \"points\": 11.25,  \"evidence\": [    \"\u0421\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u043b Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b \u0438 Helm-\u0447\u0430\u0440\u0442\u044b.\"  ],  \"comment\": \"K8s \u0438 Helm\"},{  \"id\": \"ci_cd\",  \"title\": \"\u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 CI\/CD\",  \"required\": true,  \"weight\": 15,  \"level\": 3,  \"status\": \"confirmed\",  \"points\": 11.25,  \"evidence\": [    \"\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u043b Argo CD \u0434\u043b\u044f GitOps-\u0434\u0435\u043f\u043b\u043e\u044f.\"  ],  \"comment\": \"GitOps \u0447\u0435\u0440\u0435\u0437 Argo CD\"},{  \"id\": \"monitoring\",  \"title\": \"\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\",  \"required\": true,  \"weight\": 10,  \"level\": 3,  \"status\": \"confirmed\",  \"points\": 7.5,  \"evidence\": [    \"\u041f\u043e\u0441\u0442\u0440\u043e\u0438\u043b \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043d\u0430 Prometheus \u0438 Grafana.\"  ],  \"comment\": \"Prometheus + Grafana\"},{  \"id\": \"troubleshooting\",  \"title\": \"\u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\",  \"required\": true,  \"weight\": 10,  \"level\": 4,  \"status\": \"confirmed\",  \"points\": 10.0,  \"evidence\": [    \"\u0421\u043d\u0438\u0437\u0438\u043b MTTR production-\u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u043e\u0432 \u0441 50 \u0434\u043e 20 \u043c\u0438\u043d\u0443\u0442.\",    \"\u041f\u0440\u043e\u0432\u043e\u0434\u0438\u043b \u0440\u0430\u0437\u0431\u043e\u0440 \u0430\u0432\u0430\u0440\u0438\u0439.\"  ],  \"comment\": \"\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e MTTR\"},{  \"id\": \"kubernetes\",  \"title\": \"Kubernetes\",  \"required\": false,  \"weight\": 10,  \"level\": 3,  \"status\": \"confirmed\",  \"points\": 7.5,  \"evidence\": [    \"\u0421\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u043b Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b \u0438 Helm-\u0447\u0430\u0440\u0442\u044b.\"  ],  \"comment\": \"\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 K8s\"},{  \"id\": \"terraform_cloud\",  \"title\": \"Terraform \u0438 \u043e\u0431\u043b\u0430\u0447\u043d\u0430\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\",  \"required\": false,  \"weight\": 5,  \"level\": 3,  \"status\": \"confirmed\",  \"points\": 3.75,  \"evidence\": [    \"\u0421\u043e\u0437\u0434\u0430\u0432\u0430\u043b \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 AWS \u0447\u0435\u0440\u0435\u0437 Terraform.\"  ],  \"comment\": \"Terraform + AWS\"}  ],  \"required_gaps\": [],  \"unclear_points\": [],  \"interview_questions\": [    \"\u041a\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0438 \u043a\u0430\u043a \u0438\u0437\u043c\u0435\u0440\u044f\u043b\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c?\",    \"\u041a\u0430\u043a\u0438\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0432 Argo CD \u0431\u044b\u043b\u0438 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u044b?\"  ],  \"short_reason\": \"\u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u0442\u0435\u043a SRE \u0441 \u0434\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438\",  \"extraction_quality\": \"good\",  \"candidate_id\": \"resume-005\",  \"source_file\": \"resume-005.pdf\",  \"latency_seconds\": 39.67}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0438\u0441\u0443\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u0435\u0435 \u0431\u044b\u043b\u043e:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f75\/822\/ae3\/f75822ae3b69e21b0239cfb3886094f4.png\" width=\"875\" height=\"239\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f75\/822\/ae3\/f75822ae3b69e21b0239cfb3886094f4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f75\/822\/ae3\/f75822ae3b69e21b0239cfb3886094f4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0418\u0442\u043e\u0433\u043e: 2 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0438\u0437 5 (40%). \u0434\u0432\u0430 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 <code>match<\/code>, \u0434\u0432\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0430 \u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0438 \u043e\u0434\u0438\u043d \u043f\u043e\u043b\u0443\u0447\u0438\u043b <code>no_match<\/code>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0435 \u0441\u043f\u0440\u044f\u0442\u0430\u043b\u0430 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 \u0432 <code>no_match<\/code>, \u0432\u044b\u0431\u0440\u0430\u0432 \u0434\u043b\u044f \u0441\u043f\u043e\u0440\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0431\u043e\u043b\u0435\u0435 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u044b\u0439 <code>manual_review<\/code>. \u0418\u0434\u0435\u043c \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e!<\/p>\n<p>\u0421\u0430\u043c\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0437\u0434\u0435\u0441\u044c \u0434\u0432\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0440\u0435\u0437\u044e\u043c\u0435. \u041a\u0430\u043d\u0434\u0438\u0434\u0430\u0442 \u21164 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0434\u0430\u0441\u0442 \u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u0431\u0430\u043b\u043b \u0437\u0430 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u0431\u0435\u0437 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432. \u041a\u0430\u043d\u0434\u0438\u0434\u0430\u0442 \u21165 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u0442\u0435\u043a, \u0430 \u043d\u0435 \u0438\u0441\u043a\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0447\u043d\u044b\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0441 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0435\u0439.<\/p>\n<h3>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/h3>\n<p>\u041e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0440\u0435\u0437\u044e\u043c\u0435 \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u044e \u043f\u044f\u0442\u044c \u0440\u0430\u0437:<\/p>\n<pre><code class=\"python\">for run in {1..5}; do  mkdir -p \"results\/run-$run\"  python3 -m src.main \\--vacancy vacancies\/middle-devops.yaml \\--resumes resumes-one \\--results \"results\/run-$run\"done<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0431\u0430\u043b\u043b, <code>verdict<\/code>, \u0443\u0440\u043e\u0432\u043d\u0438 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u0432, \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f9a\/3fb\/686\/f9a3fb686a82417052c34660f6ad8bdc.png\" width=\"875\" height=\"371\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f9a\/3fb\/686\/f9a3fb686a82417052c34660f6ad8bdc.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f9a\/3fb\/686\/f9a3fb686a82417052c34660f6ad8bdc.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u0442\u0430\u0431\u0438\u043b\u0435\u043d:<\/p>\n<ul>\n<li>\n<p>\u0440\u0430\u0437\u0431\u0440\u043e\u0441 0 \u0431\u0430\u043b\u043b\u043e\u0432,<\/p>\n<\/li>\n<li>\n<p>\u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0434\u0438\u043a\u0442\u043e\u0432 5 \u0438\u0437 5,<\/p>\n<\/li>\n<li>\n<p>\u0443\u0440\u043e\u0432\u043d\u0438 \u0432\u0441\u0435\u0445 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u0432 \u0441\u043e\u0432\u043f\u0430\u043b\u0438,<\/p>\n<\/li>\n<li>\n<p>\u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0441\u043e\u0432\u043f\u0430\u043b\u0438 \u0434\u043e\u0441\u043b\u043e\u0432\u043d\u043e,<\/p>\n<\/li>\n<li>\n<p>\u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e \u0441\u043e\u0432\u043f\u0430\u043b\u0438 \u0434\u043e\u0441\u043b\u043e\u0432\u043d\u043e.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0443\u0442 \u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0431\u0430\u043b\u043b \u0433\u0443\u043b\u044f\u0435\u0442 \u043d\u0430 \u0434\u0432\u0430-\u0442\u0440\u0438 \u043f\u0443\u043d\u043a\u0442\u0430, \u0441 \u044d\u0442\u0438\u043c \u0435\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u0436\u0438\u0442\u044c. \u0415\u0441\u043b\u0438 \u043e\u0434\u0438\u043d \u0437\u0430\u043f\u0443\u0441\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442 <code>match<\/code>, \u0430 \u0434\u0440\u0443\u0433\u043e\u0439 <code>no_match<\/code>, \u0442\u0430\u043a\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0422\u043e\u0436\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0439 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442.<\/p>\n<h2>\u0427\u0442\u043e \u0435\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u044c<\/h2>\n<h3>\u0412\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u044c JSON<\/h3>\n<p><code>valid_json_rate<\/code> = \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \/ \u0432\u0441\u0435 \u043e\u0442\u0432\u0435\u0442\u044b. \u0422\u043e \u0435\u0441\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,<\/p>\n<p>\u043f\u0440\u0438 49 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u043e\u0442\u0432\u0435\u0442\u0430\u0445 \u0438\u0437 50 <code>valid_json_rate<\/code> = 98%.<\/p>\n<h3>\u0414\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432<\/h3>\n<p><code>evidence_match_rate<\/code> = \u0434\u043e\u0441\u043b\u043e\u0432\u043d\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u0446\u0438\u0442\u0430\u0442\u044b \/ \u0432\u0441\u0435 \u0446\u0438\u0442\u0430\u0442\u044b. \u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0430 \u0446\u0438\u0442\u0430\u0442\u0443, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u043e\u043c\u0435\u0447\u0435\u043d \u0434\u043b\u044f \u0440\u0443\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.<\/p>\n<h3>\u0412\u0440\u0435\u043c\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/h3>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e PDF \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f <code>latency_seconds<\/code>:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c59\/e66\/18a\/c59e6618a36e9a7975f3ef44157f176d.png\" width=\"875\" height=\"374\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c59\/e66\/18a\/c59e6618a36e9a7975f3ef44157f176d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c59\/e66\/18a\/c59e6618a36e9a7975f3ef44157f176d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h3>\u041e\u0446\u0435\u043d\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0434\u043b\u044f 400 \u0440\u0435\u0437\u044e\u043c\u0435<\/h3>\n<p>\u041f\u0440\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e \u0441\u0440\u0435\u0434\u043d\u0435\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u044e\u043c\u0435 \u00d7 400. \u0422\u043e \u0435\u0441\u0442\u044c \u0435\u0441\u043b\u0438 \u043e\u0434\u043d\u043e \u0440\u0435\u0437\u044e\u043c\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f 12 \u0441\u0435\u043a\u0443\u043d\u0434, \u0442\u043e 12 \u00d7 400 = 4 800 \u0441\u0435\u043a\u0443\u043d\u0434 \u2248 80 \u043c\u0438\u043d\u0443\u0442. \u041d\u043e \u044d\u0442\u043e \u043f\u043e\u043a\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430.<\/p>\n<p>\u0420\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0440\u0435\u0437\u044e\u043c\u0435, \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441-\u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043b\u0438\u043c\u0438\u0442\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0432\u0430 \u0438\u043b\u0438 \u0447\u0435\u0442\u044b\u0440\u0435 worker-\u043f\u043e\u0442\u043e\u043a\u0430 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c throughput. \u0421\u0440\u0430\u0437\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c 50 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u0441\u0435 \u043d\u0430\u0434\u043e \u0441\u0440\u043e\u0447\u043d\u043e \u0438 \u0432\u0447\u0435\u0440\u0430 \u2014 \u043f\u043b\u043e\u0445\u0430\u044f \u0438\u0434\u0435\u044f.<\/p>\n<h3>\u041b\u043e\u0436\u043d\u044b\u0435 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b<\/h3>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u2014 \u043d\u0435 \u0441\u043f\u0440\u044f\u0442\u0430\u043b\u0438 \u043b\u0438 \u043c\u044b \u0441\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430 \u0432 \u0445\u0432\u043e\u0441\u0442 \u0432\u044b\u0434\u0430\u0447\u0438? \u0415\u0441\u043b\u0438 HR \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043e\u0442\u043c\u0435\u0442\u0438\u043b 20 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432, \u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b\u0430 18 \u0438\u0437 \u043d\u0438\u0445 \u0432 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043d\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0442\u043e recall = 18 \/ 20 = 0.9.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0438\u0448\u043d\u0438\u0445 \u0440\u0435\u0437\u044e\u043c\u0435, \u0447\u0435\u043c \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0440\u043e\u0433\u0438 \u044f \u0431\u044b \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043b \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 <code>manual_review<\/code>, \u0430 \u043d\u0435 \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u043e\u0433\u043e <code>no_match<\/code>. \u0415\u0441\u043b\u0438 \u043e\u043f\u0430\u0441\u0430\u0435\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u043e \u0434\u043b\u044f \u0431\u044e\u0434\u0436\u0435\u0442\u0430 \u043d\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0442\u043e \u043d\u0435\u0442. FMC \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u043f\u043b\u0430\u0442\u044b \u043f\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044e \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0430 \u043d\u0435 \u0442\u043e\u043a\u0435\u043d\u043e\u0432. \u0422\u043e \u0435\u0441\u0442\u044c \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0441\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0437\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441-\u0441\u0435\u0440\u0432\u0435\u0440\u0430: GPU, vCPU, RAM \u0438 \u0434\u0438\u0441\u043a, \u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043d\u0435 \u0442\u0430\u0440\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0435\u0449\u0435 \u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430. \u042d\u0442\u043e \u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u0438\u043b\u044c\u043d\u044b\u0439 SRE-\u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u0441 SaltStack \u0438 Argo CD \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043d\u043e\u043b\u044c \u0431\u0430\u043b\u043b\u043e\u0432 \u0437\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 Ansible \u0438 GitLab CI. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435, \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044e \u0435\u0441\u0442\u044c \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435. \u0422\u0430\u043a \u0447\u0442\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 <code>manual_review<\/code> \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442\u0441\u044f \u0448\u0430\u043d\u0441, \u0447\u0442\u043e HR \u0443\u0432\u0438\u0434\u0438\u0442 \u043d\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0435 \u00ab88 \u0431\u0430\u043b\u043b\u043e\u0432\u00bb, \u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u0438\u0437 \u0440\u0435\u0437\u044e\u043c\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0442\u043e \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442 \u0441\u043d\u0438\u0437\u0438\u043b MTTR \u0441 50 \u0434\u043e 20 \u043c\u0438\u043d\u0443\u0442.<\/p>\n<p>\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0431\u0430\u043b\u043b \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c, LLM \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u043e\u0439 \u0438 \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u043e\u0440\u043e\u0433\u0438. \u0423\u0440\u043e\u0432\u043d\u0438 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u0432 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u0430\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. PDF \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043c\u043e\u0434\u0435\u043b\u044c \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u043a\u0441\u0442, \u0437\u0430\u0442\u0435\u043c \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u041c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0447\u0438\u0449\u0435\u043d\u043d\u0443\u044e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e.<\/p>\n<p>Tools \u043d\u0435 \u043d\u0443\u0436\u043d\u044b, \u0438\u0445 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442. \u0412\u0441\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0d0\/36f\/03c\/0d036f03ce9e5d17e0a44f293e58a48c.png\" width=\"875\" height=\"46\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/0d0\/36f\/03c\/0d036f03ce9e5d17e0a44f293e58a48c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0d0\/36f\/03c\/0d036f03ce9e5d17e0a44f293e58a48c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h2>\u0413\u0434\u0435 \u043d\u0430\u0447\u0430\u043b\u0438\u0441\u044c \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0441\u0442\u0438<\/h2>\n<p>PDF \u2014 \u044d\u0442\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0442\u0435\u043a\u0441\u0442. \u041a\u0440\u0430\u0441\u0438\u0432\u043e\u0435 \u0440\u0435\u0437\u044e\u043c\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0430\u0432\u044b\u043a\u043e\u0432 \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043e\u043f\u044b\u0442\u043e\u043c, \u0430 \u0441\u043a\u0430\u043d \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442, \u0447\u0442\u043e\u0431\u044b \u0441\u0430\u043c\u043e\u043c\u0443 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0443\u0439\u0434\u0435\u0442 \u0432 \u043c\u043e\u0434\u0435\u043b\u044c.<\/p>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0414\u0430\u0436\u0435 \u0441 \u0445\u043e\u0440\u043e\u0448\u0438\u043c \u043f\u0440\u043e\u043c\u043f\u0442\u043e\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0432\u044b\u0448\u0430\u0442\u044c \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043e 20 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u044f\u0432\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e: <code>\u0423\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435 \u0431\u0435\u0437 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u2014 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 1 \u0431\u0430\u043b\u043b\u0430<\/code>. \u0418\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u0435\u043d \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u0441\u0442 \u0441 keyword stuffing, \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u043c\u0430\u043d\u0443\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u0415\u0449\u0435 \u043c\u043e\u0434\u0435\u043b\u044c \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0435\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0442\u0440\u0435\u0431\u0443\u044e \u0434\u043e\u0441\u043b\u043e\u0432\u043d\u044b\u0435 \u0446\u0438\u0442\u0430\u0442\u044b. \u041d\u043e \u0442\u0443\u0442 \u0432\u044b\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f, \u0447\u0442\u043e LLM \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u0435\u0433\u043a\u0430 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0444\u0440\u0430\u0437\u0443. \u0422\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0438 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0446\u0438\u0442\u0430\u0442\u0443 \u043d\u0435\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u043d\u043e\u0439. \u041c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043d\u0435\u0447\u0435\u0442\u043a\u043e\u043c\u0443 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e, \u043d\u043e \u044f \u0431\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0441\u0442\u0440\u043e\u0433\u0438\u0439 \u0440\u0435\u0436\u0438\u043c. \u041b\u0443\u0447\u0448\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043b\u0438\u0448\u043d\u0435\u0435 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435, \u0447\u0435\u043c \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d\u043d\u043e\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0437\u0430 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435.<\/p>\n<p>\u041f\u043e\u0440\u043e\u0433 75 \u0431\u0430\u043b\u043b\u043e\u0432 \u2014 \u043d\u0435 \u0438\u0441\u0442\u0438\u043d\u0430, \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u043f\u043e\u0440\u043e\u0433\u0438 \u043d\u0430\u0434\u043e \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0442\u044c \u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0447\u0435\u043d\u043d\u043e\u043c \u043d\u0430\u0431\u043e\u0440\u0435 \u0440\u0435\u0437\u044e\u043c\u0435 \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438. \u0420\u0435\u0437\u044e\u043c\u0435 \u043d\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e, \u0442\u0430\u043a \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u0430, \u044d\u0442\u043e \u0435\u0449\u0435 \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442 \u0441 \u043d\u0435\u0439 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0442\u0430\u0442\u0443\u0441\u044b \u044f \u043d\u0430\u0437\u0432\u0430\u043b <code>not_found<\/code>, \u0430 \u043d\u0435 <code>candidate_does_not_know<\/code>. \u041d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u0438 \u0448\u043b\u0438\u0444\u043e\u0432\u043a\u0430 \u043d\u0430\u043f\u0438\u043b\u044c\u043d\u0438\u043a\u043e\u043c.<\/p>\n<h2>\u0427\u0435\u0433\u043e \u043d\u0435\u0442 \u0432 \u044d\u0442\u043e\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0435<\/h2>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043c\u043d\u043e\u0439 \u0441\u0435\u0440\u0432\u0438\u0441:<\/p>\n<ul>\n<li>\n<p>\u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0442\u043a\u0430\u0437\u044b,<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u043f\u0438\u0448\u0435\u0442 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430\u043c,<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0432\u0441\u0442\u0440\u0435\u0447\u0438,<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u0442\u0430\u0442\u0443\u0441\u044b \u0432 ATS,<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0440\u0435\u0437\u044e\u043c\u0435,<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u043d\u0430\u0439\u043c\u0435,<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u0442 \u043b\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430,<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0432\u043e\u0437\u0440\u0430\u0441\u0442, \u043f\u043e\u043b \u0438\u043b\u0438 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 HR \u043f\u043e \u0438\u0442\u043e\u0433\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 \u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b. \u041c\u043e\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0434\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0441\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u043d\u043e \u043d\u0435 \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u0438\u0437 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.<\/p>\n<h2>\u0418\u0442\u043e\u0433\u0438 \u0441\u0435\u0433\u043e \u043c\u0435\u0440\u043e\u043f\u0440\u0438\u044f\u0442\u0438\u044f<\/h2>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u043b\u043e\u0441\u044c \u0432\u0441\u0435 \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u044b: \u043e\u0434\u043d\u043e\u043c\u0443 HR \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0437\u0430 \u0434\u0435\u043d\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c 400 \u0440\u0435\u0437\u044e\u043c\u0435 \u0432 PDF, \u043d\u0435 \u043e\u0442\u0441\u0435\u044f\u0442\u044c \u0441\u0438\u043b\u044c\u043d\u044b\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 \u0438 \u043d\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043b\u0430\u0431\u044b\u0445.\u00a0<\/p>\n<p>\u0412\u0441\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u043e\u043c Python. \u041c\u043e\u0434\u0435\u043b\u044c \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430 \u0441\u043c\u044b\u0441\u043b\u043e\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c: \u0438\u0449\u0435\u0442 \u0432 \u0440\u0435\u0437\u044e\u043c\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430 \u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0445 \u0441 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438.<\/p>\n<p>\u042f \u0432\u044b\u0431\u0440\u0430\u043b text-to-text-\u043c\u043e\u0434\u0435\u043b\u044c, \u0441\u043e\u0437\u0434\u0430\u043b \u0441\u0435\u0440\u0432\u0438\u0441 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442, \u043d\u0435 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044f GPU-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435 \u2014 \u044f \u043d\u0435 \u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c LLM \u0432 \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0433\u043e HR-\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0430. \u041e\u043d\u0430 \u043d\u0435 \u0440\u0435\u0448\u0430\u0435\u0442 \u0441\u0443\u0434\u044c\u0431\u0443 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430, \u043d\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043d\u0430 \u043a\u0430\u043a\u0438\u0435 \u0440\u0435\u0437\u044e\u043c\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u041f\u043e-\u043c\u043e\u0435\u043c\u0443, \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u2014 \u043d\u0435 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u0430, \u0430 \u0437\u0430\u0431\u0440\u0430\u0442\u044c \u0443 \u043d\u0435\u0433\u043e \u0440\u0443\u0442\u0438\u043d\u0443, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043d \u0443\u0436\u0435 \u043f\u043b\u0430\u0447\u0435\u0442 \u043a\u0440\u043e\u0432\u0430\u0432\u044b\u043c\u0438 \u0441\u043b\u0435\u0437\u0430\u043c\u0438.<\/p>\n<p>\u041a\u043e\u043d\u0435\u0446!<\/p>\n<\/div>\n<p>\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\/1085956\/\">https:\/\/habr.com\/ru\/articles\/1085956\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041a\u043e\u0433\u0434\u0430 \u0432 \u0434\u0435\u043d\u044c \u0432\u0430\u043c \u043f\u0440\u0438\u0441\u044b\u043b\u0430\u044e\u0442 400 \u0440\u0435\u0437\u044e\u043c\u0435 \u043d\u0430 \u043e\u0434\u043d\u0443 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u044e, \u00ab\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0441\u0435\u0445\u00bb \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f. \u0417\u0430\u0442\u043e \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u044f\u043c\u043e \u043a\u0430\u043a \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u043e\u0434 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e!\u0418\u0442\u0430\u043a, \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u044f \u0438 \u043e\u0433\u0440\u043e\u043c\u043d\u0430\u044f \u043f\u0430\u0447\u043a\u0430 PDF-\u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u0440\u0435\u0437\u044e\u043c\u0435. \u041d\u0430\u0434\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0432 \u043a\u0430\u043a\u0438\u0445 \u0438\u0437 \u043d\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044e\u0442\u0441\u044f \u043d\u0443\u0436\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u0435\u0442\u0435\u043d\u0446\u0438\u0438, \u0433\u0434\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0438 \u043a\u043e\u0433\u043e \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0430\u043c \u043d\u0430\u0439\u043c \u0438\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u043e\u0442\u043a\u0430\u0437\u043e\u0432. \u0412 \u043a\u0435\u0439\u0441\u0435 \u043d\u0438\u0436\u0435 LLM \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0432\u044b\u0436\u0438\u043c\u043a\u0443 \u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u0442\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0437\u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043c.\u041f\u043e \u0438\u0434\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u0418\u0418\u0448\u043d\u0438\u0446\u0443, \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0442\u0443\u0434\u0430 \u043f\u0430\u0447\u043a\u0443 \u0440\u0435\u0437\u044e\u043c\u0435 \u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. \u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f, \u0430 \u0435\u0440\u0443\u043d\u0434\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043d\u0435 \u043d\u0443\u0436\u0435\u043d API, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438 \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0435\u0437\u044e\u043c\u0435. \u0414\u043b\u044f \u043c\u0435\u043d\u044f \u0442\u0443\u0442 \u0432\u0430\u0436\u0435\u043d \u0438\u043c\u0435\u043d\u043d\u043e \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438. \u042f \u043d\u0435 \u0445\u043e\u0447\u0443 \u0438\u0441\u043a\u0430\u0442\u044c GPU, \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u0430 \u043c\u043e\u0434\u0435\u043b\u0438, \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e CUDA, \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c vLLM, \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0432\u043b\u0435\u0437\u0435\u0442 \u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u044c, \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 ML-\u0437\u043e\u043e\u043f\u0430\u0440\u043a \u0438 \u0432\u044b\u044f\u0441\u043d\u044f\u0442\u044c, \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0432\u0441\u0435 \u0441\u043d\u043e\u0432\u0430 \u0443\u043f\u0430\u043b\u043e.\u0421\u0442\u0430\u0442\u044c\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0420\u043e\u043c\u0430\u043d \u0428\u0443\u0431\u0438\u043d, CTO \u0438 \u0430\u0432\u0442\u043e\u0440 Telegram-\u043a\u0430\u043d\u0430\u043b\u0430 Bash Days.\u0418\u0434\u0435\u044f \u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430\u0414\u0430, \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0434\u043e\u043c\u0430\u0448\u043d\u0438\u0439 LLM-\u0441\u0442\u0435\u043a, \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0434\u043e \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u043a\u0440\u0438\u0437\u0438\u0441\u043e\u0432 \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e, \u043d\u043e \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u043d\u0435 \u043d\u0435 \u043f\u043e\u0434\u043e\u0448\u043b\u043e. \u041e\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u044d\u0442\u0443 \u043c\u0430\u0445\u0438\u043d\u0443 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0439, \u0430 \u044f \u0447\u0430\u0441\u0442\u0435\u043d\u044c\u043a\u043e \u043d\u0430\u0445\u043e\u0436\u0443\u0441\u044c \u0432 \u043f\u0435\u0440\u0435\u043b\u0435\u0442\u0430\u0445 \u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u0442\u0440\u0435\u0432\u043e\u0436\u0443\u0441\u044c, \u0435\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0434\u043e\u043c\u0430 \u00ab\u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0439 \u0443\u0442\u044e\u0433\u00bb. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0431\u043e\u0440 \u043f\u0430\u043b \u043d\u0430 FMC. \u0412\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043c\u043e\u0441\u043a\u043e\u0432\u0441\u043a\u0438\u0445 \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u043e\u0432 Selectel, \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442 \u043c\u043e\u0435 \u044d\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0432 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0438 \u0432 \u043b\u044e\u0431\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u0422\u043e \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e! Self-hosted \u2014 \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u043f\u043e\u0434 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u0441\u0435 \u0436\u0435 \u043b\u0443\u0447\u0448\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u0435\u0435.\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u043c\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043c\u043e\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435, \u0441\u0435\u0440\u0432\u0438\u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442 \u044d\u0442\u0438 \u0437\u043e\u043d\u044b. \u0422\u043e \u0435\u0441\u0442\u044c Selectel \u0434\u0430\u0435\u0442 \u043c\u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442, \u0430 \u044f \u0443\u0436\u0435 \u0440\u0435\u0448\u0430\u044e, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u0441\u0432\u043e\u0435\u043c \u043a\u043e\u0434\u0435.\u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u043e\u0435\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, FMC \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 public preview. \u0418\u043d\u0444\u0435\u0440\u0435\u043d\u0441-\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e, \u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f.\u041d\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0432\u0437\u044f\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438, \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0442\u0435\u043a\u0441\u0442 \u0438\u0437 \u0440\u0435\u0437\u044e\u043c\u0435, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430 \u043f\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044f\u043c \u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u043e\u0442\u0447\u0435\u0442 \u0434\u043b\u044f HR. \u0412\u0430\u0436\u043d\u043e \u2014 \u043d\u0435 \u0443\u043b\u0443\u0447\u0448\u0430\u0442\u044c \u0440\u0435\u0437\u044e\u043c\u0435, \u043d\u0435 \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430, \u043d\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e, \u0432\u043e\u0437\u0440\u0430\u0441\u0442 \u0438\u043b\u0438 \u0441\u0435\u043c\u0435\u0439\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0410 \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u0438\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0441 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438.\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0430\u043f\u043a\u0438 \u0441 400 \u0440\u0435\u0437\u044e\u043c\u0435 \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443:\u041a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435\u0418\u0442\u043e\u0433resume-001.pdf88\/100\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u043e\u0444\u0438\u043b\u044eresume-002.pdf61\/100\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0443\u0447\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430resume-003.pdf34\/100\u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439resume-004.pdf42\/100\u043c\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0441\u043b\u043e\u0432, \u043c\u0430\u043b\u043e \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432resume-005.pdf84\/100\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u043e\u0444\u0438\u043b\u044e\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0431\u0430\u043b\u043b\u0443 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432\u0438\u0434\u043d\u044b \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430:\u041a\u0440\u0438\u0442\u0435\u0440\u0438\u0439: CI\/CD\u0423\u0440\u043e\u0432\u0435\u043d\u044c: 4 \u0438\u0437 4\u0414\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430:\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b GitLab CI pipeline \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f 18 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\u0421\u043e\u043a\u0440\u0430\u0442\u0438\u043b \u0432\u0440\u0435\u043c\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u0441 35 \u0434\u043e 12 \u043c\u0438\u043d\u0443\u0442.\u0415\u0441\u043b\u0438 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u043d\u0435\u0442, \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u0447\u0435\u0441\u0442\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c: \u00ab\u0412 \u0442\u0435\u043a\u0441\u0442\u0435 \u0440\u0435\u0437\u044e\u043c\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e\u00bb, \u0430 \u043d\u0435 \u0434\u043e\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c \u043e\u043f\u044b\u0442 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430.\u0414\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0440\u0435\u0437\u044e\u043c\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u0430\u044f text-to-text-\u043c\u043e\u0434\u0435\u043b\u044c. \u041d\u0430 \u0432\u0445\u043e\u0434 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u044e, \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0438 \u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442, \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 JSON. \u041d\u0438\u043a\u0430\u043a\u0438\u0435 model tools \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f. \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 Python:\u041c\u043e\u0434\u0435\u043b\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u0430\u043c\u0430 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438\u043b\u0438 \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430 \u0432 \u043a\u0430\u0434\u0440\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u041e\u043d\u0430 \u0440\u0435\u0448\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u2014 \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043e\u0446\u0435\u043d\u043a\u0443 \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044f\u043c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0437 \u0440\u0435\u0437\u044e\u043c\u0435.\u0414\u043b\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u044f \u0432\u0437\u044f\u043b t-tech\/T-pro-it-2.1. \u041c\u043e\u0434\u0435\u043b\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0432 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 FMC \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 T-lite, Qwen, Gemma \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 text-to-text-\u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438.\u041f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0430? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443 \u043c\u0435\u043d\u044f \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u044b\u0435. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432 \u0440\u0435\u0437\u044e\u043c\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439, \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0430\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. \u041e\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u043d\u0435 \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u043a\u0438\u0439 \u0442\u0435\u043a\u0441\u0442, \u0430 \u0441\u0442\u0440\u043e\u0433\u043e\u0435 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438:\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u0432,\u043d\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043e\u043f\u044b\u0442,\u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430,\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 JSON,\u043d\u0435 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0431\u0430\u043b\u043b \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0443\u043d\u043a\u0442 \u0442\u0443\u0442 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u0435\u043d. \u041c\u043e\u0434\u0435\u043b\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430, \u0438\u0442\u043e\u0433\u043e\u0432\u0443\u044e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 Python. \u0418\u043d\u0430\u0447\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u043e\u0446\u0435\u043d\u043a\u0438 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u0432 \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u0432 78 \u0431\u0430\u043b\u043b\u043e\u0432, \u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0430\u0437 \u2014 \u0432 83. \u041c\u043e\u0434\u0435\u043b\u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u0438\u0434\u043d\u0435\u0435, \u043d\u043e \u043c\u0435\u043d\u044f \u0442\u0430\u043a\u043e\u0439 \u0433\u0438\u0434\u0440\u043e\u043c\u0435\u0442\u0446\u0435\u043d\u0442\u0440 \u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442.\u041f\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0445\u0435\u043c\u0430:LLM \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430. \u041e\u043d\u0430 \u043d\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c, \u043d\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043a\u0430\u0434\u0440\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438 \u043d\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0431\u0430\u043b\u043b. \u0412\u0441\u0435 \u043e\u043f\u0430\u0441\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u043a\u043e\u0434\u0435. \u0420\u043e\u0431\u043e\u0442\u0443 \u043e\u0442\u0434\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u0443\u044e \u0440\u0443\u0442\u0438\u043d\u0443, \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.\u0414\u043b\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u044f \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u044e DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430 \u0443\u0440\u043e\u0432\u043d\u044f middle. \u0422\u0430\u043a \u043c\u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0449\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u0432\u0434\u0440\u0443\u0433 \u0440\u0435\u0448\u0438\u0442, \u0447\u0442\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0441 \u0447\u0435\u0442\u044b\u0440\u044c\u043c\u044f \u0433\u043e\u0434\u0430\u043c\u0438 Django \u0438 \u043e\u0434\u043d\u0438\u043c \u0434\u043e\u043c\u0430\u0448\u043d\u0438\u043c Docker Compose \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 Kubernetes.\u041c\u043e\u043a \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438 (\u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435 \u0437\u0430\u043a\u0438\u043d\u0435\u043c \u0435\u0433\u043e \u0432 \/vacancies\/middle-devops.yaml):id: middle-devopstitle: Middle DevOps \u0438\u043d\u0436\u0435\u043d\u0435\u0440description: |  \u0418\u0449\u0435\u043c DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0438 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439  \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.  \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438:  &#8212; \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Linux-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432;  &#8212; \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438;  &#8212; \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 CI\/CD;  &#8212; \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439;  &#8212; \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430 production-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b;  &#8212; \u0443\u0447\u0430\u0441\u0442\u0438\u0435 \u0432 \u0440\u0430\u0437\u0431\u043e\u0440\u0435 \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u043e\u0432.scoring_scale:  0: \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439 \u0432 \u0440\u0435\u0437\u044e\u043c\u0435 \u043d\u0435\u0442  1: \u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u0430  2: \u0415\u0441\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u043f\u044b\u0442  3: \u0415\u0441\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u044b\u0439 production-\u043e\u043f\u044b\u0442  4: \u0415\u0441\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043e\u043f\u044b\u0442, \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u0440\u0438\u043c\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442criteria:  &#8212; id: linux_productiontitle: \u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Linux \u0432 productionrequired: trueweight: 20expected_evidence:  &#8212; \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u0435 production-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432  &#8212; \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c  &#8212; systemd  &#8212; \u0441\u0435\u0442\u044c  &#8212; \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b  &#8212; \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438  &#8212; id: automationtitle: \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438required: trueweight: 15expected_evidence:  &#8212; Ansible  &#8212; SaltStack  &#8212; Puppet  &#8212; \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438  &#8212; id: containerstitle: \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438required: trueweight: 15expected_evidence:  &#8212; Docker  &#8212; Docker Compose  &#8212; \u0441\u0431\u043e\u0440\u043a\u0430 \u043e\u0431\u0440\u0430\u0437\u043e\u0432      &#8212; \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432  &#8212; id: ci_cdtitle: \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 CI\/CDrequired: trueweight: 15expected_evidence:  &#8212; GitLab CI  &#8212; Jenkins  &#8212; GitHub Actions  &#8212; Argo CD  &#8212; \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0435\u043f\u043b\u043e\u044f  &#8212; id: monitoringtitle: \u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435required: trueweight: 10expected_evidence:  &#8212; Prometheus  &#8212; Grafana  &#8212; Zabbix  &#8212; Loki  &#8212; Alertmanager  &#8212; id: troubleshootingtitle: \u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043crequired: trueweight: 10expected_evidence:  &#8212; \u0440\u0430\u0437\u0431\u043e\u0440 \u0430\u0432\u0430\u0440\u0438\u0439  &#8212; \u043f\u043e\u0438\u0441\u043a \u043f\u0435\u0440\u0432\u043e\u043f\u0440\u0438\u0447\u0438\u043d\u044b  &#8212; \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043b\u043e\u0433\u0430\u043c\u0438 \u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c\u0438  &#8212; \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f  &#8212; id: kubernetestitle: Kubernetesrequired: falseweight: 10expected_evidence:  &#8212; \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430  &#8212; Helm  &#8212; \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435  &#8212; \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430  &#8212; id: terraform_cloudtitle: Terraform \u0438 \u043e\u0431\u043b\u0430\u0447\u043d\u0430\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430required: falseweight: 5expected_evidence:  &#8212; Terraform  &#8212; OpenStack  &#8212; Selectel  &#8212; Yandex Cloud  &#8212; AWS  &#8212; \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u0431\u043b\u0430\u043a\u0430\u0421\u0443\u043c\u043c\u0430 \u0432\u0441\u0435\u0445 \u0432\u0435\u0441\u043e\u0432 == 100. \u041a\u0430\u0436\u0434\u044b\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439 \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u0442 \u043e\u0442 0 \u0434\u043e 4. Python \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432 \u0431\u0430\u043b\u043b\u044b: \u0431\u0430\u043b\u043b\u044b \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044f = \u0432\u0435\u0441 \u00d7 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \/ 4.\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:Linux production\u0412\u0435\u0441: 20\u0423\u0440\u043e\u0432\u0435\u043d\u044c: 3 \u0438\u0437 420 \u00d7 3 \/ 4 = 15 \u0431\u0430\u043b\u043b\u043e\u0432\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430? \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u0445\u043e\u0442\u0435\u043b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u043e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u043c\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438:if &#171;kubernetes&#187; in resume.lower():score += 10\u041d\u043e \u0442\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0435\u0442 \u043d\u0435\u0443\u0432\u044f\u0437\u043e\u0447\u043a\u0430 \u0441 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u043c, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0431\u043b\u043e\u043a:\u041d\u0430\u0432\u044b\u043a\u0438:Linux, Docker, Kubernetes, Terraform, Ansible, GitLab CI, Jenkins, Prometheus, Grafana, AWS, Azure, GCP, OpenStack, Helm, Argo CD, Python, Bash, Go.\u041e\u043d \u0432\u0441\u0435\u0445 \u043e\u0431\u043c\u0430\u043d\u0435\u0442 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0430\u043b\u043b, \u0445\u043e\u0442\u044f \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u044f\u0441\u043d\u043e:\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043b\u0438 \u043e\u043d \u044d\u0442\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u0440\u0430\u0431\u043e\u0442\u0435,\u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043b \u043b\u0438 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e,\u0432\u0438\u0434\u0435\u043b \u043b\u0438 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d,\u043e\u0442\u0432\u0435\u0447\u0430\u043b \u043b\u0438 \u0437\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442,\u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043b \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438.\u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0441\u0438\u043b\u044c\u043d\u044b\u0439 SRE \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Ansible, \u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 SaltStack. \u041f\u043e\u0438\u0441\u043a \u043f\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0441\u043b\u043e\u0432\u0430\u043c \u0441\u043a\u0430\u0436\u0435\u0442: \u00abAnsible \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u2014 \u043d\u043e\u043b\u044c \u0431\u0430\u043b\u043b\u043e\u0432\u00bb. \u0410 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u044f\u0432\u0438\u0442\u044c, \u0447\u0442\u043e SaltStack \u0440\u0435\u0448\u0430\u0435\u0442 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043b\u0430\u0441\u0441 \u0437\u0430\u0434\u0430\u0447 \u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u043e\u043f\u044b\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.\u0412\u043e\u0442 \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u044f\u043c \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0438 \u0432 \u0442\u0435\u043c\u0443. \u0414\u043b\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u043d\u0435 \u0441\u0442\u0430\u043b \u0431\u0440\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u0440\u0435\u0437\u044e\u043c\u0435. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b \u043f\u044f\u0442\u044c \u0441\u0438\u043d\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 PDF \u0441 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c\u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c\u0438. \u0422\u0430\u043a \u044f \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0431\u0435\u0437 \u0441\u043b\u0438\u0432\u0430 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0431\u0443\u0434\u0443 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043c\u043e\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043d\u0430\u0439\u0442\u0438. \u041d\u0443 \u0438\u043b\u0438 \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u043d\u0430\u0440\u043e\u0434\u044c\u0435 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043c\u043e\u043a\u0438.\u0420\u0435\u0437\u044e\u043c\u0435 \u21161: \u0441\u0438\u043b\u044c\u043d\u044b\u0439 DevOpsDevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u041e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b: 4 \u0433\u043e\u0434\u0430\u041e\u041e\u041e \u00ab\u0420\u043e\u0433\u0430 \u0438 \u043a\u043e\u043f\u044b\u0442\u0430\u00bbDevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u041c\u0430\u0439 2023 \u2014 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b 60 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d Ubuntu \u0438 Debian\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 Ansible\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b GitLab CI pipeline \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438, \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f 18 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\u041f\u0435\u0440\u0435\u0432\u0435\u043b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 Docker \u0438 Docker Compose\u0421\u043e\u043a\u0440\u0430\u0442\u0438\u043b \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u0441 35 \u0434\u043e 12 \u043c\u0438\u043d\u0443\u0442\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u043b Prometheus, Grafana, Loki \u0438 Alertmanager\u0423\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0432 \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0438 production-\u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u043e\u0432 \u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 postmortem\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0438\u0437 \u0432\u043e\u0441\u044c\u043c\u0438 worker \u0443\u0437\u043b\u043e\u0432\u0421\u043e\u0437\u0434\u0430\u0432\u0430\u043b \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b \u0432 OpenStack \u0447\u0435\u0440\u0435\u0437 Terraform\u041d\u0430\u0432\u044b\u043a\u0438:Linux, Bash, Python, Ansible, Terraform, Docker, Kubernetes, GitLab CI, Prometheus, Grafana, Loki.\u0420\u0443\u0447\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u2014 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u043e\u0444\u0438\u043b\u044e \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438.\u0420\u0435\u0437\u044e\u043c\u0435 \u21162: \u0441\u0438\u043b\u044c\u043d\u044b\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u041e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b: 6 \u043b\u0435\u0442\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u04402019 \u2014 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b \u0441\u0435\u0440\u0432\u0435\u0440\u044b CentOS \u0438 Ubuntu\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043b nginx, systemd, DNS \u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b Bash \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0434\u043b\u044f \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u043b Zabbix \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0438 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u043b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0434\u0438\u0441\u043a\u0430\u043c\u0438, \u0441\u0435\u0442\u044c\u044e \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u043b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 Docker\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b GitLab CI \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0434\u0432\u0443\u0445 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432\u041f\u0438\u0441\u0430\u043b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 Ansible playbookKubernetes \u0438 Terraform \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0420\u0443\u0447\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u2014 \u0435\u0441\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0430\u044f Linux-\u0431\u0430\u0437\u0430, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0443\u0447\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430.\u0420\u0435\u0437\u044e\u043c\u0435 \u21163: &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-495858","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/495858","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=495858"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/495858\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=495858"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=495858"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=495858"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}