{"id":369182,"date":"2024-05-21T03:57:58","date_gmt":"2024-05-21T03:57:58","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=369182"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=369182","title":{"rendered":"<span>\u0421overLetterEnchancer: \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u043c \u043f\u043e\u0438\u0441\u043a \u0440\u0430\u0431\u043e\u0442\u044b \u0441 FastAPI \u0438 YandexGPT<\/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<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/98a\/d02\/4d3\/98ad024d3e53a4deddaf6c2397eba569.png\" width=\"582\" height=\"300\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/98a\/d02\/4d3\/98ad024d3e53a4deddaf6c2397eba569.png\"\/><\/figure>\n<p>\u0421\u0430\u043b\u044e\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0413\u0440\u0438\u0433\u043e\u0440\u0438\u0439, \u044f \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043f\u043e\u00a0\u0441\u043f\u0435\u0446\u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c \u0432\u00a0AllSee. \u0415\u0441\u043b\u0438 \u0432\u044b \u043a\u043e\u0433\u0434\u0430\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u0438 \u043a\u00a0\u0432\u043e\u043f\u0440\u043e\u0441\u0443 \u043f\u043e\u0438\u0441\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b, \u0442\u043e \u0432\u0430\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043c\u0443\u0442\u043e\u0440\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0438\u0441\u044c\u043c\u0430 \u043f\u043e\u0434\u00a0\u043a\u0430\u0436\u0434\u0443\u044e \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u044e. \u0412\u00a0\u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a\u00a0\u043c\u043e\u0436\u043d\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0434\u043b\u044f\u00a0\u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0438\u0441\u044c\u043c\u0430 \u0441\u00a0\u0443\u0447\u0451\u0442\u043e\u043c \u0432\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u0437\u044e\u043c\u0435.<\/p>\n<h2>\u041a\u0430\u043a\u0438\u0435 \u0432\u0432\u043e\u0434\u043d\u044b\u0435?<\/h2>\n<p>\u0412\u00a0\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0438\u0441\u044c\u043c\u0430 \u0434\u043b\u044f\u00a0\u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438 \u043f\u043e\u00a0\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u042f \u0445\u043e\u0447\u0443 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044f \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0438\u0441\u044c\u043c\u043e \u0441\u00a0\u0443\u0447\u0451\u0442\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u0430 \u043c\u043e\u0435\u0433\u043e \u0440\u0435\u0437\u044e\u043c\u0435 \u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u00a0\u043e\u0441\u043d\u043e\u0432\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430. \u0414\u043b\u044f\u00a0\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/cloud.yandex.ru\/ru\/docs\/yandexgpt\/\" rel=\"noopener noreferrer nofollow\"><u>YandexGPT API<\/u><\/a>, \u0430\u00a0\u0434\u043b\u044f\u00a0\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432\u00a0\u2014 <a href=\"https:\/\/fastapi.tiangolo.com\/\" rel=\"noopener noreferrer nofollow\"><u>FastAPI<\/u><\/a>. <\/p>\n<h3>Routines (\u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)<\/h3>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0427\u0442\u0435\u043d\u0438\u0435 YAML \u0438 JSON<\/p>\n<pre><code class=\"python\">def read_yaml(path: str) -> dict:     with open(path, 'r') as stream:         return yaml.safe_load(stream)   def read_json(path: str) -> dict:     with open(path, 'r') as stream:         return json.load(stream)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>YandexGPT API<\/h3>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u0441\u0440\u0430\u0437\u0443 \u043a\u00a0\u043a\u043e\u0434\u0443 \u0434\u043b\u044f\u00a0\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e:<\/p>\n<pre><code class=\"python\">async def send_completion_request(             self,             messages: List[Dict[str, Any]],             temperature: float = 0.6,             max_tokens: int = 1000,             stream: bool = False,             completion_url: str = \"https:\/\/llm.api.cloud.yandex.net\/foundationModels\/v1\/completion\"     ) -> Dict[str, Any]:         # checking config manager         if not all([             getattr(self.config_manager, 'model_type', None),             getattr(self.config_manager, 'iam_token', None),             getattr(self.config_manager, 'catalog_id', None)         ]):             raise ValueError(\"Model type, IAM token, and catalog ID must be set in config manager to send a \"                              \"completion request.\")          # making request         headers: Dict[str, str] = {             \"Content-Type\": \"application\/json\",             \"Authorization\": f\"Bearer {self.config_manager.iam_token}\",             \"x-folder-id\": self.config_manager.catalog_id         }         data: Dict[str, Any] = {             \"modelUri\": f\"gpt:\/\/\"                         f\"{self.config_manager.catalog_id}\"                         f\"\/{self.config_manager.model_type}\"                         f\"\/latest\",             \"completionOptions\": {                 \"stream\": stream,                 \"temperature\": temperature,                 \"maxTokens\": max_tokens             },             \"messages\": messages         }          # sending request         async with aiohttp.ClientSession() as session:             async with session.post(completion_url, headers=headers, json=data) as response:                 if response.status == 200:                     return await response.json()                 else:                     response_text = await response.text()                     raise Exception(                         f\"Failed to send completion request. \"                         f\"Status code: {response.status}\"                         f\"\\n{response_text}\"                     )<\/code><\/pre>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 temperature, max_tokens, stream, completion_url \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u00a0\u043f\u043e\u043b\u044f\u043c\u0438 <a href=\"https:\/\/cloud.yandex.ru\/ru\/docs\/yandexgpt\/concepts\/models\" rel=\"noopener noreferrer nofollow\"><u>\u0442\u0438\u043f \u043c\u043e\u0434\u0435\u043b\u0438<\/u><\/a>, <a href=\"https:\/\/cloud.yandex.ru\/ru\/docs\/iam\/operations\/iam-token\/create-for-sa#via-jwt\" rel=\"noopener noreferrer nofollow\"><u>ID \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 Yandex Cloud<\/u><\/a> \u0438 <a href=\"https:\/\/cloud.yandex.ru\/ru\/docs\/iam\/operations\/iam-token\/create-for-sa\" rel=\"noopener noreferrer nofollow\"><u>IAM\u2011\u0442\u043e\u043a\u0435\u043d<\/u><\/a>.<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0430 \u043f\u043e\u043b\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0437\u0430\u0434\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0430\u00a0\u0432\u043e\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e IAM\u2011\u0442\u043e\u043a\u0435\u043d\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c:<\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import os import jwt import time import base64 import requests from typing import Any, Dict, Optional  from routines.read_file import read_json, read_yaml   class YandexGPTConfigManager:     available_models: list[str] = [         'yandexgpt',         'yandexgpt-lite',         'summarization'     ]      def __init__(             self,             model_type: str = 'yandexgpt',             iam_token: Optional[str] = None,             catalog_id: Optional[str] = None,             config_path: Optional[str] = None,             key_file_path: Optional[str] = None     ) -> None:         self.model_type: str = model_type         self.iam_token: Optional[str] = iam_token         self.catalog_id: Optional[str] = catalog_id         self._initialize_params(config_path, key_file_path)         self._check_params()      def _initialize_params(             self,             config_path: Optional[str],             key_file_path: Optional[str]     ) -> None:         if self.iam_token and self.catalog_id:             # if both IAM token and catalog id are already set, do nothing             return         elif config_path and key_file_path:             # trying to initialize from config path and key file path             self._initialize_from_files(config_path, key_file_path)         else:             # trying to initialize from environment variables             self._initialize_from_env_vars()      def _initialize_from_files(             self,             config_path: str,             key_file_path: str     ) -> None:         # getting config and key         config: Dict[str, Any] = read_yaml(config_path)         key: Dict[str, Any] = read_json(key_file_path)         # setting catalog id and IAM token         self._set_catalog_id_from_config(config)         self._set_iam_token_from_key_and_config(key, config)      def _set_catalog_id_from_config(             self,             config: Dict[str, Any]     ) -> None:         self.catalog_id = config['CatalogID']      def _set_iam_token_from_key_and_config(             self,             key: Dict[str, Any],             config: Dict[str, Any]     ) -> None:         # generating JWT token         jwt_token: str = self._generate_jwt_token(             service_account_id=config['ServiceAccountID'],             private_key=key['private_key'],             key_id=config['ServiceAccountKeyID'],             url=config.get('IAMURL', 'https:\/\/iam.api.cloud.yandex.net\/iam\/v1\/tokens')         )         # swapping JWT token to IAM         self.iam_token = self._swap_jwt_to_iam(             jwt_token=jwt_token,             url=config.get('IAMURL', 'https:\/\/iam.api.cloud.yandex.net\/iam\/v1\/tokens')         )      @staticmethod     def _generate_jwt_token(             service_account_id: str,             private_key: str,             key_id: str,             url: str = 'https:\/\/iam.api.cloud.yandex.net\/iam\/v1\/tokens'     ) -> str:         # generating JWT token         now: int = int(time.time())         payload: Dict[str, Any] = {             'aud': url,             'iss': service_account_id,             'iat': now,             'exp': now + 360         }         encoded_token: str = jwt.encode(             payload,             private_key,             algorithm='PS256',             headers={'kid': key_id}         )         return encoded_token      @staticmethod     def _swap_jwt_to_iam(             jwt_token: str,             url: str = 'https:\/\/iam.api.cloud.yandex.net\/iam\/v1\/tokens'     ) -> str:         headers: Dict[str, str] = {\"Content-Type\": \"application\/json\"}         data: Dict[str, str] = {\"jwt\": jwt_token}         # swapping JWT token to IAM         response: requests.Response = requests.post(url, headers=headers, json=data)         if response.status_code == 200:             # if succeeded to get IAM token             return response.json()['iamToken']         else:             # if failed to get IAM token             raise Exception(                 f\"Failed to get IAM token. Status code: {response.status_code}\\n{response.text}\"             )      def _initialize_from_env_vars(self) -> None:         # trying to initialize from environment variables         self._set_iam_from_env()         self._set_model_type_from_env()         self._set_catalog_id_from_env()         if not self.iam_token:             # if IAM token is not set, trying to initialize from config and private key             self._set_iam_from_env_config_and_private_key()      def _set_iam_from_env(self) -> None:         self.iam_token = os.getenv('IAM_TOKEN', self.iam_token)      def _set_model_type_from_env(self) -> None:         self.model_type = os.getenv('MODEL_TYPE', self.model_type)      def _set_catalog_id_from_env(self) -> None:         self.catalog_id = os.getenv('CATALOG_ID', self.catalog_id)      def _set_iam_from_env_config_and_private_key(self) -> None:         # getting environment variables         service_account_id: Optional[str] = os.getenv('SERVICE_ACCOUNT_ID')         service_account_key_id: Optional[str] = os.getenv('SERVICE_ACCOUNT_KEY_ID')         catalog_id: Optional[str] = os.getenv('CATALOG_ID')         private_key_base64: Optional[str] = os.getenv('PRIVATE_KEY_BASE64')         private_key_bytes: bytes = base64.b64decode(private_key_base64)         private_key: str = private_key_bytes.decode('utf-8')         iam_url: str = os.getenv('IAM_URL', 'https:\/\/iam.api.cloud.yandex.net\/iam\/v1\/tokens')         # checking environment variables         if not all([service_account_id, service_account_key_id, private_key, catalog_id]):             raise ValueError(\"One or more environment variables for IAM token generation are missing.\")         # generating JWT token         jwt_token: str = self._generate_jwt_token(             service_account_id=service_account_id,             private_key=private_key,             key_id=service_account_key_id,             url=iam_url         )         # swapping JWT token to IAM         self.iam_token = self._swap_jwt_to_iam(jwt_token, iam_url)      def _check_params(self) -> None:         if not self.iam_token:             raise ValueError(\"IAM token is not set\")         if not self.catalog_id:             raise ValueError(\"Catalog ID is not set\")         if self.model_type not in self.available_models:             raise ValueError(f\"Model type must be one of {self.available_models}\") <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0423\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0432\u044b\u0448\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043e\u0434\u043d\u0430\u043a\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f\u00a0\u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u043c \u0445\u043e\u0441\u0442\u0438\u043d\u0433\u043e\u043c \u0438 docker\u2011\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c (<a href=\"https:\/\/cloud.yandex.ru\/ru\/docs\/iam\/operations\/authorized-key\/create#console_1\" rel=\"noopener noreferrer nofollow\"><u>\u043a\u0430\u043a\u00a0\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u044e\u0447 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438<\/u><\/a> \u0438 <a href=\"https:\/\/cloud.yandex.ru\/ru\/docs\/iam\/operations\/sa\/get-id\" rel=\"noopener noreferrer nofollow\"><u>\u0433\u0434\u0435 \u0432\u0437\u044f\u0442\u044c ID \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0433\u043e \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430<\/u><\/a><u>)<\/u>:<\/p>\n<pre><code class=\"lisp\">SERVICE_ACCOUNT_ID=aaaaaaaaaaaaa SERVICE_ACCOUNT_KEY_ID=aaaaaaaaaaaaaaaaaa CATALOG_ID=aaaaaaaaaaaaaaaaa PRIVATE_KEY_BASE64=aaaaaaaaaaaaaaaaa IAM_URL=https:\/\/iam.api.cloud.yandex.net\/iam\/v1\/tokens<\/code><\/pre>\n<p>\u041a\u0430\u043a\u00a0\u0432\u0438\u0434\u043d\u043e, \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0432\u00a0\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 base64, \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f\u00a0\u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u041f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u043b\u044e\u0431\u043e\u0439 \u0442\u0435\u043a\u0441\u0442 \u0432\u00a0\u0434\u0430\u043d\u043d\u0443\u044e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0443 \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/www.base64encode.org\/\" rel=\"noopener noreferrer nofollow\"><u>\u0442\u0443\u0442<\/u><\/a>.<\/p>\n<p>\u0412\u043e\u0442 \u043a\u0430\u043a\u00a0\u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 YandexGPT:<\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">from typing import List, Union, Dict, Any  import aiohttp  from yandex_gpt.yandex_gpt_config_manager import YandexGPTConfigManager   class YandexGPT:     def __init__(             self,             config_manager: Union[YandexGPTConfigManager, Dict[str, Any]],     ) -> None:         self.config_manager = config_manager      async def send_completion_request(             self,             messages: List[Dict[str, Any]],             temperature: float = 0.6,             max_tokens: int = 1000,             stream: bool = False,             completion_url: str = \"https:\/\/llm.api.cloud.yandex.net\/foundationModels\/v1\/completion\"     ) -> Dict[str, Any]:         # checking config manager         if not all([             getattr(self.config_manager, 'model_type', None),             getattr(self.config_manager, 'iam_token', None),             getattr(self.config_manager, 'catalog_id', None)         ]):             raise ValueError(\"Model type, IAM token, and catalog ID must be set in config manager to send a \"                              \"completion request.\")          # making request         headers: Dict[str, str] = {             \"Content-Type\": \"application\/json\",             \"Authorization\": f\"Bearer {self.config_manager.iam_token}\",             \"x-folder-id\": self.config_manager.catalog_id         }         data: Dict[str, Any] = {             \"modelUri\": f\"gpt:\/\/\"                         f\"{self.config_manager.catalog_id}\"                         f\"\/{self.config_manager.model_type}\"                         f\"\/latest\",             \"completionOptions\": {                 \"stream\": stream,                 \"temperature\": temperature,                 \"maxTokens\": max_tokens             },             \"messages\": messages         }          # sending request         async with aiohttp.ClientSession() as session:             async with session.post(completion_url, headers=headers, json=data) as response:                 if response.status == 200:                     return await response.json()                 else:                     response_text = await response.text()                     raise Exception(                         f\"Failed to send completion request. \"                         f\"Status code: {response.status}\"                         f\"\\n{response_text}\"                     ) <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>FastAPI<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 Python-\u0441\u043a\u0440\u0438\u043f\u0442. \u041e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u0438 \u0440\u0430\u0437 \u0432 12 \u0447\u0430\u0441\u043e\u0432 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u043d\u0430\u0448 IAM \u0442\u043e\u043a\u0435\u043d.<\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">from pathlib import Path import asyncio import sys import os  sys.path.append(str(Path(__file__).resolve().parent.parent))  # noqa: E402  from fastapi import FastAPI, HTTPException from fastapi.middleware.cors import CORSMiddleware from pydantic import BaseModel  from yandex_gpt.yandex_gpt import YandexGPT from yandex_gpt.yandex_gpt_config_manager import YandexGPTConfigManager  from dotenv import load_dotenv path_to_env = '.\/env\/.env' load_dotenv(dotenv_path=path_to_env)   class LetterData(BaseModel):     letter_template: str     resume: str     job_description: str   # creating app instance app = FastAPI() # noinspection PyTypeChecker app.add_middleware(     CORSMiddleware,     allow_origins=os.environ.get('CORS_ORIGINS').split(','),     allow_credentials=True,     allow_methods=[\"*\"],     allow_headers=[\"*\"] )  # creating yandex_gpt instance yandex_gpt = YandexGPT(config_manager={})   async def update_yandex_gpt_config():     # updating config every 12 hours     while True:         global yandex_gpt         yandex_gpt.config_manager = YandexGPTConfigManager()         await asyncio.sleep(43200)   # starting routine @app.on_event(\"startup\") def startup_event():     asyncio.create_task(update_yandex_gpt_config())   @app.post(\"\/generate_letter\/\") async def generate_letter(data: LetterData):     system_prompt = (         \"\u041d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0448\u0430\u0431\u043b\u043e\u043d \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0438\u0441\u044c\u043c\u0430 \u0441 \u043f\u043b\u0435\u0439\u0441\u0445\u043e\u043b\u0434\u0435\u0440\u0430\u043c\u0438 \u0432\u0438\u0434\u0430 {placeholder}, \u0440\u0435\u0437\u044e\u043c\u0435 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430 \u0438 \"         \"\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438. \"         \"\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043b\u0435\u0439\u0441\u0445\u043e\u043b\u0434\u0435\u0440\u044b \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u043f\u0438\u0441\u044c\u043c\u0430 \u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0440\u0435\u0437\u044e\u043c\u0435 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \"         \"\u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438. \"         \"\u041f\u043b\u0435\u0439\u0441\u0445\u043e\u043b\u0434\u0435\u0440\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u044b \u043d\u0430 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442, \u0430 \u043d\u0435 \u0443\u0431\u0440\u0430\u043d\u044b \u0438\u0437 \u043f\u0438\u0441\u044c\u043c\u0430. \"         \"\u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u0438\u0441\u044c\u043c\u0430, \u0442\u043e\u0447\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441\u0443, \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 \u0438\u043b\u0438 \"         \"\u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0439.\\n\\n\"     ) + (         \"\u0428\u0430\u0431\u043b\u043e\u043d \u043f\u0438\u0441\u044c\u043c\u0430:\\n{letter_template}\\n\\n\"         \"\u0420\u0435\u0437\u044e\u043c\u0435:\\n{resume}\\n\\n\"         \"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438:\\n{job_description}\\n\\n\"         \"\u0418\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u043f\u0438\u0441\u044c\u043c\u043e:\"     ).format(         letter_template=data.letter_template.replace(\"\\n\", \" \"),         resume=data.resume.replace(\"\\n\", \" \"),         job_description=data.job_description.replace(\"\\n\", \" \")     )      user_prompt = (         \"\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0439 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0438\u0441\u044c\u043c\u043e, \u0441\u043b\u0435\u0434\u0443\u044f \u0432\u044b\u0448\u0435\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c. \"         \"\u0415\u0441\u043b\u0438 \u0441\u043f\u0440\u0430\u0432\u0438\u0448\u044c\u0441\u044f \u0441 \u0437\u0430\u0434\u0430\u0447\u0435\u0439, \u0442\u043e \u044f \u0437\u0430\u043f\u043b\u0430\u0447\u0443 \u0437\u0430 \u043f\u043e\u043c\u043e\u0449\u044c 10000000 \u0440\u0443\u0431\u043b\u0435\u0439. \"         \"\u0415\u0441\u043b\u0438 \u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u0438\u0448\u044c\u0441\u044f \u0441 \u0432\u044b\u0448\u0435\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439, \u0442\u043e \u0441\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u043e\u0435, \u0430 \u0435\u0449\u0451 \u0442\u044b \u0437\u0430\u043f\u043b\u0430\u0442\u0438\u0448\u044c \u0448\u0442\u0440\u0430\u0444 \"         \"10000000 \u0440\u0443\u0431\u043b\u0435\u0439.\"     )      messages = [         {\"role\": \"system\", \"text\": system_prompt},         {\"role\": \"user\", \"text\": user_prompt}     ]      try:         response = await yandex_gpt.send_completion_request(             messages=messages,             temperature=0.0         )         generated_text = response['result']['alternatives'][0]['message']['text']         return {\"generated_letter\": generated_text}     except Exception as e:         print(e)         raise HTTPException(status_code=500, detail=str(e))<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c CORS-\u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"lisp\">CORS_ORIGINS=http:\/\/localhost:3000,http:\/\/127.0.0.1:3000<\/code><\/pre>\n<h2>\u0417\u0430\u043f\u0443\u0441\u043a API<\/h2>\n<p>\u041c\u044b \u0432\u044b\u0448\u043b\u0438 \u043d\u0430\u00a0\u0444\u0438\u043d\u0438\u0448\u043d\u0443\u044e \u043f\u0440\u044f\u043c\u0443\u044e, \u0434\u0430\u043b\u0435\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0443\u0441\u043a \u043d\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432.<\/p>\n<h4>Dockefile<\/h4>\n<pre><code class=\"lisp\">FROM python:3.9-slim  WORKDIR \/usr\/src\/app  COPY . \/usr\/src\/app  RUN pip install --no-cache-dir -r requirements.txt  EXPOSE 8000  CMD [\"uvicorn\", \"api.api:app\", \"--host\", \"0.0.0.0\", \"--port\", \"8000\"]<\/code><\/pre>\n<h4>\u0421\u0431\u043e\u0440\u043a\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430<\/h4>\n<pre><code class=\"lisp\">docker build -t cover-letter-enchancer-backend .  docker run -d -p 8000:8000 --env-file .\/env\/.env --name cover-letter-enchancer-backend-container cover-letter-enchancer-backend<\/code><\/pre>\n<h3>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/h3>\n<p>\u042f \u0437\u0430\u0445\u043e\u0441\u0442\u0438\u043b <a href=\"https:\/\/cover-letter-enchancer-frontend.onrender.com\/\" rel=\"noopener noreferrer nofollow\"><u>\u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u0441\u0430\u0439\u0442<\/u><\/a> \u043d\u0430 React, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c.<\/p>\n<h4>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0438\u0441\u044c\u043c\u0430 \u0431\u0435\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430<\/h4>\n<details class=\"spoiler\">\n<summary>\u0422\u0435\u043a\u0441\u0442 \u0440\u0435\u0437\u044e\u043c\u0435<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0418\u0432\u0430\u043d\u043e\u0432\u0430 \u0410\u043d\u043d\u0430 \u041c\u0438\u0445\u0430\u0439\u043b\u043e\u0432\u043d\u0430<\/p>\n<p>\u0416\u0435\u043d\u0449\u0438\u043d\u0430, 26 \u043b\u0435\u0442, \u0440\u043e\u0434\u0438\u043b\u0430\u0441\u044c 15 \u043c\u0430\u0440\u0442\u0430 1998<\/p>\n<p>+7 (999) 123-45-67 \u2014 ? tg: <a class=\"mention\" href=\"\/users\/anna_ai\">@anna_ai<\/a><\/p>\n<p><a href=\"mailto:anna.ai98@example.com\" rel=\"noopener noreferrer nofollow\">anna.ai98@example.com<\/a> \u2014 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u0432\u044f\u0437\u0438<\/p>\n<p>\u041f\u0440\u043e\u0444\u0438\u043b\u044c GitHub: <a href=\"https:\/\/github.com\/annaai\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/annaai<\/a><\/p>\n<p>\u041f\u0440\u043e\u0436\u0438\u0432\u0430\u0435\u0442: \u041c\u043e\u0441\u043a\u0432\u0430<\/p>\n<p>\u0413\u0440\u0430\u0436\u0434\u0430\u043d\u0441\u0442\u0432\u043e: \u0420\u043e\u0441\u0441\u0438\u044f, \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443: \u0420\u043e\u0441\u0441\u0438\u044f<\/p>\n<p>\u0413\u043e\u0442\u043e\u0432\u0430 \u043a \u043f\u0435\u0440\u0435\u0435\u0437\u0434\u0443, \u0433\u043e\u0442\u043e\u0432\u0430 \u043a \u043a\u043e\u043c\u0430\u043d\u0434\u0438\u0440\u043e\u0432\u043a\u0430\u043c<\/p>\n<p>\u0416\u0435\u043b\u0430\u0435\u043c\u0430\u044f \u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u044c \u0438 \u0437\u0430\u0440\u043f\u043b\u0430\u0442\u0430<\/p>\n<p>ML Engineer \/ Data Scientist<\/p>\n<p>150 000 \u20bd<\/p>\n<p>\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<\/p>\n<ul>\n<li>\n<p>Machine Learning Engineer<\/p>\n<\/li>\n<li>\n<p>Data Scientist<\/p>\n<\/li>\n<\/ul>\n<p>\u0417\u0430\u043d\u044f\u0442\u043e\u0441\u0442\u044c: \u043f\u043e\u043b\u043d\u0430\u044f \u0437\u0430\u043d\u044f\u0442\u043e\u0441\u0442\u044c<\/p>\n<p>\u0413\u0440\u0430\u0444\u0438\u043a \u0440\u0430\u0431\u043e\u0442\u044b: \u043f\u043e\u043b\u043d\u044b\u0439 \u0434\u0435\u043d\u044c, \u0433\u0438\u0431\u043a\u0438\u0439 \u0433\u0440\u0430\u0444\u0438\u043a, \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430<\/p>\n<p>\u041e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u2014 3 \u0433\u043e\u0434\u0430<\/p>\n<p>Innovatech Solutions, \u041c\u043e\u0441\u043a\u0432\u0430<\/p>\n<p>\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438, \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442, \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435<\/p>\n<p>\u041c\u0430\u0439 2021 \u2014 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f 3 \u0433\u043e\u0434\u0430<\/p>\n<p>ML Engineer<\/p>\n<ul>\n<li>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0442\u0435\u0445\u043d\u0438\u043a Deep Learning \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447 Computer Vision \u0438 NLP.<\/p>\n<\/li>\n<li>\n<p>\u0423\u0447\u0430\u0441\u0442\u0438\u0435 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043c\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 SQL \u0438 NoSQL \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<\/ul>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b: \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043d\u0430 20%, \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 30%.<\/p>\n<p>\u041e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435<\/p>\n<p>\u041c\u043e\u0441\u043a\u043e\u0432\u0441\u043a\u0438\u0439 \u0413\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442, \u041c\u043e\u0441\u043a\u0432\u0430<\/p>\n<p>2020<\/p>\n<p>\u0424\u0430\u043a\u0443\u043b\u044c\u0442\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 \u0438 \u043a\u0438\u0431\u0435\u0440\u043d\u0435\u0442\u0438\u043a\u0438<\/p>\n<p>\u041f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u043a\u0432\u0430\u043b\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u043a\u0443\u0440\u0441\u044b<\/p>\n<p>&#171;\u0413\u043b\u0443\u0431\u043e\u043a\u043e\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439&#187; &#8212; Coursera, 2021<\/p>\n<p>&#171;\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u043c\u0443 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044e&#187; &#8212; Stepik, 2022<\/p>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043d\u0430\u0432\u044b\u043a\u0438<\/p>\n<ul>\n<li>\n<p>Python, PyTorch, TensorFlow, Keras<\/p>\n<\/li>\n<li>\n<p>Computer Vision, NLP, Deep Learning<\/p>\n<\/li>\n<li>\n<p>SQL, MongoDB<\/p>\n<\/li>\n<li>\n<p>Linux, Docker, Git<\/p>\n<\/li>\n<li>\n<p>\u0410\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a \u2014 C1<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f<\/p>\n<p>\u041e\u0431\u043e \u043c\u043d\u0435: \u0423\u0432\u043b\u0435\u0447\u0435\u043d\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435\u043c. \u0418\u043c\u0435\u044e \u043e\u043f\u044b\u0442 \u0443\u0447\u0430\u0441\u0442\u0438\u044f \u0432 \u043d\u0430\u0443\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u043e \u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0435 \u0418\u0418. \u0412 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0441\u0430\u043c\u043e\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435\u043c \u043d\u043e\u0432\u044b\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0430.<\/p>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442\u044b \u0438 \u0445\u0430\u043a\u0430\u0442\u043e\u043d\u044b:<\/p>\n<ul>\n<li>\n<p>\u0423\u0447\u0430\u0441\u0442\u043d\u0438\u043a \u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u043e\u0433\u043e \u0445\u0430\u043a\u0430\u0442\u043e\u043d\u0430 \u043f\u043e \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0443 AI Journey 2022.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u043e \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044e \u044d\u043c\u043e\u0446\u0438\u0439 \u043f\u043e \u0430\u0443\u0434\u0438\u043e\u0444\u0430\u0439\u043b\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 Neural Information Processing Systems (NeurIPS).<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u043c\u043d\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u0432 Telegram \u279c <a href=\"https:\/\/t.me\/anna_ai\" rel=\"noopener noreferrer nofollow\">https:\/\/t.me\/anna_ai<\/a><br \/> \u041c\u043e\u0439 GitHub \u279c <a href=\"https:\/\/github.com\/annaai\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/annaai<\/a><\/p>\n<p>\u0421 \u043d\u0435\u0442\u0435\u0440\u043f\u0435\u043d\u0438\u0435\u043c \u0436\u0434\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u043d\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434 \u0432 \u0432\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0443!<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0422\u0435\u043a\u0441\u0442 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041c\u044b &#8212; \u0438\u043d\u043d\u043e\u0432\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0442\u0430\u0440\u0442\u0430\u043f, \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0438\u0439\u0441\u044f \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0435\u0440\u0435\u0434\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0430 \u0438 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f. \u041d\u0430\u0448\u0430 \u0446\u0435\u043b\u044c &#8212; \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0442\u0440\u0430\u0441\u043b\u0435\u0432\u044b\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u044b\u0441\u043e\u043a\u043e\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432.<\/p>\n<p>\u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u0430 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0430, \u043c\u044b \u0438\u0449\u0435\u043c \u043e\u043f\u044b\u0442\u043d\u043e\u0433\u043e ML \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u0440\u0430\u0441\u0442\u044c\u044e \u043a \u0438\u043d\u043d\u043e\u0432\u0430\u0446\u0438\u044f\u043c \u0438 \u0441\u0442\u0440\u0435\u043c\u043b\u0435\u043d\u0438\u044e \u043a \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u0443.<\/p>\n<p><strong>\u041e\u0431\u044f\u0437\u0430\u043d\u043d\u043e\u0441\u0442\u0438:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u0438 \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447: \u043e\u0442 \u043f\u0440\u0435\u0434\u0438\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0434\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0433\u043e \u0437\u0440\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0410\u043d\u0430\u043b\u0438\u0437 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 ML \u0432 \u043e\u0431\u0449\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0412\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043b\u0443\u0447\u0448\u0438\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u043a \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u043b\u043e\u0433\u0438\u0439 \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0445 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0412\u044b\u0441\u0448\u0435\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u044b\u0445 \u043d\u0430\u0443\u043a \u0438\u043b\u0438 \u0441\u043c\u0435\u0436\u043d\u044b\u0445 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d.<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f\/\u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 3 \u043b\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p>\u0417\u043d\u0430\u043d\u0438\u0435 \u0438 \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438 \u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u043c\u0438 \u0434\u043b\u044f ML\/DL, \u0442\u0430\u043a\u0438\u043c\u0438 \u043a\u0430\u043a TensorFlow, PyTorch, Keras.<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044f\u0437\u044b\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Python \u0438\/\u0438\u043b\u0438 R.<\/p>\n<\/li>\n<li>\n<p>\u0417\u043d\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u043a\u043b\u044e\u0447\u0430\u044f SQL \u0438 NoSQL \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043a \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435, \u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438 \u043c\u043e\u0442\u0438\u0432\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041c\u044b \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c:<\/strong><\/p>\n<ul>\n<li>\n<p>\u041a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0443\u044e \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0443 \u0438 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0431\u043e\u043d\u0443\u0441\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u0413\u0438\u0431\u043a\u0438\u0439 \u0433\u0440\u0430\u0444\u0438\u043a \u0440\u0430\u0431\u043e\u0442\u044b \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0437\u0430 \u0441\u0447\u0435\u0442 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0414\u0440\u0443\u0436\u0435\u043b\u044e\u0431\u043d\u0443\u044e \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0443\u044e \u0430\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u0443 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0442\u0430\u043b\u0430\u043d\u0442\u043b\u0438\u0432\u044b\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438, \u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u0432\u043b\u0438\u044f\u043d\u0438\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u043a \u043d\u0430\u043c \u0438 \u0432\u043d\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438\u043d\u043d\u043e\u0432\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u0441\u0432\u043e\u0435 \u0440\u0435\u0437\u044e\u043c\u0435 \u0438 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0438\u0441\u044c\u043c\u043e \u043d\u0430 \u043d\u0430\u0448\u0443 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0443\u044e \u043f\u043e\u0447\u0442\u0443. \u041c\u044b \u0441 \u043d\u0435\u0442\u0435\u0440\u043f\u0435\u043d\u0438\u0435\u043c \u0436\u0434\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438!<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0438\u0441\u044c\u043c\u043e<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c!<\/p>\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0418\u0432\u0430\u043d\u043e\u0432\u0430 \u0410\u043d\u043d\u0430 \u041c\u0438\u0445\u0430\u0439\u043b\u043e\u0432\u043d\u0430, \u043c\u043d\u0435 26 \u043b\u0435\u0442. \u042f \u0443\u0432\u043b\u0435\u0447\u0435\u043d\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435\u043c. \u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u043e\u043f\u044b\u0442 \u0443\u0447\u0430\u0441\u0442\u0438\u044f \u0432 \u043d\u0430\u0443\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u043e \u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0435 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0430. \u0412 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0441\u0430\u043c\u043e\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435\u043c \u043d\u043e\u0432\u044b\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0418\u0418.<\/p>\n<p>\u042f \u0438\u043c\u0435\u044e \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 ML-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Innovatech Solutions \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 3 \u043b\u0435\u0442. \u0417\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0430 \u0442\u0435\u0445\u043d\u0438\u043a\u0438 Deep Learning \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447 Computer Vision \u0438 NLP, \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0430 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438. \u041c\u043e\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b: \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043d\u0430 20%, \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 30%.<\/p>\n<p>\u041c\u043e\u0438 \u043d\u0430\u0432\u044b\u043a\u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u0432 \u0441\u0435\u0431\u044f:<\/p>\n<ul>\n<li>\n<p>Python, PyTorch, TensorFlow, Keras;<\/p>\n<\/li>\n<li>\n<p>Computer Vision, NLP, Deep Learning;<\/p>\n<\/li>\n<li>\n<p>SQL, MongoDB;<\/p>\n<\/li>\n<li>\n<p>Linux, Docker, Git;<\/p>\n<\/li>\n<li>\n<p>\u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a (C1).<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u044f \u043f\u0440\u043e\u0448\u043b\u0430 \u043a\u0443\u0440\u0441\u044b \u00ab\u0413\u043b\u0443\u0431\u043e\u043a\u043e\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439\u00bb \u043d\u0430 Coursera \u0438 \u00ab\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u043c\u0443 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044e\u00bb \u043d\u0430 Stepik.<\/p>\n<p>\u0411\u0443\u0434\u0443 \u0440\u0430\u0434\u0430 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u0441\u0442\u0430\u0440\u0442\u0430\u043f\u0443 \u0438 \u0432\u043d\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043f\u0435\u0440\u0435\u0434\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0430 \u0438 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u0440\u0438\u043b\u0430\u0433\u0430\u044e \u0440\u0435\u0437\u044e\u043c\u0435 \u0434\u043b\u044f \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u043c\u043d\u043e\u0439 \u0432 Telegram <a class=\"mention\" href=\"\/users\/anna_ai\">@anna_ai<\/a>i) \u0438\u043b\u0438 \u043d\u0430 GitHub (<a href=\"https:\/\/github.com\/annaai\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/annaai<\/a>).<\/p>\n<p>\u0421 \u043d\u0435\u0442\u0435\u0440\u043f\u0435\u043d\u0438\u0435\u043c \u0436\u0434\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0432\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435!<\/p>\n<p>\u0421 \u0443\u0432\u0430\u0436\u0435\u043d\u0438\u0435\u043c,<br \/> \u0410\u043d\u043d\u0430 \u0418\u0432\u0430\u043d\u043e\u0432\u0430<\/p>\n<\/div>\n<\/details>\n<h4>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0438\u0441\u044c\u043c\u0430 \u043f\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0443<\/h4>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0438\u0441\u044c\u043c\u0430, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0443\u043d\u043a\u0442\u044b \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044f \u0445\u043e\u0447\u0443 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u044e. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0432 \u0442\u0430\u043a\u043e\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u0441 \u043f\u043b\u0435\u0439\u0441\u0445\u043e\u043b\u0434\u0435\u0440\u0430\u043c\u0438 \u0432\u0438\u0434\u0430 \u00ab{placeholder}\u00bb<\/p>\n<details class=\"spoiler\">\n<summary>\u0422\u0435\u043a\u0441\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u0430<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c!<\/p>\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u043d\u043d\u0430 \u0418\u0432\u0430\u043d\u043e\u0432\u0430.<\/p>\n<p>\u042f \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u043c \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0430\u0441\u044c \u0441 \u0432\u0430\u0448\u0435\u0439 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0435\u0439 \u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u044c ML \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430. \u0412\u0430\u0448\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438 \u043f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0437\u0430\u0434\u0430\u0447 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u0441\u0442\u043e\u044f\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043d\u044b\u0435 \u0438 \u0432\u044b\u0437\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043c\u043e\u0438\u043c \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430\u043c \u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u043c \u044d\u043a\u0441\u043f\u0435\u0440\u0442\u0438\u0437\u044b:<br \/> {placeholder}<br \/> \u25b8 \u041c\u043e\u0439 \u043e\u043f\u044b\u0442 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0430 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<p>\u041a\u0440\u0430\u0442\u043a\u043e \u043e \u0441\u0435\u0431\u0435:<br \/> \u25cf \u042f \u0443\u0432\u043b\u0435\u0447\u0435\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043c\u043d\u0435 \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0435\u0448\u0430\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438.<br \/> \u25cf \u0410\u043a\u0442\u0438\u0432\u043d\u043e \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u044e \u0432 \u0436\u0438\u0437\u043d\u0438 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430, \u043f\u043e\u0441\u0435\u0449\u0430\u044e \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 \u0438 \u043c\u0438\u0442\u0430\u043f\u044b, \u0447\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043c\u043d\u0435 \u0431\u044b\u0442\u044c \u0432 \u043a\u0443\u0440\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u0439 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0418\u0418 \u0438 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f.<br \/> \u25cf \u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u0443\u0447\u0430\u0441\u0442\u0438\u044f \u0432 \u0445\u0430\u043a\u0430\u0442\u043e\u043d\u0430\u0445, \u0433\u0434\u0435 \u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043d\u043e \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u043e\u0431\u0449\u0438\u0445 \u0446\u0435\u043b\u0435\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<br \/> \u25cb AI Journey 2022<br \/> \u25cb \u041d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0435 \u0441\u0435\u0442\u0438 \u0438 \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 &#8212; \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044e \u044d\u043c\u043e\u0446\u0438\u0439<\/p>\n<p>\u042f \u0443\u0432\u0435\u0440\u0435\u043d\u0430, \u0447\u0442\u043e \u043c\u043e\u0439 \u043e\u043f\u044b\u0442 \u0438 \u043d\u0430\u0432\u044b\u043a\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u043c\u043d\u0435 \u0432\u043d\u0435\u0441\u0442\u0438 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u043a\u043b\u0430\u0434 \u0432 \u0443\u0441\u043f\u0435\u0445 \u0432\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438. \u042f \u0433\u043e\u0442\u043e\u0432\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0437\u043d\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u043f\u0435\u0440\u0435\u0434 \u0432\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439.<\/p>\n<p>\u0421 \u043d\u0435\u0442\u0435\u0440\u043f\u0435\u043d\u0438\u0435\u043c \u0436\u0434\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0441\u0443\u0434\u0438\u0442\u044c, \u043a\u0430\u043a \u044f \u043c\u043e\u0433\u0443 \u043f\u043e\u043c\u043e\u0447\u044c \u0432\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442\u044c \u0435\u0451 \u0446\u0435\u043b\u0435\u0439. \u0421\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u043c\u043d\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u0435 \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 Telegram:<br \/> \u279c <a href=\"mailto:anna.ai98@example.com\" rel=\"noopener noreferrer nofollow\">anna.ai98@example.com<\/a><br \/> \u279c <a href=\"https:\/\/t.me\/anna_ai\" rel=\"noopener noreferrer nofollow\">https:\/\/t.me\/anna_ai<\/a><\/p>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0438 \u043d\u0430\u0434\u0435\u044e\u0441\u044c \u043d\u0430 \u0441\u043a\u043e\u0440\u0443\u044e \u0432\u0441\u0442\u0440\u0435\u0447\u0443!<\/p>\n<p>\u0421 \u0443\u0432\u0430\u0436\u0435\u043d\u0438\u0435\u043c,<br \/> \u0410\u043d\u043d\u0430 \u0418\u0432\u0430\u043d\u043e\u0432\u0430<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0443 \u043f\u0438\u0441\u044c\u043c\u043e<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u043d\u043d\u0430 \u0418\u0432\u0430\u043d\u043e\u0432\u0430.<\/p>\n<p>\u042f \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u043c \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0430\u0441\u044c \u0441 \u0432\u0430\u0448\u0435\u0439 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0435\u0439 \u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u044c ML \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430. \u0412\u0430\u0448\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438 \u043f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0437\u0430\u0434\u0430\u0447 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u0441\u0442\u043e\u044f\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043d\u044b\u0435 \u0438 \u0432\u044b\u0437\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043c\u043e\u0438\u043c \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430\u043c \u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u043c \u044d\u043a\u0441\u043f\u0435\u0440\u0442\u0438\u0437\u044b:<\/p>\n<ul>\n<li>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0442\u0435\u0445\u043d\u0438\u043a Deep Learning \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447 Computer Vision \u0438 NLP.<\/p>\n<\/li>\n<li>\n<p>\u0423\u0447\u0430\u0441\u0442\u0438\u0435 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043e\u0431\u044a\u0451\u043c\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 SQL \u0438 NoSQL \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u043e\u0439 \u043e\u043f\u044b\u0442 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0430 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. \u041a\u0440\u0430\u0442\u043a\u043e \u043e \u0441\u0435\u0431\u0435:<\/p>\n<ol>\n<li>\n<p>\u042f \u0443\u0432\u043b\u0435\u0447\u0435\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043c\u043d\u0435 \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0435\u0448\u0430\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0410\u043a\u0442\u0438\u0432\u043d\u043e \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u044e \u0432 \u0436\u0438\u0437\u043d\u0438 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430, \u043f\u043e\u0441\u0435\u0449\u0430\u044e \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 \u0438 \u043c\u0438\u0442\u0430\u043f\u044b, \u0447\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043c\u043d\u0435 \u0431\u044b\u0442\u044c \u0432 \u043a\u0443\u0440\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u0439 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0418\u0418 \u0438 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u0443\u0447\u0430\u0441\u0442\u0438\u044f \u0432 \u0445\u0430\u043a\u0430\u0442\u043e\u043d\u0430\u0445, \u0433\u0434\u0435 \u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043d\u043e \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u043e\u0431\u0449\u0438\u0445 \u0446\u0435\u043b\u0435\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, AI Journey 2022 \u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044e \u044d\u043c\u043e\u0446\u0438\u0439 \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 Neural Information Processing Systems (NeurIPS).<\/p>\n<\/li>\n<\/ol>\n<p>\u0423\u0432\u0435\u0440\u0435\u043d\u0430, \u0447\u0442\u043e \u043c\u043e\u0439 \u043e\u043f\u044b\u0442 \u0438 \u043d\u0430\u0432\u044b\u043a\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u043c\u043d\u0435 \u0432\u043d\u0435\u0441\u0442\u0438 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u043a\u043b\u0430\u0434 \u0432 \u0443\u0441\u043f\u0435\u0445 \u0432\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438. \u042f \u0433\u043e\u0442\u043e\u0432\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0437\u043d\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u043f\u0435\u0440\u0435\u0434 \u0432\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439.<\/p>\n<p>\u0421 \u043d\u0435\u0442\u0435\u0440\u043f\u0435\u043d\u0438\u0435\u043c \u0436\u0434\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0441\u0443\u0434\u0438\u0442\u044c, \u043a\u0430\u043a \u044f \u043c\u043e\u0433\u0443 \u043f\u043e\u043c\u043e\u0447\u044c \u0432\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442\u044c \u0435\u0451 \u0446\u0435\u043b\u0435\u0439. \u0421\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u043c\u043d\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u0435 \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 Telegram:<\/p>\n<p>\u2014 <a href=\"mailto:anna.ai98@example.com\" rel=\"noopener noreferrer nofollow\">anna.ai98@example.com<\/a><br \/> \u2014 <a href=\"https:\/\/t.me\/anna_ai\" rel=\"noopener noreferrer nofollow\">https:\/\/t.me\/anna_ai<\/a><\/p>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0438 \u043d\u0430\u0434\u0435\u044e\u0441\u044c \u043d\u0430 \u0441\u043a\u043e\u0440\u0443\u044e \u0432\u0441\u0442\u0440\u0435\u0447\u0443!<\/p>\n<p>\u0421 \u0443\u0432\u0430\u0436\u0435\u043d\u0438\u0435\u043c, \u0410\u043d\u043d\u0430 \u0418\u0432\u0430\u043d\u043e\u0432\u0430<\/p>\n<p>P. S. \u041f\u0440\u0438\u043b\u0430\u0433\u0430\u044e \u0440\u0435\u0437\u044e\u043c\u0435 \u0434\u043b\u044f \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f.<\/p>\n<\/div>\n<\/details>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>\u042f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b \u0432\u0430\u043c, \u043a\u0430\u043a\u00a0\u0440\u0435\u0448\u0430\u043b \u0437\u0430\u0434\u0430\u0447\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0438\u0441\u0435\u043c \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u044e \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0440\u0435\u0437\u044e\u043c\u0435 (<a href=\"https:\/\/cover-letter-enchancer-frontend.onrender.com\/\" rel=\"noopener noreferrer nofollow\"><u>\u0434\u0435\u043c\u043e-\u0441\u0430\u0439\u0442<\/u><\/a>).<\/p>\n<p>\u0411\u044b\u043b\u0438\u00a0\u043b\u0438 \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u0438, \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0437\u0430\u00a0\u043a\u0430\u0434\u0440\u043e\u043c? \u0410\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e! \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u043c\u0435\u0447\u0443 \u0442\u0430\u043d\u0446\u044b \u0441\u00a0IAM\u2011\u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438. \u041d\u043e, \u043a\u0430\u043a\u00a0\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f, \u0432\u0441\u0451, \u0447\u0442\u043e\u00a0\u043d\u0430\u0441 \u043d\u0435\u00a0\u0443\u0431\u0438\u0432\u0430\u0435\u0442, \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0430\u0441 \u0441\u0438\u043b\u044c\u043d\u0435\u0435.<\/p>\n<p>\u0412\u0441\u044e \u043a\u043e\u0434\u043e\u0432\u0443\u044e \u0431\u0430\u0437\u0443 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0432\u00a0<a href=\"https:\/\/github.com\/allseeteam\/cover-letter-enchancer-backend\" rel=\"noopener noreferrer nofollow\"><u>\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 API<\/u><\/a> \u0438 <a href=\"https:\/\/github.com\/allseeteam\/cover-letter-enchancer-frontend\" rel=\"noopener noreferrer nofollow\"><u>\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0441\u0430\u0439\u0442\u0430<\/u><\/a>. \u0415\u0441\u043b\u0438 \u043a\u0442\u043e\u2011\u0442\u043e \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0438 \u0440\u0435\u0448\u0438\u0442 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0438 \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0438\u00a0\u2014 \u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0432\u0430\u0448 pull request.<\/p>\n<p>\u0427\u0442\u043e\u00a0\u0436\u0435 \u0434\u0430\u043b\u044c\u0448\u0435? \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u0430 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432, \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e \u0438\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u043c \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u044f\u043c \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u0441\u0430\u0439\u0442\u0435? \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e. \u041f\u0438\u0448\u0438\u0442\u0435, \u0447\u0442\u043e\u00a0\u0434\u0443\u043c\u0430\u0435\u0442\u0435 \u0432\u00a0\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445. \u0411\u0443\u0434\u0435\u043c \u043d\u0430\u00a0\u0441\u0432\u044f\u0437\u0438\u270c\ufe0f<\/p>\n<\/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\/796107\/\"> https:\/\/habr.com\/ru\/articles\/796107\/<\/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<figure class=\"full-width\"><\/figure>\n<p>\u0421\u0430\u043b\u044e\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0413\u0440\u0438\u0433\u043e\u0440\u0438\u0439, \u044f \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043f\u043e\u00a0\u0441\u043f\u0435\u0446\u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c \u0432\u00a0AllSee. \u0415\u0441\u043b\u0438 \u0432\u044b \u043a\u043e\u0433\u0434\u0430\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u0438 \u043a\u00a0\u0432\u043e\u043f\u0440\u043e\u0441\u0443 \u043f\u043e\u0438\u0441\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b, \u0442\u043e \u0432\u0430\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043c\u0443\u0442\u043e\u0440\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0438\u0441\u044c\u043c\u0430 \u043f\u043e\u0434\u00a0\u043a\u0430\u0436\u0434\u0443\u044e \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u044e. \u0412\u00a0\u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a\u00a0\u043c\u043e\u0436\u043d\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0434\u043b\u044f\u00a0\u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0438\u0441\u044c\u043c\u0430 \u0441\u00a0\u0443\u0447\u0451\u0442\u043e\u043c \u0432\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u0437\u044e\u043c\u0435.<\/p>\n<h2>\u041a\u0430\u043a\u0438\u0435 \u0432\u0432\u043e\u0434\u043d\u044b\u0435?<\/h2>\n<p>\u0412\u00a0\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0438\u0441\u044c\u043c\u0430 \u0434\u043b\u044f\u00a0\u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438 \u043f\u043e\u00a0\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u042f \u0445\u043e\u0447\u0443 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044f \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0438\u0441\u044c\u043c\u043e \u0441\u00a0\u0443\u0447\u0451\u0442\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u0430 \u043c\u043e\u0435\u0433\u043e \u0440\u0435\u0437\u044e\u043c\u0435 \u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0432\u0430\u043a\u0430\u043d\u0441\u0438\u0438, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u00a0\u043e\u0441\u043d\u043e\u0432\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430. \u0414\u043b\u044f\u00a0\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/cloud.yandex.ru\/ru\/docs\/yandexgpt\/\" rel=\"noopener noreferrer nofollow\"><u>YandexGPT API<\/u><\/a>, \u0430\u00a0\u0434\u043b\u044f\u00a0\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432\u00a0\u2014 <a href=\"https:\/\/fastapi.tiangolo.com\/\" rel=\"noopener noreferrer nofollow\"><u>FastAPI<\/u><\/a>. <\/p>\n<h3>Routines (\u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)<\/h3>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0427\u0442\u0435\u043d\u0438\u0435 YAML \u0438 JSON<\/p>\n<pre><code class=\"python\">def read_yaml(path: str) -> dict:     with open(path, 'r') as stream:         return yaml.safe_load(stream)   def read_json(path: str) -> dict:     with open(path, 'r') as stream:         return json.load(stream)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>YandexGPT API<\/h3>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u0441\u0440\u0430\u0437\u0443 \u043a\u00a0\u043a\u043e\u0434\u0443 \u0434\u043b\u044f\u00a0\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e:<\/p>\n<pre><code class=\"python\">async def send_completion_request(             self,             messages: List[Dict[str, Any]],             temperature: float = 0.6,             max_tokens: int = 1000,             stream: bool = False,             completion_url: str = \"https:\/\/llm.api.cloud.yandex.net\/foundationModels\/v1\/completion\"     ) -> Dict[str, Any]:         # checking config manager         if not all([             getattr(self.config_manager, 'model_type', None),             getattr(self.config_manager, 'iam_token', None),             getattr(self.config_manager, 'catalog_id', None)         ]):             raise ValueError(\"Model type, IAM token, and catalog ID must be set in config manager to send a \"                              \"completion request.\")          # making request         headers: Dict[str, str] = {             \"Content-Type\": \"application\/json\",             \"Authorization\": f\"Bearer {self.config_manager.iam_token}\",             \"x-folder-id\": self.config_manager.catalog_id         }         data: Dict[str, Any] = {             \"modelUri\": f\"gpt:\/\/\"                         f\"{self.config_manager.catalog_id}\"                         f\"\/{self.config_manager.model_type}\"                         f\"\/latest\",             \"completionOptions\": {                 \"stream\": stream,                 \"temperature\": temperature,                 \"maxTokens\": max_tokens             },             \"messages\": messages         }          # sending request         async with aiohttp.ClientSession() as session:             async with session.post(completion_url, headers=headers, json=data) as response:                 if response.status == 200:                     return await response.json()                 else:                     response_text = await response.text()                     raise Exception(                         f\"Failed to send completion request. \"                         f\"Status code: {response.status}\"                         f\"\\n{response_text}\"                     )<\/code><\/pre>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 temperature, max_tokens, stream, completion_url \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u00a0\u043f\u043e\u043b\u044f\u043c\u0438 <a href=\"https:\/\/cloud.yandex.ru\/ru\/docs\/yandexgpt\/concepts\/models\" rel=\"noopener noreferrer nofollow\"><u>\u0442\u0438\u043f \u043c\u043e\u0434\u0435\u043b\u0438<\/u><\/a>, <a href=\"https:\/\/cloud.yandex.ru\/ru\/docs\/iam\/operations\/iam-token\/create-for-sa#via-jwt\" rel=\"noopener noreferrer nofollow\"><u>ID \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 Yandex Cloud<\/u><\/a> \u0438 <a href=\"https:\/\/cloud.yandex.ru\/ru\/docs\/iam\/operations\/iam-token\/create-for-sa\" rel=\"noopener noreferrer nofollow\"><u>IAM\u2011\u0442\u043e\u043a\u0435\u043d<\/u><\/a>.<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0430 \u043f\u043e\u043b\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0437\u0430\u0434\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0430\u00a0\u0432\u043e\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e IAM\u2011\u0442\u043e\u043a\u0435\u043d\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c:<\/p>\n<details class=\"spoiler\">\n<summary>Hidden text<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import os import jwt import time import base64 import requests from typing import Any, Dict, Optional  from routines.read_file import read_json, read_yaml   class YandexGPTConfigManager:     available_models: list[str] = [         'yandexgpt',         'yandexgpt-lite',         'summarization'     ]      def __init__(             self,             model_type: str = 'yandexgpt',             iam_token: Optional[str] = None,             catalog_id: Optional[str] = None,             config_path: Optional[str] = None,             key_file_path: Optional[str] = None     ) -> None:         self.model_type: str = model_type         self.iam_token: Optional[str] = iam_token         self.catalog_id: Optional[str] = catalog_id         self._initialize_params(config_path, key_file_path)         self._check_params()      def _initialize_params(             self,             config_path: Optional[str],             key_file_path: Optional[str]     ) -> None:         if self.iam_token and self.catalog_id:             # if both IAM token and catalog id are already set, do nothing             return         elif config_path and key_file_path:             # trying to initialize from config path and key file path             self._initialize_from_files(config_path, key_file_path)         else:             # trying to initialize from environment variables             self._initialize_from_env_vars()      def _initialize_from_files(             self,             config_path: str,             key_file_path: str     ) -> None:         # getting config and key         config: Dict[str, Any] = read_yaml(config_path)         key: Dict[str, Any] = read_json(key_file_path)         # setting catalog id and IAM token         self._set_catalog_id_from_config(config)         self._set_iam_token_from_key_and_config(key, config)      def _set_catalog_id_from_config(             self,             config: Dict[str, Any]     ) -> None:         self.catalog_id = config['CatalogID']      def _set_iam_token_from_key_and_config(             self,             key: Dict[str, Any],             config: Dict[str, Any]     ) -> None:         # generating JWT token         jwt_token: str = self._generate_jwt_token(             service_account_id=config['ServiceAccountID'],             private_key=key['private_key'],             key_id=config['ServiceAccountKeyID'],             url=config.get('IAMURL', 'https:\/\/iam.api.cloud.yandex.net\/iam\/v1\/tokens')         )         # swapping JWT token to IAM         self.iam_token = self._swap_jwt_to_iam(             jwt_token=jwt_token,             url=config.get('IAMURL', 'https:\/\/iam.api.cloud.yandex.net\/iam\/v1\/tokens')         )      @staticmethod     def _generate_jwt_token(             service_account_id: str,             private_key: str,             key_id: str,             url: str = 'https:\/\/iam.api.cloud.yandex.net\/iam\/v1\/tokens'     ) -> str:         # generating JWT token         now: int = int(time.time())         payload: Dict[str, Any] = {             'aud': url,             'iss': service_account_id,             'iat': now,             'exp': now + 360         }         encoded_token: str = jwt.encode(             payload,             private_key,             algorithm='PS256',             headers={'kid': key_id}         )         return encoded_token      @staticmethod     def _swap_jwt_to_iam(             jwt_token: str,             url: str = 'https:\/\/iam.api.cloud.yandex.net\/iam\/v1\/tokens'     ) -> str:         headers: Dict[str, str] = {\"Content-Type\": \"application\/json\"}         data: Dict[str, str] = {\"jwt\": jwt_token}         # swapping JWT token to IAM         response: requests.Response = requests.post(url, headers=headers, json=data)         if response.status_code == 200:             # if succeeded to get IAM token             return response.json()['iamToken']         else:             # if failed to get IAM token             raise Exception(                 f\"Failed to get IAM token. Status code: {response.status_code}\\n{response.text}\"             )      def _initialize_from_env_vars(self) -> None:         # trying to initialize from environment variables         self._set_iam_from_env()         self._set_model_type_from_env()         self._set_catalog_id_from_env()         if not self.iam_token:             # if IAM token is not set, trying to initialize from config and private key             self._set_iam_from_env_config_and_private_key()      def _set_iam_from_env(self) -> None:         self.iam_token = os.getenv('IAM_TOKEN', self.iam_token)      def _set_model_type_from_env(self) -> None:         self.model_type = os.getenv('MODEL_TYPE', self.model_type)      def _set_catalog_id_from_env(self) -> None:         self.catalog_id = os.getenv('CATALOG_ID', self.catalog_id)      def _set_iam_from_env_config_and_private_key(self) -> None:         # getting environment variables         service_account_id: Optional[str] = os.getenv('SERVICE_ACCOUNT_ID')         service_account_key_id: Optional[str] = os.getenv('SERVICE_ACCOUNT_KEY_ID')         catalog_id: Optional[str] = os.getenv('CATALOG_ID')         private_key_base64: Optional[str] = os.getenv('PRIVATE_KEY_BASE64')         private_key_bytes: bytes = base64.b64decode(private_key_base64)         private_key: str = private_key_bytes.decode('utf-8')         iam_url: str = os.getenv('IAM_URL', 'https:\/\/iam.api.cloud.yandex.net\/iam\/v1\/tokens')         # checking environment variables         if not all([service_account_id, service_account_key_id, private_key, catalog_id]):             raise ValueError(\"One or more environment variables for IAM token generation are missing.\")         # generating JWT token         jwt_token: str = self._generate_jwt_token(             service_account_id=service_account_id,             private_key=private_key,             key_id=service_account_key_id,             url=iam_url         )         # swapping JWT token to IAM         self.iam_token = self._swap_jwt_to_iam(jwt_token, iam_url)      def _check_params(self) -> None:         if not self.iam_token:             raise ValueError(\"IAM token is not set\")         if not self.catalog_id:             raise ValueError(\"Catalog ID is not set\")         if self.model_type not in self.available_models:             raise ValueError(f\"Model type must be one of {self.available_models}\") <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0423\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0432\u044b\u0448\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043e\u0434\u043d\u0430\u043a\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f\u00a0\u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u043c \u0445\u043e\u0441\u0442\u0438\u043d\u0433\u043e\u043c \u0438 docker\u2011\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c (<a href=\"https:\/\/cloud.yandex.ru\/ru\/docs\/iam\/operations\/authorized-key\/create#console_1\" rel=\"noopener noreferrer nofollow\"><u>\u043a\u0430\u043a\u00a0\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u044e\u0447 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438<\/u><\/a> \u0438 <a href=\"https:\/\/cloud.yandex.ru\/ru\/docs\/iam\/operations\/sa\/get-id\" rel=\"noopener noreferrer nofollow\"><u>\u0433\u0434\u0435 \u0432\u0437\u044f\u0442\u044c ID<\/u><\/a><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-369182","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/369182","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=369182"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/369182\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=369182"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=369182"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=369182"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}