{"id":465868,"date":"2025-07-03T09:38:16","date_gmt":"2025-07-03T09:38:16","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=465868"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=465868","title":{"rendered":"<span>\u0410\u043b\u0438\u0441\u0430, \u043f\u043e\u0434\u0432\u0438\u043d\u044c\u0441\u044f<\/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><em>\u0421\u0442\u0430\u0442\u044c\u044f \u043e\u0431\u0437\u043e\u0440\u043d\u0430\u044f, \u0434\u043b\u044f \u0434\u0438\u043d\u043e\u0437\u0430\u0432\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u0447\u043d\u0443\u043b\u0438\u0441\u044c \u0438\u0437 \u0431\u0435\u0441\u043f\u0440\u043e\u0441\u0432\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u043d\u0430 \u043d\u0435\u0432\u0435\u0434\u0435\u043d\u0438\u044f. \u0422\u0430\u043a\u0438\u043c \u0434\u0438\u043d\u043e\u0437\u0430\u0432\u0440\u043e\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u044f\u0432\u043b\u044f\u044e\u0441\u044c \u044f \u0441\u0430\u043c. \u0412\u0441\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u043c\u044b\u0441\u043b\u0435\u0444\u043e\u0440\u043c\u044b \u0438 \u043f\u0440\u043e\u0447\u0435\u0435, \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u044e\u0442 \u043d\u0430 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u0438\u0441\u0442\u0438\u043d\u0443 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0438. \u041d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b &#171;\u0430 \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0425&#187; \u043e\u0442\u0432\u0435\u0447\u0443: \u0442\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c. \u0421\u0442\u0430\u0442\u044c\u044f \u0431\u044b\u043b\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u043e\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u0440\u0435\u043c\u044f, \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0440\u044b\u0432\u043a\u0430\u043c\u0438.<\/em><br \/><em>\u041f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f.<\/em><\/p>\n<p>\u0412\u043e\u043a\u0440\u0443\u0433 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0432\u0438\u0436\u0443\u0445\u0438 \u0432\u043e\u043a\u0440\u0443\u0433 \u0418\u0418: \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 DeepSeek R1 \u043e\u0431\u0432\u0430\u043b\u0438\u043b \u0430\u043a\u0446\u0438\u0438 \u0418\u0422 \u0433\u0438\u0433\u0438\u043d\u0442\u043e\u0432 \u0421\u0428\u0410! Tulu 3 \u043f\u0440\u0435\u0432\u0437\u043e\u0448\u043b\u0430 DeepSeek V3! Qwen 2.5-VL \u043e\u0442 Alibaba \u043e\u0431\u043e\u0448\u0435\u043b DeepSeek! \u041d\u0443 \u0438 \u0442.\u0434. \u0438 \u0442.\u043f.<\/p>\n<p>\u0410 \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u0418\u0418 \u0442\u0430\u043a\u043e\u0439? \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0435\u0433\u043e \u043f\u0438\u0448\u0443\u0442 \u043a\u043e\u0434, \u043a\u043e\u043f\u0438\u0440\u0430\u0439\u0442\u0435\u0440\u044b \u043f\u0438\u0448\u0443\u0442 \u0442\u0435\u043a\u0441\u0442, \u0434\u0438\u0437\u0430\u0439\u043d\u0435\u0440\u044b \u0440\u0438\u0441\u0443\u044e\u0442 \u0434\u0438\u0437\u0430\u0439\u043d\u044b (\u0442\u043e\u0442 \u0436\u0435 \u0418\u043e\u043d\u043e\u0432 \u043e\u0442 \u0441\u0442\u0443\u0434\u0438\u0438 \u0410\u0440\u0442\u0435\u043c\u0438\u044f \u041b\u0435\u0431\u0435\u0434\u0435\u0432\u0430), \u043a\u043e\u043d\u0442\u0435\u043d\u0442-\u043c\u0435\u0439\u043a\u0435\u0440\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u0440\u0438\u0441\u0443\u043d\u043a\u0438 \u0438 \u0432\u0438\u0434\u0435\u043e.<\/p>\n<p>\u0410 \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0430\u043c, \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u043b\u044e\u0434\u044f\u043c? \u0410\u043b\u0438\u0441\u0430, \u041c\u0430\u0440\u0443\u0441\u044f, \u0421\u0430\u043b\u044e\u0442, \u0421\u0438\u0440\u0438, \u041a\u043e\u0440\u0442\u0430\u043d\u0430, \u0410\u043b\u0435\u043a\u0441\u0430,  Bixby, \u0438 \u043f\u0440\u043e\u0447\u0435\u0435.<\/p>\n<p>\u042d\u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u0432\u0441\u0435 \u044d\u0442\u0438 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0418\u0418 \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u044b \u043d\u0430\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0435 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442. \u041c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0445 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0412\u0441\u044f \u043d\u0430\u0448\u0430 \u0436\u0438\u0437\u043d\u044c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u0438\u043c \u043e\u043d\u043b\u0430\u0439\u043d \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430\u043c \u2014 \u043a\u0430\u043a \u043e\u0442\u043a\u0440\u044b\u0442\u0430\u044f \u043a\u043d\u0438\u0433\u0430 \u0434\u043b\u044f \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u0440\u043e\u0447\u044c \u043d\u0430 \u043d\u0430\u0441 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p>\u0410 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 &#8230;\u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0418\u0418 \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430?<\/p>\n<h2>\u0427\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c?<\/h2>\n<p>\u0410\u043b\u0438\u0441\u0430 \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u0418\u0418 \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u044b \u2014 \u0441\u043b\u0443\u0448\u0430\u044e\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0441 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u0430 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u0411\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0438\u043c\u0435\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u043e\u0433 \u0437\u0430\u0442\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u0441\u0432\u043e\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0435\u0437\u0442\u044c \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442, \u0438 \u0441\u043b\u0438\u0432\u0430\u0442\u044c \u043b\u0438\u0447\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0437\u043e\u0432\u0435\u043c \u0441\u0432\u043e\u0435\u0433\u043e \u0418\u0418 \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430 <s>\u043d\u0435 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e<\/s> \u00ab\u0414\u0436\u0430\u0440\u0432\u0438\u0441\u00bb. \u0418 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0432 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0438 &#8212; \u00ab\u0414\u0436\u0430\u0440\u0432\u0438\u0441\u00bb.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043a\u0430\u043a \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0438\u043c \u0437\u0430\u0433\u043e\u0440\u043e\u0434\u043d\u044b\u043c \u0434\u043e\u043c\u043e\u043c<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p>\u0432\u0440\u0435\u043c\u044f, \u0434\u0430\u0442\u0430 (\u0432\u044b\u0434\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0438 \u0434\u0430\u0442\u0443)<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a\u0438\u0435 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u043e\u0432\u043e\u0441\u0442\u0438? (\u0432\u044b\u0434\u0430\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0442\u043e\u043f 5 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439)<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a\u0430\u044f \u043f\u043e\u0433\u043e\u0434\u0430 \u0432 \u043c\u043e\u0441\u043a\u0432\u0435 \u0438 \u043f\u0438\u0442\u0435\u0440\u0435? (\u0432\u044b\u0434\u0430\u0435\u0442 \u043f\u043e\u0433\u043e\u0434\u0443)<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0432\u0435\u0440\u044c \u043f\u043e\u0447\u0442\u0443 (\u0432\u044b\u0434\u0430\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0445 \u043f\u0438\u0441\u0435\u043c \u044d\u043b.\u043f\u043e\u0447\u0442\u044b)<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u043a\u0430\u0436\u0438 \u0441\u0443\u0448\u0438 (\u0432\u044b\u0437\u043e\u0432 API \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430 \u0441\u0443\u0448\u0438 \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0432\u043e\u0439 \u0438\u043c\u0435\u0435\u0442\u0441\u044f)<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u043f\u0440\u0430\u0432\u044c \u0421\u041c\u0421 \u0431\u0440\u0430\u0442\u0443: \u00ab\u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0435 \u043f\u0440\u0438\u0435\u0434\u0443, \u0432\u0435\u0441\u044c \u0434\u0435\u043d\u044c \u0437\u0430\u043d\u044f\u0442\u00bb (\u0432\u044b\u0437\u043e\u0432 API \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0421\u041c\u0421)<\/p>\n<\/li>\n<li>\n<p>\u043a\u0443\u0440\u0441 \u0434\u043e\u043b\u043b\u0430\u0440\u0430 (\u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 1 \u0434\u043e\u043b\u043b\u0430\u0440\u0430 \u0432 \u0440\u0443\u0431\u043b\u044f\u0445 \u043f\u043e \u043a\u0443\u0440\u0441\u0443 \u0426\u0411)<\/p>\n<\/li>\n<li>\n<p>\u0432\u043a\u043b\u044e\u0447\u0438 \u043c\u0443\u0437\u044b\u043a\u0443 \u0431\u0435\u0442\u0445\u043e\u0432\u0435\u043d \u0441\u0438\u043c\u0444\u043e\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440 \u043f\u044f\u0442\u044c (\u0437\u0430\u043f\u0443\u0441\u043a \u043f\u043b\u0435\u0435\u0440\u0430)<\/p>\n<\/li>\n<li>\n<p>\u0431\u0443\u0434\u0438\u043b\u044c\u043d\u0438\u043a \u043d\u0430 \u0437\u0430\u0432\u0442\u0440\u0430 \u0432 17:15 (\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0438\u043b\u044c\u043d\u0438\u043a\u0430)<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u043c\u0435\u043d\u0438 \u0432\u0441\u0435 \u0434\u0435\u043b\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f (\u043e\u0442\u043c\u0435\u043d\u0430 \u0432\u0441\u0435\u0445 \u0431\u0443\u0434\u0438\u043b\u044c\u043d\u0438\u043a\u043e\u0432)<\/p>\n<\/li>\n<li>\n<p>\u0432\u043a\u043b\u044e\u0447\u0438 \u0440\u043e\u0431\u043e\u0442-\u043f\u044b\u043b\u0435\u0441\u043e\u0441 (\u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u00ab\u0443\u043c\u043d\u043e\u043c\u0443 \u0434\u043e\u043c\u0443\u00bb)<\/p>\n<\/li>\n<li>\n<p>\u0432\u043a\u043b\u044e\u0447\u0438 \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440 \u0432 \u043a\u0443\u0445\u043d\u0435 (\u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u00ab\u0443\u043c\u043d\u043e\u043c\u0443 \u0434\u043e\u043c\u0443\u00bb)<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u043a\u0440\u043e\u0439 \u0448\u0442\u043e\u0440\u044b \u0432 \u0433\u043e\u0441\u0442\u0438\u043d\u043e\u0439 (\u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u00ab\u0443\u043c\u043d\u043e\u043c\u0443 \u0434\u043e\u043c\u0443\u00bb)<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u043a\u043b\u044e\u0447\u0438 \u0441\u0432\u0435\u0442 \u0432 \u043a\u043e\u0440\u0438\u0434\u043e\u0440\u0435, \u0432 \u043f\u0440\u0438\u0445\u043e\u0436\u0435\u0439 \u0438 \u0432 \u0432\u0430\u043d\u043d\u043e\u0439 (\u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u00ab\u0443\u043c\u043d\u043e\u043c\u0443 \u0434\u043e\u043c\u0443\u00bb)<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0441\u0442\u0430\u0432\u044c \u0434\u043e\u043c \u043d\u0430 \u043e\u0445\u0440\u0430\u043d\u0443 (\u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u00ab\u0443\u043c\u043d\u043e\u043c\u0443 \u0434\u043e\u043c\u0443\u00bb)<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u043d\u0430\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u0443\u044e \u043b\u0438\u0447\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0433 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b: \u043a\u0430\u043a\u0438\u0435 \u0435\u0441\u0442\u044c \u043a\u043e\u043c\u043d\u0430\u0442\u044b, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u0442\u0430\u043a\u0442 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430, \u0430\u0434\u0440\u0435\u0441 \u0434\u043e\u043c\u0430 \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0443\u0448\u0438, \u0438 \u0442.\u0434.<\/p>\n<p>\u0410\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2014 \u043f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u0441 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u043e\u043c \u0438 \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c\u0438, \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0439 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0435\u0442\u044c, \u0438\u043c\u0435\u044e\u0449\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0443, \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0449\u0438\u0439 \u0418\u0418, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0448\u0438 \u0443\u0441\u0442\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u0416\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0451 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u043d\u0430 \u043d\u0435\u0434\u043e\u0440\u043e\u0433\u043e\u043c \u041f\u041a, \u0431\u0435\u0437 \u043a\u0440\u0443\u0442\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b.<\/p>\n<h2>\u0421 \u0447\u0435\u0433\u043e \u043d\u0430\u0447\u0430\u0442\u044c?<\/h2>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u0433\u043e\u043b\u043e\u0441\u0430. \u0422.\u043a. \u044f \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c \u0441 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u0433\u043e\u043b\u043e\u0441\u0430 <a href=\"https:\/\/alphacephei.com\/vosk\/index.ru\" rel=\"noopener noreferrer nofollow\">https:\/\/alphacephei.com\/vosk\/index.ru<\/a>, \u043f\u0440\u043e\u0435\u043a\u0442: <a href=\"https:\/\/github.com\/alphacep\/vosk-api\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/alphacep\/vosk-api<\/a> \u2013 \u0442\u043e \u0435\u0433\u043e \u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u043f\u0430\u043a\u0435\u0442 Vosk \u0432 NuGet. \u0417\u0430\u0442\u0435\u043c \u0441\u043a\u0430\u0447\u0430\u0435\u043c \u0438 \u0440\u0430\u0437\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c vosk-model-small-ru-0.22 (\u0432\u0441\u0435\u0433\u043e 45\u041c\u0431) \u0438\u0437 <a href=\"https:\/\/alphacephei.com\/vosk\/models\" rel=\"noopener noreferrer nofollow\">https:\/\/alphacephei.com\/vosk\/models<\/a>.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u043e\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u043f\u0430\u043a\u0435\u0442 NAudio. \u0410 \u0434\u043b\u044f \u043e\u0437\u0432\u0443\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0414\u0436\u0430\u0440\u0432\u0438\u0441\u0430 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c TTS (Text-to-Speech). \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0431\u044b\u0442\u044c \u0440\u0443\u0441\u0441\u043a\u043e\u0433\u043e \u043c\u0443\u0436\u0441\u043a\u043e\u0433\u043e \u0433\u043e\u043b\u043e\u0441\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0441 \u0441\u0430\u0439\u0442\u0430 <a href=\"https:\/\/rhvoice.su\/voices\" rel=\"noopener noreferrer nofollow\">https:\/\/rhvoice.su\/voices<\/a>. \u0412 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043d\u0438\u043c\u0430\u0435\u043c \u0433\u0430\u043b\u043a\u0443 \u00ab\u041f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f 32-\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f\u00bb.<\/p>\n<details class=\"spoiler\">\n<summary>C\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">using NAudio.Wave; using Newtonsoft.Json; using System; using System.Linq; using System.Speech.Synthesis; using Vosk;  namespace ConsoleJarvis {     internal class Program     {         private class RecognizeWord         {             public double conf { get; set; }             public double end { get; set; }             public double start { get; set; }             public string word { get; set; }         }         private class RecognizeResult         {             public RecognizeWord[] result { get; set; }             public string text { get; set; }         }          static void Main(string[] args)         {             \/\/\u043c\u043e\u0434\u0435\u043b\u044c             Model model = new Model(\"vosk-model-small-ru-0.22\");              \/\/\u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \"\u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u0435\u043b\u044c\"             var recognizer = new VoskRecognizer(model, 16000.0f);             recognizer.SetMaxAlternatives(0);             recognizer.SetWords(true);              \/\/\u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0438 \u00ab\u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u00bb \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d             var waveIn = new WaveInEvent();             waveIn.DeviceNumber = 0; \/\/\u043f\u0435\u0440\u0432\u044b\u0439 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e             waveIn.WaveFormat = new WaveFormat(16000, 1); \/\/\u0434\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f             waveIn.DataAvailable += WaveIn_DataAvailable;             waveIn.StartRecording();              \/\/\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u0430             void WaveIn_DataAvailable(object sender, WaveInEventArgs e)             {                 \/\/\u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0435\u043c                 if (recognizer.AcceptWaveform(e.Buffer, e.BytesRecorded))                 {                     \/\/\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0432 json                     string txt = recognizer.FinalResult();                      \/\/\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c                     RecognizeResult values = JsonConvert.DeserializeObject&lt;RecognizeResult&gt;(txt);                      \/\/\u043f\u0430\u0440\u0441\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b                     parseCommands(values);                 }             }              Console.WriteLine();             Console.WriteLine(\"\u0421\u043a\u0430\u0436\u0438\u0442\u0435 \u043e\u0434\u043d\u0443 \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434:\");             Console.WriteLine(\"\u0414\u0436\u0430\u0440\u0432\u0438\u0441, \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043c\u0430\u043d\u0434!\");             Console.WriteLine(\"\u0414\u0436\u0430\u0440\u0432\u0438\u0441, \u0434\u0430\u0442\u0430\");             Console.WriteLine(\"\u0414\u0436\u0430\u0440\u0432\u0438\u0441, \u0432\u0440\u0435\u043c\u044f\");             Console.WriteLine(\"\u0414\u0436\u0430\u0440\u0432\u0438\u0441, \u0437\u0430\u043f\u0443\u0441\u0442\u0438 \u0431\u043b\u043e\u043a\u043d\u043e\u0442\");             Console.WriteLine(\"\u0414\u0436\u0430\u0440\u0432\u0438\u0441, \u0432\u044b\u0445\u043e\u0434\");             Console.WriteLine(\"\u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 'exit' \u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 Enter \u0447\u0442\u043e-\u0431\u044b \u0432\u044b\u0439\u0442\u0438\");             Console.WriteLine();             var input = Console.ReadLine();             while (input != \"exit\")             {             }         }          \/\/\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u0432\u0435\u0442         static void PlayTTS(string text)         {             var synthesizer = new SpeechSynthesizer();             synthesizer.SetOutputToDefaultAudioDevice(); \/\/\u0430\u0443\u0434\u0438\u043e-\u0432\u044b\u0445\u043e\u0434 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e             \/\/synthesizer.SelectVoice(voiceName); \/\/\u0432\u044b\u0431\u043e\u0440 \u0433\u043e\u043b\u043e\u0441\u0430              var builder = new PromptBuilder();             builder.StartVoice(synthesizer.Voice);             builder.AppendText(text);             builder.EndVoice();              \/\/\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0437\u0432\u0443\u043a             synthesizer.Speak(text);         }          static void parseCommands(RecognizeResult words)         {             if (words.text.Length == 0) return;              Console.WriteLine(\"\u0420\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u043e: \" + words.text + Environment.NewLine);              \/\/\u0435\u0441\u043b\u0438 \u0432 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0434\u0436\u0430\u0440\u0432\u0438\u0441 - \u0441\u043b\u0443\u0448\u0430\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443             if (words.result.First().word.Contains(\"\u0434\u0436\u0430\u0440\u0432\u0438\u0441\"))             {                 var text = words.result.Select(obj =&gt; obj.word).ToList();                  var print = string.Join(\" \", text);                 var command = string.Join(\" \", text.Skip(1)); \/\/Skip(1) - \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0435\u0440\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \"\u0434\u0436\u0430\u0440\u0432\u0438\u0441\"                  \/\/\u043b\u043e\u0433\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443                 Console.WriteLine(print);                  var executerComment = \"\";                  if (command.Trim().Length == 0)                 {                     Console.WriteLine(\"\u0414\u0436\u0430\u0440\u0432\u0438\u0441: \u0447\u0442\u043e?\");                     PlayTTS(\"\u0447\u0442\u043e?\");                 }                 else if (!Executer.Parse(command, ref executerComment)) \/\/\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b                 {                     Console.WriteLine(\"\u0414\u0436\u0430\u0440\u0432\u0438\u0441: \u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0435 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u0430\");                     PlayTTS(\"\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0435 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u0430\");                 }                 else                 {                     Console.WriteLine(\"\u0414\u0436\u0430\u0440\u0432\u0438\u0441: \"+executerComment);                     PlayTTS(executerComment);                 }                 Console.WriteLine(\"\");             }         }     } }<\/code><\/pre>\n<p> \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0444\u0430\u0439\u043b Executer.cs:<\/p>\n<pre><code class=\"cs\">using System; using System.Collections.Generic; using System.Globalization;  namespace ConsoleJarvis {     public static class Executer     {         public delegate void Func(string text, ref string comment);          private class Command         {             public string word { get; set; }             public Func action { get; set; }             public Command(string word, Func action)             {                 this.word = word;                 this.action = action;             }          }          private static readonly List&lt;Command&gt; commands = new List&lt;Command&gt;();          static Executer()         {             \/\/\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0441\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b              commands.Add(new Command(\"\u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043c\u0430\u043d\u0434\", (string text, ref string comment) =&gt;             {                 foreach (var c in commands) {                     comment = comment + Environment.NewLine + c.word + '.';                 }             }));              commands.Add(new Command(\"\u0434\u0430\u0442\u0430\", (string text, ref string comment) =&gt;             {                 comment = DateTime.Now.ToString(\"dddd dd MMMM yyyy\", CultureInfo.CurrentCulture);             }));              commands.Add(new Command(\"\u0432\u0440\u0435\u043c\u044f\", (string text, ref string comment) =&gt;             {                 comment = DateTime.Now.ToString(\"H mm\", CultureInfo.CurrentCulture);             }));              commands.Add(new Command(\"\u0437\u0430\u043f\u0443\u0441\u0442\u0438\", (string text, ref string comment) =&gt;             {                 foreach (var c in text.Split(' '))                 {                     switch (c)                     {                         case \"\u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440\":                             System.Diagnostics.Process.Start(@\"calc.exe\");                             return;                         case \"\u0431\u043b\u043e\u043a\u043d\u043e\u0442\":                             System.Diagnostics.Process.Start(@\"notepad.exe\");                             return;                     }                  }                 comment = \"\u044f \u043d\u0435 \u0443\u043c\u0435\u044e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0438\u0447\u0435\u0433\u043e \u043a\u0440\u043e\u043c\u0435 \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u0438 \u0431\u043b\u043e\u043a\u043d\u043e\u0442\u0430\";             }));              commands.Add(new Command(\"\u0432\u044b\u0445\u043e\u0434\", (string text, ref string comment) =&gt;             {                 Environment.Exit(0);             }));          }          public static bool Parse(string text, ref string comment)         {             foreach (var command in commands)             {                 if (text.Contains(command.word))                 {                     command.action(text, ref comment);                     return true;                 }             }             return false;         }     } }<\/code><\/pre>\n<p> \u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430:<\/p>\n<pre><code class=\"json\">{   \"result\" : [{       \"conf\" : 1.000000,       \"end\" : 1.110000,       \"start\" : 0.630000,       \"word\" : \"\u0434\u0436\u0430\u0440\u0432\u0438\u0441\"     }, {       \"conf\" : 1.000000,       \"end\" : 1.410000,       \"start\" : 1.110000,       \"word\" : \"\u043a\u0443\u0440\u0441\"     }, {       \"conf\" : 1.000000,       \"end\" : 1.860000,       \"start\" : 1.410000,       \"word\" : \"\u0434\u043e\u043b\u043b\u0430\u0440\u0430\"     }],   \"text\" : \"\u0434\u0436\u0430\u0440\u0432\u0438\u0441 \u043a\u0443\u0440\u0441 \u0434\u043e\u043b\u043b\u0430\u0440\u0430\" }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a <s>\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0445\u0438\u0442\u0440\u044b\u0445 \u043f\u0440\u0438\u0441\u043f\u043e\u0441\u043e\u0431\u043b\u0435\u043d\u0438\u0439 \u0431\u0443\u0445\u0430\u043d\u043a\u0430 \u0431\u0435\u043b\u043e\u0433\u043e \u0445\u043b\u0435\u0431\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0430\u0441\u044c \u0432 \u0442\u0440\u043e\u043b\u043b\u0435\u0439\u0431\u0443\u0441<\/s> \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u00ab\u0413\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0439 \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442 \u0418\u0440\u0438\u043d\u0430\u00bb <a href=\"https:\/\/habr.com\/ru\/articles\/595855\/\" rel=\"noopener noreferrer nofollow\">https:\/\/habr.com\/ru\/articles\/595855\/<\/a>.<\/p>\n<h2>\u041f\u0440\u043e\u0431\u0443\u0435\u043c LLM<\/h2>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 LLM \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e, \u0433\u0443\u0433\u043b \u0441\u043e\u0432\u0435\u0442\u0443\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c LM Studio. \u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c \u0447\u0442\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c  \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 AVX2. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u0442\u0430\u043a\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043d\u0430 Intel(R) Core(TM) i7-3770K \u043d\u0435\u0442.<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0447\u0442\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c: GPT4ALL. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438 \u0438\u0437 \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u00ab\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f GPT4ALL\u00bb, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0441 \u043d\u0435\u043a\u043e\u0435\u0433\u043e HuggingFace.<\/p>\n<p>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 HuggingFace? \u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0446\u0435\u043b\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439. \u0412\u044b\u0431\u0440\u0430\u043b \u0432 \u043f\u043e\u0438\u0441\u043a\u0435 \u0441\u0430\u043c\u0443\u044e \u043c\u0430\u043b\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c Jarvis-0.5B.f16.gguf \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 948\u041c\u0431.<\/p>\n<p>\u041f\u0438\u0448\u0443 \u00ab\u043f\u0440\u0438\u0432\u0435\u0442\u00bb. \u0417\u0430\u0448\u0443\u043c\u0435\u043b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u044b\u0439 \u043a\u0443\u043b\u0435\u0440, \u0438 \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u043e\u043d\u043e \u043e\u0442\u0432\u0435\u0442\u0438\u043b\u043e.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/afe\/be8\/0e2\/afebe80e2d85bc6456e79e9bae28a94a.png\" width=\"300\" height=\"254\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/afe\/be8\/0e2\/afebe80e2d85bc6456e79e9bae28a94a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/afe\/be8\/0e2\/afebe80e2d85bc6456e79e9bae28a94a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<div class=\"floating-image\">\n<p>\u0412\u043e\u0442 \u043e\u043d\u043e \u0447\u0442\u043e! \u0412\u043e\u0442 \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d \u0430\u043f\u0433\u0440\u0435\u0439\u0434 \u041f\u041a! \u041d\u0435 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c \u0432 \u0438\u0433\u0440\u044b! \u0410 \u0440\u0430\u0434\u0438 \u0432\u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u0441\u0430\u043c\u043e\u0433\u043e!<\/p>\n<p>\u041e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438 \u2014 koboldcpp.<\/p>\n<\/div>\n<p>\u041d\u043e \u043f\u043e\u0433\u043e\u0434\u0438\u0442\u0435, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0440\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u0434, \u043d\u0430\u0434\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438.<\/p>\n<h2>LLM, \u0411\u042f\u041c, \u041d\u0435\u0439\u0440\u043e\u043d\u043a\u0430, \u0427\u0430\u0442-\u0433\u043f\u0442. \u041a\u0440\u0430\u0442\u043a\u0438\u0439 \u043f\u043e\u043d\u044f\u0442\u0438\u0439\u043d\u044b\u0439 \u043a\u0443\u0440\u0441<\/h2>\n<p>\u0427\u0442\u043e-\u0431\u044b \u043f\u0440\u0438\u043a\u043e\u0441\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e\u043c\u0443 \u043c\u0438\u0440\u0443 LLM, \u043e\u043a\u0443\u043d\u0435\u043c\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432 \u0442\u0435\u043e\u0440\u0438\u044e. \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0430, \u0441 \u0447\u0435\u043c \u0435\u0435 \u0435\u0434\u044f\u0442. \u041f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0442\u0435\u0445 \u043a\u0442\u043e \u043e\u0441\u043e\u0431\u043e \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u0438\u043c \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u0441\u044f, \u043d\u043e \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c. \u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u2014 \u043c\u043e\u0438 \u043b\u0438\u0447\u043d\u044b\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c. \u041f\u0440\u043e\u0441\u044c\u0431\u0430 \u043d\u0435 \u0441\u0443\u0434\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u0433\u043e \u0437\u0430 \u0441\u0442\u0438\u043b\u044c \u043f\u0438\u0441\u044c\u043c\u0430.<\/p>\n<p>\u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 <strong>\u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0430<\/strong> \u2014 \u044d\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0447\u0438\u0441\u0435\u043b \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u043e\u0434\u0430\u044e\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043a\u0430\u043a\u0443\u044e-\u043b\u0438\u0431\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e (\u0442\u0435\u043a\u0441\u0442, \u0444\u043e\u0442\u043e, \u0437\u0432\u0443\u043a), \u0438 \u044d\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u043f\u0440\u043e\u0445\u043e\u0434\u044f \u0447\u0435\u0440\u0435\u0437 \u043c\u0430\u0441\u0441\u0438\u0432, \u0432\u044b\u0434\u0430\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<p>\u0421\u0430\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u043e\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00ab<strong>\u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441<\/strong>\u00bb (inference).<\/p>\n<p>\u041a\u0430\u043a \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0430 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u043a\u0430\u043a\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043c\u044b \u0435\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c, \u0438 \u043a\u0430\u043a\u0438\u043c\u0438 \u0435\u0434\u0438\u043d\u0438\u0446\u0430\u043c\u0438 \u043e\u043d\u0430 \u00ab\u043c\u044b\u0441\u043b\u0438\u0442\u00bb? \u041f\u043e\u043d\u044f\u0442\u043d\u043e \u0447\u0442\u043e \u0440\u0430\u0437 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0430 \u2014 \u044d\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0447\u0438\u0441\u0435\u043b, \u0442\u043e \u0438 \u043f\u043e\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430 \u0432\u0445\u043e\u0434 \u0435\u0439 \u043d\u0430\u0434\u043e \u0447\u0438\u0441\u043b\u0430. \u0422\u0435\u043a\u0441\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0435, \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u00ab<strong>\u0442\u043e\u043a\u0435\u043d\u044b<\/strong>\u00bb &#8212; \u043a\u0443\u0441\u043e\u0447\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0435 \u0441\u043e\u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u0447\u0438\u0441\u043b\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435: \u00abhello my friend\u00bb, \u044d\u0442\u043e\u0442 \u0442\u0435\u043a\u0441\u0442 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0442\u0440\u0438 \u0442\u043e\u043a\u0435\u043d\u0430 \u00abhello\u00bb \u00abmy\u00bb \u00abfriend\u00bb, \u043f\u0440\u0438\u0447\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u0447\u0438\u0441\u043b\u0443. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0432 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0442\u0440\u0438 \u0447\u0438\u0441\u043b\u0430, \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440: 12234, 42112, 234345.<\/p>\n<p>\u0422.\u0435. \u0443 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0438 \u0435\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 <strong>\u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0442\u043e\u043a\u0435\u043d\u043e\u0432<\/strong>: \u0441\u0432\u044f\u0437\u044c \u0442\u043e\u043a\u0435\u043d\u0430 \u0438 \u0447\u0438\u0441\u043b\u0430 (\u0432\u0435\u043a\u0442\u043e\u0440).<\/p>\n<p>\u0420\u0430\u0437\u043c\u0435\u0440 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0438 \u2014 \u043d\u0435 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439, \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0435\u0439 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0437\u0430 \u043e\u0434\u0438\u043d \u0440\u0430\u0437. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0435\u0439 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u043a\u0435\u043d\u043e\u0432. \u0422\u0430\u043a\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00ab<strong>\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u043c \u043e\u043a\u043d\u043e\u043c<\/strong>\u00bb. \u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u043a\u0440\u0443\u0447\u0435 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0430 \u2014 \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0435 \u043e\u043a\u043d\u043e, \u0442.\u0435. \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0443.<\/p>\n<p>\u0422\u0430\u043a \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u0430\u044f LLM \u0431\u044b\u043b\u0430 \u0441\u0434\u0435\u043b\u0430\u043d\u0430 \u0432 \u0421\u0428\u0410 \u0438 \u00ab\u043f\u043e\u043d\u0438\u043c\u0430\u043b\u0430\u00bb \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0435 \u0441\u043b\u043e\u0432\u0430. \u041a\u043e\u0433\u0434\u0430 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0438 \u0441\u0442\u0430\u043b\u0438 \u043e\u0431\u0443\u0447\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c \u044f\u0437\u044b\u043a\u0430\u043c, \u0442\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0442\u043e\u043a\u0435\u043d\u043e\u0432. \u0412 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043e\u0434\u043d\u043e \u0441\u043b\u043e\u0432\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u0432\u0438\u0434\u043e\u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u043e \u043f\u0430\u0434\u0435\u0436\u0430\u043c, \u0438 \u0440\u0430\u0437\u0434\u0443\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u043e\u0434\u043d\u0438\u043c \u0441\u043b\u043e\u0432\u043e\u043c \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0430\u0434\u0435\u0436\u0430\u0445 \u2014 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e. \u041f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 \u043b\u0430\u0439\u0444\u0445\u0430\u043a: \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u0430 \u043d\u0430 \u043a\u0443\u0441\u043a\u0438, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u0441\u043b\u043e\u0432\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0435\u043a\u0441\u0442 \u00ab\u043f\u0440\u0438\u0432\u0435\u0442 \u043c\u043e\u0439 \u0434\u0440\u0443\u0433\u00bb \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435 \u043d\u0430 \u0442\u0440\u0438 \u0442\u043e\u043a\u0435\u043d\u0430, \u0430 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e: \u00ab\u043f\u0440\u0438\u00bb \u00ab\u0432\u0435\u0442\u00bb \u00ab \u00bb \u00ab\u043c\u043e\u0439\u00bb \u00ab \u00bb \u00ab\u0434\u0440\u00bb \u00ab\u0443\u0433\u00bb. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0432 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0443\u0436\u0435 7 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0430 \u043d\u0435 \u0442\u0440\u0438.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u00ab\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0435 \u043e\u043a\u043d\u043e\u00bb \u0432\u0445\u043e\u0434\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u043b\u043e\u0432 \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u0438 \u043c\u0435\u043d\u044c\u0448\u0435 \u2014 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c.<\/p>\n<p>\u0418\u043d\u0444\u0435\u0440\u0435\u043d\u0441\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c: \u0434\u0430\u0442\u044c \u0432\u043e\u043b\u044e \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0435 \u0438\u043b\u0438 \u0441\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0435\u0435 \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u044e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u00ab<strong>\u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430<\/strong>\u00bb: \u0447\u0435\u043c \u0432\u044b\u0448\u0435 \u2014 \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0430 \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u0440\u0443\u0435\u0442. \u041e\u0434\u043d\u0430\u043a\u043e \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0447\u0442\u043e \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u00ab<strong>\u0433\u0430\u043b\u043b\u044e\u0446\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c<\/strong>\u00bb: \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0431\u0435\u0441\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442.<\/p>\n<p>\u0414\u0440\u0443\u0433\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u00ab<strong>TopK<\/strong>\u00bb \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u0441\u0443\u0437\u0438\u0442\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0432\u044b\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0441\u043b\u043e\u0432, \u043e\u0442\u0431\u0440\u043e\u0441\u0438\u0432 \u0441\u0430\u043c\u044b\u0435 \u043d\u0435\u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044f \u0444\u0440\u0430\u0437\u0443: \u00ab\u0421\u043e\u043b\u043d\u0446\u0435 \u0432\u0441\u0442\u0430\u0435\u0442 \u043d\u0430\u2026\u00bb \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0441\u043b\u043e\u0432\u043e \u00ab\u043a\u0430\u0440\u0442\u0438\u043d\u0430\u00bb. \u041d\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0443\u043a\u0430\u0436\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440  <strong>TopK=3<\/strong>, \u0442\u043e \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0430 \u0432\u044b\u0431\u0435\u0440\u0435\u0442 \u043e\u0434\u0438\u043d \u0438\u0437 \u0442\u043e\u043f 3 \u0441\u0430\u043c\u044b\u0445 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0445 \u0441\u043b\u043e\u0432: \u00ab\u0432\u043e\u0441\u0442\u043e\u043a\u00bb, \u00ab\u0440\u0430\u0441\u0441\u0432\u0435\u0442\u00bb, \u00ab\u043d\u0435\u0431\u043e\u00bb.<\/p>\n<p>\u0415\u0449\u0435 \u043e\u0434\u0438\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u00ab<strong>Frequency penalty<\/strong>\u00bb &#8212; \u0448\u0442\u0440\u0430\u0444 \u0437\u0430 \u0447\u0430\u0441\u0442\u043e\u0442\u0443: \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u00ab\u0448\u0442\u0440\u0430\u0444\u00bb \u0437\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 \u0432 \u043e\u0442\u0432\u0435\u0442\u0435, \u0447\u0442\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<p>\u00ab<strong>Presence penalty<\/strong>\u00bb &#8212; \u0448\u0442\u0440\u0430\u0444 \u0437\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435: \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u00ab\u0448\u0442\u0440\u0430\u0444\u00bb \u0437\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0442\u043e\u043a\u0435\u043d, \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u043d\u0435\u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0442\u043e\u043a\u0435\u043d \u0432 \u043e\u0442\u0432\u0435\u0442\u0435.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0447\u0442\u043e-\u0442\u043e \u043f\u0438\u0448\u0435\u043c \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0435 \u2014 \u043d\u0430\u0448 \u0442\u0435\u043a\u0441\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00ab<strong>\u043f\u0440\u043e\u043c\u043f\u0442<\/strong>\u00bb (prompt): \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<p>\u041c\u044b \u0442\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u0435\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u043e\u0439 \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u0442: \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439, \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c \u0441\u0442\u0438\u043b\u0435, \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u0430\u0436\u043d\u043e\u0435, \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438 \u0442.\u0434. \u0412 \u0445\u043e\u0434 \u0438\u0434\u0443\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0432\u0430, \u043d\u043e \u0438 \u0437\u043d\u0430\u043a\u0438 \u043f\u0440\u0435\u043f\u0438\u043d\u0430\u043d\u0438\u044f (!), \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u0430\u0436\u043d\u044b\u0445 \u0441\u043b\u043e\u0432 \u0412 \u0412\u0415\u0420\u0425\u041d\u0415\u041c \u0420\u0415\u0413\u0418\u0421\u0422\u0420\u0415, \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0437\u0432\u0435\u0437\u0434\u043e\u0447\u043a\u0430\u043c\u0438, \u043a\u0430\u0432\u044b\u0447\u043a\u0430\u043c\u0438 \u0438 \u0442.\u0434. \u0418\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u043c\u043f\u0442\u0438\u043d\u0433\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00ab<strong>\u041f\u0440\u043e\u043c\u043f\u0442-\u0438\u043d\u0436\u0438\u043d\u0438\u0440\u0438\u043d\u0433<\/strong>\u00bb.<\/p>\n<p>\u0427\u0442\u043e-\u0431\u044b \u043f\u0440\u0438\u0434\u0430\u0442\u044c \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0438\u043b\u044c, \u043f\u0440\u0438\u0434\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u00ab<strong>\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u043f\u0442<\/strong>\u00bb, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: \u00ab\u0422\u044b \u2014 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a \u041e\u043b\u0435\u0433. \u041e\u0442\u0432\u0435\u0447\u0430\u0439 \u043a\u0440\u0430\u0442\u043a\u043e \u0438 \u043f\u043e \u0434\u0435\u043b\u0443. \u041d\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u0439 \u043b\u0438\u0448\u043d\u0438\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432\u00bb. \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u043f\u0442 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u0430 \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c.<\/p>\n<p>\u041d\u0435\u0439\u0440\u043e\u043d\u043a\u0430 \u0432 \u0441\u0432\u043e\u0438\u0445 \u043e\u0442\u0432\u0435\u0442\u0430\u0445 \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u00ab<strong>\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442<\/strong>\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u043f\u0440\u043e\u043c\u043f\u0442\u043e\u043c, \u0442\u0430\u043a \u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0430 \u0442\u0430\u043a \u0436\u0435 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0447\u0438\u0441\u0442\u0438\u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u043e\u0439 \u043d\u0430\u0447\u043d\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0441 \u0447\u0438\u0441\u0442\u043e\u0433\u043e \u043b\u0438\u0441\u0442\u0430.<\/p>\n<p>\u041d\u0435\u0439\u0440\u043e\u043d\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c, \u043d\u043e \u0438 \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c, \u0432\u0438\u0434\u0435\u043e, \u0437\u0432\u0443\u043a\u043e\u043c. \u0422\u0430\u043a\u0438\u0435 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u00ab<strong>\u043c\u0443\u043b\u044c\u0442\u0438\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u043c\u0438<\/strong>\u00bb.<\/p>\n<p>\u0420\u0430\u0437\u043c\u0435\u0440 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u00ab<strong>\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432<\/strong>\u00bb: \u0442.\u0435. \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0447\u0438\u0441\u0435\u043b (\u0432\u0435\u0441\u043e\u0432) \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0438. \u0410\u043d\u0430\u043b\u043e\u0433 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0432 \u0436\u0438\u0432\u043e\u0439 \u043f\u0440\u0438\u0440\u043e\u0434\u0435 \u2014 \u0441\u0438\u043b\u0430 \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u043d\u0435\u0439\u0440\u043e\u043d\u0430\u043c\u0438. \u0415\u0441\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430 1, 10, 70, 180 \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u043e\u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.<\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e-\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u043e\u0439, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u043c\u0435\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0447\u0442\u043e-\u0431\u044b \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0430 \u043c\u043e\u0433\u043b\u0430 \u0442\u0443\u0434\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e-\u0431\u044b \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0448\u0443\u0441\u0442\u0440\u043e \u2014 \u043d\u0443\u0436\u0435\u043d \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043e\u0449\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 (AVX, AVX2). \u041d\u043e \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043c\u043e\u0449\u043d\u0430\u044f \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043f\u0430\u043c\u044f\u0442\u0438 \u2014 \u0432\u0430\u043c \u043f\u043e\u0432\u0435\u0437\u043b\u043e: \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0447\u0435\u043c \u043d\u0430 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435 \u041f\u041a.<\/p>\n<p>\u041d\u043e \u043d\u0435 \u0443 \u0432\u0441\u0435\u0445 \u0435\u0441\u0442\u044c \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430 \u0441 24-80 \u0413\u0431. \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0445 \u043d\u0435\u0439\u0440\u043e\u043d\u043e\u043a. \u041c\u043e\u0436\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0438 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0442\u0435\u0440\u044f\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435. \u0422\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00ab<strong>\u043a\u0432\u0430\u043d\u0442\u0438\u0437\u0430\u0446\u0438\u0435\u0439<\/strong>\u00bb: \u0432\u0435\u0441\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0447\u0438\u0441\u0435\u043b (\u0432\u0435\u0441\u043e\u0432) \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0430 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0447\u0438\u0441\u0435\u043b \u0441 \u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0431\u044b\u043b\u0438 \u0447\u0438\u0441\u043b\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0438\u0435: 0.123456789 \u0430 \u0441\u0442\u0430\u043b\u0438: 0.123. \u041f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0437\u0434\u0435\u0441\u044c: <a href=\"https:\/\/habr.com\/ru\/articles\/797443\/\" rel=\"noopener noreferrer nofollow\">https:\/\/habr.com\/ru\/articles\/797443\/<\/a><\/p>\n<p>\u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u0442\u0440\u0443\u0434\u043e\u0451\u043c\u043a\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0447\u0435\u043c \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441. \u041a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0433\u043e\u0442\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u00ab<strong>\u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430<\/strong>\u00bb: \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u043c\u0438 \u043e\u0442\u0432\u0435\u0442\u0430. \u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00ab<strong>\u043f\u0440\u0435\u0442\u0440\u0435\u0439\u043d<\/strong>\u00bb (pretrain, \u043f\u0440\u0435\u0434\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435) \u2014 \u0441\u0430\u043c\u044b\u0439 \u0442\u0440\u0443\u0434\u043e\u0437\u0430\u0442\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043b\u044f \u0436\u0435\u043b\u0435\u0437\u0430 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u0434\u0435\u0442 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435. \u041c\u043e\u0434\u0435\u043b\u044c \u043e\u0431\u0443\u0447\u0430\u044e\u0442 \u043e\u0431\u0449\u0438\u043c\u0438 \u0437\u043d\u0430\u043d\u0438\u044f\u043c\u0438 \u043e \u043c\u0438\u0440\u0435. \u0422\u0430\u043a\u0430\u044f \u00ab\u043f\u0440\u0435\u0442\u0440\u0435\u0439\u043d\u00bb \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0438\u0434\u0435\u0442 \u00ab<strong>\u0444\u0430\u0439\u043d\u0442\u044e\u043d<\/strong>\u00bb (finetune, \u0442\u043e\u043d\u043a\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430): \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0447\u0438\u0442\u0441\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430\u0445 \u0441 \u0434\u0438\u0430\u043b\u043e\u0433\u0430\u043c\u0438. \u0422\u0440\u0435\u0442\u044c\u044f \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u00ab<strong>\u0430\u043b\u0430\u0439\u043c\u0435\u043d\u0442<\/strong>\u00bb (alignment, \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435): \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u044d\u0442\u0438\u0447\u043d\u044b\u0445 \u0442\u0435\u043c).<\/p>\n<p>\u0413\u043e\u0442\u043e\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0437\u043d\u0430\u043d\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043a\u043e\u0433\u0434\u0430 \u0435\u0435 \u043e\u0431\u0443\u0447\u0430\u043b\u0438, \u0438 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0415\u0441\u043b\u0438 \u0435\u0435 \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0439 \u0441\u0435\u0439\u0447\u0430\u0441 \u0433\u043e\u0434 \u2014 \u043e\u043d\u0430 \u043e\u0442\u0432\u0435\u0442\u0438\u0442 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 2022, \u0435\u0441\u043b\u0438 \u043e\u0431\u0443\u0447\u0430\u043b\u0430\u0441\u044c \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0434\u043e\u043e\u0431\u0443\u0447\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u2014 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u043e. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043c\u043e\u0434\u0435\u043b\u044c \u0437\u043d\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0447\u0430\u0442-\u0431\u043e\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b:<\/p>\n<ul>\n<li>\n<p><strong>Function Calling<\/strong> \u2013 \u043c\u043e\u0434\u0435\u043b\u0438 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u00ab\u0432\u044b\u0432\u043e\u0434 \u043f\u043e\u0433\u043e\u0434\u044b\u00bb \u0438 \u0442.\u0434. \u0418 \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u043f\u0440\u043e\u0441\u0438\u0442 \u00ab\u043a\u0430\u043a\u0430\u044f \u043f\u043e\u0433\u043e\u0434\u0430 \u0432 \u041c\u043e\u0441\u043a\u0432\u0435\u00bb, \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e (\u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u043c), \u0432\u0435\u0440\u043d\u0443\u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043e\u0442\u0432\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p><strong>RAG <\/strong>(Retrieval Augmented Generation) \u2014 \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0447\u0435\u0440\u0435\u0437 Function Calling) \u043b\u044e\u0431\u0435\u0437\u043d\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u043c \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e. \u041b\u0438\u0431\u043e \u0441\u0430\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u043e\u0434\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u0432 \u043f\u0440\u043e\u043c\u043f\u0442 \u0438\u043b\u0438 \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0447\u0430\u0442\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b, \u0433\u0434\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u0435\u0441\u0430\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 (\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430).<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0438\u0441\u043a \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435, \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043b\u0430\u043c\u043f\u043e\u0447\u043a\u0438 \u0438 \u043f\u0440\u043e\u0447\u0435\u0435 \u2014 \u0432\u0441\u0451 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437  Function Calling. \u0421\u0430\u043c\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0435\u0437\u0442\u044c \u0432 \u0433\u0443\u0433\u043b \u0438\u043b\u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0432\u0430\u043c \u0448\u0442\u043e\u0440\u044b \u0432 \u043a\u043e\u043c\u043d\u0430\u0442\u0435 \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435.<\/p>\n<p>\u0410 \u0435\u0449\u0435 \u043f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u043e\u0431\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u0438 \u0440\u0430\u0441\u0442\u0438 \u043a\u0430\u043a \u0436\u0438\u0432\u043e\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043c, \u043d\u0438 \u043e \u043a\u0430\u043a\u043e\u043c \u0437\u0430\u0445\u0432\u0430\u0442\u0435 \u0441\u043a\u0430\u0439\u043d\u0435\u0442\u0430 \u043f\u043e\u043a\u0430 \u0440\u0435\u0447\u0438 \u043d\u0435 \u0438\u0434\u0435\u0442.<\/p>\n<p>\u041e\u043a. \u041f\u043e\u043a\u0430 \u043d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0451. \u0418\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<h3>NPU<\/h3>\n<p>\u0412 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u0445 \u0435\u0441\u0442\u044c \u0431\u043b\u043e\u043a NPU (Neural Processing Unit). \u041f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 &#171;\u0441\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440&#187; \u0437\u0430\u0442\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u043c\u0430\u0442\u0440\u0438\u0446\u0430\u043c\u0438. \u0417\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 Intel\u00ae NPU Acceleration Library \u043d\u0430 \u043f\u0430\u0439\u0442\u043e\u043d\u0435: <a href=\"https:\/\/github.com\/intel\/intel-npu-acceleration-library\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/intel\/intel-npu-acceleration-library<\/a>. \u0422\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 OpenVINO, DirectML.<\/p>\n<p>\u0412 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u0435, \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0418\u0418 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u044d\u0442\u0438\u043c \u0431\u043b\u043e\u043a\u043e\u043c, \u043d\u0430\u043f\u0438\u0445\u0430\u0432 \u043f\u043e\u0431\u043e\u043b\u044c\u0448\u0435 \u041e\u0417\u0423 \u0432 \u041f\u041a, \u0431\u0435\u0437 \u0442\u0440\u0430\u0442\u044b \u043d\u0430 \u0434\u043e\u0440\u043e\u0433\u0438\u0435 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u043e\u0442 24\u0413\u0431.<\/p>\n<p>\u041d\u043e \u0443 \u043c\u0435\u043d\u044f \u0441\u0442\u0430\u0440\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u044d\u0442\u043e \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435.<\/p>\n<h2>\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u0432 \u043a\u043e\u0434. LlamaSharp, \u043e\u043d \u0436\u0435 llama.cpp<\/h2>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0438 \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u0435\u0437 python. \u0421\u0430\u043c \u043f\u0430\u0439\u0442\u043e\u043d \u043e\u0447\u0435\u043d\u044c \u0442\u044f\u0436\u0435\u043b\u044b\u0439, \u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 LLM. <span class=\"habrahidden\">\u041f\u0440\u043e\u0441\u0442\u0438\u0442\u0435 \u043f\u0438\u0442\u043e\u043d\u0438\u0441\u0442\u044b.<\/span><\/p>\n<p>\u041d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 <a href=\"https:\/\/github.com\/ggerganov\/llama.cpp\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/ggerganov\/llama.cpp<\/a> \u043d\u0430 C\/C++. \u0410 \u043d\u0430 c# \u0435\u0441\u0442\u044c \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 <a href=\"https:\/\/github.com\/SciSharp\/LlamaSharp\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/SciSharp\/LlamaSharp<\/a> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 llama.cpp, \u0432\u043e\u0442 \u0435\u0433\u043e \u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0436\u0443, \u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u043d\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u0441\u0430\u043c\u043e\u0439 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c: Qvikhr-2.5-1.5B-Instruct-r-Q8_0.gguf, \u0441\u043c.: <a href=\"https:\/\/huggingface.co\/Vikhrmodels\/QVikhr-2.5-1.5B-Instruct-r_GGUF\/tree\/main\" rel=\"noopener noreferrer nofollow\">https:\/\/huggingface.co\/Vikhrmodels\/QVikhr-2.5-1.5B-Instruct-r_GGUF\/tree\/main<\/a> <\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u0430\u043a\u0435\u0442\u044b \u0438\u0437 NuGet: <strong>LlamaSharp<\/strong> \u0438 <strong>LlamaSharp.Backend.Cpu<\/strong>, \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435 \u0443\u0434\u0430\u0441\u0442\u0441\u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438 \u0438\u043d\u0444\u0435\u0440\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">using LLama.Common; using LLama; using LLama.Sampling; using LLama.Transformers;  \/\/\u043f\u0443\u0442\u044c \u043a \u043c\u043e\u0434\u0435\u043b\u0438 string modelPath = @\"c:\\models\\QVikhr-2.5-1.5B-Instruct-r-Q8_0.gguf\";  var parameters = new ModelParams(modelPath) {     ContextSize = 1024, \/\/\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 };  \/\/\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c using var model = LLamaWeights.LoadFromFile(parameters);  \/\/\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 using var context = model.CreateContext(parameters);  \/\/\u0434\u043b\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 var executorInstruct = new InstructExecutor(context); \/\/\u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u0430  var executorInteractive = new InteractiveExecutor(context); \/\/\u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 var executorStateless = new StatelessExecutor(model, parameters) {     ApplyTemplate = true,     SystemMessage = \"\u0422\u044b - \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a. \u041e\u0442\u0432\u0435\u0447\u0430\u0439 \u043a\u0440\u0430\u0442\u043a\u043e\" };  \/\/\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441\u0430 InferenceParams inferenceParams = new InferenceParams() {     MaxTokens = 256, \/\/\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u043a\u0435\u043d\u043e\u0432     AntiPrompts = new List&lt;string&gt; { \"&gt;\" },     SamplingPipeline = new DefaultSamplingPipeline()     {          Temperature = 0.4f         ,TopK = 50         ,TopP = 0.95f         ,RepeatPenalty = 1.1f     } };  \/\/\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0438\u0437 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u043f\u0440\u043e\u043c\u043f\u0442\u0430 LLamaTemplate llamaTemplate = new LLamaTemplate(model.NativeHandle) {     AddAssistant = true };  \/\/\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u043f\u0442 string createPrompt(string role, string input) {     var ltemplate = llamaTemplate.Add(role, input);     return PromptTemplateTransformer.ToModelPrompt(ltemplate); }  Console.Write(\"\\n&gt;\"); string userInput = Console.ReadLine() ?? \"\"; while (userInput != \"exit\") {     \/\/\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a\u043e\u0439 \u043d\u0430\u043c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0442\u0432\u0435\u0442     \/\/prompt: &lt;| im_start |&gt; user     \/\/\u043f\u0440\u0438\u0432\u0435\u0442 &lt;| im_end |&gt;     \/\/&lt;| im_start |&gt; assistant      \/\/\u0434\u043b\u044f executorInstruct \u0438 executorInteractive \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0431\u0443\u0434\u0435\u0442 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u043a\u0438, \u0442.\u043a. \u043e\u043d\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435     \/\/\u0434\u043b\u044f executorStateless - \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0437\u0430\u043d\u043e\u0432\u043e \u0431\u0435\u0437 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u043a\u0438     var prompt = createPrompt(\"user\", userInput);     Console.WriteLine(\"prompt: \"+ prompt);      \/\/\u0438\u043d\u0444\u0435\u0440     await foreach (var text in executorInteractive.InferAsync(prompt, inferenceParams))     {         Console.ForegroundColor = ConsoleColor.White;         Console.Write(text);     }     userInput = Console.ReadLine() ?? \"\"; }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c: \u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0441\u0432\u043e\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u043e\u0431\u0449\u0435\u043d\u0438\u044f (<strong>ChatML<\/strong>, <strong>CommandR<\/strong>, <strong>Gemma 2<\/strong>, \u0438 \u0442.\u0434.). \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u043f\u0442 \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u0417\u0430 \u043d\u0430\u0441 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043e\u0434, \u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0435\u0441\u044f \u0432 \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u044e\u0442 \u0447\u0430\u0441\u0442\u0443\u044e \u043f\u0440\u0430\u0432\u043a\u0443 \u043a\u043e\u0434\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0438 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0442\u044f\u0436\u0435\u043b\u044b\u0439 \u044d\u0442\u0430\u043f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<h2>Ollama<\/h2>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 <a href=\"https:\/\/ollama.com\" rel=\"noopener noreferrer nofollow\">https:\/\/ollama.com<\/a>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e: \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0441\u0435\u0440\u0432\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c, \u0438 \u0432\u044b \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0441 \u043d\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435. \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 c#, \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u043b\u0438 \u043a\u043e\u0434, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u2014 \u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430 \u0432 ollama, \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0436\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438.<\/p>\n<p>\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e Ollama, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c. \u0418\u0449\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0443\u044e \u0432\u0430\u0441 \u043c\u043e\u0434\u0435\u043b\u044c <a href=\"https:\/\/ollama.com\/search\" rel=\"noopener noreferrer nofollow\">https:\/\/ollama.com\/search<\/a> \u0438 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439: <code>ollama pull modelname<\/code>. \u041c\u043e\u0436\u0435\u043c \u0441 \u043d\u0435\u0439 \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u0438: <code>ollama run modelname<\/code>. \u0412\u044b\u0445\u043e\u0434: <code>\/bye<\/code>. \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043a\u0430\u0447\u0430\u043d\u043d\u044b\u0445 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0434\u0435\u043b\u0435\u0439: <code>ollama list<\/code>. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440: <code>ollama serve<\/code>.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u044f \u0443\u0436\u0435 \u0441\u043a\u0430\u0447\u0430\u043b \u0440\u0430\u043d\u0435\u0435 \u043c\u043e\u0434\u0435\u043b\u044c <strong>Qvikhr-2.5-1.5B-Instruct-r-Q8_0.gguf<\/strong> \u043d\u0430 1,53 \u0413\u0431, \u0438 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 ollama \u0442\u0430\u043a\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0435\u0442. \u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c?<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u0443\u0436\u0435 \u0441\u043a\u0430\u0447\u0430\u043d\u043d\u0443\u044e gguf \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 Ollama:<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<p>1) \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b Modelfile (\u0431\u0435\u0437 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f) \u0441 \u0442\u0430\u043a\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c:<\/p>\n<pre><code>from f:\\GPT4ALL\\models\\QVikhr-2.5-1.5B-Instruct-r-Q8_0.gguf # set the temperature to 1 [higher is more creative, lower is more coherent] PARAMETER temperature 0.0 #PARAMETER top_p 0.8 #PARAMETER repeat_penalty 1.05 #PARAMETER top_k 20  TEMPLATE \"\"\" {{- if .Messages }} {{- if or .System .Tools }}&lt;|im_start|&gt;system {{- if .System }} {{ .System }} {{- end }} {{- if .Tools }}  # Tools  You may call one or more functions to assist with the user query. Do not distort user description to call functions!   You are provided with function signatures within &lt;tools&gt;&lt;\/tools&gt; XML tags: &lt;tools&gt; {{- range .Tools }} {\"type\": \"function\", \"function\": {{ .Function }}} {{- end }} &lt;\/tools&gt;  For each function call, return a json object with function name and arguments within &lt;toolcall&gt;&lt;\/toolcall&gt; XML tags: &lt;toolcall&gt; {\"name\": &lt;function-name&gt;, \"arguments\": &lt;args-json-object&gt;} &lt;\/toolcall&gt; {{- end }}&lt;|im_end|&gt; {{ end }} {{- range $i, $_ := .Messages }} {{- $last := eq (len (slice $.Messages $i)) 1 -}} {{- if eq .Role \"user\" }}&lt;|im_start|&gt;user {{ .Content }}&lt;|im_end|&gt; {{ else if eq .Role \"assistant\" }}&lt;|im_start|&gt;assistant {{ if .Content }}{{ .Content }} {{- else if .ToolCalls }}&lt;toolcall&gt; {{ range .ToolCalls }}{\"name\": \"{{ .Function.Name }}\", \"arguments\": {{ .Function.Arguments }}} {{ end }}&lt;\/toolcall&gt; {{- end }}{{ if not $last }}&lt;|im_end|&gt; {{ end }} {{- else if eq .Role \"tool\" }}&lt;|im_start|&gt;user &lt;tool_response&gt; {{ .Content }} &lt;\/tool_response&gt;&lt;|im_end|&gt; {{ end }} {{- if and (ne .Role \"assistant\") $last }}&lt;|im_start|&gt;assistant {{ end }} {{- end }} {{- else }} {{- if .System }}&lt;|im_start|&gt;system {{ .System }}&lt;|im_end|&gt; {{ end }}{{ if .Prompt }}&lt;|im_start|&gt;user {{ .Prompt }}&lt;|im_end|&gt; {{ end }}&lt;|im_start|&gt;assistant {{ end }}{{ .Response }}{{ if .Response }}&lt;|im_end|&gt;{{ end }} \"\"\"  # set the system message SYSTEM \"\"\"You are JARVIS. You are a helpful assistant. Answer user requests briefly.\"\"\"<\/code><\/pre>\n<p> 2) \u0417\u0430\u0442\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0438\u043c\u043f\u043e\u0440\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 Ollama:<\/p>\n<pre><code>ollama create MY -f c:\\models\\Modelfile<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412\u0443\u0430\u043b\u044f. \u0422\u0435\u043f\u0435\u0440\u044c \u043a \u044d\u0442\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u00abMY\u00bb.<\/p>\n<p>\u041e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e: \u0432 TEMPLATE \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 Ollama \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Function Calling. \u0418\u043d\u0430\u0447\u0435 Ollama \u0432\u044b\u0434\u0430\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 <code>\"registry.ollama.ai MY does not support tools\"<\/code>.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>ollama serve<\/code> \u0443 \u0432\u0430\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 <code>\"Error: listen tcp 127.0.0.1:11434: bind: Only one usage of each socket address (protocol\/network address\/port) is normally permitted.\"<\/code>, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0432 \u0442\u0440\u0435\u0439 &#8212; \u0442\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 ollama. \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c, \u0432\u044b\u0431\u0440\u0430\u0432 &#171;Quit Ollama&#187;.<\/p>\n<p>\u0427\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043f\u043e\u0441\u043b\u0435 \u0440\u0435\u043b\u0438\u0437\u0430 Ollama v0.5.11 (\u0430 \u043c\u043e\u0436\u0435\u0442 \u0438 \u0432\u044b\u0448\u0435), \u044d\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043d\u0430 Qwen2.5 (\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e &#171;\u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430&#187;) \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0444\u0430\u0439\u043b <strong>Modelfile <\/strong>(\u043c\u0435\u043d\u044f\u0442\u044c \u0441 &#171;tool_call&#187; \u043d\u0430 &#171;toolcall&#187;). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u043b\u0438 \u0432\u044b \u0441\u043a\u0430\u0447\u0430\u0435\u0442\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0442 Qwen2.5 \u0441 \u0441\u0430\u0439\u0442\u0430 Ollama &#8212; \u0442\u0430\u043c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c \u043f\u0440\u043e\u043c\u043f\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0430\u0440\u044b\u0439, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0439, \u0432\u0430\u0440\u0438\u0430\u043d\u0442.<\/p>\n<details class=\"spoiler\">\n<summary>\u0441\u043c. \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f97\/e1c\/faa\/f97e1cfaa9b205e22aa990f446cfaec7.png\" width=\"1105\" height=\"749\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f97\/e1c\/faa\/f97e1cfaa9b205e22aa990f446cfaec7.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f97\/e1c\/faa\/f97e1cfaa9b205e22aa990f446cfaec7.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<\/div>\n<\/details>\n<h2>Microsoft Semantic Kernel<\/h2>\n<p>\u0423 \u043c\u0435\u043b\u043a\u043e\u0441\u043e\u0444\u0442\u0430 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 LLM, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0441 <strong>Ollama<\/strong>. \u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439: <a href=\"https:\/\/github.com\/microsoft\/semantic-kernel\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/microsoft\/semantic-kernel<\/a>, \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u043a\u0443\u043a\u0431\u0443\u043a <a href=\"https:\/\/github.com\/microsoft\/SemanticKernelCookBook\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/microsoft\/SemanticKernelCookBook<\/a>.<\/p>\n<h3>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0447\u0430\u0442<\/h3>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u043a\u0435\u0442\u044b <strong>Microsoft.SemanticKernel<\/strong>, <strong>Microsoft.SemanticKernel.Connectors.Ollama <\/strong>\u0432 NuGet.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0447\u0430\u0442\u0438\u043a<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">#pragma warning disable SKEXP0070  using Microsoft.SemanticKernel;  var modelId = \"MY\"; var url = \"http:\/\/localhost:11434\";  var builder = Kernel.CreateBuilder(); builder.Services.AddOllamaChatCompletion(modelId, new HttpClient() { BaseAddress = new Uri(url) }); var kernel = builder.Build();  Console.Write(\"User: \"); string? input = null; while ((input = Console.ReadLine()) is not null) {     var answer = await kernel.InvokePromptAsync(input);     Console.WriteLine(\"AI: \" + string.Join(\"\\n\", answer));      Console.Write(\"User: \"); }<\/code><\/pre>\n<\/div>\n<\/details>\n<h3>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/p>\n<details class=\"spoiler\">\n<summary>Function Calling<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">#pragma warning disable SKEXP0070  using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Connectors.Ollama; using System.ComponentModel;  var modelId = \"MY\"; var url = \"http:\/\/localhost:11434\";  var builder = Kernel.CreateBuilder(); builder.Services.AddOllamaChatCompletion(modelId, new HttpClient() { BaseAddress = new Uri(url) }); var kernel = builder.Build();  \/\/\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0432\u043e\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 kernel.Plugins.AddFromObject(new MyWeatherPlugin()); kernel.Plugins.AddFromType&lt;MyTimePlugin&gt;(); kernel.Plugins.AddFromObject(new MyNewsPlugin());  \/\/\u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c ollama \u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0439 var settings = new OllamaPromptExecutionSettings {     FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(),     Temperature = 0,     TopP = 0, };  Console.Write(\"User: \"); string? input = null; while ((input = Console.ReadLine()) is not null) {     var answer = await kernel.InvokePromptAsync(input, new(settings));     Console.WriteLine(\"AI: \" + string.Join(\"\\n\", answer));      Console.Write(\"User: \"); }  \/\/\u041f\u043b\u0430\u0433\u0438\u043d\u044b public class MyWeatherPlugin {     [KernelFunction, Description(\"Gets the current weather for the specified city\")]     public string GetWeather(string _city)     {         return \"very good in \" + _city + \"!\";     } }  public class MyTimePlugin {     [KernelFunction, Description(\"Get the current day of week\")]     public string DayOfWeek() =&gt; System.DateTime.Now.ToString(\"dddd\");      [KernelFunction, Description(\"Get the current time\")]     public string Time() =&gt; System.DateTime.Now.ToString(\"HH 'hour' mm 'minutes'\");      [KernelFunction, Description(\"Get the current date\")]     public string Date() =&gt; System.DateTime.Now.ToString(\"dddd dd MMMM yyyy\"); }  public class MyNewsPlugin {     [KernelFunction, Description(\"Gets the current news for the specified count\")]     public string GetNews(int count)     {         return \"the ruble strengthened. An alien ship was found in the USA. It's a full moon today.\";     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1c4\/5e6\/748\/1c45e6748e40cd765e635bbe1d156de5.png\" width=\"386\" height=\"199\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/1c4\/5e6\/748\/1c45e6748e40cd765e635bbe1d156de5.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1c4\/5e6\/748\/1c45e6748e40cd765e635bbe1d156de5.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h3>RAG, \u041f\u043e\u0438\u0441\u043a\u043e\u0432\u0430\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f<\/h3>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c LLM \u0438\u0441\u043a\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0432 \u043d\u0430\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 <span class=\"habrahidden\">(\u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0438\u0437 \u043d\u0435\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u0438\u043a)<\/span>  \u0442.\u0435. \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c RAG.<\/p>\n<p>\u041a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442:<\/p>\n<ol>\n<li>\n<p>\u0418\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 (\u043e\u0431\u044a\u0435\u043a\u0442 TextMemoryPlugin \u0438\u0437 Microsoft.SemanticKernel.Plugins.Memory)<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 NuGet \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b: <strong>SmartComponents.LocalEmbeddings.SemanticKernel<\/strong>, <strong>Microsoft.SemanticKernel.Plugins.Memory<\/strong>.<\/p>\n<p>\u0412 \u043a\u043e\u0434\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0444\u0430\u043a\u0442\u044b: &#171;\u0418\u0432\u0430\u043d \u0436\u0438\u0432\u0435\u0442 \u0432 \u041c\u043e\u0441\u043a\u0432\u0435&#187;; &#171;\u0423 \u0418\u0432\u0430\u043d\u0430 \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u043a\u043e\u0442\u0430&#187; \u0438 \u0442.\u0434. \u0410 \u0442\u0430\u043a \u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<br \/>\u041f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430\u043c \u043b\u044e\u0431\u0435\u0437\u043d\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043c\u0435\u043b\u043a\u043e\u0441\u043e\u0444\u0442: <strong>TextMemoryPlugin<\/strong>.<\/p>\n<details class=\"spoiler\">\n<summary>RAG<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">#pragma warning disable SKEXP0001 #pragma warning disable SKEXP0050 #pragma warning disable SKEXP0070  using Microsoft.Extensions.DependencyInjection; using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Connectors.Ollama; using Microsoft.SemanticKernel.Embeddings; using Microsoft.SemanticKernel.Memory; using Microsoft.SemanticKernel.Plugins.Memory; using System.ComponentModel;  var modelId = \"MY\"; var url = \"http:\/\/localhost:11434\";  var builder = Kernel.CreateBuilder(); builder.AddLocalTextEmbeddingGeneration(); \/\/\u0434\u043b\u044f embeddingGenerator builder.Services.AddOllamaChatCompletion(modelId, new HttpClient() { BaseAddress = new Uri(url) }); var kernel = builder.Build();  \/\/\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0432\u043e\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 kernel.Plugins.AddFromObject(new MyWeatherPlugin()); kernel.Plugins.AddFromType&lt;MyTimePlugin&gt;(); kernel.Plugins.AddFromObject(new MyNewsPlugin());  \/\/===RAG \/\/\u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c var embeddingGenerator = kernel.Services.GetRequiredService&lt;ITextEmbeddingGenerationService&gt;(); var store = new VolatileMemoryStore(); var memory = new MemoryBuilder()            .WithTextEmbeddingGeneration(embeddingGenerator)            .WithMemoryStore(store)            .Build();  \/\/\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u0430\u043a\u0442\u044b const string CollectionName = \"generic\"; await memory.SaveInformationAsync(CollectionName, \"\u0418\u0432\u0430\u043d \u0436\u0438\u0432\u0435\u0442 \u0432 \u041c\u043e\u0441\u043a\u0432\u0435.\", Guid.NewGuid().ToString(), \"generic\", kernel: kernel); await memory.SaveInformationAsync(CollectionName, \"\u0423 \u0418\u0432\u0430\u043d\u0430 \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u043a\u043e\u0442\u0430.\", Guid.NewGuid().ToString(), \"generic\", kernel: kernel); await memory.SaveInformationAsync(CollectionName, \"\u0421\u0435\u043c\u0451\u043d \u0436\u0438\u0432\u0435\u0442 \u0432 \u041f\u0438\u0442\u0435\u0440\u0435.\", Guid.NewGuid().ToString(), \"generic\", kernel: kernel); await memory.SaveInformationAsync(CollectionName, \"\u0423 \u0421\u0435\u043c\u0451\u043d\u0430 \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u043a\u043e\u0442\u0430.\", Guid.NewGuid().ToString(), \"generic\", kernel: kernel); await memory.SaveInformationAsync(CollectionName, \"\u041c\u0430\u0440\u0438\u043d\u0430 \u0436\u0438\u0432\u0435\u0442 \u0432 \u0412\u043e\u0440\u043a\u0443\u0442\u0435.\", Guid.NewGuid().ToString(), \"generic\", kernel: kernel); await memory.SaveInformationAsync(CollectionName, \"\u0423 \u041c\u0430\u0440\u0438\u043d\u044b \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u0441\u043e\u0431\u0430\u043a\u0438.\", Guid.NewGuid().ToString(), \"generic\", kernel: kernel);  \/\/\u043f\u043b\u0430\u0433\u0438\u043d \u043f\u043e\u0438\u0441\u043a\u0430 kernel.Plugins.AddFromObject(new TextMemoryPlugin(memory)); \/\/===RAG  \/\/\u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 kernel.FunctionInvocationFilters.Add(new FunctionCallLoggingFilter());   \/\/\u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c ollama \u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0439 var settings = new OllamaPromptExecutionSettings {     FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(), \/\/\u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u044b     Temperature = 0 };  Console.Write(\"User: \"); string? input = null; while ((input = Console.ReadLine()) is not null) {     var answer = await kernel.InvokePromptAsync(input, new(settings));      Console.WriteLine(\"AI: \" + string.Join(\"\\n\", answer));      Console.Write(\"User: \"); }  \/\/\u041f\u043b\u0430\u0433\u0438\u043d\u044b public class MyWeatherPlugin {     [KernelFunction, Description(\"Gets the current weather for the specified city\")]     public string GetWeather(string _city)     {         return \"very good in \" + _city + \"!\";     } }  public class MyTimePlugin {     [KernelFunction, Description(\"Get the current day of week\")]     public string DayOfWeek() =&gt; System.DateTime.Now.ToString(\"dddd\");      [KernelFunction, Description(\"Get the current time\")]     public string Time() =&gt; System.DateTime.Now.ToString(\"HH 'hour' mm 'minutes'\");      [KernelFunction, Description(\"Get the current date\")]     public string Date() =&gt; System.DateTime.Now.ToString(\"dddd dd MMMM yyyy\"); }  public class MyNewsPlugin {     [KernelFunction, Description(\"Gets the current news for the specified count\")]     public string GetNews(int count)     {         return \"the ruble strengthened. An alien ship was found in the USA. It's a full moon today.\";     } }  public class FunctionCallLoggingFilter : IFunctionInvocationFilter {     public async Task OnFunctionInvocationAsync(FunctionInvocationContext context, Func&lt;FunctionInvocationContext, Task&gt; next)     {         try         {             var values = \"\";             foreach (var arg in context.Arguments.Names)             {                 var val = context.Arguments[arg] == null ? \"null\" : context.Arguments[arg];                 values += $\"{arg}: {val}; \";             }              Console.WriteLine($\"call {context.Function.Name}: {values}\");         }         catch         {             Console.WriteLine($\"call {context.Function.Name}\");         }          await next(context);     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9f8\/113\/d68\/9f8113d68088edda7658b8a71b2f6c18.png\" width=\"830\" height=\"267\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/9f8\/113\/d68\/9f8113d68088edda7658b8a71b2f6c18.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9f8\/113\/d68\/9f8113d68088edda7658b8a71b2f6c18.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<ol>\n<li>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437 \u043c\u044b \u0441\u043f\u0440\u043e\u0441\u0438\u043b\u0438 &#171;\u0443 \u043a\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u043a\u043e\u0442\u0430&#187;, \u0418\u0418 \u043d\u0430\u0447\u0430\u043b \u043f\u043e\u0438\u0441\u043a \u0432 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441 \u043b\u0438\u043c\u0438\u0442\u043e\u043c 1, \u0438 \u0432\u044b\u0434\u0430\u043b \u0421\u0435\u043c\u0451\u043d\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437 \u043c\u044b \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u043b\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u0438\u0441\u043a\u0430 <code>\u0443 \u043a\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u043a\u043e\u0442\u0430? (( recall input='\u0442\u0440\u0438 \u043a\u043e\u0442\u0430' collection='generic' relevance=0.8 limit=1 ))<\/code>, \u0441 \u043b\u0438\u043c\u0438\u0442\u043e\u043c 1, \u0447\u0442\u043e \u0431\u044b \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0440\u0435\u0442\u0438\u0439 \u0440\u0430\u0437 \u043c\u044b \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u043b\u0438 \u043b\u0438\u043c\u0438\u0442 2, \u0447\u0442\u043e \u0431\u044b <strong>TextMemoryPlugin <\/strong>\u0432\u044b\u0434\u0430\u043b \u043d\u0430\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 2 \u043f\u043e\u0437\u0438\u0446\u0438\u0439, &#8230;\u0438 \u0442\u0443\u0442 \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0442\u0430\u043a. \u0418\u0418 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0418\u0432\u0430\u043d\u0430 \u0438 \u0421\u0435\u043c\u0451\u043d\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0447\u0442\u043e \u043f\u0440\u0438 \u0432\u044b\u0432\u043e\u0434\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 (\u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f json), \u0432 LLM \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u0430\u0441\u044c \u043a\u0440\u0438\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 unicode \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044f\u043c\u0438. \u0427\u0442\u043e-\u0442\u043e \u0442\u0438\u043f\u0430 \u0442\u0430\u043a\u043e\u0433\u043e: <code>[\"\\u0423 \\u0421\\u0435\\u043C\\u0451\\u043D\\u0430 \\u0435\\u0441\\u0442\\u044C \\u0442\\u0440\\u0438 \\u043A\\u043E\\u0442\\u0430.\",\"\\u0423 \\u0418\\u0432\\u0430\\u043D\\u0430 \\u0435\\u0441\\u0442\\u044C \\u0442\\u0440\\u0438 \\u043A\\u043E\\u0442\\u0430.\"]<\/code><\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0441\u0432\u043e\u0439 \u0430\u043d\u0430\u043b\u043e\u0433 TextMemoryPlugin, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043a\u0430\u0442\u044c \u043f\u043e \u0432\u0441\u0435\u043c \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u043c \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434. \u0422\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0447\u0442\u043e <a href=\"https:\/\/github.com\/microsoft\/semantic-kernel\/blob\/cbf8fc2820909955239a672374bc93a850a9affd\/dotnet\/src\/Plugins\/Plugins.Memory\/TextMemoryPlugin.cs#L20\" rel=\"noopener noreferrer nofollow\">\u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0435\u0441\u0442\u044c \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435<\/a>. \u0417\u0430\u043e\u0434\u043d\u043e \u0440\u0430\u0441\u043a\u0440\u0430\u0441\u0438\u043c \u0432\u044b\u0432\u043e\u0434.<\/p>\n<details class=\"spoiler\">\n<summary>MyTextMemoryPlugin<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Memory; using System.ComponentModel; using System.Diagnostics.CodeAnalysis; using System.Text.Encodings.Web; using System.Text.Json;  [Experimental(\"SKEXP0001\")] public sealed class MyTextMemoryPlugin {     private ISemanticTextMemory memory;      public MyTextMemoryPlugin(ISemanticTextMemory memory)     {         this.memory = memory;     }      [KernelFunction, Description(\"Key-based lookup for a specific memory\")]     public async Task&lt;string&gt; RetrieveAsync(         [Description(\"The key associated with the memory to retrieve\")] string key,         \/\/[Description(\"Memories collection associated with the memory to retrieve\")] string? collection = DefaultCollection,         CancellationToken cancellationToken = default)     {         \/\/\u0438\u0449\u0435\u043c \u0432\u043e \u0432\u0441\u0435\u0445 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u0445         var collections = await this.memory.GetCollectionsAsync();         foreach (var collection in collections)         {             var info = await this.memory.GetAsync(collection, key, cancellationToken: cancellationToken).ConfigureAwait(false);             var result = info?.Metadata.Text;              if (result != null)                 return result;         }          return string.Empty;     }      [KernelFunction, Description(\"Semantic search and return up to N memories related to the input text\")]     public async Task&lt;string&gt; RecallAsync(         [Description(\"The input text to find related memories for\")] string input,         \/\/[Description(\"Memories collection to search\")] string collection = DefaultCollection,         \/\/[Description(\"The relevance score, from 0.0 to 1.0, where 1.0 means perfect match\")] double? relevance = DefaultRelevance,         [Description(\"The maximum number of relevant memories to recall\")] int? limit = 3,         CancellationToken cancellationToken = default)     {         var collections = await this.memory.GetCollectionsAsync();          foreach (var collection in collections)         {             \/\/ Search memory             List&lt;MemoryQueryResult&gt; memories = await this.memory             .SearchAsync(collection, input, limit.Value, 0.9, cancellationToken: cancellationToken)             .ToListAsync(cancellationToken)             .ConfigureAwait(false);              if (memories.Count == 1)             {                 Console.ForegroundColor = ConsoleColor.Yellow;                 Console.WriteLine(\"RecallAsync: \" + string.Join(\"\\n\", memories[0].Metadata.Text));                 return memories[0].Metadata.Text;             }              if (memories.Count &gt; 1)             {                 var opt = new JsonSerializerOptions { WriteIndented = true, Encoder = JavaScriptEncoder.Create(new TextEncoderSettings(System.Text.Unicode.UnicodeRanges.All)) };                 var t = JsonSerializer.Serialize(memories.Select(x =&gt; x.Metadata.Text), opt);                 Console.ForegroundColor = ConsoleColor.Yellow;                 Console.WriteLine(\"RecallAsync: \" + string.Join(\"\\n\", t));                 return t;             }         }         return string.Empty;     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5fd\/c10\/9ee\/5fdc109ee3a0dcbd1a7387923005eb59.png\" width=\"455\" height=\"300\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/5fd\/c10\/9ee\/5fdc109ee3a0dcbd1a7387923005eb59.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5fd\/c10\/9ee\/5fdc109ee3a0dcbd1a7387923005eb59.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d <strong>TextMemoryPlugin<\/strong>, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0435\u0433\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c:<\/p>\n<pre><code class=\"cs\">var opt = new JsonSerializerOptions { WriteIndented = true, Encoder = JavaScriptEncoder.Create(new TextEncoderSettings(System.Text.Unicode.UnicodeRanges.All)) }; kernel.Plugins.AddFromObject(new TextMemoryPlugin(memory, jsonSerializerOptions: opt));<\/code><\/pre>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0438 \u0442\u0443\u0442 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 <span class=\"habrahidden\">(Microsoft.SemanticKernel, Microsoft.SemanticKernel.Connectors.Ollama, Microsoft.SemanticKernel.Plugins.Memory)<\/span> \u0432\u044b\u0448\u0435 1.40.1 &#8212; \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041c\u0435\u043b\u043a\u043e\u0441\u043e\u0444\u0442 \u043e\u043f\u044f\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0441\u043b\u043e\u043c\u0430\u043b\u0438.<\/p>\n<p><strong>\u0414\u0440\u0443\u0433\u043e\u0439 \u043e\u0447\u0435\u043d\u044c \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u0439 \u043c\u0438\u043d\u0443\u0441 Microsoft Semantic Kernel: \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439-\u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u0442\u0435\u043c \u0442\u044f\u0436\u0435\u043b\u0435\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043b\u044e\u0431\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441. \u0410 \u0432\u0435\u0434\u044c \u043c\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0430\u0440\u043e\u0439 \u0442\u0440\u043e\u0439\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0439&#8230;<\/strong><\/p>\n<p>\u0414\u0430, \u044f \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0441 &#171;\u0430\u0433\u0435\u043d\u0442\u0430\u043c\u0438&#187;: \u0441\u043f\u0435\u0440\u0432\u0430 \u0430\u0433\u0435\u043d\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0435\u0441\u043b\u0438 \u0432\u044b\u0437\u043e\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c &#8212; \u0418\u0418 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e (\u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 settings). \u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u044b. \u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441 \u0430\u0433\u0435\u043d\u0442\u043e\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">#pragma warning disable SKEXP0001 #pragma warning disable SKEXP0050 #pragma warning disable SKEXP0070  using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Connectors.Ollama; using System.ComponentModel;  var modelId = \"MY\"; var url = \"http:\/\/localhost:11434\";  var builder = Kernel.CreateBuilder(); builder.AddLocalTextEmbeddingGeneration(); \/\/\u0434\u043b\u044f embeddingGenerator builder.Services.AddOllamaChatCompletion(modelId, new HttpClient() { BaseAddress = new Uri(url) }); var kernel = builder.Build();  \/\/\"\u043e\u0431\u043b\u0435\u0433\u0447\u0435\u043d\u043d\u043e\u0435 \u044f\u0434\u0440\u043e\" var kernelLight = kernel.Clone();  \/\/\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0432\u043e\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \"\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u044f\u0434\u0440\u043e\" kernel.Plugins.AddFromObject(new MyWeatherPlugin()); kernel.Plugins.AddFromType&lt;MyTimePlugin&gt;(); kernel.Plugins.AddFromObject(new MyNewsPlugin());  \/\/\u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 kernel.FunctionInvocationFilters.Add(new FunctionCallLoggingFilter()); kernelLight.FunctionInvocationFilters.Add(new FunctionCallLoggingFilter());  \/\/\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 var functions = \"\"; foreach (var plugin in kernel.Plugins) {     var items = plugin.Select(x =&gt; {         \/\/var param = x.Metadata.Parameters.Select(y =&gt; y.Name).ToArray();         var param = x.Metadata.Parameters.Select(y =&gt;         {             \/\/\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 - \u0431\u0435\u0440\u0435\u043c \u0435\u0433\u043e, \u0438\u043d\u0430\u0447\u0435 - \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430             \/\/return string.IsNullOrEmpty(y.Description) ? y.Name : y.Name + \" - \" + y.Description;             return y.Name;         }).ToArray();         var result = param.Length == 0 ? x.Name : x.Name + \"(\" + string.Join(\",\", param) + \")\";         return result;     }).ToArray();     functions += string.Join(\",\", items) + \",\"; } functions = \"[\" + functions + \"]\";  \/\/\u0430\u0433\u0435\u043d\u0442  var functionNeedAgent = kernelLight.CreateFunctionFromPrompt(@$\"\u041e\u041f\u0420\u0415\u0414\u0415\u041b\u0418 \u041f\u041e\u0414\u0425\u041e\u0414\u0418\u0422 \u041b\u0418 \u0417\u0410\u041f\u0420\u041e\u0421 \u041f\u041e\u0414 \u0424\u0423\u041d\u041a\u0426\u0418\u0418: {functions}.      \u0415\u0421\u041b\u0418 \u0414\u0410 - \u0412\u0415\u0420\u041d\u0418 \u0422\u041e\u041b\u042c\u041a\u041e: 'function:\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435;parameters:\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435' \u0418\u041b\u0418 'null'.      \u0411\u041e\u041b\u042c\u0428\u0415 \u041d\u0418\u0427\u0415\u0413\u041e \u041d\u0415 \u0412\u042b\u0412\u041e\u0414\u0418.     \u041f\u0420\u0418\u041c\u0415\u0420: 'function:GetWeather;parameters:-'.     \u0417\u0410\u041f\u0420\u041e\u0421: '{{{{$user_input}}}}'\");  \/\/\u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c ollama \u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0439 var functionSettings = new OllamaPromptExecutionSettings {     FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(autoInvoke:true), \/\/\u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u044b     Temperature = 0 };  \/\/\u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0439 var defaultSettings = new OllamaPromptExecutionSettings {     FunctionChoiceBehavior = FunctionChoiceBehavior.None(), \/\/\u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u044b     Temperature = 0.3f \/\/\u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 };  Console.ForegroundColor = ConsoleColor.Green; Console.Write(\"User: \");  string? input = null; while ((input = Console.ReadLine()) is not null) {     \/\/\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438     var answer = await functionNeedAgent.InvokeAsync(kernelLight, new() { [\"user_input\"] = input });      Console.ForegroundColor = ConsoleColor.Yellow;     Console.WriteLine(\"functionNeedAgent: \" + string.Join(\"\\n\", answer));      \/\/\u0435\u0441\u043b\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e - \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c     if (answer.ToString().Contains(\"function\"))     {         answer = await kernel.InvokePromptAsync(input, new(functionSettings));     } else         answer = await kernel.InvokePromptAsync(input, new(defaultSettings));      Console.ForegroundColor = ConsoleColor.White;     Console.WriteLine(\"AI: \" + string.Join(\"\\n\", answer));      Console.ForegroundColor = ConsoleColor.Green;     Console.Write(\"User: \"); }  \/\/\u041f\u043b\u0430\u0433\u0438\u043d\u044b public class MyWeatherPlugin {     [KernelFunction, Description(\"Gets the current weather for the specified city\")]     public string GetWeather(string _city)     {         return \"very good in \" + _city + \"!\";     } }  public class MyTimePlugin {     [KernelFunction, Description(\"Get the current day of week\")]     public string DayOfWeek() =&gt; System.DateTime.Now.ToString(\"dddd\");      [KernelFunction, Description(\"Get the current time\")]     public string Time() =&gt; System.DateTime.Now.ToString(\"HH 'hour' mm 'minutes'\");      [KernelFunction, Description(\"Get the current date\")]     public string Date() =&gt; System.DateTime.Now.ToString(\"dddd dd MMMM yyyy\"); }  public class MyNewsPlugin {     [KernelFunction, Description(\"Gets the current news for the specified count\")]     public string GetNews(int count)     {         return \"the ruble strengthened. An alien ship was found in the USA. It's a full moon today.\";     } }  public class FunctionCallLoggingFilter : IFunctionInvocationFilter {     public async Task OnFunctionInvocationAsync(FunctionInvocationContext context, Func&lt;FunctionInvocationContext, Task&gt; next)     {         try         {             var values = \"\";             foreach (var arg in context.Arguments.Names)             {                 var val = context.Arguments[arg] == null ? \"null\" : context.Arguments[arg];                 values += $\"{arg}: {val}; \";             }              Console.ForegroundColor = ConsoleColor.Red;             Console.WriteLine($\"call {context.Function.Name}: {values}\");         }         catch         {             Console.ForegroundColor = ConsoleColor.Red;             Console.WriteLine($\"call {context.Function.Name}\");         }          await next(context);     } }<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b94\/277\/e88\/b94277e8818b3b6743528efd5bac71bb.png\" width=\"644\" height=\"274\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b94\/277\/e88\/b94277e8818b3b6743528efd5bac71bb.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b94\/277\/e88\/b94277e8818b3b6743528efd5bac71bb.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<\/div>\n<\/details>\n<h2>Microsoft.Extensions.AI<\/h2>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u043b\u0433\u0438\u0445 \u043f\u043e\u0438\u0441\u043a\u043e\u0432 \u0432 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0438 Microsoft Semantic Kernel, \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u044d\u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 Kernel. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 <strong>Microsoft.Extensions.AI.Ollama<\/strong> \u0438 \u043d\u0430\u0447\u0430\u043b \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b&#8230; \u041f\u0440\u043e\u0441\u0442\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u043c\u043e\u0434\u0435\u043b\u0438 (\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438) \u043d\u0435 \u0441\u0442\u0430\u043b\u0438 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432. \u041e\u0434\u043d\u0430\u043a\u043e, \u043d\u0430 \u043d\u0435\u0433\u043e \u044f \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u044b\u0442\u0430\u044f\u0441\u044c \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c: \u043f\u043e\u0447\u0435\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u0441 unicode \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044f\u043c\u0438. \u041d\u0438\u043a\u0430\u043a\u0438\u0435 \u0443\u0445\u0438\u0449\u0440\u0435\u043d\u0438\u044f, \u043a\u0430\u043a \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u0441 <strong>MyTextMemoryPlugin <\/strong>\u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442. \u041a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u044d\u0442\u043e\u0442 \u043f\u0430\u043a\u0435\u0442 &#8212; \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439, \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f. Visual Studio \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0430\u043a\u0435\u0442 <strong>OllamaSharp<\/strong>. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e\u0442 \u043f\u0430\u043a\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f <strong>RAG <\/strong>(OllamaEmbeddingGenerator).<\/p>\n<h2>OllamaSharp<\/h2>\n<p>\u0412 \u0441\u0435\u0442\u0438 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 <a href=\"https:\/\/github.com\/awaescher\/OllamaSharp\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/awaescher\/OllamaSharp<\/a> \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Ollama. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u043a\u0435\u0442 <strong>OllamaSharp <\/strong>\u0432 NuGet. \u0421\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Function Calling <a href=\"https:\/\/awaescher.github.io\/OllamaSharp\/docs\/tool-support.html\" rel=\"noopener noreferrer nofollow\">https:\/\/awaescher.github.io\/OllamaSharp\/docs\/tool-support.html<\/a>.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">using OllamaSharp;  var ollama = new OllamaApiClient(\"http:\/\/localhost:11434\", \"MY:latest\");  \/\/\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 List&lt;object&gt; Tools = [new GetWeatherTool(), new DateTool()];  var chat = new Chat(ollama); while (true) {     Console.Write(\"User: \");     var message = Console.ReadLine();      Console.Write(\"AI: \");     \/\/\u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438 \u043d\u0430\u0448\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438     await foreach (var answerToken in chat.SendAsync(message, Tools))         Console.Write(answerToken);      Console.WriteLine(); }<\/code><\/pre>\n<p> \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 SampleTools.cs (namespace \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u0435\u043d):<\/p>\n<pre><code class=\"cs\">namespace OllamaSharp;  public static class SampleTools {     \/\/\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438     \/\/\u0438\u0437 \u043d\u0438\u0445 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u0431\u0440\u0430\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438      \/\/\/ &lt;summary&gt;     \/\/\/ Get the current weather for a city     \/\/\/ &lt;\/summary&gt;     \/\/\/ &lt;param name=\"city\"&gt;Name of the city&lt;\/param&gt;     [OllamaTool]     public static string GetWeather(string city) =&gt; $\"It's cold at only 6\u00b0 in {city}.\";      \/\/\/ &lt;summary&gt;     \/\/\/ Get the current date     \/\/\/ &lt;\/summary&gt;     [OllamaTool]      public static string Date() =&gt; System.DateTime.Now.ToString(\"dddd dd MMMM yyyy\"); }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u0438 \u0432\u0432\u043e\u0434\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0431\u0435\u0437 \u0437\u043d\u0430\u043a\u043e\u0432 \u043f\u0440\u0435\u043f\u0438\u043d\u0430\u043d\u0438\u044f, \u0431\u0435\u0437 \u0432\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438 \u0432\u043e\u0441\u043a\u043b\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u043a\u043e\u0432 \u2014 \u0432\u0441\u0451 \u043e\u043a. \u041d\u043e \u0441\u0442\u041e\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u043d\u0430\u043a, \u043b\u0438\u0431\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0443\u043a\u0432\u044b \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 \u2014 \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c, \u0438 \u0432\u0435\u0434\u0435\u0442 \u0441\u0435\u0431\u044f \u043d\u0435\u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u043e. \u041a\u0430\u043a \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 &#8212; \u043f\u043e\u043a\u0430 \u043d\u0435 \u044f\u0441\u043d\u043e.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0435\u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u043e\u0441\u0442\u0438:<\/summary>\n<div class=\"spoiler__content\">\n<p><strong>User:<\/strong> \u043a\u0430\u043a \u0442\u0435\u0431\u044f \u0437\u043e\u0432\u0443\u0442<br \/><strong>AI:<\/strong> \u042f \u2013 JARVIS.<\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<br \/><strong>User:<\/strong> \u041a\u0430\u043a \u0442\u0435\u0431\u044f \u0437\u043e\u0432\u0443\u0442?<br \/><strong>AI:<\/strong> \u0422\u0435\u043f\u043b\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435: &lt;tool_response&gt;<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u043e \u043d\u0430\u043c \u043d\u0435 \u0432\u0430\u0436\u043d\u044b \u0437\u043d\u0430\u043a\u0438 \u043f\u0440\u0435\u043f\u0438\u043d\u0430\u043d\u0438\u044f, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u043d\u0430\u043a\u043e\u0432 \u043f\u0440\u0435\u043f\u0438\u043d\u0430\u043d\u0438\u044f \u0438 \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430.<\/p>\n<h2>Microsoft.Extensions.AI + OllamaSharp<\/h2>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u0438 <strong>Function Calling<\/strong>, \u0438 <strong>RAG <\/strong>(\u0430\u043d\u0430\u043b\u043e\u0433 \u043c\u0435\u043b\u043a\u043e\u0441\u043e\u0444\u0442\u043e\u0432\u0441\u043a\u043e\u0433\u043e <strong>TextMemoryPlugin<\/strong>).<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">using Microsoft.Extensions.AI; using OllamaAITest; using OllamaSharp; using System.ComponentModel; using System.Numerics.Tensors;  var modelID = \"MY\" var modelEmbeddID = \"MY\" \/\/\u0434\u043b\u044f RAG var url = \"http:\/\/localhost:11434\";  var ollamaClient = new OllamaApiClient(new Uri(url), modelID);  IChatClient chatClient = new ChatClientBuilder(ollamaClient)     \/\/.UseFunctionInvocation() \/\/\u0430\u0432\u0442\u043e\u0437\u0430\u043f\u0443\u0441\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043c, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438     \/\/.UseDistributedCache(new MemoryDistributedCache(Options.Create(new MemoryDistributedCacheOptions()))) \/\/\u043a\u044d\u0448 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043c, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0441\u0432\u0435\u0436\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b     .Use(async (chatMessages, options, nextAsync, cancellationToken) =&gt;      {          await nextAsync(chatMessages, options, cancellationToken);      })     .Build();   \/\/\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 OllamaEmbeddingGenerator ollamaEmbeddingGenerator = new(new Uri(url), modelEmbeddID);  \/\/\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 var opt = new EmbeddingGenerationOptions() {     ModelId = modelID,     AdditionalProperties = new()     {         [\"Temperature\"] = \"0\"     }, };  \/\/\u0444\u0430\u043a\u0442\u044b string[] facts = [     \"\u0418\u0432\u0430\u043d \u0436\u0438\u0432\u0435\u0442 \u0432 \u041c\u043e\u0441\u043a\u0432\u0435\",     \"\u0423 \u0418\u0432\u0430\u043d\u0430 \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u043a\u043e\u0442\u0430\",     \"\u0421\u0435\u043c\u0451\u043d \u0436\u0438\u0432\u0435\u0442 \u0432 \u041f\u0438\u0442\u0435\u0440\u0435\",     \"\u0423 \u0421\u0435\u043c\u0451\u043d\u0430 \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u043a\u043e\u0442\u0430\",     \"\u041c\u0430\u0440\u0438\u043d\u0430 \u0436\u0438\u0432\u0435\u0442 \u0432 \u0412\u043e\u0440\u043a\u0443\u0442\u0435\",     \"\u0423 \u041c\u0430\u0440\u0438\u043d\u044b \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u0441\u043e\u0431\u0430\u043a\u0438\",     ];  \/\/\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0438\u0437 \u0444\u0430\u043a\u0442\u043e\u0432 var factsEmbeddings = await ollamaEmbeddingGenerator.GenerateAndZipAsync(facts, opt);  \/\/\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0447\u0430\u0442\u0430 ChatOptions options = new ChatOptions(); options.ToolMode = AutoChatToolMode.Auto; options.Tools = [     AIFunctionFactory.Create(GetWeather),     AIFunctionFactory.Create(DayOfWeek),     AIFunctionFactory.Create(Time),     AIFunctionFactory.Create(Date),     AIFunctionFactory.Create(Recall)     ];  \/\/\u0438\u0441\u0442\u043e\u0440\u0438\u044f List&lt;ChatMessage&gt; chatHistory = new();  string answer = \"\"; bool lastWasTool = false; do {     if (!lastWasTool)     {         Console.ForegroundColor = ConsoleColor.Green;         Console.Write(\"User: \");         var userMessage = Console.ReadLine();         chatHistory.Add(new ChatMessage(ChatRole.User, userMessage));     }  again:     var response = await chatClient.GetResponseAsync(chatHistory, options);     if (response == null)     {         Console.WriteLine(\"No response from the assistant\");         continue;     }      foreach (var message in response.Messages)     {         chatHistory.Add(message);          FunctionCallContent[] array = response.Messages.FirstOrDefault().Contents.OfType&lt;FunctionCallContent&gt;().ToArray();         if (array.Length &gt; 0)         {             await ProcessToolRequest(message, chatHistory);             lastWasTool = true;         }     }      if (lastWasTool)     {         lastWasTool = false;         goto again;     } else     {         answer = string.Join(string.Empty, response.Messages.Select(m =&gt; m.Text));         Console.ForegroundColor = ConsoleColor.White;         Console.WriteLine($\"AI: {answer}\");          chatHistory.Clear();\/\/\u043e\u0447\u0438\u0449\u0430\u0435\u043c     }  } while (true);  async Task ProcessToolRequest(     ChatMessage completion,     IList&lt;ChatMessage&gt; prompts) {     foreach (var toolCall in completion.Contents.OfType&lt;FunctionCallContent&gt;())     {         \/\/AIFunction aIFunction = options.Tools.OfType&lt;AIFunction&gt;().FirstOrDefault((AIFunction t) =&gt; t.Name == toolCall.Name);          AIFunction aIFunction = options.Tools.OfType&lt;AIFunction&gt;().FirstOrDefault((AIFunction t) =&gt; t.Name.Contains(toolCall.Name.Replace(\"__Main___g__\", \"\"))); \/\/__Main___g__          var functionName = toolCall.Name;         var arguments = new AIFunctionArguments(toolCall.Arguments);          var callLog = string.Join(\"; \", arguments.Select(x =&gt; x.Key.ToString() +\": \" + x.Value?.ToString() + \" \").ToArray());         Console.ForegroundColor = ConsoleColor.Red;         Console.WriteLine(\"Call: \" + functionName + \" \" + callLog);          if (aIFunction == null) continue;         var result = await aIFunction.InvokeAsync(arguments);          Console.ForegroundColor = ConsoleColor.Yellow;         Console.WriteLine(\"Call result: \" + string.Join(\"\\n\", result));          ChatMessage responseMessage = new(ChatRole.Tool,             [                 new FunctionResultContent(toolCall.CallId, result)             ]);          prompts.Add(responseMessage);     } }  \/\/\u0444\u0443\u043d\u043a\u0446\u0438\u0438  [Description(\"Gets the current weather for the specified city\")] [return: Description(\"The current weather\")] string GetWeather([Description(\"The city\")]  string _city) {     return \"The weather in \" + _city + \" is 30 degrees and sunny.\"; }  [Description(\"Get the day of week\")] string DayOfWeek() =&gt; System.DateTime.Now.ToString(\"dddd\", new System.Globalization.CultureInfo(\"en-EN\"));  [Description(\"Get the time\")] string Time() =&gt; System.DateTime.Now.ToString(\"HH 'hour' mm 'minutes'\", new System.Globalization.CultureInfo(\"en-EN\"));  [Description(\"Get the date\")] string Date() =&gt; System.DateTime.Now.ToString(\"dddd dd MMMM yyyy\", new System.Globalization.CultureInfo(\"en-EN\"));  [Description(\"Search the memory for a given query.\")] [return: Description(\"Collection of text search result\")] async Task&lt;List&lt;string&gt;&gt; Recall([Description(\"The query to search for.\")] string query) {     \/\/\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438     var o = new EmbeddingGenerationOptions()     {         ModelId = modelEmbeddID,         AdditionalProperties = new()         {             [\"Temperature\"] = \"0\"         },     };      \/\/\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440 \u0438\u0437 \u0437\u0430\u043f\u0440\u043e\u0441\u0430     var userEmbedding = await ollamaEmbeddingGenerator.GenerateAsync(query, o);      \/\/\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c \u043f\u043e\u0438\u0441\u043a \u0438\u0437 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441\u0440\u0435\u0434\u0438 \u0444\u0430\u043a\u0442\u043e\u0432     var topMatches = factsEmbeddings         \/\/\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a         .Select(candidate =&gt; new         {             Text = candidate.Value,             Similarity = TensorPrimitives.CosineSimilarity(candidate.Embedding.Vector.Span, userEmbedding.Vector.Span)         })         \/\/relevance - \u043e\u0442\u0441\u0435\u043a\u0430\u0435\u043c \u0441\u043b\u0430\u0431\u044b\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f         \/*         .Where(x =&gt; {             return x.Similarity &gt;= 0.92f;         })         *\/         \/\/\u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c - \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0430\u043c\u044b\u0435 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0435         .OrderByDescending(match =&gt; match.Similarity)         \/\/limit - \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e         .Take(3);      var result = topMatches.Select(x =&gt; x.Text).ToList&lt;string&gt;();      return result; }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fa1\/639\/cd0\/fa1639cd09fb2dd8c53f6d27b16ffe02.png\" width=\"1480\" height=\"511\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/fa1\/639\/cd0\/fa1639cd09fb2dd8c53f6d27b16ffe02.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fa1\/639\/cd0\/fa1639cd09fb2dd8c53f6d27b16ffe02.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u043e \u0438\u0442\u043e\u0433\u0443: \u043f\u0435\u0440\u0432\u044b\u043c \u0443 \u043d\u0430\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0444\u0430\u043a\u0442\u043e\u0432, \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 3 \u0441\u0435\u043a\u0443\u043d\u0434. \u0414\u0430\u043b\u0435\u0435, \u043f\u0440\u0438 \u0432\u0432\u043e\u0434\u0435 \u043b\u044e\u0431\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a \u043c\u043e\u0434\u0435\u043b\u0438, \u0435\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c (json \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435). \u042d\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 &#8212; \u043e\u043a\u043e\u043b\u043e 20 \u0441\u0435\u043a\u0443\u043d\u0434. \u0414\u0430\u043b\u0435\u0435 \u043b\u044e\u0431\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e &#8212; \u043e\u0442 3 \u0434\u043e 7 \u0441\u0435\u043a\u0443\u043d\u0434. \u041d\u0435\u043f\u043b\u043e\u0445\u043e \u0434\u043b\u044f \u043d\u0435\u0440\u0430\u0437\u043e\u0433\u043d\u0430\u043d\u043d\u043e\u0433\u043e Intel Core i7-3770K \u0438\u0437 \u0434\u0430\u043b\u0451\u043a\u043e\u0433\u043e 2012\u00a0\u0433\u043e\u0434\u0430.<\/p>\n<p><strong>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 RAG, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u044d\u043c\u0431\u0435\u0434\u0434\u0438\u043d\u0433\u043e\u0432.<\/strong> \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>var modelEmbeddID = \"MYEmbedd\"<\/code>, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u044d\u0442\u0443 \u043c\u043e\u0434\u0435\u043b\u044c \u0432 Ollama.<\/p>\n<p>\u0414\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u043c\u043e\u0434\u0435\u043b\u044c\u044e, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0430 \u043d\u0430 <code>chatHistory.Clear()<\/code>:<\/p>\n<ol>\n<li>\n<p><strong>[user] Text = &#171;\u0443 \u043a\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u043a\u043e\u0442\u0430&#187;<\/strong> \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0447\u0430\u0442\u0430.  <strong>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0438\u043d\u0444\u0435\u0440 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0447\u0430\u0442\u0430.<\/strong><\/p>\n<\/li>\n<li>\n<p><strong>[assistant] FunctionCall = 3a5d650f, Main_g__Recall_7([query, \u0423 \u043a\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u043a\u043e\u0442\u0430?]) <\/strong>\u043c\u043e\u0434\u0435\u043b\u044c \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441, \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0432\u0438\u0434\u0435 json \u0441 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438. \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041c\u044b \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c.<\/p>\n<\/li>\n<li>\n<p><strong>[tool] FunctionResult = 3a5d650f, [ &#171;\u0423 \u0421\u0435\u043c\u0451\u043d\u0430 \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u043a\u043e\u0442\u0430&#187;, &#171;\u0421\u0435\u043c\u0451\u043d \u0436\u0438\u0432\u0435\u0442 \u0432 \u041f\u0438\u0442\u0435\u0440\u0435&#187;, &#171;\u0423 \u0418\u0432\u0430\u043d\u0430 \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u043a\u043e\u0442\u0430&#187;]<\/strong> \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441 \u0435\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0447\u0430\u0442\u0430.  <strong>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0438\u043d\u0444\u0435\u0440 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0447\u0430\u0442\u0430.<\/strong><\/p>\n<\/li>\n<li>\n<p><strong>[assistant] Text = &#171;\u0418\u0442\u0430\u043a, \u0443 \u0421\u0435\u043c\u0451\u043d\u0430 \u0438 \u0443 \u0418\u0432\u0430\u043d\u0430 \u043f\u043e \u0442\u0440\u0438 \u043a\u043e\u0442\u0430.&#187;<\/strong> \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u044b\u0434\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0441\u043b\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043f.1 \u0438 \u043f.3.<\/p>\n<\/li>\n<\/ol>\n<p>\u0418\u0442\u043e\u0433\u043e: \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 &#8212; 1 \u0438\u043d\u0444\u0435\u0440. \u0417\u0430\u043f\u0440\u043e\u0441 \u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 &#8212; 2 \u0438\u043d\u0444\u0435\u0440\u0430.<\/p>\n<p><strong>\u0417\u0430\u0447\u0435\u043c \u043c\u044b \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0438\u0441\u0442\u0438\u043c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439?<\/strong> \u0415\u0441\u043b\u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043d\u0435 \u0447\u0438\u0441\u0442\u0438\u0442\u044c &#8212; \u0442\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u043d\u0438\u0442\u044c\u0441\u044f. \u041f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0430 \u043f\u0440\u0438 \u0432\u0442\u043e\u0440\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f &#8212; \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0434\u0430\u0441\u0442 \u0432\u0440\u0435\u043c\u044f \u0438\u0437 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u0410 \u043d\u0430\u043c \u0442\u0430\u043a\u043e\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p><strong>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0441\u043b\u043e\u0436\u043d\u0435\u0435<\/strong>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f. \u0414\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 (MyEvent), \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u0434\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u043f\u043e\u043b\u044f\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b<code>{ get; set; }<\/code>, \u0438\u043d\u0430\u0447\u0435 \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.<\/p>\n<details class=\"spoiler\">\n<summary>MyEventPlugin<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">using System.ComponentModel;  namespace OllamaAITest {     public class MyEventPlugin     {         public class MyEvent         {             public string description { get; set; }             public DateTime time { get; set; }         }          List&lt;MyEvent&gt; events = new List&lt;MyEvent&gt;();          [Description(\"Sets an alarm at the specified time with format 'hour:minut' and specified exact description\")]         public string SetEvent(string time, string? description)         {             foreach (var item in events)             {                 \/\/\u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435                 if (item.time.Equals(time))                 {                     item.description = description;                     return $\"Event updated by description\";                 }                  if (item.description.Equals(description))                 {                     item.time = DateTime.Parse(time);                     return $\"Event updated by time\";                 }             }             \/\/\u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0448\u043b\u043e\u0441\u044c - \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c             events.Add(new MyEvent() { time = DateTime.Parse(time), description = description });             return $\"Event set for time: {time}\";         }          [Description(\"Remove one Event at the provided specified time with format 'hour:minut' or specified description\")]         public string RemoveEvent(string time, string? description)         {             var deleteCount = 0;             var index = 0;             while (index &lt; events.Count)             {                 var item = events[index];                 if (item.time.Equals(time) || item.description.Equals(description))                 {                     events.RemoveAt(index);                     deleteCount++;                 }                 else                 {                     index++;                 }             }              if (deleteCount &gt; 0) return $\"Droped {deleteCount} Events\";              return $\"Nothing deleted\";         }          [Description(\"Remove all Events\")]         public string RemoveAllEvents()         {             events.Clear();             return $\"All Event is dropped\";         }          [Description(\"List all Events\")]         [return: Description(\"Events with description and datetime\")]         public List&lt;MyEvent&gt; ListEvents()         {             return events;         }     } } <\/code><\/pre>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 Program.cs:<\/p>\n<pre><code class=\"cs\">var events = new MyEventPlugin();  \/\/\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0447\u0430\u0442\u0430 ChatOptions options = new ChatOptions(); options.ToolMode = AutoChatToolMode.Auto; options.Tools = [     ...     \/\/\u0430\u0433\u0430 \u0432\u043e\u0442 \u044d\u0442\u0438 \u0440\u0435\u0431\u044f\u0442\u0430     AIFunctionFactory.Create(events.SetEvent),     AIFunctionFactory.Create(events.ListEvents),     AIFunctionFactory.Create(events.RemoveEvent),     AIFunctionFactory.Create(events.RemoveAllEvents),     ];<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f4c\/73d\/5ef\/f4c73d5ef41d4949523391dbc288ef59.png\" width=\"614\" height=\"440\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f4c\/73d\/5ef\/f4c73d5ef41d4949523391dbc288ef59.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f4c\/73d\/5ef\/f4c73d5ef41d4949523391dbc288ef59.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h2>\u0418\u0442\u043e\u0433\u043e<\/h2>\n<p><span class=\"habrahidden\">\u0414\u043e\u0440\u043e\u0433\u043e\u0439 \u0434\u043d\u0435\u0432\u043d\u0438\u043a, \u043c\u043d\u0435 \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0442\u0443 \u0431\u043e\u043b\u044c \u0438 \u0441\u0442\u0440\u0430\u0434\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043f\u0435\u0440\u0435\u043d\u0451\u0441&#8230;<\/span><\/p>\n<p>\u041d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 7 \u043c\u0435\u0441\u044f\u0446\u0435\u0432, \u043f\u0435\u0440\u0435\u0440\u044b\u0432 \u043f\u043e\u0447\u0442\u0438 \u0432\u0435\u0441\u044c github, \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0432 \u043c\u044b\u0441\u043b\u0438\u043c\u043e\u0435 \u0438 \u043d\u0435\u043c\u044b\u0441\u043b\u0438\u043c\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432, \u0442\u0430\u043a\u0438 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0443\u043c: \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u0441\u043d\u043e\u0441\u043d\u043e \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043d\u0430 \u0441\u043b\u0430\u0431\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435.<\/p>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0443\u0440\u0435\u0437\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 LLM \u043f\u043e\u043b\u043d\u0430 \u0441\u0442\u0440\u0430\u0434\u0430\u043d\u0438\u0439. \u041c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0432\u0435\u0449\u0438. \u0415\u0441\u043b\u0438 \u043f\u043b\u043e\u0445\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 &#8212; \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439. \u041c\u043e\u0434\u0435\u043b\u044c \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u0442\u043b\u0438\u0432\u043e\u0439. \u041b\u044e\u0431\u043e\u0439 \u043b\u0438\u0448\u043d\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u043e\u043c\u0430\u0442\u044c \u0434\u0438\u0430\u043b\u043e\u0433 \u0441 \u043c\u043e\u0434\u0435\u043b\u044c\u044e. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0440\u0430\u043d\u0435\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 &#8212; \u0442\u0435\u043c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u043e\u0442\u0432\u0435\u0442. \u041c\u043e\u0434\u0435\u043b\u044c \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u0438\u043f <code>DateTime <\/code>\u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 (\u0432\u0435\u0440\u043d\u0435\u0435 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u043e\u0440 json \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043e\u0434\u0435\u043b\u044c\u044e). \u0414\u0430 \u0438 \u043b\u044e\u0431\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u0438\u043f\u044b \u043a\u0440\u043e\u043c\u0435 <code>string <\/code>\u0438 <code>int <\/code>\u043f\u0440\u0438\u0431\u0430\u0432\u044f\u0442 \u0432\u0430\u043c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0431\u043e\u043b\u0438.<\/p>\n<p>\u0425\u043e\u0440\u043e\u0448\u0430\u044f \u043d\u043e\u0432\u043e\u0441\u0442\u044c: \u0435\u0441\u043b\u0438 \u043c\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0445\u043e\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435\u0435 \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043d\u0430 \u0442\u0430\u043a\u043e\u0439 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u0443\u0440\u0435\u0437\u0430\u043d\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438, \u043d\u0430 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0430\u0431\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435, \u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0437\u0443\u043c\u043d\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u0431\u043e\u043b\u0435\u0435 \u043c\u043e\u0449\u043d\u043e\u0435 \u0436\u0435\u043b\u0435\u0437\u043e \u0442\u043e\u0447\u043d\u043e \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<p>\u0414\u0430, \u043d\u0430\u043c \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0433\u043e AI-\u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 <code>if then else<\/code>, \u0447\u0430\u0441\u0442\u043e \u0441 \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u0435\u043d \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442: \u044d\u0442\u043e n8n + \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0435 LLM. \u0410 \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f &#8212; \u0432\u0441\u0451.<\/p>\n<figure class=\"bordered full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ada\/ce2\/757\/adace27577b2d6c6021c140aed90a8ec.png\" alt=\"n8n\" title=\"n8n\" width=\"1157\" height=\"542\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/ada\/ce2\/757\/adace27577b2d6c6021c140aed90a8ec.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ada\/ce2\/757\/adace27577b2d6c6021c140aed90a8ec.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>n8n<\/figcaption><\/div>\n<\/figure>\n<p>\u0410\u043b\u0438\u0441\u0430, \u043e\u0442\u0431\u043e\u0439&#8230;<\/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\/914392\/\"> https:\/\/habr.com\/ru\/articles\/914392\/<\/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><em>\u0421\u0442\u0430\u0442\u044c\u044f \u043e\u0431\u0437\u043e\u0440\u043d\u0430\u044f, \u0434\u043b\u044f \u0434\u0438\u043d\u043e\u0437\u0430\u0432\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u0447\u043d\u0443\u043b\u0438\u0441\u044c \u0438\u0437 \u0431\u0435\u0441\u043f\u0440\u043e\u0441\u0432\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u043d\u0430 \u043d\u0435\u0432\u0435\u0434\u0435\u043d\u0438\u044f. \u0422\u0430\u043a\u0438\u043c \u0434\u0438\u043d\u043e\u0437\u0430\u0432\u0440\u043e\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u044f\u0432\u043b\u044f\u044e\u0441\u044c \u044f \u0441\u0430\u043c. \u0412\u0441\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u043c\u044b\u0441\u043b\u0435\u0444\u043e\u0440\u043c\u044b \u0438 \u043f\u0440\u043e\u0447\u0435\u0435, \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u044e\u0442 \u043d\u0430 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u0438\u0441\u0442\u0438\u043d\u0443 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0438. \u041d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b &#171;\u0430 \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0425&#187; \u043e\u0442\u0432\u0435\u0447\u0443: \u0442\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c. \u0421\u0442\u0430\u0442\u044c\u044f \u0431\u044b\u043b\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u043e\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u0440\u0435\u043c\u044f, \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0440\u044b\u0432\u043a\u0430\u043c\u0438.<\/em><br \/><em>\u041f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f.<\/em><\/p>\n<p>\u0412\u043e\u043a\u0440\u0443\u0433 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0432\u0438\u0436\u0443\u0445\u0438 \u0432\u043e\u043a\u0440\u0443\u0433 \u0418\u0418: \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 DeepSeek R1 \u043e\u0431\u0432\u0430\u043b\u0438\u043b \u0430\u043a\u0446\u0438\u0438 \u0418\u0422 \u0433\u0438\u0433\u0438\u043d\u0442\u043e\u0432 \u0421\u0428\u0410! Tulu 3 \u043f\u0440\u0435\u0432\u0437\u043e\u0448\u043b\u0430 DeepSeek V3! Qwen 2.5-VL \u043e\u0442 Alibaba \u043e\u0431\u043e\u0448\u0435\u043b DeepSeek! \u041d\u0443 \u0438 \u0442.\u0434. \u0438 \u0442.\u043f.<\/p>\n<p>\u0410 \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u0418\u0418 \u0442\u0430\u043a\u043e\u0439? \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0435\u0433\u043e \u043f\u0438\u0448\u0443\u0442 \u043a\u043e\u0434, \u043a\u043e\u043f\u0438\u0440\u0430\u0439\u0442\u0435\u0440\u044b \u043f\u0438\u0448\u0443\u0442 \u0442\u0435\u043a\u0441\u0442, \u0434\u0438\u0437\u0430\u0439\u043d\u0435\u0440\u044b \u0440\u0438\u0441\u0443\u044e\u0442 \u0434\u0438\u0437\u0430\u0439\u043d\u044b (\u0442\u043e\u0442 \u0436\u0435 \u0418\u043e\u043d\u043e\u0432 \u043e\u0442 \u0441\u0442\u0443\u0434\u0438\u0438 \u0410\u0440\u0442\u0435\u043c\u0438\u044f \u041b\u0435\u0431\u0435\u0434\u0435\u0432\u0430), \u043a\u043e\u043d\u0442\u0435\u043d\u0442-\u043c\u0435\u0439\u043a\u0435\u0440\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u0440\u0438\u0441\u0443\u043d\u043a\u0438 \u0438 \u0432\u0438\u0434\u0435\u043e.<\/p>\n<p>\u0410 \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0430\u043c, \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u043b\u044e\u0434\u044f\u043c? \u0410\u043b\u0438\u0441\u0430, \u041c\u0430\u0440\u0443\u0441\u044f, \u0421\u0430\u043b\u044e\u0442, \u0421\u0438\u0440\u0438, \u041a\u043e\u0440\u0442\u0430\u043d\u0430, \u0410\u043b\u0435\u043a\u0441\u0430,  Bixby, \u0438 \u043f\u0440\u043e\u0447\u0435\u0435.<\/p>\n<p>\u042d\u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u0432\u0441\u0435 \u044d\u0442\u0438 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0418\u0418 \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u044b \u043d\u0430\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0435 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442. \u041c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0445 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0412\u0441\u044f \u043d\u0430\u0448\u0430 \u0436\u0438\u0437\u043d\u044c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u0438\u043c \u043e\u043d\u043b\u0430\u0439\u043d \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430\u043c \u2014 \u043a\u0430\u043a \u043e\u0442\u043a\u0440\u044b\u0442\u0430\u044f \u043a\u043d\u0438\u0433\u0430 \u0434\u043b\u044f \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u0440\u043e\u0447\u044c \u043d\u0430 \u043d\u0430\u0441 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p>\u0410 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 &#8230;\u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0418\u0418 \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430?<\/p>\n<h2>\u0427\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c?<\/h2>\n<p>\u0410\u043b\u0438\u0441\u0430 \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u0418\u0418 \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u044b \u2014 \u0441\u043b\u0443\u0448\u0430\u044e\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0441 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u0430 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u0411\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0438\u043c\u0435\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u043e\u0433 \u0437\u0430\u0442\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u0441\u0432\u043e\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0435\u0437\u0442\u044c \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442, \u0438 \u0441\u043b\u0438\u0432\u0430\u0442\u044c \u043b\u0438\u0447\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0437\u043e\u0432\u0435\u043c \u0441\u0432\u043e\u0435\u0433\u043e \u0418\u0418 \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430 <s>\u043d\u0435 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e<\/s> \u00ab\u0414\u0436\u0430\u0440\u0432\u0438\u0441\u00bb. \u0418 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0432 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0438 &#8212; \u00ab\u0414\u0436\u0430\u0440\u0432\u0438\u0441\u00bb.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043a\u0430\u043a \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0438\u043c \u0437\u0430\u0433\u043e\u0440\u043e\u0434\u043d\u044b\u043c \u0434\u043e\u043c\u043e\u043c<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p>\u0432\u0440\u0435\u043c\u044f, \u0434\u0430\u0442\u0430 (\u0432\u044b\u0434\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0438 \u0434\u0430\u0442\u0443)<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a\u0438\u0435 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u043e\u0432\u043e\u0441\u0442\u0438? (\u0432\u044b\u0434\u0430\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0442\u043e\u043f 5 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439)<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a\u0430\u044f \u043f\u043e\u0433\u043e\u0434\u0430 \u0432 \u043c\u043e\u0441\u043a\u0432\u0435 \u0438 \u043f\u0438\u0442\u0435\u0440\u0435? (\u0432\u044b\u0434\u0430\u0435\u0442 \u043f\u043e\u0433\u043e\u0434\u0443)<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0432\u0435\u0440\u044c \u043f\u043e\u0447\u0442\u0443 (\u0432\u044b\u0434\u0430\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0445 \u043f\u0438\u0441\u0435\u043c \u044d\u043b.\u043f\u043e\u0447\u0442\u044b)<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u043a\u0430\u0436\u0438 \u0441\u0443\u0448\u0438 (\u0432\u044b\u0437\u043e\u0432 API \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430 \u0441\u0443\u0448\u0438 \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0432\u043e\u0439 \u0438\u043c\u0435\u0435\u0442\u0441\u044f)<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u043f\u0440\u0430\u0432\u044c \u0421\u041c\u0421 \u0431\u0440\u0430\u0442\u0443: \u00ab\u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0435 \u043f\u0440\u0438\u0435\u0434\u0443, \u0432\u0435\u0441\u044c \u0434\u0435\u043d\u044c \u0437\u0430\u043d\u044f\u0442\u00bb (\u0432\u044b\u0437\u043e\u0432 API \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0421\u041c\u0421)<\/p>\n<\/li>\n<li>\n<p>\u043a\u0443\u0440\u0441 \u0434\u043e\u043b\u043b\u0430\u0440\u0430 (\u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 1 \u0434\u043e\u043b\u043b\u0430\u0440\u0430 \u0432 \u0440\u0443\u0431\u043b\u044f\u0445 \u043f\u043e \u043a\u0443\u0440\u0441\u0443 \u0426\u0411)<\/p>\n<\/li>\n<li>\n<p>\u0432\u043a\u043b\u044e\u0447\u0438 \u043c\u0443\u0437\u044b\u043a\u0443 \u0431\u0435\u0442\u0445\u043e\u0432\u0435\u043d \u0441\u0438\u043c\u0444\u043e\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440 \u043f\u044f\u0442\u044c (\u0437\u0430\u043f\u0443\u0441\u043a \u043f\u043b\u0435\u0435\u0440\u0430)<\/p>\n<\/li>\n<li>\n<p>\u0431\u0443\u0434\u0438\u043b\u044c\u043d\u0438\u043a \u043d\u0430 \u0437\u0430\u0432\u0442\u0440\u0430 \u0432 17:15 (\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0438\u043b\u044c\u043d\u0438\u043a\u0430)<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u043c\u0435\u043d\u0438 \u0432\u0441\u0435 \u0434\u0435\u043b\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f (\u043e\u0442\u043c\u0435\u043d\u0430 \u0432\u0441\u0435\u0445 \u0431\u0443\u0434\u0438\u043b\u044c\u043d\u0438\u043a\u043e\u0432)<\/p>\n<\/li>\n<li>\n<p>\u0432\u043a\u043b\u044e\u0447\u0438 \u0440\u043e\u0431\u043e\u0442-\u043f\u044b\u043b\u0435\u0441\u043e\u0441 (\u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u00ab\u0443\u043c\u043d\u043e\u043c\u0443 \u0434\u043e\u043c\u0443\u00bb)<\/p>\n<\/li>\n<li>\n<p>\u0432\u043a\u043b\u044e\u0447\u0438 \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440 \u0432 \u043a\u0443\u0445\u043d\u0435 (\u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u00ab\u0443\u043c\u043d\u043e\u043c\u0443 \u0434\u043e\u043c\u0443\u00bb)<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u043a\u0440\u043e\u0439 \u0448\u0442\u043e\u0440\u044b \u0432 \u0433\u043e\u0441\u0442\u0438\u043d\u043e\u0439 (\u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u00ab\u0443\u043c\u043d\u043e\u043c\u0443 \u0434\u043e\u043c\u0443\u00bb)<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u043a\u043b\u044e\u0447\u0438 \u0441\u0432\u0435\u0442 \u0432 \u043a\u043e\u0440\u0438\u0434\u043e\u0440\u0435, \u0432 \u043f\u0440\u0438\u0445\u043e\u0436\u0435\u0439 \u0438 \u0432 \u0432\u0430\u043d\u043d\u043e\u0439 (\u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u00ab\u0443\u043c\u043d\u043e\u043c\u0443 \u0434\u043e\u043c\u0443\u00bb)<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0441\u0442\u0430\u0432\u044c \u0434\u043e\u043c \u043d\u0430 \u043e\u0445\u0440\u0430\u043d\u0443 (\u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u00ab\u0443\u043c\u043d\u043e\u043c\u0443 \u0434\u043e\u043c\u0443\u00bb)<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u043d\u0430\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u0443\u044e \u043b\u0438\u0447\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0433 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b: \u043a\u0430\u043a\u0438\u0435 \u0435\u0441\u0442\u044c \u043a\u043e\u043c\u043d\u0430\u0442\u044b, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u0442\u0430\u043a\u0442 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430, \u0430\u0434\u0440\u0435\u0441 \u0434\u043e\u043c\u0430 \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0443\u0448\u0438, \u0438 \u0442.\u0434.<\/p>\n<p>\u0410\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2014 \u043f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u0441 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u043e\u043c \u0438 \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u043c\u0438, \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0439 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0435\u0442\u044c, \u0438\u043c\u0435\u044e\u0449\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0443, \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0449\u0438\u0439 \u0418\u0418, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0448\u0438 \u0443\u0441\u0442\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u0416\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0451 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u043d\u0430 \u043d\u0435\u0434\u043e\u0440\u043e\u0433\u043e\u043c \u041f\u041a, \u0431\u0435\u0437 \u043a\u0440\u0443\u0442\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b.<\/p>\n<h2>\u0421 \u0447\u0435\u0433\u043e \u043d\u0430\u0447\u0430\u0442\u044c?<\/h2>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u0433\u043e\u043b\u043e\u0441\u0430. \u0422.\u043a. \u044f \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c \u0441 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u0433\u043e\u043b\u043e\u0441\u0430 <a href=\"https:\/\/alphacephei.com\/vosk\/index.ru\" rel=\"noopener noreferrer nofollow\">https:\/\/alphacephei.com\/vosk\/index.ru<\/a>, \u043f\u0440\u043e\u0435\u043a\u0442: <a href=\"https:\/\/github.com\/alphacep\/vosk-api\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/alphacep\/vosk-api<\/a> \u2013 \u0442\u043e \u0435\u0433\u043e \u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u043f\u0430\u043a\u0435\u0442 Vosk \u0432 NuGet. \u0417\u0430\u0442\u0435\u043c \u0441\u043a\u0430\u0447\u0430\u0435\u043c \u0438 \u0440\u0430\u0437\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c vosk-model-small-ru-0.22 (\u0432\u0441\u0435\u0433\u043e 45\u041c\u0431) \u0438\u0437 <a href=\"https:\/\/alphacephei.com\/vosk\/models\" rel=\"noopener noreferrer nofollow\">https:\/\/alphacephei.com\/vosk\/models<\/a>.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u043e\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u043f\u0430\u043a\u0435\u0442 NAudio. \u0410 \u0434\u043b\u044f \u043e\u0437\u0432\u0443\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0414\u0436\u0430\u0440\u0432\u0438\u0441\u0430 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c TTS (Text-to-Speech). \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0431\u044b\u0442\u044c \u0440\u0443\u0441\u0441\u043a\u043e\u0433\u043e \u043c\u0443\u0436\u0441\u043a\u043e\u0433\u043e \u0433\u043e\u043b\u043e\u0441\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0441 \u0441\u0430\u0439\u0442\u0430 <a href=\"https:\/\/rhvoice.su\/voices\" rel=\"noopener noreferrer nofollow\">https:\/\/rhvoice.su\/voices<\/a>. \u0412 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043d\u0438\u043c\u0430\u0435\u043c \u0433\u0430\u043b\u043a\u0443 \u00ab\u041f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f 32-\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f\u00bb.<\/p>\n<details class=\"spoiler\">\n<summary>C\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">using NAudio.Wave; using Newtonsoft.Json; using System; using System.Linq; using System.Speech.Synthesis; using Vosk;  namespace ConsoleJarvis {     internal class Program     {         private class RecognizeWord         {             public double conf { get; set; }             public double end { get; set; }             public double start { get; set; }             public string word { get; set; }         }         private class RecognizeResult         {             public RecognizeWord[] result { get; set; }             public string text { get; set; }         }          static void Main(string[] args)         {             \/\/\u043c\u043e\u0434\u0435\u043b\u044c             Model model = new Model(\"vosk-model-small-ru-0.22\");              \/\/\u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \"\u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u0435\u043b\u044c\"             var recognizer = new VoskRecognizer(model, 16000.0f);             recognizer.SetMaxAlternatives(0);             recognizer.SetWords(true);              \/\/\u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0438 \u00ab\u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u00bb \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d             var waveIn = new WaveInEvent();             waveIn.DeviceNumber = 0; \/\/\u043f\u0435\u0440\u0432\u044b\u0439 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e             waveIn.WaveFormat = new WaveFormat(16000, 1); \/\/\u0434\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f             waveIn.DataAvailable += WaveIn_DataAvailable;             waveIn.StartRecording();              \/\/\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u0430             void WaveIn_DataAvailable(object sender, WaveInEventArgs e)             {                 \/\/\u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0435\u043c                 if (recognizer.AcceptWaveform(e.Buffer, e.BytesRecorded))                 {                     \/\/\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0432 json                     string txt = recognizer.FinalResult();                      \/\/\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c                     RecognizeResult values = JsonConvert.DeserializeObject&lt;RecognizeResult&gt;(txt);                      \/\/\u043f\u0430\u0440\u0441\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b                     parseCommands(values);                 }             }              Console.WriteLine();             Console.WriteLine(\"\u0421\u043a\u0430\u0436\u0438\u0442\u0435 \u043e\u0434\u043d\u0443 \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434:\");             Console.WriteLine(\"\u0414\u0436\u0430\u0440\u0432\u0438\u0441, \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043c\u0430\u043d\u0434!\");             Console.WriteLine(\"\u0414\u0436\u0430\u0440\u0432\u0438\u0441, \u0434\u0430\u0442\u0430\");             Console.WriteLine(\"\u0414\u0436\u0430\u0440\u0432\u0438\u0441, \u0432\u0440\u0435\u043c\u044f\");             Console.WriteLine(\"\u0414\u0436\u0430\u0440\u0432\u0438\u0441, \u0437\u0430\u043f\u0443\u0441\u0442\u0438 \u0431\u043b\u043e\u043a\u043d\u043e\u0442\");             Console.WriteLine(\"\u0414\u0436\u0430\u0440\u0432\u0438\u0441, \u0432\u044b\u0445\u043e\u0434\");             Console.WriteLine(\"\u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 'exit' \u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 Enter \u0447\u0442\u043e-\u0431\u044b \u0432\u044b\u0439\u0442\u0438\");             Console.WriteLine();             var input = Console.ReadLine();             while (input != \"exit\")             {             }         }          \/\/\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u0432\u0435\u0442         static void PlayTTS(string text)         {             var synthesizer = new SpeechSynthesizer();             synthesizer.SetOutputToDefaultAudioDevice(); \/\/\u0430\u0443\u0434\u0438\u043e-\u0432\u044b\u0445\u043e\u0434 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e             \/\/synthesizer.SelectVoice(voiceName); \/\/\u0432\u044b\u0431\u043e\u0440 \u0433\u043e\u043b\u043e\u0441\u0430              var builder = new PromptBuilder();             builder.StartVoice(synthesizer.Voice);             builder.AppendText(text);             builder.EndVoice();              \/\/\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0437\u0432\u0443\u043a             synthesizer.Speak(text);         }          static void parseCommands(RecognizeResult words)         {             if (words.text.Length == 0) return;              Console.WriteLine(\"\u0420\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u043e: \" + words.text + Environment.NewLine);              \/\/\u0435\u0441\u043b\u0438 \u0432 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0434\u0436\u0430\u0440\u0432\u0438\u0441 - \u0441\u043b\u0443\u0448\u0430\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443             if (words.result.First().word.Contains(\"\u0434\u0436\u0430\u0440\u0432\u0438\u0441\"))             {                 var text = words.result.Select(obj =&gt; obj.word).ToList();                  var print = string.Join(\" \", text);                 var command = string.Join(\" \", text.Skip(1)); \/\/Skip(1) - \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0435\u0440\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \"\u0434\u0436\u0430\u0440\u0432\u0438\u0441\"                  \/\/\u043b\u043e\u0433\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443                 Console.WriteLine(print);                  var executerComment = \"\";                  if (command.Trim().Length == 0)                 {                     Console.WriteLine(\"\u0414\u0436\u0430\u0440\u0432\u0438\u0441: \u0447\u0442\u043e?\");                     PlayTTS(\"\u0447\u0442\u043e?\");                 }                 else if (!Executer.Parse(command, ref executerComment)) \/\/\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b                 {                     Console.WriteLine(\"\u0414\u0436\u0430\u0440\u0432\u0438\u0441: \u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0435 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u0430\");                     PlayTTS(\"\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0435 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u0430\");                 }                 else                 {                     Console.WriteLine(\"\u0414\u0436\u0430\u0440\u0432\u0438\u0441: \"+executerComment);                     PlayTTS(executerComment);                 }                 Console.WriteLine(\"\");             }         }     } }<\/code><\/pre>\n<p> \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0444\u0430\u0439\u043b Executer.cs:<\/p>\n<pre><code class=\"cs\">using System; using System.Collections.Generic; using System.Globalization;  namespace ConsoleJarvis {     public static class Executer     {         public delegate void Func(string text, ref string comment);          private class Command         {             public string word { get; set; }             public Func action { get; set; }             public Command(string word, Func action)             {                 this.word = word;                 this.action = action;             }          }          private static readonly List&lt;Command&gt; commands = new List&lt;Command&gt;();          static Executer()         {             \/\/\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0441\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b              commands.Add(new Command(\"\u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043c\u0430\u043d\u0434\", (string text, ref string comment) =&gt;             {                 foreach (var c in commands) {                     comment = comment + Environment.NewLine + c.word + '.';                 }             }));              commands.Add(new Command(\"\u0434\u0430\u0442\u0430\", (string text, ref string comment) =&gt;             {                 comment = DateTime.Now.ToString(\"dddd dd MMMM yyyy\", CultureInfo.CurrentCulture);             }));              commands.Add(new Command(\"\u0432\u0440\u0435\u043c\u044f\", (string text, ref string comment) =&gt;             {                 comment = DateTime.Now.ToString(\"H mm\", CultureInfo.CurrentCulture);             }));              commands.Add(new Command(\"\u0437\u0430\u043f\u0443\u0441\u0442\u0438\", (string text, ref string comment) =&gt;             {                 foreach (var c in text.Split(' '))                 {                     switch (c)                     {                         case \"\u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440\":                             System.Diagnostics.Process.Start(@\"calc.exe\");                             return;                         case \"\u0431\u043b\u043e\u043a\u043d\u043e\u0442\":<\/code><\/pre>\n<\/div>\n<\/details>\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-465868","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/465868","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=465868"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/465868\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=465868"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=465868"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=465868"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}