{"id":465327,"date":"2025-07-01T09:00:54","date_gmt":"2025-07-01T09:00:54","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=465327"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=465327","title":{"rendered":"<span>\u0418\u0418-\u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435: \u0441\u0435\u043c\u044c \u0440\u0430\u0437 \u0432\u0430\u0439\u0431-\u043a\u043e\u0434 \u2014 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u043e\u0439\u043c\u0435\u0448\u044c<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u041d\u0430 \u0441\u0432\u044f\u0437\u0438 \u041d\u0438\u043a\u043e\u043b\u0430\u0439 \u0438\u0437 \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u0438 \u0431\u043b\u043e\u0433\u0430 <a href=\"https:\/\/yadro.com?utm_source=habr&amp;utm_medium=referral&amp;utm_campaign=ai-helper-01072025\" rel=\"noopener noreferrer nofollow\">YADRO<\/a>. \u041d\u0430\u0448\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0443 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u044b\u043c \u0438 \u0441\u043c\u0435\u0436\u043d\u044b\u043c \u0442\u0435\u043c\u0430\u043c. \u041c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443, \u0440\u0430\u0434\u0443\u0435\u043c\u0441\u044f \u0438\u043b\u0438 \u043e\u0433\u043e\u0440\u0447\u0430\u0435\u043c\u0441\u044f, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0433\u0438\u043f\u043e\u0442\u0435\u0437\u044b \u0438 \u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u0432 \u043e\u0442\u0432\u0435\u0442 \u0433\u0440\u0430\u0444\u0438\u043a \u0440\u043e\u0441\u0442\u0430 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u043d\u0430 \u043d\u0430\u0441 \u043f\u043e\u0434 \u043d\u043e\u0432\u044b\u043c, \u0431\u043e\u0301\u043b\u044c\u0448\u0438\u043c \u0443\u0433\u043b\u043e\u043c.<\/p>\n<p>\u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0447\u0438\u0441\u043b\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0432 \u0431\u043b\u043e\u0433\u0435 YADRO \u043d\u0435\u0443\u043a\u043b\u043e\u043d\u043d\u043e \u0440\u0430\u0441\u0442\u0435\u0442. \u0410 \u043c\u043e\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u043e\u0439: \u043f\u0430\u0440\u0430-\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u043f\u043b\u044e\u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f\u0440\u043a\u0438\u0445 \u0432\u0441\u043f\u044b\u0448\u0435\u043a \u043f\u043e\u0440\u0430\u043d\u044c\u0448\u0435. \u0417\u0430\u0442\u043e \u0440\u0430\u0441\u0442\u0435\u0442 FOMO \u2014 \u0442\u0440\u0435\u0432\u043e\u0433\u0430, \u0447\u0442\u043e \u044f \u043c\u043e\u0433 \u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u043d\u043e\u0432\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0431\u043b\u043e\u0433\u0430, \u0431\u0443\u0434\u044c \u043c\u043e\u0439 \u0444\u043e\u043a\u0443\u0441 \u0448\u0438\u0440\u0435. \u041f\u043e\u043c\u043e\u0436\u0435\u0442 \u043b\u0438 \u0437\u0434\u0435\u0441\u044c \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442? \u00ab\u041e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u0435\u0439\u0441\u00bb \u2014 \u043e\u0442\u0432\u0435\u0442\u0438\u043b\u0430 ChatGPT, \u0438 \u044f \u043d\u0430\u0447\u0430\u043b \u043f\u0435\u0440\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>\u0412\u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0435 \u0432\u0435\u0441\u044c\u043c\u0430 \u0440\u0430\u0441\u043f\u043b\u044b\u0432\u0447\u0430\u0442\u043e: \u043d\u0443\u0436\u0435\u043d \u0418\u0418-\u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e\u0431\u043e \u0432\u0441\u0435\u0445 \u0442\u0435\u043a\u0441\u0442\u0430\u0445 \u0432 \u0431\u043b\u043e\u0433\u0435 YADRO \u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u043e \u043d\u0438\u043c \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0447\u0430\u0442-\u0431\u043e\u0442\u0430. \u041a\u043e\u0433\u0434\u0430 \u044f \u043d\u0430\u0447\u0438\u043d\u0430\u043b \u043f\u043e\u0441\u0442, \u0432 \u0431\u043b\u043e\u0433\u0435 \u0431\u044b\u043b\u043e 223 \u0441\u0442\u0430\u0442\u044c\u0438, \u0447\u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0440 \u0434\u043b\u044f \u043a\u0440\u043e\u0441\u0441\u043b\u0438\u043d\u043a\u043e\u0432\u043a\u0438. \u0425\u043e\u0447\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b, \u043d\u0430 \u043a\u0430\u043a\u0438\u0435 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u0431\u043b\u043e\u0433\u0430 \u044f \u043c\u043e\u0433\u0443 \u0441\u043e\u0441\u043b\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u043e\u0432\u043e\u0439. \u0411\u044b\u043b\u043e \u0431\u044b \u0437\u0434\u043e\u0440\u043e\u0432\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u0434\u0431\u043e\u0440\u043a\u0438 \u0441\u0442\u0430\u0442\u0435\u0439, \u0447\u0442\u043e \u043c\u044b \u0438\u043d\u043e\u0433\u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0430\u043d\u043e\u043d\u0441\u044b \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u043c\u0438\u0442\u0430\u043f\u043e\u0432. \u0415\u0449\u0435 \u043a\u0430\u043a\u0438\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u044f, \u043d\u0430\u0432\u0435\u0440\u043d\u043e, \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u044e \u043d\u0430 \u0445\u043e\u0434\u0443.<\/p>\n<p>\u0414\u0440\u0443\u0433\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430, \u043a\u0430\u043a \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u2014 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430 \u0432 \u0440\u0430\u0437\u0440\u0435\u0437\u0435 \u0442\u0435\u043c \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0441\u0442\u0430\u0442\u0435\u0439, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445, \u0430 \u043d\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445. \u041d\u043e \u043d\u0435 \u0431\u0443\u0434\u0443 \u0433\u0440\u0443\u0441\u0442\u0438\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435: \u044d\u0442\u043e \u043f\u0435\u0442-\u043f\u0440\u043e\u0435\u043a\u0442, take it easy. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442: \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445, \u0430 \u043d\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0447\u0430\u0442-\u0431\u043e\u0442\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0437\u0430\u043c\u0435\u0442\u043d\u0435\u0435.<\/p>\n<h2>\u0412\u044b\u0431\u043e\u0440 \u0441\u0442\u0435\u043a\u0430<\/h2>\n<p>\u0421\u043e\u0437\u0434\u0430\u044e \u043d\u043e\u0432\u044b\u0439 \u0434\u0438\u0430\u043b\u043e\u0433 \u0441 GPT-4o \u0438 \u0437\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e \u0432 \u043d\u0435\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0430\u0431\u0437\u0430\u0446\u0435\u0432. \u041d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0431\u043e\u0434\u0440\u043e \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p><strong>GPT-4 + LangChain (\u0438\u043b\u0438 ChatGPT API \u0441 RAG). <\/strong>\u00ab\u041c\u0438\u043d\u0443\u0441\u044b: \u043f\u043b\u0430\u0442\u043d\u043e (\u0438 \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u0440\u0430\u0441\u0442\u0438 \u043f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445)\u00bb. \u0422\u043e\u0442 \u0436\u0435 \u043c\u0438\u043d\u0443\u0441 \u2014 \u0438 \u0432 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 <strong>\u00ab\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0434 \u043a\u043b\u044e\u0447 (SaaS-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b): <\/strong><a href=\"http:\/\/writer.com\" rel=\"noopener noreferrer nofollow\"><strong>writer.com<\/strong><\/a><strong>, <\/strong><a href=\"http:\/\/jasper.ai\" rel=\"noopener noreferrer nofollow\"><strong>jasper.ai<\/strong><\/a><strong>, <\/strong><a href=\"http:\/\/copy.ai\" rel=\"noopener noreferrer nofollow\"><strong>copy.ai<\/strong><\/a><strong>\u00bb.<\/strong> \u0410 \u0435\u0441\u0442\u044c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0430 open source?<\/p>\n<p>\u0414\u0430, \u043f\u0440\u0438\u0447\u0435\u043c \u044d\u0442\u043e \u0431\u044b\u043b \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435: <strong>open-source LLM + \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u0430\u044f \u0431\u0430\u0437\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, LLaMA 3 + FAISS \/ Weaviate \/ Qdrant)<\/strong>. \u041f\u0440\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0442\u0440\u0435\u0445 \u043e\u043f\u0446\u0438\u0439 GPT \u0434\u0430\u0436\u0435 \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u043b \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u044d\u0442\u043e\u0439: \u00ab\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c, \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c\u00bb. \u0427\u0435\u0441\u0442\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043e\u0436\u0438\u0434\u0430\u043b \u043e\u0442 OpenAI \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u0430\u043c\u043e\u0440\u0435\u043a\u043b\u0430\u043c\u044b, \u043f\u0440\u0438\u044f\u0442\u043d\u043e \u0443\u0434\u0438\u0432\u043b\u0435\u043d. \u0414\u0430\u0432\u0430\u0439 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043d\u0430 open source, \u043d\u043e \u0441\u043c\u043e\u0433\u0443 \u043b\u0438 \u044f \u043e\u0441\u0438\u043b\u0438\u0442\u044c \u044d\u0442\u043e \u0432 \u043e\u0434\u0438\u043d\u043e\u0447\u043a\u0443?<\/p>\n<p>\u00ab\u0414\u0430, \u0442\u044b \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u0435\u0448\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0441\u0430\u043c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0443 \u0442\u0435\u0431\u044f \u0435\u0441\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043d\u0430\u0432\u044b\u043a\u0438 Python \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 API \u0438\u043b\u0438 \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435\u00bb. \u0422\u0430\u043a, \u043c\u043e\u0438 \u043d\u0430\u0432\u044b\u043a\u0438 Python \u0438\u0441\u0447\u0435\u0440\u043f\u044b\u0432\u0430\u044e\u0449\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u044b <a href=\"https:\/\/habr.com\/ru\/articles\/715950\/\" rel=\"noopener noreferrer nofollow\">\u0432 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435<\/a> (\u0434\u0432\u0430 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u044f \u043f\u0440\u043e\u0448\u0435\u043b \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043c\u0435\u0441\u044f\u0447\u043d\u044b\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u044f\u0437\u044b\u043a\u0443). \u0421 \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0432\u0441\u0435 \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u043b\u0443\u0447\u0448\u0435, \u0430 \u0441 API\u2026 \u0432 \u043e\u0431\u0449\u0435\u043c, \u0437\u0434\u0435\u0441\u044c \u0443\u0436\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0440\u0430 \u0432 \u0441\u0435\u0431\u044f \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 ChatGPT \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u043b \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 \u044d\u0442\u0430\u043f\u044b \u0441 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438. \u0425\u043e\u0447\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0441\u0432\u043e\u0435\u0433\u043e \u0431\u043e\u0442\u0430 \u0441\u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u043a\u043e\u043b\u043b\u0435\u0433\u0438 \u0431\u0435\u0437 \u043e\u043f\u044b\u0442\u0430 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. \u041f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043d\u0435 \u0443\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f, \u043d\u043e \u0438\u0437 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432\u043e\u0437\u044c\u043c\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0436\u043d\u044b\u0435 \u044d\u0442\u0430\u043f\u044b.<\/p>\n<h2>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f (MacOS)<\/h2>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u044e \u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u2014\u00a0\u0432\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430, \u043f\u043e\u043c\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u043a\u043e\u0434\u043e\u043c, \u043f\u0440\u043e\u0439\u0434\u0435\u0442 \u0432 \u043d\u0435\u043c. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e homebrew:<\/p>\n<p><code>\/bin\/bash -c \"$(curl -fsSL <\/code><a href=\"https:\/\/raw.githubusercontent.com\/Homebrew\/install\/HEAD\/install.sh\" rel=\"noopener noreferrer nofollow\"><code>https:\/\/raw.githubusercontent.com\/Homebrew\/install\/HEAD\/install.sh<\/code><\/a><code>)\"  <\/code><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u0435\u043d Python \u0432\u0435\u0440\u0441\u0438\u0438 3.10+. \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043a\u0443\u0440\u0441\u0430 \u043f\u043e \u044f\u0437\u044b\u043a\u0443 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0430 \u043c\u0430\u043a\u0431\u0443\u043a\u0435 \u0442\u043e\u0447\u043d\u043e \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c, \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0435 MacOS \u0440\u0443\u0433\u0430\u0435\u0442 \u0435\u0435 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u0418 \u0442\u0430\u043a \u043d\u0435 \u0443 \u043c\u0435\u043d\u044f \u043e\u0434\u043d\u043e\u0433\u043e, \u043a\u0430\u043a \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u0430\u043b \u0433\u0443\u0433\u043b.<\/p>\n<p>\u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441\u0442\u0430\u0434\u0438\u044e bugfix \u043a\u0430\u043a \u0440\u0430\u0437 \u043f\u0440\u0435\u043e\u0434\u043e\u043b\u0435\u043b Python 3.12, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u044e \u0435\u0433\u043e, \u0432\u0434\u0440\u0443\u0433 \u0438 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0438\u0441\u0447\u0435\u0437\u043d\u0435\u0442.<\/p>\n<p><code>brew install python@3.12<\/code><\/p>\n<p>\u0414\u0430, \u0438 \u043f\u0440\u0430\u0432\u0434\u0430 \u0438\u0441\u0447\u0435\u0437\u043b\u0430. \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u044e \u043f\u0430\u043f\u043a\u0443 llama_blog_tool, \u0432 \u043d\u0435\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435:<\/p>\n<p><code>mkdir llama_blog_tool<\/code><\/p>\n<p><code>cd llama_blog_tool<\/code><\/p>\n<p><code>python3 -m venv venv<\/code><\/p>\n<p><code>source venv\/bin\/activate<\/code><\/p>\n<p>\u0421\u0442\u0430\u0432\u043b\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:<\/p>\n<p><code>pip install --upgrade pip<\/code><\/p>\n<p><code>pip install faiss-cpu langchain sentence-transformers llama-index<\/code><\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c LLaMA 3 \u0447\u0435\u0440\u0435\u0437 llama.cpp (\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430), \u0441\u043e\u0432\u0435\u0442\u0443\u044e\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0435 \u0432\u043e\u0442 \u044d\u0442\u043e:<\/p>\n<p><code>pip install llama-cpp-python<\/code><\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c Jupiter, \u0435\u0441\u043b\u0438 \u044f \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0431\u043b\u043e\u043a\u043d\u043e\u0442\u0430\u0445. \u041f\u043e\u043a\u0430 \u044f \u043b\u0438\u0448\u044c \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u044e, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 Textedit \u043d\u0430 \u043c\u043e\u0435\u043c \u043c\u0430\u043a\u0435, \u043d\u043e \u043f\u0443\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442:<\/p>\n<p><code>pip install notebook<\/code><\/p>\n<p>\u0421\u0440\u0435\u0434\u0430 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u0430, \u043f\u0435\u0440\u0435\u0445\u043e\u0436\u0443 \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443.<\/p>\n<h2>\u041f\u0430\u0440\u0441\u0438\u043c \u0431\u043b\u043e\u0433 \u0432 \u043e\u0434\u0438\u043d \u0448\u0430\u0433<\/h2>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0432\u044b\u0434\u0430\u0442\u044c \u043c\u043d\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0443\u044e \u043f\u0440\u043e\u0441\u0442\u044b\u043d\u044e \u043a\u043e\u043c\u0430\u043d\u0434, \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u043a\u0430 \u0441\u043f\u0440\u043e\u0441\u0438\u043b\u0430, \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043b\u0438 \u0443 \u043c\u0435\u043d\u044f \u0431\u043b\u043e\u0433 \u0438\u043b\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0444\u0430\u0439\u043b\u043e\u0432, \u0438 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b\u0430 \u0441\u0441\u044b\u043b\u043a\u0443. \u0417\u0430\u0442\u0435\u043c \u043e\u0431\u0440\u0430\u0434\u043e\u0432\u0430\u043b\u0430, \u0447\u0442\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Python, \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0441 \u0431\u043b\u043e\u043a\u0430\u043c\u0438 \u043a\u043e\u0434\u0430.<\/p>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u00ab\u0423\u0431\u0435\u0434\u0438\u0441\u044c, \u0447\u0442\u043e \u0442\u044b \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043b \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u2026\u00bb. \u0410 \u043a\u0430\u043a \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f? \u0415\u0441\u043b\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0435\u0441\u0442\u044c <code>(venv)<\/code>, \u0437\u043d\u0430\u0447\u0438\u0442, \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0432 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438.<\/p>\n<p><code>pip install requests beautifulsoup4 tqdm<\/code><\/p>\n<p>\u042d\u0442\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 GPT \u0434\u0430\u043b\u0430 \u0431\u0435\u0437 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0439. \u041d\u0443 \u0443\u0436 \u043d\u0435\u0442, \u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0445\u043e\u0442\u044f \u0431\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0441\u0442\u0430\u0432\u043b\u044e. Requests \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, beautifulsoup \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430, \u0430 tqdm \u2014 \u044d\u0442\u043e\u2026 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441-\u0431\u0430\u0440? \u041b\u0430\u0434\u043d\u043e, \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435\u0442.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u0441 \u043a\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430. GPT \u043d\u0435 \u0443\u0442\u043e\u0447\u043d\u044f\u0435\u0442 \u0433\u0434\u0435, \u0442\u0430\u043a \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043c \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043f\u0430\u043f\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0433\u0434\u0435 \u0443\u0436\u0435 \u043b\u0435\u0436\u0438\u0442 \u043f\u0430\u043f\u043a\u0430 \u0441 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c. \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043a\u043e\u0434\u0430 \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0449\u0435, \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 (IDE) \u0442\u0438\u043f\u0430 <a href=\"https:\/\/www.jetbrains.com\/pycharm\/download\/?section=mac\" rel=\"noopener noreferrer nofollow\">PyCharm<\/a>.<\/p>\n<blockquote>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0435 \u043c\u043e\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e \u0445\u043e\u0434\u0443 \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438, \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0435\u0440\u0432\u0430\u0442\u044c\u0441\u044f. \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430\u0447\u043d\u0435\u0442\u0441\u044f \u043d\u0438\u0436\u0435, \u0441 \u0444\u0430\u0439\u043b\u0430 <strong>collect_all_articles.py<\/strong>.  <\/p>\n<\/blockquote>\n<p>\u0421\u043e\u0437\u0434\u0430\u044e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b parse blog, \u043c\u0435\u043d\u044f\u044e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043d\u0430 *.py, \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e \u0432 IDE, \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u043a\u043e\u0434 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e. \u0412\u043e\u0442 \u0442\u0430\u043a\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f <strong>parse blog.py<\/strong>:<\/p>\n<pre><code class=\"python\">import requests from bs4 import BeautifulSoup from tqdm import tqdm import time import json  BASE_URL = \"https:\/\/habr.com\" START_URL = \"https:\/\/habr.com\/ru\/companies\/yadro\/articles\/\"  headers = {     \"User-Agent\": \"Mozilla\/5.0\" }  def get_article_links(page_url):     resp = requests.get(page_url, headers=headers)     soup = BeautifulSoup(resp.text, \"html.parser\")     articles = soup.find_all(\"article\")     links = []     for article in articles:         a = article.find(\"a\", class_=\"tm-title__link\")         if a:             links.append(BASE_URL + a['href'])     return links  def get_article_content(article_url):     resp = requests.get(article_url, headers=headers)     soup = BeautifulSoup(resp.text, \"html.parser\")     title_tag = soup.find(\"h1\")     body_divs = soup.find_all(\"div\", class_=\"article-formatted-body\")      title = title_tag.text.strip() if title_tag else \"\u0411\u0435\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\"     body = \"\\n\".join(div.text.strip() for div in body_divs)          return {         \"url\": article_url,         \"title\": title,         \"body\": body     }  def parse_all_articles(max_pages=5):     all_articles = []     for page in range(1, max_pages + 1):         print(f\"\ud83d\udcc4 \u041f\u0430\u0440\u0441\u0438\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 {page}\")         url = START_URL + f\"page{page}\/\"         links = get_article_links(url)         for link in tqdm(links, desc=\"\u0421\u0442\u0430\u0442\u044c\u0438\"):             try:                 article = get_article_content(link)                 all_articles.append(article)                 time.sleep(1)  # \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u0434\u0434\u043e\u0441\u0438\u0442\u044c Habr             except Exception as e:                 print(f\"\u26a0\ufe0f \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 {link}: {e}\")     return all_articles  if __name__ == \"__main__\":     articles = parse_all_articles(max_pages=3)  # \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c     with open(\"articles.json\", \"w\", encoding=\"utf-8\") as f:         json.dump(articles, f, ensure_ascii=False, indent=2)     print(f\"\u2705 \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e {len(articles)} \u0441\u0442\u0430\u0442\u0435\u0439 \u0432 articles.json\")<\/code><\/pre>\n<p>\u0425\u043e\u0440\u043e\u0448\u043e, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430 \u043f\u0430\u0443\u0437\u0430 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u0438 \u0435\u0441\u0442\u044c \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f. \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0442\u043a\u0440\u043e\u0435\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0432 \u043f\u0430\u043f\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0441\u043a\u0440\u0438\u043f\u0442:<\/p>\n<p><code>python parse_blog.py<\/code><\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0448\u0430\u0433\u043e\u0432 \u0437\u0430 \u043f\u044f\u0442\u044c \u0441 ChatGPT \u043e\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 <code>no such file or directory: venv\/bin\/activate<\/code> \u044f \u0434\u043e\u0431\u0440\u0430\u043b\u0441\u044f \u0434\u043e \u0432\u0435\u0440\u0434\u0438\u043a\u0442\u0430: \u00ab\u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0432 zsh \u0443 \u0442\u0435\u0431\u044f \u0441\u043d\u043e\u0432\u0430 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d \u0430\u043b\u0438\u0430\u0441 python, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \/usr\/bin\/python \u2014 \u043e\u0442\u0441\u044e\u0434\u0430 \u0438 \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u043a\u0438\u00bb.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/063\/15b\/686\/06315b686bcadf5c71a76f05839deb1e.png\" alt=\"\u041d\u0430\u0434\u0435\u0436\u043d\u043e \u2014 \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u0430 \u0442\u043e \u0443\u0436\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0436\u043e\u043d\u0433\u043b\u0438\u0440\u0443\u044e \u0431\u0435\u043d\u0437\u043e\u043f\u0438\u043b\u0430\u043c\u0438\" title=\"\u041d\u0430\u0434\u0435\u0436\u043d\u043e \u2014 \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u0430 \u0442\u043e \u0443\u0436\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0436\u043e\u043d\u0433\u043b\u0438\u0440\u0443\u044e \u0431\u0435\u043d\u0437\u043e\u043f\u0438\u043b\u0430\u043c\u0438\" width=\"888\" height=\"482\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/063\/15b\/686\/06315b686bcadf5c71a76f05839deb1e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/063\/15b\/686\/06315b686bcadf5c71a76f05839deb1e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u041d\u0430\u0434\u0435\u0436\u043d\u043e \u2014 \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u0430 \u0442\u043e \u0443\u0436\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0436\u043e\u043d\u0433\u043b\u0438\u0440\u0443\u044e \u0431\u0435\u043d\u0437\u043e\u043f\u0438\u043b\u0430\u043c\u0438<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u0423\u0440\u0430, \u043f\u0430\u0440\u0441\u0435\u0440 \u0441\u043a\u0430\u0447\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438! \u041f\u0440\u0430\u0432\u0434\u0430, \u0442\u043e\u043b\u044c\u043a\u043e 60 \u0438\u0437 223.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/34d\/4b2\/e9a\/34d4b2e9a55cf9d7b7d393b6fc22abc9.png\" width=\"1600\" height=\"199\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/34d\/4b2\/e9a\/34d4b2e9a55cf9d7b7d393b6fc22abc9.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/34d\/4b2\/e9a\/34d4b2e9a55cf9d7b7d393b6fc22abc9.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0421 \u0447\u0435\u043c \u044d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e, \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e. \u0412 <a href=\"https:\/\/habr.com\/ru\/companies\/yadro\/articles\/\" rel=\"noopener noreferrer nofollow\">\u0431\u043b\u043e\u0433\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438<\/a> \u0432\u044b\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043e 20 \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u0441\u043b\u0435 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043e\u0431\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u043d\u043e\u0433\u043e\u0442\u043e\u0447\u0438\u0438. \u041d\u0430\u0434\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0441\u043f\u0430\u0440\u0441\u0438\u043b \u0432\u0441\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0437\u043b\u043e\u0436\u0443 \u043d\u043e\u0432\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0441\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u043e\u043f\u0438\u0448\u0443, \u043a\u0430\u043a \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443. \u041d\u043e\u0432\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">import requests from bs4 import BeautifulSoup from tqdm import tqdm import time import json  BASE_URL = \"https:\/\/habr.com\" COMPANY_BLOG_URL = \"https:\/\/habr.com\/ru\/companies\/yadro\/articles\/page{}\/\"  headers = {     \"User-Agent\": \"Mozilla\/5.0\" }  articles = []  def parse_article(url):     try:         resp = requests.get(url, headers=headers)         soup = BeautifulSoup(resp.text, \"html.parser\")          title_tag = soup.find(\"h1\")         content_tag = soup.find(\"div\", class_=\"tm-article-body\")          if not title_tag or not content_tag:             return None          return {             \"url\": url,             \"title\": title_tag.text.strip(),             \"content\": content_tag.get_text(strip=True, separator=\"\\n\")         }     except Exception as e:         print(f\"[!] Error parsing {url}: {e}\")         return None  def get_article_links_from_page(page_number):     url = COMPANY_BLOG_URL.format(page_number)     resp = requests.get(url, headers=headers)      if resp.status_code != 200:         return []      soup = BeautifulSoup(resp.text, \"html.parser\")     article_tags = soup.select(\"a.tm-title__link\")     return [BASE_URL + a[\"href\"] for a in article_tags]  print(\"\ud83d\udd0d \u041d\u0430\u0447\u0438\u043d\u0430\u044e \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0432\u0441\u0435\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0431\u043b\u043e\u0433\u0430...\") page = 1 while True:     links = get_article_links_from_page(page)     if not links:         print(f\"\u2705 \u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430: {page - 1}\")         break      print(f\"\u2192 \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 {page}: \u043d\u0430\u0439\u0434\u0435\u043d\u043e {len(links)} \u0441\u0441\u044b\u043b\u043e\u043a\")     for link in tqdm(links, desc=f\"  \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0442\u0430\u0442\u0435\u0439 \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b {page}\"):         article = parse_article(link)         if article:             articles.append(article)         time.sleep(1)  # \u043f\u0430\u0443\u0437\u0430 \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438      page += 1     time.sleep(1)  # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 with open(\"articles.json\", \"w\", encoding=\"utf-8\") as f:     json.dump(articles, f, ensure_ascii=False, indent=2)  print(f\"\ud83d\udcdd \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e \u0441\u0442\u0430\u0442\u0435\u0439: {len(articles)} \u2192 \u0432 \u0444\u0430\u0439\u043b articles.json\")<\/code><\/pre>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043d\u0430\u0434\u043e, \u043d\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043f\u043e\u043b\u043c\u0438\u043d\u0443\u0442\u044b, \u043d\u0430 \u043e\u0434\u043d\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u0443\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u043b\u0442\u043e\u0440\u044b \u0441\u0435\u043a\u0443\u043d\u0434\u044b. \u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u0432 \u0431\u043b\u043e\u0433\u0435 \u0431\u044b\u043b\u043e 12 \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u043a\u043e\u043b\u043e \u0448\u0435\u0441\u0442\u0438 \u043c\u0438\u043d\u0443\u0442 \u043d\u0430 \u043f\u0430\u0440\u0441\u0438\u043d\u0433. \u0411\u0430\u0437\u0443 \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0441 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u0433\u0434\u0435-\u0442\u043e \u0442\u0440\u0438\u0436\u0434\u044b \u0432 \u043d\u0435\u0434\u0435\u043b\u044e, \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u043f\u043b\u0430\u043d\u0430 \u043d\u0430\u0448\u0435\u0439 \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u0438.<\/p>\n<h2>\u0424\u0438\u0447\u0438 \u0432\u0435\u0434\u0443\u0442 \u0432 \u0442\u0443\u043f\u0438\u043a<\/h2>\n<p>\u041f\u043e\u043d\u0430\u0447\u0430\u043b\u0443 \u043f\u0440\u043e\u0435\u043a\u0442 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u043b\u0441\u044f \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u044f \u043e\u0436\u0438\u0434\u0430\u043b, \u0442\u0430\u043a \u0447\u0442\u043e \u044f \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u043c\u0430\u0445\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0432\u044b\u0445\u043e\u0434\u044f\u0449\u0443\u044e \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b MVP. \u0411\u044b\u043b\u043e \u0431\u044b \u0437\u0434\u043e\u0440\u043e\u0432\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0430\u0440\u0441\u0435\u0440 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b \u0431\u043b\u043e\u0433 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u0438 \u0441\u0432\u043e\u044e \u0431\u0430\u0437\u0443 \u0441\u0442\u0430\u0442\u0435\u0439, \u0430 \u0437\u0430\u0442\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0435\u0435. \u0422\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0435. \u0423 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 title, \u043f\u043e \u043d\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u0435\u0440\u044f\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0441\u0442\u0430\u0442\u044c\u044f \u0443\u0436\u0435 \u0432 \u0431\u0430\u0437\u0435.<\/p>\n<p>\u0412 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u044d\u0442\u0438 \u0445\u043e\u0442\u0435\u043b\u043a\u0438 ChatGPT \u0432\u044b\u0434\u0430\u043b\u0430 \u043d\u043e\u0432\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b \u0442\u0430\u0439\u0442\u043b\u044b \u0432 existing_title, \u043f\u0440\u0438\u0447\u0435\u043c \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0431\u044b\u043b \u043f\u0440\u0435\u0440\u0432\u0430\u043d. \u041d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u0441\u0435\u0440 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435: \u043e\u0434\u043d\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u0430 \u043d\u0430 \u043e\u0434\u043d\u0443 \u0441\u0442\u0430\u0442\u044c\u044e. \u041d\u043e \u043a\u043e\u0434 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u043b\u0441\u044f.<\/p>\n<p>\u041d\u0435 \u0431\u0443\u0434\u0443 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u0441\u043a\u0440\u0438\u043f\u0442 \u0442\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0435\u0440\u0430, \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0432 MVP \u043e\u043d \u043d\u0435 \u043f\u043e\u043f\u0430\u043b. \u041b\u0443\u0447\u0448\u0435 \u043f\u043e\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u043d\u0430\u0432\u0435\u043b\u043e \u043c\u0435\u043d\u044f \u043d\u0430 \u043c\u044b\u0441\u043b\u044c, \u0447\u0442\u043e \u043a\u043e\u043f\u0430\u044e \u044f \u043d\u0435 \u0442\u0443\u0434\u0430:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/649\/012\/a73\/649012a73f478cec6ad0ab75b64091af.png\" width=\"1600\" height=\"772\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/649\/012\/a73\/649012a73f478cec6ad0ab75b64091af.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/649\/012\/a73\/649012a73f478cec6ad0ab75b64091af.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u042d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u043e\u0442\u0430. \u041f\u043e \u043d\u0438\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u0435\u0441\u044c \u0441\u043a\u043e\u0440\u043c\u043b\u0435\u043d\u043d\u044b\u0439 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u0442\u0435\u043a\u0441\u0442 \u0438\u043c\u0435\u0435\u0442 \u0434\u043b\u044f \u043d\u0435\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442. \u0410 \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0441\u0442\u0430\u0442\u0435\u0439 \u0438\u043c\u0435\u043b\u0438 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u0439, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u0430\u043c \u043e\u0431\u044b\u0447\u043d\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0442\u0435\u043c\u044b \u0441\u0442\u0430\u0442\u0435\u0439 (\u0438\u0433\u0440\u0438\u0432\u044b\u043c\u0438 \u0442\u0430\u0439\u0442\u043b\u0430\u043c\u0438 \u043c\u044b \u0432 \u0431\u043b\u043e\u0433\u0435 \u043e\u0441\u043e\u0431\u043e \u043d\u0435 \u0431\u0430\u043b\u0443\u0435\u043c\u0441\u044f). \u0422\u0430\u043a\u0436\u0435, \u0447\u0442\u043e\u0431\u044b \u0447\u0430\u0442-\u0431\u043e\u0442 \u0434\u0430\u0432\u0430\u043b \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b, \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0443\u0436\u043d\u043e \u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u0438 \u2014 \u0447\u0435\u0433\u043e \u0443\u0436 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u2014 \u0434\u0430\u0442\u0443 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438.<\/p>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0431\u043e\u0442\u0430, \u0434\u0438\u0430\u043b\u043e\u0433 \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u0432\u044b\u0448\u0435, \u0435\u0434\u0432\u0430 \u043b\u0438 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043c\u043d\u0435, \u0434\u0430 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043b\u044e\u0431\u043e\u043c\u0443 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0443. \u041d\u043e \u043f\u043e \u043f\u0443\u0442\u0438 \u043a \u043d\u0435\u0439 \u044f \u043d\u0430\u0443\u0447\u0438\u043b\u0441\u044f \u0445\u0443\u0434\u043e-\u0431\u0435\u0434\u043d\u043e \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u0434\u0435 \u043e\u0442 ChatGPT \u0438 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u0441\u043b\u043e\u0436\u0438\u043b\u0430\u0441\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0414\u0435\u0434\u043b\u0430\u0439\u043d\u044b \u043d\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0435 \u043d\u0435 \u0433\u043e\u0440\u044f\u0442, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0435\u0440\u0443 \u0432\u0441\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u0434\u0443\u043c\u0447\u0438\u0432\u043e.<\/p>\n<h2>\u041f\u0430\u0440\u0441\u0438\u043c \u0431\u043b\u043e\u0433 \u0432 \u0434\u0432\u0430 \u0448\u0430\u0433\u0430<\/h2>\n<p>\u0412 \u0431\u043b\u043e\u0433\u0435 YADRO \u043e\u043a\u043e\u043b\u043e 250 \u0441\u0442\u0430\u0442\u0435\u0439, \u0438 \u043a\u0430\u0436\u0434\u0443\u044e \u043d\u0435\u0434\u0435\u043b\u044e \u043a \u043d\u0438\u043c \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0440\u0438. \u0415\u0436\u0435\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u044b\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u043a\u043e\u0439 \u0431\u0430\u0437\u044b \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u2014 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 LLM, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u043a\u0440\u0443\u0442\u0438\u0442\u044c\u0441\u044f \u0440\u044f\u0434\u043e\u043c. \u0422\u0430\u043a \u0447\u0442\u043e \u0438\u0434\u0435\u044e \u0441 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0431\u0430\u0437\u044b \u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044e, \u043f\u0443\u0441\u0442\u044c \u043f\u043e\u043a\u0430 \u0433\u0440\u0443\u0437\u0438\u0442 \u0432\u0441\u0435 \u0441 \u043d\u0443\u043b\u044f.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435, \u0440\u0430\u0437\u0434\u0435\u043b\u044e \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0431\u043b\u043e\u0433\u0430 \u043d\u0430 \u0434\u0432\u0430 \u044d\u0442\u0430\u043f\u0430. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0431\u043e\u0440 \u0441\u0441\u044b\u043b\u043e\u043a \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b\u0438\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <strong>collect_all_articles.py<\/strong>. \u042d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u0442\u043e\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u0443\u044e \u043f\u0430\u043f\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/p>\n<pre><code class=\"python\">import requests from bs4 import BeautifulSoup from tqdm import tqdm import re  BASE_URL = \"https:\/\/habr.com\/ru\/companies\/yadro\/articles\/\" OUTPUT_FILE = \"article_links.txt\" HEADERS = {\"User-Agent\": \"Mozilla\/5.0\"}  def get_total_pages():     response = requests.get(BASE_URL, headers=HEADERS)     soup = BeautifulSoup(response.text, \"html.parser\")     pagination = soup.find_all(\"a\", class_=\"tm-pagination__page\")      page_numbers = []     for p in pagination:         try:             page = int(p.text.strip())             page_numbers.append(page)         except ValueError:             continue      return max(page_numbers) if page_numbers else 1  def extract_links_from_page(page_number):     url = BASE_URL + f\"page{page_number}\/\"     response = requests.get(url, headers=HEADERS)     if response.status_code != 200:         return []      soup = BeautifulSoup(response.text, \"html.parser\")     links = []      for a in soup.find_all(\"a\", href=True):         href = a[\"href\"]         if href.startswith(\"\/ru\/companies\/yadro\/articles\/\"):             full_link = \"https:\/\/habr.com\" + href.split(\"?\")[0]              # \u0424\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u043c \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438             if (                 full_link.endswith(\"comments\/\") or                 \"\/page\" in full_link or                 full_link == BASE_URL             ):                 continue              links.append(full_link)      return list(set(links))  def main():     total_pages = get_total_pages()     all_links = set()      for i in tqdm(range(1, total_pages + 1), desc=\"\ud83d\udd17 \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0438\"):         links = extract_links_from_page(i)         if not links:             break         all_links.update(links)      with open(OUTPUT_FILE, \"w\", encoding=\"utf-8\") as f:         for link in sorted(all_links):             f.write(link + \"\\n\")      print(f\"\u2705 \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e {len(all_links)} \u0441\u0442\u0430\u0442\u0435\u0439 \u0432 {OUTPUT_FILE}\")  if __name__ == \"__main__\":     main()<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u0441\u0441\u044b\u043b\u043e\u043a \u043c\u043d\u0435 \u0431\u044b\u043b\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432 GPT, \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0431\u043b\u043e\u0433\u0430 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0441\u0442\u0430\u0442\u0435\u0439 (https:\/\/habr.com\/ru\/companies\/yadro\/articles\/pageX\/, \u0433\u0434\u0435 X \u2014 \u043d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b) \u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u0438 (https:\/\/habr.com\/ru\/companies\/yadro\/articles\/&#8230;).<\/p>\n<p>\u0412\u044b\u0448\u0435 \u2014 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0430\u043c\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0441\u043e \u0441\u0442\u0430\u0442\u044c\u044f\u043c\u0438 \u0435\u0441\u0442\u044c \u0432 \u0431\u043b\u043e\u0433\u0435. \u0422\u043e\u0442, \u0447\u0442\u043e ChatGPT \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b\u0430 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e, \u0431\u044b\u043b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c 20 \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u043d\u043e \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0441\u0430\u043c\u0430 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b\u0430 \u0435\u0433\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u2014 \u044d\u0442\u043e\u0442 \u0430\u043f\u0433\u0440\u0435\u0439\u0434 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>main()<\/code>.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c28\/391\/cf2\/c28391cf229e60fbc10f8aa107a4b7e0.png\" width=\"1186\" height=\"258\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c28\/391\/cf2\/c28391cf229e60fbc10f8aa107a4b7e0.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c28\/391\/cf2\/c28391cf229e60fbc10f8aa107a4b7e0.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041d\u0430 \u0447\u0438\u0441\u043b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438\u0441\u044c. \u041f\u043e\u0441\u043b\u0435 \u0444\u0438\u043a\u0441\u0430 \u0432\u044b\u0448\u0435 \u0441\u0441\u044b\u043b\u043e\u043a, \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e. \u041d\u043e \u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043b \u043f\u0430\u0440\u0441\u0438\u043d\u0433, \u0447\u0442\u043e\u0431\u044b \u043b\u0435\u0433\u0447\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u043f\u0440\u043e\u0431\u043b\u0435\u043c. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u044e \u043f\u0440\u043e\u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0441 \u0445\u0432\u043e\u0441\u0442\u043e\u043c \u2026\/comments \u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0431\u043b\u043e\u0433\u0430, \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 \u0441\u0442\u0430\u0442\u0435\u0439, \u0442\u043e\u0436\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0441\u044c \u0432 \u0444\u0430\u0439\u043b\u0435. ChatGPT \u043f\u043e\u043c\u043e\u0433 \u043c\u043d\u0435 \u0438\u0445 \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u2014 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0432\u043e\u0434\u0443 \u0432 \u043a\u043e\u0434\u0435 \u0432\u044b\u0448\u0435 \u0435\u0441\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u0441\u0441\u044b\u043b\u043e\u043a. \u0417\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a \u043f\u0435\u0440\u0435\u0436\u0438\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439: \u043e\u043d \u0431\u044b\u043b \u0442\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d, \u0442\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d \u0441 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u043c \u0441\u0441\u044b\u043b\u043e\u043a, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b \u0432\u0441\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0442\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435, \u0442\u043e \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0442\u043e \u0432 txt, \u0442\u043e \u0432 json. \u0412 \u0438\u0442\u043e\u0433\u0435 \u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0441\u044f \u043d\u0430 json \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438: \u0442\u0430\u043a \u043f\u0440\u043e\u0449\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b Selenium \u0438 ChromeDriver. Selenium \u043d\u0443\u0436\u0435\u043d, \u0447\u0442\u043e\u0431\u044b \u0441\u0430\u0439\u0442 \u043f\u0440\u0438\u043d\u044f\u043b \u043d\u0430\u0448 \u0441\u043a\u0440\u0438\u043f\u0442 \u0437\u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430, \u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 ChromeDriver \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 Selenium \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c Chrome. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438:<\/p>\n<p><code>pip install selenium undetected-chromedriver<\/code><\/p>\n<p>\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 <strong>download_articles.py<\/strong>:<\/p>\n<pre><code class=\"python\">import os import time import json import random from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from tqdm import tqdm  time.sleep(random.uniform(2, 5))  DATA_DIR = \"articles_json\" LINKS_FILE = \"article_links.txt\" FAILED_LINKS_FILE = \"failed_links.txt\"  os.makedirs(DATA_DIR, exist_ok=True)  def load_links():     with open(LINKS_FILE, \"r\", encoding=\"utf-8\") as f:         return [line.strip() for line in f if line.strip()]  def init_driver():     chrome_options = Options()     chrome_options.add_argument(\"--headless\")     chrome_options.add_argument(\"--disable-gpu\")     driver = webdriver.Chrome(options=chrome_options)     return driver  def parse_article(driver, url):     try:         driver.get(url)         time.sleep(3)     except Exception as e:         print(f\"\u26a0\ufe0f \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 {url}: {e}\")         raise      # \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a     try:         title = driver.find_element(By.TAG_NAME, \"h1\").text.strip()     except:         title = \"\u0411\u0435\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\"      # \u0414\u0430\u0442\u0430     try:         date_elem = driver.find_element(By.CLASS_NAME, \"tm-article-datetime-published\")         date = date_elem.text.strip()     except:         date = \"\u0414\u0430\u0442\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430\"      # \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0435\u043a\u0441\u0442     text = \"\"     try:         # \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u2014 \u0447\u0435\u0440\u0435\u0437 \u043a\u043b\u0430\u0441\u0441 \u0438 &lt;p&gt;         article_body = driver.find_element(By.CLASS_NAME, \"tm-article-presenter__body\")         paragraphs = article_body.find_elements(By.TAG_NAME, \"p\")         text = \"\\n\".join(p.text.strip() for p in paragraphs if p.text.strip())     except:         pass      # Fallback: \u0435\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043f\u0443\u0441\u0442\u043e\u0439 \u2014 \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u0442\u0435\u043a\u0441\u0442 \u0438\u0437 article-formatted-body     if not text:         try:             alt_body = driver.find_element(By.CLASS_NAME, \"article-formatted-body\")             text = alt_body.text.strip()         except:             pass      # \u0415\u0449\u0451 \u043e\u0434\u0438\u043d fallback: \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 &lt;div&gt; \u0432 article, \u0433\u0434\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u0435\u043a\u0441\u0442     if not text:         try:             all_divs = driver.find_elements(By.CLASS_NAME, \"tm-article-presenter__body\")             text_chunks = []             for div in all_divs:                 div_text = div.text.strip()                 if len(div_text) &gt; 50:                     text_chunks.append(div_text)             text = \"\\n\\n\".join(text_chunks)         except:             pass      return {         \"url\": url,         \"title\": title,         \"date\": date,         \"text\": text     }  def main():     driver = init_driver()     links = load_links()     errors = []      for url in tqdm(links, desc=\"\ud83d\udce5 \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0441\u0442\u0430\u0442\u044c\u0438\"):         article_id = url.strip(\"\/\").split(\"\/\")[-1]         filename = os.path.join(DATA_DIR, f\"{article_id}.json\")          if os.path.exists(filename):             continue          try:             article_data = parse_article(driver, url)             if article_data[\"text\"]:                 with open(filename, \"w\", encoding=\"utf-8\") as f:                     json.dump(article_data, f, ensure_ascii=False, indent=2)             else:                 print(f\"\u26a0\ufe0f \u041f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043e (\u043f\u0443\u0441\u0442\u043e\u0439 \u0442\u0435\u043a\u0441\u0442): {url}\")                 errors.append(url)         except Exception as e:             print(f\"\u26a0\ufe0f \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 {url}: {e}\")             errors.append(url)             continue      driver.quit()      if errors:         with open(FAILED_LINKS_FILE, \"w\", encoding=\"utf-8\") as f:             f.write(\"\\n\".join(errors))         print(f\"\ud83d\udca5 \u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c {len(errors)} \u0441\u0442\u0430\u0442\u0435\u0439. \u0421\u0441\u044b\u043b\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b \u0432 '{FAILED_LINKS_FILE}'\")     else:         print(\"\u2705 \u0412\u0441\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b.\")  if __name__ == \"__main__\":     main()<\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f json:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4a3\/c90\/d14\/4a3c90d140c4ba0b69db93e0c79f9649.png\" alt=\"\u0421\u0441\u044b\u043b\u043a\u0430, \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u0434\u0430\u0442\u0430 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0435\u043a\u0441\u0442 \u2014 \u0432\u0441\u044e \u0432\u0430\u0436\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a \u0432\u044b\u0442\u044f\u043d\u0443\u043b \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043b\" title=\"\u0421\u0441\u044b\u043b\u043a\u0430, \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u0434\u0430\u0442\u0430 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0435\u043a\u0441\u0442 \u2014 \u0432\u0441\u044e \u0432\u0430\u0436\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a \u0432\u044b\u0442\u044f\u043d\u0443\u043b \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043b\" width=\"1600\" height=\"248\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/4a3\/c90\/d14\/4a3c90d140c4ba0b69db93e0c79f9649.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4a3\/c90\/d14\/4a3c90d140c4ba0b69db93e0c79f9649.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u0421\u0441\u044b\u043b\u043a\u0430, \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u0434\u0430\u0442\u0430 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0435\u043a\u0441\u0442 \u2014 \u0432\u0441\u044e \u0432\u0430\u0436\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a \u0432\u044b\u0442\u044f\u043d\u0443\u043b \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043b<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u043c\u0435\u0442\u0438\u0442 \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u043d\u0435\u043a\u0438\u0435 failed_links.txt \u0438 fallback. \u0422\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0442\u0435 \u0441\u0442\u0430\u0442\u044c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0430\u0440\u0441\u0435\u0440 \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b, \u2014 \u0442\u0430\u043a\u0438\u0445 \u0443 \u043c\u0435\u043d\u044f \u0431\u044b\u043b\u043e 22. ChatGPT \u0441\u0430\u043c\u0430 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b\u0430 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442, \u0447\u0442\u043e\u0431\u044b \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0442\u0430\u043a\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b. \u041f\u0440\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0445 \u044f \u043c\u043e\u0433\u0443 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0435\u0433\u043e \u0432 LINKS_FILE, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0438\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0432 \u043b\u043e\u0431 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435 \u0434\u0430\u043b\u0438. \u0412\u0441\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u044b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0435\u0441\u0442\u044c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438, \u0447\u0442\u043e \u0432 \u043d\u0438\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0433\u043e. \u0412\u043d\u0435\u0448\u043d\u0435 \u043e\u043d\u0438 \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u0435\u0440\u0441\u0442\u043a\u0443 \u0441\u0430\u0439\u0442\u0430.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/713\/a0b\/ad0\/713a0bad03d8c4932db99c41a6f0a1ad.png\" alt=\"\u0423 \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d \u0432 \u0442\u0435\u0433 \u0430\u0431\u0437\u0430\u0446\u0430, &lt;p&gt;\" title=\"\u0423 \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d \u0432 \u0442\u0435\u0433 \u0430\u0431\u0437\u0430\u0446\u0430, &lt;p&gt;\" width=\"1600\" height=\"345\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/713\/a0b\/ad0\/713a0bad03d8c4932db99c41a6f0a1ad.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/713\/a0b\/ad0\/713a0bad03d8c4932db99c41a6f0a1ad.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u0423 \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d \u0432 \u0442\u0435\u0433 \u0430\u0431\u0437\u0430\u0446\u0430, &lt;p&gt;<\/em><\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3f7\/961\/33c\/3f796133cd12017b9255082c4b70b94e.png\" alt=\"\u0423 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u0442\u0435\u0433 &lt;p&gt; \u043e\u0431\u0440\u0430\u043c\u043b\u044f\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0430\u0431\u0437\u0430\u0446\" title=\"\u0423 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u0442\u0435\u0433 &lt;p&gt; \u043e\u0431\u0440\u0430\u043c\u043b\u044f\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0430\u0431\u0437\u0430\u0446\" width=\"1106\" height=\"806\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/3f7\/961\/33c\/3f796133cd12017b9255082c4b70b94e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3f7\/961\/33c\/3f796133cd12017b9255082c4b70b94e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u0423 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u0442\u0435\u0433 &lt;p&gt; \u043e\u0431\u0440\u0430\u043c\u043b\u044f\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0430\u0431\u0437\u0430\u0446<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u0432\u043e\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u044f \u0438\u0437\u043b\u043e\u0436\u0438\u043b ChatGPT, \u0438 \u043e\u043d\u0430 \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u043b\u0430 \u0441\u043a\u0440\u0438\u043f\u0442 fallback-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u043c\u0438. \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u043f\u0430\u0440\u0441\u0438\u043b\u0438\u0441\u044c, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0432\u0441\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0432 \u0431\u043b\u043e\u0433\u0435, \u0438 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0435 json\u2019\u044b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u043b\u0438\u0441\u044c.<\/p>\n<h2>\u0427\u0430\u043d\u043a\u0438, \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438, \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438. \u041a\u0430\u043a \u044f \u043f\u0438\u0441\u0430\u043b \u0432\u044b\u0448\u0435, \u0432 \u043e\u0442\u0432\u0435\u0442\u0430\u0445 \u0431\u043e\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0441\u0442\u0430\u0442\u0435\u0439. ChatGPT \u0441\u043a\u0430\u0437\u0430\u043b\u0430, \u0447\u0442\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u043c\u043f\u0442 \u0447\u0430\u0442-\u0431\u043e\u0442\u0430 \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u043e\u0449\u0435, \u043d\u043e \u0441 \u0447\u0430\u0442-\u0431\u043e\u0442\u043e\u043c \u043c\u043d\u0435 \u0438 \u0442\u0430\u043a \u0441\u0432\u0435\u0442\u0438\u0442 \u0435\u0449\u0435 \u043c\u043d\u043e\u0433\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432. \u0412\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u043d\u0438\u0435 \u043f\u0443\u0442\u0430\u043d\u0438\u0446\u044b \u043b\u0443\u0447\u0448\u0435 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438. \u0412\u043e\u0442 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438, <strong>build_faiss_index.py<\/strong>:<\/p>\n<pre><code class=\"python\">import os import json import pickle from langchain_community.vectorstores import FAISS from langchain_huggingface import HuggingFaceEmbeddings from langchain_core.documents import Document from langchain.text_splitter import RecursiveCharacterTextSplitter  ARTICLES_DIR = \"articles_json\" INDEX_DIR = \"faiss_index\" EMBEDDINGS_CACHE = \"embeddings.pkl\"  def load_articles():     docs = []     for filename in os.listdir(ARTICLES_DIR):         if filename.endswith(\".json\"):             with open(os.path.join(ARTICLES_DIR, filename), \"r\", encoding=\"utf-8\") as f:                 data = json.load(f)                 content = data.get(\"text\", \"\").strip()                 if not content:                     continue  # \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0443\u0441\u0442\u044b\u0435 \u0442\u0435\u043a\u0441\u0442\u044b                 metadata = {                     \"title\": data.get(\"title\", \"\"),                     \"date\": data.get(\"date\", \"\"),                     \"url\": data.get(\"url\", \"\")                 }                 docs.append(Document(page_content=content, metadata=metadata))     return docs  def main():     print(\"\ud83d\udcda \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0441\u0442\u0430\u0442\u044c\u0438...\")     raw_docs = load_articles()     print(f\"\ud83d\udd39 \u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e \u0441\u0442\u0430\u0442\u0435\u0439: {len(raw_docs)}\")      if not raw_docs:         print(\"\u26a0\ufe0f \u041d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438. \u041f\u0440\u043e\u0432\u0435\u0440\u044c \u043f\u0430\u043f\u043a\u0443 'articles_json'.\")         return      print(\"\u2702\ufe0f \u0420\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u043c \u043d\u0430 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b...\")     splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)     docs = splitter.split_documents(raw_docs)      # \u0423\u0434\u0430\u043b\u0438\u043c \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u0431\u0435\u0437 \u0442\u0435\u043a\u0441\u0442\u0430     docs = [doc for doc in docs if doc.page_content.strip()]     print(f\"\ud83e\udde9 \u0424\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438: {len(docs)}\")     if not docs:         print(\"\u26a0\ufe0f \u041f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432. \u041f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u043c.\")         return      print(\"\ud83d\udca1 \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u0438...\")     embeddings = HuggingFaceEmbeddings(model_name=\"intfloat\/multilingual-e5-large\")      print(\"\ud83d\udd0d \u0421\u0442\u0440\u043e\u0438\u043c FAISS-\u0438\u043d\u0434\u0435\u043a\u0441...\")     vectorstore = FAISS.from_documents(docs, embeddings)      print(f\"\ud83d\udcbe \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 '{INDEX_DIR}'...\")     vectorstore.save_local(INDEX_DIR)      print(f\"\ud83d\udcbe \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c embeddings \u0432 '{EMBEDDINGS_CACHE}'...\")     with open(EMBEDDINGS_CACHE, \"wb\") as f:         pickle.dump(embeddings, f)      print(\"\u2705 \u0418\u043d\u0434\u0435\u043a\u0441 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d!\")  if __name__ == \"__main__\":     main()<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u0430:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1de\/011\/477\/1de0114770b6d2887d228bdc71c64de4.png\" alt=\"ChatGPT \u043b\u044e\u0431\u0438\u0442 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u044d\u043c\u043e\u0434\u0437\u0438, \u0438 \u043e\u043d\u0438 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u044f\u043a\u043e\u0440\u0435\u0439\" title=\"ChatGPT \u043b\u044e\u0431\u0438\u0442 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u044d\u043c\u043e\u0434\u0437\u0438, \u0438 \u043e\u043d\u0438 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u044f\u043a\u043e\u0440\u0435\u0439\" width=\"1144\" height=\"312\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/1de\/011\/477\/1de0114770b6d2887d228bdc71c64de4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1de\/011\/477\/1de0114770b6d2887d228bdc71c64de4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>ChatGPT \u043b\u044e\u0431\u0438\u0442 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u044d\u043c\u043e\u0434\u0437\u0438, \u0438 \u043e\u043d\u0438 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u044f\u043a\u043e\u0440\u0435\u0439<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432\u044b\u0437\u0432\u0430\u043b\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u044b \u0438\u0437 langchain. \u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0447\u0430\u0441\u0442\u043e \u0441\u044b\u043f\u0430\u043b \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438: \u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 FAISS \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f, \u0442\u043e HuggingFaceEmbeddings \u043d\u0443\u0436\u043d\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430, \u0442\u043e \u0435\u0449\u0435 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c. \u0427\u0430\u0441\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u043d\u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0446\u0438\u044f \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b\u0430, \u043d\u043e \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0439 \u0445\u043e\u0442\u044f \u0431\u044b \u0441\u0435\u0439\u0447\u0430\u0441, \u0434\u043e \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 langchain.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b, \u043f\u043e\u0447\u0435\u043c\u0443 \u0435\u0449\u0435 \u0441\u0430\u043c\u0430\u044f \u0440\u0430\u043d\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0447\u0430\u0442-\u0431\u043e\u0442\u0430 \u043f\u043b\u043e\u0445\u043e \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438, ChatGPT \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b\u0430 \u043c\u043d\u0435 \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0432\u0435\u0434\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0447\u0430\u043d\u043a\u043e\u0432 \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445. 4130 \u0447\u0430\u043d\u043a\u043e\u0432 \u043d\u0430 233 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014\u00a0\u044d\u0442\u043e, \u043f\u043e \u043c\u043d\u0435\u043d\u0438\u044e ChatGPT, \u043d\u0435\u043f\u043b\u043e\u0445\u043e\u0439 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c. \u041d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u00ab\u0434\u043b\u044f \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043e\u0431\u044a\u0435\u043c\u043e\u043c 2000\u20134000 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043e\u0436\u0438\u0434\u0430\u0442\u044c 10\u201320 \u0447\u0430\u043d\u043a\u043e\u0432, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u0434\u043b\u0438\u043d\u043d\u0430\u044f \u0438\u043b\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u0433\u0440\u0430\u0444\u043e\u0432\u00bb. \u0421\u0442\u0430\u0442\u044c\u0438 \u0432 \u043d\u0430\u0448\u0435\u043c \u0431\u043b\u043e\u0433\u0435 \u0442\u043e\u0447\u043d\u043e \u043a\u0440\u0443\u043f\u043d\u0435\u0435, \u0438 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0447\u0430\u043d\u043a\u043e\u0432.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a08\/868\/9db\/a088689db2a3241f8727444bda71b416.png\" width=\"1600\" height=\"656\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/a08\/868\/9db\/a088689db2a3241f8727444bda71b416.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a08\/868\/9db\/a088689db2a3241f8727444bda71b416.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0422\u0435\u043a\u0441\u0442 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0435 \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0432\u044b\u0432\u043e\u0434\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432. \u0410 \u0432\u043e\u0442 \u0441 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435\u043c \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430\u0434\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f. \u042f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u043b ChatGPT, \u0432 \u0447\u0435\u043c \u0434\u0435\u043b\u043e, \u043d\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0442\u043e\u043b\u043a\u043e\u043c \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u043b. \u041d\u0430\u0447\u0430\u043b \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u043a\u043e\u0434 \u0441\u0430\u043c \u0438 \u043d\u0430\u0448\u0435\u043b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443: \u0432 <strong>download_articles.py<\/strong> \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u0437\u043d\u0430\u0447\u0438\u043b\u0438\u0441\u044c \u043a\u0430\u043a <strong>url<\/strong>, \u0430 <strong>build_faiss_index.py<\/strong> \u0438\u0441\u043a\u0430\u043b \u0442\u0430\u043c <strong>link<\/strong>. \u041a\u043e\u0433\u0434\u0430 \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437 \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0448\u044c \u0434\u0430\u0436\u0435 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u0434\u0430 ChatGPT, \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0441\u043c\u044b\u0441\u043b\u043e\u0432\u044b\u0435 \u0435\u0434\u0438\u043d\u0438\u0446\u044b.<\/p>\n<p>\u0412 \u0440\u0430\u043a\u0443\u0440\u0441\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044d\u0442\u043e\u0442 \u044d\u043f\u0438\u0437\u043e\u0434 \u0435\u0434\u0432\u0430 \u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d, \u043d\u043e \u044d\u043c\u043e\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u043e\u043d \u0441\u0442\u0430\u043b \u043f\u0435\u0440\u0435\u043b\u043e\u043c\u043d\u044b\u043c. \u041f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u0448\u043b\u043e \u0432 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c: \u0434\u0430 \u044f \u0443\u0436\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442!<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/092\/297\/123\/092297123d6325b4546b63021278e81b.png\" alt=\"\u0425\u0435-\u0445\u0435, \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c, \u044f \u043f\u043e\u0444\u0438\u043a\u0441\u0438\u043b, \u0430 \u0442\u044b \u043d\u0435\u0442 (\u043a\u0430\u0434\u0440 \u0438\u0437 \u0445\/\u0444 \u00ab\u0422\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440\u00bb)\" title=\"\u0425\u0435-\u0445\u0435, \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c, \u044f \u043f\u043e\u0444\u0438\u043a\u0441\u0438\u043b, \u0430 \u0442\u044b \u043d\u0435\u0442 (\u043a\u0430\u0434\u0440 \u0438\u0437 \u0445\/\u0444 \u00ab\u0422\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440\u00bb)\" width=\"1600\" height=\"668\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/092\/297\/123\/092297123d6325b4546b63021278e81b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/092\/297\/123\/092297123d6325b4546b63021278e81b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u0425\u0435-\u0445\u0435, \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c, \u044f \u043f\u043e\u0444\u0438\u043a\u0441\u0438\u043b, \u0430 \u0442\u044b \u043d\u0435\u0442 (\u043a\u0430\u0434\u0440 \u0438\u0437 \u0445\/\u0444 \u00ab\u0422\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440\u00bb)<\/em><\/figcaption><\/div>\n<\/figure>\n<h2>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0447\u0430\u0442-\u0431\u043e\u0442\u0430<\/h2>\n<p>\u0427\u0430\u0442-\u0431\u043e\u0442 \u044f \u0441\u043e\u0437\u0434\u0430\u044e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 open-source \u043c\u043e\u0434\u0435\u043b\u0438 <a href=\"https:\/\/ai.meta.com\/blog\/meta-llama-3\/\" rel=\"noopener noreferrer nofollow\">Llama 3<\/a>. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u2014 \u0438\u043d\u0430\u0447\u0435, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0431\u043e\u0442 \u0432\u0441\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u0441\u043a\u0430\u043a\u0438\u0432\u0430\u0435\u0442 \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a. \u0421\u043e\u0437\u0434\u0430\u044e \u0444\u0430\u0439\u043b <strong>Modelfile<\/strong> (\u0431\u0435\u0437 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f), \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e \u0432 Textedit \u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u043f\u0440\u043e\u043c\u043f\u0442:<\/p>\n<pre><code>FROM llama3 SYSTEM \u041e\u0442\u0432\u0435\u0447\u0430\u0439 \u0441\u0442\u0440\u043e\u0433\u043e \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435. \u0418\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0439 \u0434\u0440\u0443\u0433\u0438\u0435 \u044f\u0437\u044b\u043a\u0438, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0439 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u0442\u0438\u043b\u044c.<\/code><\/pre>\n<p>\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u043f\u0442 \u0445\u043e\u0440\u043e\u0448 \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u043f\u0440\u0438\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a \u043d\u0435\u043c\u0443 \u043e\u0445\u043e\u0442\u043d\u0435\u0439, \u0447\u0435\u043c \u043a \u043f\u0440\u043e\u043c\u043f\u0442\u0443 \u0432 \u0447\u0430\u0442-\u0431\u043e\u0442\u0435. \u0417\u0434\u0435\u0441\u044c \u0441\u0442\u043e\u0438\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u0432\u0440\u044f\u0434 \u043b\u0438 \u043f\u043e\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f.<\/p>\n<p>\u0421\u0442\u0430\u0432\u043b\u044e Llama \u0447\u0435\u0440\u0435\u0437 homebrew \u0432 \u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435:<\/p>\n<p><code>brew install ollama<\/code><\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/57d\/05d\/ae0\/57d05dae0657345c3d0dc169ea46549b.png\" alt=\"\u0423 \u0432\u0430\u0441 \u043b\u043e\u0433\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0438\u043d\u0430\u0447\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u0441\u044f homebrew \u2014 \u043e\u043d \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0430\u043f\u0434\u0435\u0439\u0442\u044b\" title=\"\u0423 \u0432\u0430\u0441 \u043b\u043e\u0433\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0438\u043d\u0430\u0447\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u0441\u044f homebrew \u2014 \u043e\u043d \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0430\u043f\u0434\u0435\u0439\u0442\u044b\" width=\"1600\" height=\"333\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/57d\/05d\/ae0\/57d05dae0657345c3d0dc169ea46549b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/57d\/05d\/ae0\/57d05dae0657345c3d0dc169ea46549b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u0423 \u0432\u0430\u0441 \u043b\u043e\u0433\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0438\u043d\u0430\u0447\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u0441\u044f homebrew \u2014 \u043e\u043d \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0430\u043f\u0434\u0435\u0439\u0442\u044b<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u044e \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0441 Modelfile. \u0412\u043c\u0435\u0441\u0442\u043e llama3-rus \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435:<\/p>\n<p><code>ollama create llama3-rus -f Modelfile<\/code><\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c2d\/fd4\/fd9\/c2dfd4fd9a53f0d80837a2f6a9b43781.png\" alt=\"\u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0433\u043e\" title=\"\u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0433\u043e\" width=\"1600\" height=\"337\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c2d\/fd4\/fd9\/c2dfd4fd9a53f0d80837a2f6a9b43781.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c2d\/fd4\/fd9\/c2dfd4fd9a53f0d80837a2f6a9b43781.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0433\u043e<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0431\u0438\u0440\u0430\u044e \u0447\u0430\u0442-\u0431\u043e\u0442\u0430, <strong>chatbot.py<\/strong>:<\/p>\n<pre><code class=\"python\">import os import pickle from langchain_community.vectorstores import FAISS from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_ollama import OllamaLLM from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables import RunnableMap  INDEX_DIR = \"faiss_index\" EMBEDDINGS_CACHE = \"embeddings.pkl\"  llm = OllamaLLM(     model=\"llama3-rus\",     system_message=\"\u0422\u044b \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a. \u0412\u0441\u0435\u0433\u0434\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0439 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u043e\u043f\u0440\u043e\u0441 \u0437\u0430\u0434\u0430\u043d \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u044f\u0437\u044b\u043a\u0435.\" )  with open(EMBEDDINGS_CACHE, \"rb\") as f:     embeddings = pickle.load(f)  vectorstore = FAISS.load_local(INDEX_DIR, embeddings, allow_dangerous_deserialization=True) retriever = vectorstore.as_retriever(search_kwargs={\"k\": 20}, search_type=\"mmr\")  # \u0428\u0430\u0431\u043b\u043e\u043d prompt_template = ChatPromptTemplate.from_template(     \"\"\"\u0422\u044b \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a \u043f\u043e \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u0431\u043b\u043e\u0433\u0443.  \u0412\u0441\u0435\u0433\u0434\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0439 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u043e\u043f\u0440\u043e\u0441 \u0437\u0430\u0434\u0430\u043d \u0438\u043d\u0430\u0447\u0435.  \u041d\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0439\u0441\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u044f\u0437\u044b\u043a\u0438.  \u041d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0445 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u0442\u0430\u0442\u0435\u0439 \u043e\u0442\u0432\u0435\u0442\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0441\u0442\u0430\u0442\u0435\u0439 (\u0435\u0441\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b) \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0439 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043d\u0438\u0445.  \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442: {context}  \u0412\u043e\u043f\u0440\u043e\u0441: {question}  \u041e\u0442\u0432\u0435\u0442:\"\"\" )  # \u0426\u0435\u043f\u043e\u0447\u043a\u0430 chain = (     RunnableMap({         \"context\": lambda x: retriever.invoke(x[\"question\"]),         \"question\": lambda x: x[\"question\"]     })     | prompt_template     | llm )   def rag_chain(question):     result = chain.invoke({         \"question\": question     })     return result.content if hasattr(result, \"content\") else result   if __name__ == \"__main__\":     print(\"\ud83e\udd16 \u0427\u0430\u0442-\u0431\u043e\u0442 \u0430\u043a\u0442\u0438\u0432\u0435\u043d. \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0432\u043e\u043f\u0440\u043e\u0441 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c (\u0438\u043b\u0438 'exit'):\")     while True:         query = input(\"\ud83e\udde0 \u0412\u043e\u043f\u0440\u043e\u0441: \").strip()         if query.lower() in [\"exit\", \"quit\"]:             break         answer = rag_chain(query)         print(f\"\ud83e\udd16 \u041e\u0442\u0432\u0435\u0442:\\n{answer}\\n\")<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u0447\u0430\u0442-\u0431\u043e\u0442\u0430 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u043f\u0435\u0440\u0432\u0430\u044f. \u041e\u043f\u0438\u0448\u0443 \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u043e\u043f\u044b\u0442\u0443, \u043d\u0430 \u0447\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435.<\/p>\n<p>\u0412 \u0431\u043b\u043e\u043a\u0435 \u0441 \u0438\u043c\u043f\u043e\u0440\u0442\u0430\u043c\u0438 (from\u2026 import\u2026) \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0441\u0442\u0440\u043e\u043a \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0438\u043c\u043f\u043e\u0440\u0442\u0430\u043c\u0438 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0430\u0439\u043b\u0430\u0445. \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u043d\u0435\u0447\u0442\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445, \u0442\u043e \u044d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430. \u0418\u043d\u0430\u0447\u0435 \u0432\u0430\u0441 \u0436\u0434\u0443\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438\u043b\u0438 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043c\u043e\u0437\u043e\u043b\u0438\u0442\u044c \u0433\u043b\u0430\u0437\u0430, \u043f\u043e\u043a\u0430 \u0432\u044b \u043d\u0435 \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u044b.<\/p>\n<p>\u0412 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 llm \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0438\u043c\u044f \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0440\u0430\u043d\u0435\u0435. \u041d\u0438\u043a\u0442\u043e \u043d\u0435 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 llama \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438, Modelfile. \u0412\u0430\u0436\u043d\u043e \u043d\u0435 \u0437\u0430\u043f\u0443\u0442\u0430\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0438. \u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u00ab\u043b\u0430\u043c\u00bb \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 llama list.<\/p>\n<p>\u0412 \u0431\u043b\u043e\u043a\u0435 \u043f\u043e\u0434 \u0438\u043c\u0435\u043d\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430: \u0432\u044b\u0448\u0435 \u043e\u043d\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u00ab\u0442\u044b \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a\u00bb. \u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u043c\u043f\u0442\u0430\u043c\u0438, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c, \u0447\u0442\u043e \u0447\u0430\u0442-\u0431\u043e\u0442 \u043d\u0435 \u0441\u043e\u0441\u043a\u043e\u0447\u0438\u0442 \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439.<\/p>\n<p>\u0427\u0443\u0442\u044c \u043d\u0435 \u0437\u0430\u0431\u044b\u043b: \u0447\u0430\u0442-\u0431\u043e\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>python chatbot.py<\/code> (\u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u0441 \u043a\u043e\u0434\u043e\u043c \u0431\u043e\u0442\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f chatbot.py).<\/p>\n<h2>\u0427\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c<\/h2>\n<p>\u0412\u0440\u0435\u043c\u044f <s>\u0445\u0432\u0430\u043b\u0438\u0442\u044c\u0441\u044f<\/s> \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438. \u0412\u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0440\u0435\u0437\u043e\u043a \u0438\u0437 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5e2\/d8b\/1ed\/5e2d8b1ed90a6aae66a058160d4370e0.png\" alt=\"\u041d\u0435\u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u043e, \u043d\u043e \u0432 \u0446\u0435\u043b\u043e\u043c \u0432\u0435\u0440\u043d\u043e\" title=\"\u041d\u0435\u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u043e, \u043d\u043e \u0432 \u0446\u0435\u043b\u043e\u043c \u0432\u0435\u0440\u043d\u043e\" width=\"1600\" height=\"99\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/5e2\/d8b\/1ed\/5e2d8b1ed90a6aae66a058160d4370e0.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5e2\/d8b\/1ed\/5e2d8b1ed90a6aae66a058160d4370e0.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u041d\u0435\u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u043e, \u043d\u043e \u0432 \u0446\u0435\u043b\u043e\u043c \u0432\u0435\u0440\u043d\u043e<\/em><\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eb0\/c5a\/e78\/eb0c5ae78b9ed147b29ecf5cb3ea10e3.png\" alt=\"\u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0438\u0437 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435: \u043f\u043e\u0438\u0441\u043a \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u043e \u0442\u0435\u043c\u0435. \u041f\u043e\u0438\u0441\u043a \u0443\u0434\u0430\u043b\u0441\u044f, \u0445\u043e\u0442\u044c \u0438 \u0432\u043a\u0440\u0430\u043b\u0430\u0441\u044c \u043e\u0434\u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e Go. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 \u0437\u0430\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432\u043e\u043f\u043b\u044c\" title=\"\u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0438\u0437 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435: \u043f\u043e\u0438\u0441\u043a \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u043e \u0442\u0435\u043c\u0435. \u041f\u043e\u0438\u0441\u043a \u0443\u0434\u0430\u043b\u0441\u044f, \u0445\u043e\u0442\u044c \u0438 \u0432\u043a\u0440\u0430\u043b\u0430\u0441\u044c \u043e\u0434\u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e Go. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 \u0437\u0430\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432\u043e\u043f\u043b\u044c\" width=\"1600\" height=\"339\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/eb0\/c5a\/e78\/eb0c5ae78b9ed147b29ecf5cb3ea10e3.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eb0\/c5a\/e78\/eb0c5ae78b9ed147b29ecf5cb3ea10e3.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0438\u0437 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435: \u043f\u043e\u0438\u0441\u043a \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u043e \u0442\u0435\u043c\u0435. \u041f\u043e\u0438\u0441\u043a \u0443\u0434\u0430\u043b\u0441\u044f, \u0445\u043e\u0442\u044c \u0438 \u0432\u043a\u0440\u0430\u043b\u0430\u0441\u044c \u043e\u0434\u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e Go. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 \u0437\u0430\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432\u043e\u043f\u043b\u044c<\/em><\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/323\/677\/1c6\/3236771c6c36ba835879bbd48b6bc27d.png\" alt=\"\u0421 \u0442\u0430\u043a\u0438\u043c\u0438 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u044b\u043c\u0438, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u043e\u0442\u0430 \u043b\u0443\u0447\u0448\u0435 \u043d\u0435 \u0445\u043e\u0434\u0438\u0442\u044c\" title=\"\u0421 \u0442\u0430\u043a\u0438\u043c\u0438 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u044b\u043c\u0438, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u043e\u0442\u0430 \u043b\u0443\u0447\u0448\u0435 \u043d\u0435 \u0445\u043e\u0434\u0438\u0442\u044c\" width=\"1600\" height=\"527\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/323\/677\/1c6\/3236771c6c36ba835879bbd48b6bc27d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/323\/677\/1c6\/3236771c6c36ba835879bbd48b6bc27d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u0421 \u0442\u0430\u043a\u0438\u043c\u0438 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u044b\u043c\u0438, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u043e\u0442\u0430 \u043b\u0443\u0447\u0448\u0435 \u043d\u0435 \u0445\u043e\u0434\u0438\u0442\u044c<\/em><\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/10d\/b1c\/c11\/10db1cc11db4552366319fe63f6f31c0.png\" alt=\"\u0412\u043f\u0438\u0441\u0430\u043b \u043a\u043e\u0442\u0438\u043a\u043e\u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u0430 \u0431\u043e\u0442 \u0443\u0442\u0435\u0440 \u043c\u043d\u0435 \u043d\u043e\u0441 \u0438 \u0442\u0430\u043a\u0438 \u043d\u0430\u0448\u0435\u043b \u0441\u0442\u0430\u0442\u044c\u044e \u0441 \u043d\u0438\u043c\u0438. \u0414\u0430 \u0435\u0449\u0435 \u0438 \u0431\u043b\u0438\u0437\u043a\u0438\u0435 \u0442\u0435\u043c\u044b \u043e\u043f\u0438\u0441\u0430\u043b. \u041c\u043e\u043b\u043e\u0434\u0435\u0446! \u0425\u043e\u0442\u044f \u0447\u0435\u0442\u043a\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u044f \u0442\u0430\u043a \u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u2026\" title=\"\u0412\u043f\u0438\u0441\u0430\u043b \u043a\u043e\u0442\u0438\u043a\u043e\u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u0430 \u0431\u043e\u0442 \u0443\u0442\u0435\u0440 \u043c\u043d\u0435 \u043d\u043e\u0441 \u0438 \u0442\u0430\u043a\u0438 \u043d\u0430\u0448\u0435\u043b \u0441\u0442\u0430\u0442\u044c\u044e \u0441 \u043d\u0438\u043c\u0438. \u0414\u0430 \u0435\u0449\u0435 \u0438 \u0431\u043b\u0438\u0437\u043a\u0438\u0435 \u0442\u0435\u043c\u044b \u043e\u043f\u0438\u0441\u0430\u043b. \u041c\u043e\u043b\u043e\u0434\u0435\u0446! \u0425\u043e\u0442\u044f \u0447\u0435\u0442\u043a\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u044f \u0442\u0430\u043a \u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u2026\" width=\"1600\" height=\"114\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/10d\/b1c\/c11\/10db1cc11db4552366319fe63f6f31c0.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/10d\/b1c\/c11\/10db1cc11db4552366319fe63f6f31c0.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u0412\u043f\u0438\u0441\u0430\u043b \u043a\u043e\u0442\u0438\u043a\u043e\u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u0430 \u0431\u043e\u0442 \u0443\u0442\u0435\u0440 \u043c\u043d\u0435 \u043d\u043e\u0441 \u0438 \u0442\u0430\u043a\u0438 \u043d\u0430\u0448\u0435\u043b \u0441\u0442\u0430\u0442\u044c\u044e \u0441 \u043d\u0438\u043c\u0438. \u0414\u0430 \u0435\u0449\u0435 \u0438 \u0431\u043b\u0438\u0437\u043a\u0438\u0435 \u0442\u0435\u043c\u044b \u043e\u043f\u0438\u0441\u0430\u043b. \u041c\u043e\u043b\u043e\u0434\u0435\u0446! \u0425\u043e\u0442\u044f \u0447\u0435\u0442\u043a\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u044f \u0442\u0430\u043a \u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u2026<\/em><\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/909\/360\/cd3\/909360cd373011272e02c4cd2183c15f.png\" alt=\"\u0421 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c\u0438 \u0438\u043d\u043e\u0433\u0434\u0430 \u0433\u0430\u043b\u043b\u044e\u0446\u0438\u043d\u0438\u0440\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e\" title=\"\u0421 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c\u0438 \u0438\u043d\u043e\u0433\u0434\u0430 \u0433\u0430\u043b\u043b\u044e\u0446\u0438\u043d\u0438\u0440\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e\" width=\"1600\" height=\"332\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/909\/360\/cd3\/909360cd373011272e02c4cd2183c15f.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/909\/360\/cd3\/909360cd373011272e02c4cd2183c15f.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u0421 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c\u0438 \u0438\u043d\u043e\u0433\u0434\u0430 \u0433\u0430\u043b\u043b\u044e\u0446\u0438\u043d\u0438\u0440\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e<\/em><\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c50\/dfb\/f6c\/c50dfbf6c8c0d83203c71c88c34c5b0c.png\" alt=\"\u00ab\u042f\u043d\u0434\u0435\u043a\u0441. \u041d\u0430\u0439\u0434\u0435\u0442\u0441\u044f \u0432\u0435\u0437\u0434\u0435\u00bb. \u042d\u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u0447\u0443\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0447\u0430\u0442-\u0431\u043e\u0442\u0430 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0442\u043e\u0439, \u0447\u0442\u043e \u044f \u043f\u0440\u0438\u0432\u0435\u043b \u0432\u044b\u0448\u0435. \u041d\u043e \u043f\u0440\u043e\u043c\u043f\u0442 \u0432 \u043d\u0435\u0439 \u0431\u044b\u043b \u0442\u043e\u0442 \u0436\u0435. \u041a\u0430\u043a \u0438 \u0431\u0430\u0437\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043e\u0442\u0432\u0435\u0442\u043e\u0432, \u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\" title=\"\u00ab\u042f\u043d\u0434\u0435\u043a\u0441. \u041d\u0430\u0439\u0434\u0435\u0442\u0441\u044f \u0432\u0435\u0437\u0434\u0435\u00bb. \u042d\u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u0447\u0443\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0447\u0430\u0442-\u0431\u043e\u0442\u0430 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0442\u043e\u0439, \u0447\u0442\u043e \u044f \u043f\u0440\u0438\u0432\u0435\u043b \u0432\u044b\u0448\u0435. \u041d\u043e \u043f\u0440\u043e\u043c\u043f\u0442 \u0432 \u043d\u0435\u0439 \u0431\u044b\u043b \u0442\u043e\u0442 \u0436\u0435. \u041a\u0430\u043a \u0438 \u0431\u0430\u0437\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043e\u0442\u0432\u0435\u0442\u043e\u0432, \u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\" width=\"1600\" height=\"315\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c50\/dfb\/f6c\/c50dfbf6c8c0d83203c71c88c34c5b0c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c50\/dfb\/f6c\/c50dfbf6c8c0d83203c71c88c34c5b0c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u00ab\u042f\u043d\u0434\u0435\u043a\u0441. \u041d\u0430\u0439\u0434\u0435\u0442\u0441\u044f \u0432\u0435\u0437\u0434\u0435\u00bb. \u042d\u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u0447\u0443\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0447\u0430\u0442-\u0431\u043e\u0442\u0430 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0442\u043e\u0439, \u0447\u0442\u043e \u044f \u043f\u0440\u0438\u0432\u0435\u043b \u0432\u044b\u0448\u0435. \u041d\u043e \u043f\u0440\u043e\u043c\u043f\u0442 \u0432 \u043d\u0435\u0439 \u0431\u044b\u043b \u0442\u043e\u0442 \u0436\u0435. \u041a\u0430\u043a \u0438 \u0431\u0430\u0437\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043e\u0442\u0432\u0435\u0442\u043e\u0432, \u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e<\/em><\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3e0\/d5a\/a1c\/3e0d5aa1c4bb0b50e3ad63026bf6c4c8.png\" alt=\"\u00abIdentity theft is not a joke Jim!\u00bb \u2014 \u0414\u0443\u0430\u0439\u0442 \u0428\u0440\u0443\u0442, \u0441\u0435\u0440\u0438\u0430\u043b \u00ab\u041e\u0444\u0438\u0441\u00bb\" title=\"\u00abIdentity theft is not a joke Jim!\u00bb \u2014 \u0414\u0443\u0430\u0439\u0442 \u0428\u0440\u0443\u0442, \u0441\u0435\u0440\u0438\u0430\u043b \u00ab\u041e\u0444\u0438\u0441\u00bb\" width=\"1129\" height=\"534\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/3e0\/d5a\/a1c\/3e0d5aa1c4bb0b50e3ad63026bf6c4c8.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3e0\/d5a\/a1c\/3e0d5aa1c4bb0b50e3ad63026bf6c4c8.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u00abIdentity theft is not a joke Jim!\u00bb \u2014 \u0414\u0443\u0430\u0439\u0442 \u0428\u0440\u0443\u0442, \u0441\u0435\u0440\u0438\u0430\u043b \u00ab\u041e\u0444\u0438\u0441\u00bb<\/em><\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/213\/457\/456\/213457456e52604faec21e3435d027a4.png\" alt=\"\u00ab\u041e\u0441\u043e\u0437\u043d\u0430\u043d\u0438\u0435\u00bb \u0432\u0441\u0435\u0433\u043e \u0431\u043b\u043e\u0433\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u0430\u0436\u043d\u044b\u043c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u043c \u0432 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0438 \u0447\u0430\u0442-\u0431\u043e\u0442\u0430\" title=\"\u00ab\u041e\u0441\u043e\u0437\u043d\u0430\u043d\u0438\u0435\u00bb \u0432\u0441\u0435\u0433\u043e \u0431\u043b\u043e\u0433\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u0430\u0436\u043d\u044b\u043c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u043c \u0432 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0438 \u0447\u0430\u0442-\u0431\u043e\u0442\u0430\" width=\"1600\" height=\"907\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/213\/457\/456\/213457456e52604faec21e3435d027a4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/213\/457\/456\/213457456e52604faec21e3435d027a4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u00ab\u041e\u0441\u043e\u0437\u043d\u0430\u043d\u0438\u0435\u00bb \u0432\u0441\u0435\u0433\u043e \u0431\u043b\u043e\u0433\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u0430\u0436\u043d\u044b\u043c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u043c \u0432 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0438 \u0447\u0430\u0442-\u0431\u043e\u0442\u0430<\/em><\/figcaption><\/div>\n<\/figure>\n<h2>Is it\u2026 MVP?<\/h2>\n<p>\u0414\u0443\u043c\u0430\u044e, \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0431\u043e\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u0440\u0443\u0431\u043a\u0443 \u2014 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0441\u044f\u0446 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0431\u043e\u0442\u044b. \u0418\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/p>\n<ul>\n<li>\n<p><strong>collect_all_articles.py<\/strong> \u2014 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0432 txt,<\/p>\n<\/li>\n<li>\n<p><strong>download_articles.py<\/strong> \u2014 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u043e \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u043c \u0441\u0441\u044b\u043b\u043a\u0430\u043c \u0432 json,<\/p>\n<\/li>\n<li>\n<p><strong>build_faiss_index.py<\/strong> \u2014 \u0433\u043e\u0442\u043e\u0432\u0438\u0442 \u0442\u0435\u043a\u0441\u0442\u044b \u0434\u043b\u044f \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438,<\/p>\n<\/li>\n<li>\n<p><strong>Modelfile<\/strong> \u2014 \u0437\u0430\u0434\u0430\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u043f\u0442 \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438 (\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u044d\u0442\u0430\u043f),<\/p>\n<\/li>\n<li>\n<p><strong>chatbot.py<\/strong> \u2014 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0447\u0430\u0442-\u0431\u043e\u0442\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b.<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0436\u0438\u0434\u0430\u043b, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u043a\u043e\u0434\u043e\u043c, \u043d\u043e \u0438\u0445 \u0432\u0441\u0435\u0433\u043e \u043f\u044f\u0442\u044c. \u041e\u0442\u0440\u0430\u0434\u043d\u043e, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0432 \u0438\u0442\u043e\u0433\u0435 \u043d\u0435\u0441\u0435\u0442 \u0447\u0435\u0442\u043a\u0443\u044e \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u0443\u044e \u043c\u043d\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u042f \u0437\u043d\u0430\u044e, \u0447\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0438 \u043c\u043e\u0433\u0443 \u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0447\u0435\u0440\u0435\u0437 \u0446\u0435\u043b\u044b\u0445 \u0442\u0440\u0438 \u043f\u0440\u043e\u043c\u043f\u0442\u0430\u2026 \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043c\u043f\u0442\u044b \u0432 Modelfile \u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0447\u0430\u0442-\u0431\u043e\u0442\u0430 \u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430.<\/p>\n<p>\u0427\u0442\u043e \u0443\u043c\u0435\u0435\u0442 \u0431\u043e\u0442 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442:<\/p>\n<ul>\n<li>\n<p>\u0412\u0441\u0435\u0433\u0434\u0430 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043f\u043e-\u0440\u0443\u0441\u0441\u043a\u0438. \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u044f \u043e\u0436\u0438\u0434\u0430\u043b.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043c\u044b \u0438 \u0441\u0441\u044b\u043b\u043a\u0438. \u0421\u0442\u0430\u0442\u044c\u0438 \u0432\u044b\u0434\u0430\u0435\u0442 \u043d\u0435 \u0432\u0441\u0435, \u0438\u043d\u043e\u0433\u0434\u0430 \u043e\u0448\u0438\u0431\u0430\u0435\u0442\u0441\u044f \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u0442\u0435\u043c\u044b. \u041d\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u043e\u043b\u044c\u0437\u0443 \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437.<\/p>\n<\/li>\n<li>\n<p>\u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043c\u044b \u0431\u043b\u043e\u0433\u0430. \u041f\u043e\u043a\u0430 \u0447\u0442\u043e \u043d\u0435 \u0432\u0441\u0435, \u0431\u0435\u0437 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0443\u0436 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438.<\/p>\n<\/li>\n<\/ul>\n<h2>\u0427\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u043b\u044c\u0448\u0435<\/h2>\n<p>\u041d\u0430 \u0441\u0432\u043e\u0435\u043c MVP-\u0440\u0430\u0441\u043f\u0443\u0442\u044c\u0435 \u044f \u043d\u0430\u0441\u0447\u0438\u0442\u0430\u043b \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0442\u0440\u0438 \u0434\u043e\u0440\u043e\u0433\u0438 \u2014 \u0438 \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0432\u0437\u0433\u043b\u044f\u0434\u0435 \u0441 \u0432\u0435\u0440\u0442\u043e\u043b\u0435\u0442\u0430.<\/p>\n<p><strong>\u0420\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c \u0431\u044d\u043a\u0435\u043d\u0434 \u0447\u0430\u0442-\u0431\u043e\u0442\u0430. <\/strong>ChatGPT \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c LoRa \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u0431\u043e\u043b\u0435\u0435 \u0443\u0437\u043a\u0438\u043c \u0437\u0430\u0434\u0430\u0447\u0430\u043c. \u0417\u0430\u0434\u0430\u0447 \u044f \u043f\u043e\u043a\u0430 \u043c\u043d\u043e\u0433\u043e \u043d\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b, \u0442\u0430\u043a \u0447\u0442\u043e \u0438\u0434\u0435\u044f \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430. \u041c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0447\u0430\u0442\u043e\u0432 \u0438 \u0434\u043e\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u043d\u0435\u0439. \u0418\u043b\u0438, \u0440\u0430\u0437 \u0443\u0436 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0435\u043c\u043d\u043e\u0433\u043e, \u0444\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0438 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u044b \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043a\u0435\u0439\u0441\u0430\u043c.<\/p>\n<p><strong>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u0443\u044e \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0443 \u0447\u0430\u0442-\u0431\u043e\u0442\u0430. <\/strong>\u041f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u043a\u0430 \u0436\u0438\u0432\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0432 \u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435. \u0425\u043e\u0440\u043e\u0448\u043e \u0431\u044b \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0441 GPU, \u043d\u0430\u043b\u0430\u0434\u0438\u0442\u044c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0430\u0437\u044b \u0441\u0442\u0430\u0442\u0435\u0439 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b, \u0447\u0442\u043e\u0431\u044b \u0432 \u0438\u0442\u043e\u0433\u0435 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u0438 YADRO \u0432 \u0432\u0438\u0434\u0435 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u0431\u043e\u0442\u0430. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u043e\u0442\u0440\u0430\u0437\u0438\u0442\u0441\u044f \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043e\u0442\u0432\u0435\u0442\u043e\u0432? \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043d\u0430 Macbook Pro \u0441 M1 Pro \u044f \u0436\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043f\u043e\u043b\u043c\u0438\u043d\u0443\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0438.<\/p>\n<p><strong>\u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 open source. <\/strong>\u0414\u0443\u043c\u0430\u044e, \u043c\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430\u043c \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0431\u043b\u043e\u0433\u043e\u0432 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435. \u0421\u0442\u043e\u0438\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u0449\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0431\u0435\u0437 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u043a YADRO, \u0433\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c \u0431\u043e\u0442\u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u043e\u043c.<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u0435\u043d\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u043e\u043b\u043d\u0443\u0435\u0442 \u0433\u0430\u043b\u043b\u044e\u0446\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043d\u0435\u043f\u043e\u043b\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u2014 \u044d\u0442\u043e \u044f \u0431\u044b \u0445\u043e\u0442\u0435\u043b \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u044c \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u041a\u043e\u043b\u043b\u0435\u0433\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u0430\u043b\u0438, \u0447\u0442\u043e \u0433\u0430\u043b\u043b\u044e\u0446\u0438\u043d\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0443 \u043c\u043e\u0434\u0435\u043b\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u0443\u0433\u043b\u0443\u0431\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438 \u0433\u0438\u043f\u0435\u0440\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u2014 \u044d\u0442\u043e \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0434\u0430\u0441\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0440 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043e\u0442\u043e\u0437\u0432\u0430\u043b\u0441\u044f \u0443 \u0432\u0430\u0441 \u0438\u0434\u0435\u044f\u043c\u0438 \u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u2014 \u044d\u0442\u043e \u0437\u0434\u043e\u0440\u043e\u0432\u043e, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0431\u0441\u0443\u0434\u0438\u043c \ud83d\ude42<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/923780\/\"> https:\/\/habr.com\/ru\/articles\/923780\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u041d\u0430 \u0441\u0432\u044f\u0437\u0438 \u041d\u0438\u043a\u043e\u043b\u0430\u0439 \u0438\u0437 \u0440\u0435\u0434\u0430\u043a\u0446\u0438\u0438 \u0431\u043b\u043e\u0433\u0430 <a href=\"https:\/\/yadro.com?utm_source=habr&amp;utm_medium=referral&amp;utm_campaign=ai-helper-01072025\" rel=\"noopener noreferrer nofollow\">YADRO<\/a>. \u041d\u0430\u0448\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0443 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u044b\u043c \u0438 \u0441\u043c\u0435\u0436\u043d\u044b\u043c \u0442\u0435\u043c\u0430\u043c. \u041c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443, \u0440\u0430\u0434\u0443\u0435\u043c\u0441\u044f \u0438\u043b\u0438 \u043e\u0433\u043e\u0440\u0447\u0430\u0435\u043c\u0441\u044f, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0433\u0438\u043f\u043e\u0442\u0435\u0437\u044b \u0438 \u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u0432 \u043e\u0442\u0432\u0435\u0442 \u0433\u0440\u0430\u0444\u0438\u043a \u0440\u043e\u0441\u0442\u0430 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u043d\u0430 \u043d\u0430\u0441 \u043f\u043e\u0434 \u043d\u043e\u0432\u044b\u043c, \u0431\u043e\u0301\u043b\u044c\u0448\u0438\u043c \u0443\u0433\u043b\u043e\u043c.<\/p>\n<p>\u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0447\u0438\u0441\u043b\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0432 \u0431\u043b\u043e\u0433\u0435 YADRO \u043d\u0435\u0443\u043a\u043b\u043e\u043d\u043d\u043e \u0440\u0430\u0441\u0442\u0435\u0442. \u0410 \u043c\u043e\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u043e\u0439: \u043f\u0430\u0440\u0430-\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u043f\u043b\u044e\u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f\u0440\u043a\u0438\u0445 \u0432\u0441\u043f\u044b\u0448\u0435\u043a \u043f\u043e\u0440\u0430\u043d\u044c\u0448\u0435. \u0417\u0430\u0442\u043e \u0440\u0430\u0441\u0442\u0435\u0442 FOMO \u2014 \u0442\u0440\u0435\u0432\u043e\u0433\u0430, \u0447\u0442\u043e \u044f \u043c\u043e\u0433 \u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u043d\u043e\u0432\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0431\u043b\u043e\u0433\u0430, \u0431\u0443\u0434\u044c \u043c\u043e\u0439 \u0444\u043e\u043a\u0443\u0441 \u0448\u0438\u0440\u0435. \u041f\u043e\u043c\u043e\u0436\u0435\u0442 \u043b\u0438 \u0437\u0434\u0435\u0441\u044c \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442? \u00ab\u041e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u0435\u0439\u0441\u00bb \u2014 \u043e\u0442\u0432\u0435\u0442\u0438\u043b\u0430 ChatGPT, \u0438 \u044f \u043d\u0430\u0447\u0430\u043b \u043f\u0435\u0440\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>\u0412\u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0435 \u0432\u0435\u0441\u044c\u043c\u0430 \u0440\u0430\u0441\u043f\u043b\u044b\u0432\u0447\u0430\u0442\u043e: \u043d\u0443\u0436\u0435\u043d \u0418\u0418-\u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e\u0431\u043e \u0432\u0441\u0435\u0445 \u0442\u0435\u043a\u0441\u0442\u0430\u0445 \u0432 \u0431\u043b\u043e\u0433\u0435 YADRO \u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u043e \u043d\u0438\u043c \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0447\u0430\u0442-\u0431\u043e\u0442\u0430. \u041a\u043e\u0433\u0434\u0430 \u044f \u043d\u0430\u0447\u0438\u043d\u0430\u043b \u043f\u043e\u0441\u0442, \u0432 \u0431\u043b\u043e\u0433\u0435 \u0431\u044b\u043b\u043e 223 \u0441\u0442\u0430\u0442\u044c\u0438, \u0447\u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0440 \u0434\u043b\u044f \u043a\u0440\u043e\u0441\u0441\u043b\u0438\u043d\u043a\u043e\u0432\u043a\u0438. \u0425\u043e\u0447\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b, \u043d\u0430 \u043a\u0430\u043a\u0438\u0435 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u0431\u043b\u043e\u0433\u0430 \u044f \u043c\u043e\u0433\u0443 \u0441\u043e\u0441\u043b\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u043e\u0432\u043e\u0439. \u0411\u044b\u043b\u043e \u0431\u044b \u0437\u0434\u043e\u0440\u043e\u0432\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u0434\u0431\u043e\u0440\u043a\u0438 \u0441\u0442\u0430\u0442\u0435\u0439, \u0447\u0442\u043e \u043c\u044b \u0438\u043d\u043e\u0433\u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0430\u043d\u043e\u043d\u0441\u044b \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u043c\u0438\u0442\u0430\u043f\u043e\u0432. \u0415\u0449\u0435 \u043a\u0430\u043a\u0438\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u044f, \u043d\u0430\u0432\u0435\u0440\u043d\u043e, \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u044e \u043d\u0430 \u0445\u043e\u0434\u0443.<\/p>\n<p>\u0414\u0440\u0443\u0433\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430, \u043a\u0430\u043a \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u2014 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430 \u0432 \u0440\u0430\u0437\u0440\u0435\u0437\u0435 \u0442\u0435\u043c \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0441\u0442\u0430\u0442\u0435\u0439, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445, \u0430 \u043d\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445. \u041d\u043e \u043d\u0435 \u0431\u0443\u0434\u0443 \u0433\u0440\u0443\u0441\u0442\u0438\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435: \u044d\u0442\u043e \u043f\u0435\u0442-\u043f\u0440\u043e\u0435\u043a\u0442, take it easy. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442: \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445, \u0430 \u043d\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0447\u0430\u0442-\u0431\u043e\u0442\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0437\u0430\u043c\u0435\u0442\u043d\u0435\u0435.<\/p>\n<h2>\u0412\u044b\u0431\u043e\u0440 \u0441\u0442\u0435\u043a\u0430<\/h2>\n<p>\u0421\u043e\u0437\u0434\u0430\u044e \u043d\u043e\u0432\u044b\u0439 \u0434\u0438\u0430\u043b\u043e\u0433 \u0441 GPT-4o \u0438 \u0437\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e \u0432 \u043d\u0435\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0430\u0431\u0437\u0430\u0446\u0435\u0432. \u041d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0431\u043e\u0434\u0440\u043e \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p><strong>GPT-4 + LangChain (\u0438\u043b\u0438 ChatGPT API \u0441 RAG). <\/strong>\u00ab\u041c\u0438\u043d\u0443\u0441\u044b: \u043f\u043b\u0430\u0442\u043d\u043e (\u0438 \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u0440\u0430\u0441\u0442\u0438 \u043f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445)\u00bb. \u0422\u043e\u0442 \u0436\u0435 \u043c\u0438\u043d\u0443\u0441 \u2014 \u0438 \u0432 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 <strong>\u00ab\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0434 \u043a\u043b\u044e\u0447 (SaaS-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b): <\/strong><a href=\"http:\/\/writer.com\" rel=\"noopener noreferrer nofollow\"><strong>writer.com<\/strong><\/a><strong>, <\/strong><a href=\"http:\/\/jasper.ai\" rel=\"noopener noreferrer nofollow\"><strong>jasper.ai<\/strong><\/a><strong>, <\/strong><a href=\"http:\/\/copy.ai\" rel=\"noopener noreferrer nofollow\"><strong>copy.ai<\/strong><\/a><strong>\u00bb.<\/strong> \u0410 \u0435\u0441\u0442\u044c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0430 open source?<\/p>\n<p>\u0414\u0430, \u043f\u0440\u0438\u0447\u0435\u043c \u044d\u0442\u043e \u0431\u044b\u043b \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435: <strong>open-source LLM + \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u0430\u044f \u0431\u0430\u0437\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, LLaMA 3 + FAISS \/ Weaviate \/ Qdrant)<\/strong>. \u041f\u0440\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0442\u0440\u0435\u0445 \u043e\u043f\u0446\u0438\u0439 GPT \u0434\u0430\u0436\u0435 \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u043b \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u044d\u0442\u043e\u0439: \u00ab\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c, \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c\u00bb. \u0427\u0435\u0441\u0442\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043e\u0436\u0438\u0434\u0430\u043b \u043e\u0442 OpenAI \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u0430\u043c\u043e\u0440\u0435\u043a\u043b\u0430\u043c\u044b, \u043f\u0440\u0438\u044f\u0442\u043d\u043e \u0443\u0434\u0438\u0432\u043b\u0435\u043d. \u0414\u0430\u0432\u0430\u0439 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043d\u0430 open source, \u043d\u043e \u0441\u043c\u043e\u0433\u0443 \u043b\u0438 \u044f \u043e\u0441\u0438\u043b\u0438\u0442\u044c \u044d\u0442\u043e \u0432 \u043e\u0434\u0438\u043d\u043e\u0447\u043a\u0443?<\/p>\n<p>\u00ab\u0414\u0430, \u0442\u044b \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u0435\u0448\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0441\u0430\u043c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0443 \u0442\u0435\u0431\u044f \u0435\u0441\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043d\u0430\u0432\u044b\u043a\u0438 Python \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 API \u0438\u043b\u0438 \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435\u00bb. \u0422\u0430\u043a, \u043c\u043e\u0438 \u043d\u0430\u0432\u044b\u043a\u0438 Python \u0438\u0441\u0447\u0435\u0440\u043f\u044b\u0432\u0430\u044e\u0449\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u044b <a href=\"https:\/\/habr.com\/ru\/articles\/715950\/\" rel=\"noopener noreferrer nofollow\">\u0432 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435<\/a> (\u0434\u0432\u0430 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u044f \u043f\u0440\u043e\u0448\u0435\u043b \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043c\u0435\u0441\u044f\u0447\u043d\u044b\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u044f\u0437\u044b\u043a\u0443). \u0421 \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0432\u0441\u0435 \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u043b\u0443\u0447\u0448\u0435, \u0430 \u0441 API\u2026 \u0432 \u043e\u0431\u0449\u0435\u043c, \u0437\u0434\u0435\u0441\u044c \u0443\u0436\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0440\u0430 \u0432 \u0441\u0435\u0431\u044f \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 ChatGPT \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u043b \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 \u044d\u0442\u0430\u043f\u044b \u0441 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438. \u0425\u043e\u0447\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0441\u0432\u043e\u0435\u0433\u043e \u0431\u043e\u0442\u0430 \u0441\u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u043a\u043e\u043b\u043b\u0435\u0433\u0438 \u0431\u0435\u0437 \u043e\u043f\u044b\u0442\u0430 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. \u041f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043d\u0435 \u0443\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f, \u043d\u043e \u0438\u0437 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432\u043e\u0437\u044c\u043c\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0436\u043d\u044b\u0435 \u044d\u0442\u0430\u043f\u044b.<\/p>\n<h2>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f (MacOS)<\/h2>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u044e \u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u2014\u00a0\u0432\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430, \u043f\u043e\u043c\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u043a\u043e\u0434\u043e\u043c, \u043f\u0440\u043e\u0439\u0434\u0435\u0442 \u0432 \u043d\u0435\u043c. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e homebrew:<\/p>\n<p><code>\/bin\/bash -c \"$(curl -fsSL <\/code><a href=\"https:\/\/raw.githubusercontent.com\/Homebrew\/install\/HEAD\/install.sh\" rel=\"noopener noreferrer nofollow\"><code>https:\/\/raw.githubusercontent.com\/Homebrew\/install\/HEAD\/install.sh<\/code><\/a><code>)\"  <\/code><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u0435\u043d Python \u0432\u0435\u0440\u0441\u0438\u0438 3.10+. \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043a\u0443\u0440\u0441\u0430 \u043f\u043e \u044f\u0437\u044b\u043a\u0443 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0430 \u043c\u0430\u043a\u0431\u0443\u043a\u0435 \u0442\u043e\u0447\u043d\u043e \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c, \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0435 MacOS \u0440\u0443\u0433\u0430\u0435\u0442 \u0435\u0435 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u0418 \u0442\u0430\u043a \u043d\u0435 \u0443 \u043c\u0435\u043d\u044f \u043e\u0434\u043d\u043e\u0433\u043e, \u043a\u0430\u043a \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u0430\u043b \u0433\u0443\u0433\u043b.<\/p>\n<p>\u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441\u0442\u0430\u0434\u0438\u044e bugfix \u043a\u0430\u043a \u0440\u0430\u0437 \u043f\u0440\u0435\u043e\u0434\u043e\u043b\u0435\u043b Python 3.12, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u044e \u0435\u0433\u043e, \u0432\u0434\u0440\u0443\u0433 \u0438 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0438\u0441\u0447\u0435\u0437\u043d\u0435\u0442.<\/p>\n<p><code>brew install python@3.12<\/code><\/p>\n<p>\u0414\u0430, \u0438 \u043f\u0440\u0430\u0432\u0434\u0430 \u0438\u0441\u0447\u0435\u0437\u043b\u0430. \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u044e \u043f\u0430\u043f\u043a\u0443 llama_blog_tool, \u0432 \u043d\u0435\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435:<\/p>\n<p><code>mkdir llama_blog_tool<\/code><\/p>\n<p><code>cd llama_blog_tool<\/code><\/p>\n<p><code>python3 -m venv venv<\/code><\/p>\n<p><code>source venv\/bin\/activate<\/code><\/p>\n<p>\u0421\u0442\u0430\u0432\u043b\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:<\/p>\n<p><code>pip install --upgrade pip<\/code><\/p>\n<p><code>pip install faiss-cpu langchain sentence-transformers llama-index<\/code><\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c LLaMA 3 \u0447\u0435\u0440\u0435\u0437 llama.cpp (\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430), \u0441\u043e\u0432\u0435\u0442\u0443\u044e\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0435 \u0432\u043e\u0442 \u044d\u0442\u043e:<\/p>\n<p><code>pip install llama-cpp-python<\/code><\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c Jupiter, \u0435\u0441\u043b\u0438 \u044f \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0431\u043b\u043e\u043a\u043d\u043e\u0442\u0430\u0445. \u041f\u043e\u043a\u0430 \u044f \u043b\u0438\u0448\u044c \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u044e, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 Textedit \u043d\u0430 \u043c\u043e\u0435\u043c \u043c\u0430\u043a\u0435, \u043d\u043e \u043f\u0443\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442:<\/p>\n<p><code>pip install notebook<\/code><\/p>\n<p>\u0421\u0440\u0435\u0434\u0430 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u0430, \u043f\u0435\u0440\u0435\u0445\u043e\u0436\u0443 \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443.<\/p>\n<h2>\u041f\u0430\u0440\u0441\u0438\u043c \u0431\u043b\u043e\u0433 \u0432 \u043e\u0434\u0438\u043d \u0448\u0430\u0433<\/h2>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0432\u044b\u0434\u0430\u0442\u044c \u043c\u043d\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0443\u044e \u043f\u0440\u043e\u0441\u0442\u044b\u043d\u044e \u043a\u043e\u043c\u0430\u043d\u0434, \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u043a\u0430 \u0441\u043f\u0440\u043e\u0441\u0438\u043b\u0430, \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043b\u0438 \u0443 \u043c\u0435\u043d\u044f \u0431\u043b\u043e\u0433 \u0438\u043b\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0444\u0430\u0439\u043b\u043e\u0432, \u0438 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b\u0430 \u0441\u0441\u044b\u043b\u043a\u0443. \u0417\u0430\u0442\u0435\u043c \u043e\u0431\u0440\u0430\u0434\u043e\u0432\u0430\u043b\u0430, \u0447\u0442\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Python, \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0441 \u0431\u043b\u043e\u043a\u0430\u043c\u0438 \u043a\u043e\u0434\u0430.<\/p>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u00ab\u0423\u0431\u0435\u0434\u0438\u0441\u044c, \u0447\u0442\u043e \u0442\u044b \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043b \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u2026\u00bb. \u0410 \u043a\u0430\u043a \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f? \u0415\u0441\u043b\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0435\u0441\u0442\u044c <code>(venv)<\/code>, \u0437\u043d\u0430\u0447\u0438\u0442, \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0432 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438.<\/p>\n<p><code>pip install requests beautifulsoup4 tqdm<\/code><\/p>\n<p>\u042d\u0442\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 GPT \u0434\u0430\u043b\u0430 \u0431\u0435\u0437 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0439. \u041d\u0443 \u0443\u0436 \u043d\u0435\u0442, \u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0445\u043e\u0442\u044f \u0431\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0441\u0442\u0430\u0432\u043b\u044e. Requests \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, beautifulsoup \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430, \u0430 tqdm \u2014 \u044d\u0442\u043e\u2026 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441-\u0431\u0430\u0440? \u041b\u0430\u0434\u043d\u043e, \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435\u0442.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u0441 \u043a\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430. GPT \u043d\u0435 \u0443\u0442\u043e\u0447\u043d\u044f\u0435\u0442 \u0433\u0434\u0435, \u0442\u0430\u043a \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043c \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043f\u0430\u043f\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0433\u0434\u0435 \u0443\u0436\u0435 \u043b\u0435\u0436\u0438\u0442 \u043f\u0430\u043f\u043a\u0430 \u0441 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c. \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043a\u043e\u0434\u0430 \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0449\u0435, \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 (IDE) \u0442\u0438\u043f\u0430 <a href=\"https:\/\/www.jetbrains.com\/pycharm\/download\/?section=mac\" rel=\"noopener noreferrer nofollow\">PyCharm<\/a>.<\/p>\n<blockquote>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0435 \u043c\u043e\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e \u0445\u043e\u0434\u0443 \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438, \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0435\u0440\u0432\u0430\u0442\u044c\u0441\u044f. \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430\u0447\u043d\u0435\u0442\u0441\u044f \u043d\u0438\u0436\u0435, \u0441 \u0444\u0430\u0439\u043b\u0430 <strong>collect_all_articles.py<\/strong>.  <\/p>\n<\/blockquote>\n<p>\u0421\u043e\u0437\u0434\u0430\u044e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b parse blog, \u043c\u0435\u043d\u044f\u044e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043d\u0430 *.py, \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e \u0432 IDE, \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u043a\u043e\u0434 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e. \u0412\u043e\u0442 \u0442\u0430\u043a\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f <strong>parse blog.py<\/strong>:<\/p>\n<pre><code class=\"python\">import requests from bs4 import BeautifulSoup from tqdm import tqdm import time import json  BASE_URL = \"https:\/\/habr.com\" START_URL = \"https:\/\/habr.com\/ru\/companies\/yadro\/articles\/\"  headers = {     \"User-Agent\": \"Mozilla\/5.0\" }  def get_article_links(page_url):     resp = requests.get(page_url, headers=headers)     soup = BeautifulSoup(resp.text, \"html.parser\")     articles = soup.find_all(\"article\")     links = []     for article in articles:         a = article.find(\"a\", class_=\"tm-title__link\")         if a:             links.append(BASE_URL + a['href'])     return links  def get_article_content(article_url):     resp = requests.get(article_url, headers=headers)     soup = BeautifulSoup(resp.text, \"html.parser\")     title_tag = soup.find(\"h1\")     body_divs = soup.find_all(\"div\", class_=\"article-formatted-body\")      title = title_tag.text.strip() if title_tag else \"\u0411\u0435\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\"     body = \"\\n\".join(div.text.strip() for div in body_divs)          return {         \"url\": article_url,         \"title\": title,         \"body\": body     }  def parse_all_articles(max_pages=5):     all_articles = []     for page in range(1, max_pages + 1):         print(f\"\ud83d\udcc4 \u041f\u0430\u0440\u0441\u0438\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 {page}\")         url = START_URL + f\"page{page}\/\"         links = get_article_links(url)         for link in tqdm(links, desc=\"\u0421\u0442\u0430\u0442\u044c\u0438\"):             try:                 article = get_article_content(link)                 all_articles.append(article)                 time.sleep(1)  # \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u0434\u0434\u043e\u0441\u0438\u0442\u044c Habr             except Exception as e:                 print(f\"\u26a0\ufe0f \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 {link}: {e}\")     return all_articles  if __name__ == \"__main__\":     articles = parse_all_articles(max_pages=3)  # \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c     with open(\"articles.json\", \"w\", encoding=\"utf-8\") as f:         json.dump(articles, f, ensure_ascii=False, indent=2)     print(f\"\u2705 \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e {len(articles)} \u0441\u0442\u0430\u0442\u0435\u0439 \u0432 articles.json\")<\/code><\/pre>\n<p>\u0425\u043e\u0440\u043e\u0448\u043e, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430 \u043f\u0430\u0443\u0437\u0430 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u0438 \u0435\u0441\u0442\u044c \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f. \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0442\u043a\u0440\u043e\u0435\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0432 \u043f\u0430\u043f\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0441\u043a\u0440\u0438\u043f\u0442:<\/p>\n<p><code>python parse_blog.py<\/code><\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0448\u0430\u0433\u043e\u0432 \u0437\u0430 \u043f\u044f\u0442\u044c \u0441 ChatGPT \u043e\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 <code>no such file or directory: venv\/bin\/activate<\/code> \u044f \u0434\u043e\u0431\u0440\u0430\u043b\u0441\u044f \u0434\u043e \u0432\u0435\u0440\u0434\u0438\u043a\u0442\u0430: \u00ab\u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0432 zsh \u0443 \u0442\u0435\u0431\u044f \u0441\u043d\u043e\u0432\u0430 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d \u0430\u043b\u0438\u0430\u0441 python, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \/usr\/bin\/python \u2014 \u043e\u0442\u0441\u044e\u0434\u0430 \u0438 \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u043a\u0438\u00bb.<\/p>\n<figure class=\"full-width\">\n<div><figcaption><em>\u041d\u0430\u0434\u0435\u0436\u043d\u043e \u2014 \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u0430 \u0442\u043e \u0443\u0436\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0436\u043e\u043d\u0433\u043b\u0438\u0440\u0443\u044e \u0431\u0435\u043d\u0437\u043e\u043f\u0438\u043b\u0430\u043c\u0438<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u0423\u0440\u0430, \u043f\u0430\u0440\u0441\u0435\u0440 \u0441\u043a\u0430\u0447\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438! \u041f\u0440\u0430\u0432\u0434\u0430, \u0442\u043e\u043b\u044c\u043a\u043e 60 \u0438\u0437 223.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0421 \u0447\u0435\u043c \u044d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e, \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e. \u0412 <a href=\"https:\/\/habr.com\/ru\/companies\/yadro\/articles\/\" rel=\"noopener noreferrer nofollow\">\u0431\u043b\u043e\u0433\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438<\/a> \u0432\u044b\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043e 20 \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u0441\u043b\u0435 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043e\u0431\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u043d\u043e\u0433\u043e\u0442\u043e\u0447\u0438\u0438. \u041d\u0430\u0434\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0441\u043f\u0430\u0440\u0441\u0438\u043b \u0432\u0441\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0437\u043b\u043e\u0436\u0443 \u043d\u043e\u0432\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0441\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u043e\u043f\u0438\u0448\u0443, \u043a\u0430\u043a \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443. \u041d\u043e\u0432\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">import requests from bs4 import BeautifulSoup from tqdm import tqdm import time import json  BASE_URL = \"https:\/\/habr.com\" COMPANY_BLOG_URL = \"https:\/\/habr.com\/ru\/companies\/yadro\/articles\/page{}\/\"  headers = {     \"User-Agent\": \"Mozilla\/5.0\" }  articles = []  def parse_article(url):     try:         resp = requests.get(url, headers=headers)         soup = BeautifulSoup(resp.text, \"html.parser\")          title_tag = soup.find(\"h1\")         content_tag = soup.find(\"div\", class_=\"tm-article-body\")          if not title_tag or not content_tag:             return None          return {             \"url\": url,             \"title\": title_tag.text.strip(),             \"content\": content_tag.get_text(strip=True, separator=\"\\n\")         }     except Exception as e:         print(f\"[!] Error parsing {url}: {e}\")         return None  def get_article_links_from_page(page_number):     url = COMPANY_BLOG_URL.format(page_number)     resp = requests.get(url, headers=headers)      if resp.status_code != 200:         return []      soup = BeautifulSoup(resp.text, \"html.parser\")     article_tags = soup.select(\"a.tm-title__link\")     return [BASE_URL + a[\"href\"] for a in article_tags]  print(\"\ud83d\udd0d \u041d\u0430\u0447\u0438\u043d\u0430\u044e \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0432\u0441\u0435\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0431\u043b\u043e\u0433\u0430...\") page = 1 while True:     links = get_article_links_from_page(page)     if not links:         print(f\"\u2705 \u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430: {page - 1}\")         break      print(f\"\u2192 \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 {page}: \u043d\u0430\u0439\u0434\u0435\u043d\u043e {len(links)} \u0441\u0441\u044b\u043b\u043e\u043a\")     for link in tqdm(links, desc=f\"  \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0442\u0430\u0442\u0435\u0439 \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b {page}\"):         article = parse_article(link)         if article:             articles.append(article)         time.sleep(1)  # \u043f\u0430\u0443\u0437\u0430<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-465327","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/465327","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=465327"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/465327\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=465327"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=465327"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=465327"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}