<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>PythonTalk</title><generator>teletype.in</generator><description><![CDATA[Привет, меня зовут Олег Булыгин 👋

🐍 Здесь я делюсь полезной информацией для тех, кто пишет код на Python: от разработки до Data Science. ]]></description><image><url>https://img2.teletype.in/files/91/e3/91e385d9-f4e7-4e83-87f0-a916155eaf55.png</url><title>PythonTalk</title><link>https://pythontalk.olegtalks.ru/</link></image><link>https://pythontalk.olegtalks.ru/?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=pythontalk</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/pythontalk?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/pythontalk?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Sat, 25 Apr 2026 14:50:25 GMT</pubDate><lastBuildDate>Sat, 25 Apr 2026 14:50:25 GMT</lastBuildDate><item><guid isPermaLink="true">https://pythontalk.olegtalks.ru/deepby-data-analysis-platform</guid><link>https://pythontalk.olegtalks.ru/deepby-data-analysis-platform?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=pythontalk</link><comments>https://pythontalk.olegtalks.ru/deepby-data-analysis-platform?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=pythontalk#comments</comments><dc:creator>pythontalk</dc:creator><title>Нейронка, которая сама копается в данных? 📊</title><pubDate>Sun, 06 Jul 2025 04:06:38 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/58/5d/585db3e6-aa11-414f-995f-e01eee9b465e.png"></media:content><category>Опенсорс</category><description><![CDATA[<img src="https://img1.teletype.in/files/cf/09/cf097b87-c06b-4765-8016-4f3e0a914c2e.png"></img>DeepBI — это open-source платформа для анализа данных, построенная на LLM. Идея простая: вместо того чтобы писать SQL-запросы или код на Python, вы просто задаете вопросы на естественном языке.]]></description><content:encoded><![CDATA[
  <p id="uQGD"><a href="https://github.com/DeepInsight-AI/DeepBI" target="_blank">DeepBI</a> — это open-source платформа для анализа данных, построенная на LLM. Идея простая: вместо того чтобы писать SQL-запросы или код на Python, вы просто задаете вопросы на естественном языке.</p>
  <blockquote id="ofbp">DeepBI is an AI-native data analysis platform. DeepBI leverages the power of large language models to explore, query, visualize, and share data from any data source.</blockquote>
  <p id="VIw4"></p>
  <figure id="yaE1" class="m_original">
    <img src="https://img1.teletype.in/files/cf/09/cf097b87-c06b-4765-8016-4f3e0a914c2e.png" width="1267" />
  </figure>
  <h2 id="fRM2">Что обещают?</h2>
  <p id="l9dR">Давайте посмотрим на список фич, которые заявлены в репозитории.</p>
  <ul id="bIA6">
    <li id="gR0s"><strong>Анализ данных в формате диалога.</strong> Самая мякотка. Вы просто пишете на человеческом языке: «покажи мне топ-5 самых продаваемых товаров в прошлом месяце» и (в теории) получаете готовый результат.</li>
    <li id="f3ff"><strong>Генерация запросов и визуализаций.</strong> Платформа не просто показывает результат, но и может сгенерировать персистентный запрос или график, который потом можно добавить в дашборд.</li>
    <li id="5gkp"><strong>Дашборды.</strong> Куда же без них. Собранные визуализации можно компоновать в привычные дашборды.</li>
    <li id="xiTO"><strong>Автоматические отчёты.</strong> А вот это уже интересно. Заявляется фича (пока в разработке 🌚) по автоматической генерации полноценных отчётов по текстовому заданию.</li>
    <li id="4WGI"><strong>Поддержка разных источников данных.</strong> Список вполне приличный: MySQL, PostgreSQL, Doris, StarRocks, MongoDB и CSV/Excel.</li>
    <li id="t4eS"><strong>Мультиплатформенность.</strong> Запустить можно где угодно: Windows (даже есть .exe), Linux, Mac.</li>
  </ul>
  <p id="yfvi"></p>
  <h2 id="oQzw">Как это пощупать своими руками?</h2>
  <p id="ToIr">Раз проект open-source, то грех не попробовать его развернуть локально. Вариантов несколько, на любой вкус и цвет.</p>
  <h3 id="LPc4">📦 Установка на Windows</h3>
  <p id="ofIi">Для тех, кто боится консоли, есть exe-шник. Скачиваете архив, распаковываете, запускаете. Проще не придумаешь.</p>
  <h3 id="x1sW">🐳 Развертывание через Docker</h3>
  <p id="F8id">Всё сводится к паре команд:</p>
  <pre id="YIPc" data-lang="bash"># Клонируем репозиторий
git clone https://github.com/DeepInsight-AI/DeepBI.git
cd DeepBI

# Запускаем скрипт установки
./Install.sh</pre>
  <p id="gojI">После этого сервис будет доступен по адресу http://ip:8338.</p>
  <h3 id="Cl1D">🐧 Установка на Ubuntu</h3>
  <p id="Llhp">Потребуется предварительно поставить redis, postgresql и python 3.8.x. Все шаги подробно описаны в README, но в целом сводятся к запуску ubuntu_install.sh.</p>
  <p id="5Ozs"></p>
  <figure id="fDX2" class="m_custom">
    <iframe srcdoc="<!DOCTYPE html>
<html lang=&quot;ru&quot;>
<head>
    <meta charset=&quot;UTF-8&quot;>
    <meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;>
    <title>Интерактивная плашка</title>
    <script src=&quot;https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js&quot;></script>
    <style>
        @import url(&#x27;https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap&#x27;);

        :root {
            --bg-color: #0d1117;
            --bg-gradient-start: #1c2128;
            --card-bg-color: rgba(22, 27, 34, 0.75);
            --border-color: rgba(48, 54, 61, 0.8);
            --text-color: #e6edf3;
            --text-secondary-color: #7d8590;
            
            --color-telegram: #2AABEE;
            --color-donate: #DB61A2;
            --color-dzen: #FF8C00;
        }

        @keyframes fadeInSlideUp {
            from { opacity: 0; transform: translateY(10px); }
            to { opacity: 1; transform: translateY(0); }
        }
        
        @keyframes popIn {
            from { transform: scale(0.7); opacity: 0; }
            to { transform: scale(1); opacity: 1; }
        }

        body {
            margin: 0;
            padding: 16px;
            box-sizing: border-box;
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background-color: var(--bg-color);
            background-image: 
                radial-gradient(circle at center, var(--bg-gradient-start) 0%, var(--bg-color) 80%),
                url(&quot;data:image/svg+xml,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; width=&#x27;20&#x27; height=&#x27;20&#x27;%3E%3Crect width=&#x27;20&#x27; height=&#x27;20&#x27; fill=&#x27;none&#x27;/%3E%3Ccircle cx=&#x27;4&#x27; cy=&#x27;4&#x27; r=&#x27;1&#x27; fill=&#x27;rgba(255,255,255,0.04)&#x27;/%3E%3C/svg%3E&quot;);
            font-family: &#x27;Inter&#x27;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, sans-serif;
            color: var(--text-color);
        }

        .promo-block {
            display: flex;
            flex-direction: column;
            gap: 16px;
            width: 100%;
            max-width: 420px;
        }

        .main-card {
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 16px;
            background-color: var(--card-bg-color);
            backdrop-filter: blur(12px);
            border: 1px solid var(--border-color);
            border-radius: 12px;
            cursor: pointer;
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            animation: fadeInSlideUp 0.5s ease-out forwards;
        }
        .main-card:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 5px -5px rgba(219, 97, 162, 0.3);
        }

        .main-card-header {
            display: flex;
            align-items: center;
            gap: 12px;
            margin-bottom: 12px;
            min-height: 34px;
        }
        
        .main-card-header .icon { width: 28px; height: 28px; color: var(--color-donate); }
        .main-card-header h3 { font-size: 1.25rem; font-weight: 600; margin: 0; display:flex; align-items:center; gap: 8px;}
        .main-card-header .icon-check { color: #3fb950; animation: popIn 0.3s ease-out; }

        .qr-code-wrapper {
            background-color: #ffffff;
            padding: 5px;
            border-radius: 8px;
            width: 130px;
            height: 130px;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .qr-code-wrapper img, .qr-code-wrapper canvas {
            display: block;
            border-radius: 4px;
        }
        
        .link-text {
            font-size: 0.85rem;
            color: var(--text-secondary-color);
            margin-top: 12px;
            word-break: break-all;
            line-height: 1.4;
            text-align: center;
        }
        
        .secondary-actions {
            display: flex;
            flex-direction: column;
            gap: 12px;
        }

        .action-item {
            display: flex;
            align-items: center;
            gap: 16px;
            padding: 16px;
            background-color: var(--card-bg-color);
            backdrop-filter: blur(12px);
            border: 1px solid var(--border-color);
            border-radius: 10px;
            cursor: pointer;
            opacity: 0;
            transform: translateY(10px);
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            animation: fadeInSlideUp 0.5s ease-out forwards;
        }
        .action-item:nth-child(1) { animation-delay: 0.1s; }
        .action-item:nth-child(2) { animation-delay: 0.2s; }

        .action-item.telegram:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 15px -5px rgba(42, 171, 238, 0.4);
        }
        .action-item.dzen:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 15px -5px rgba(255, 140, 0, 0.4);
        }

        .action-icon-wrapper {
            width: 40px;
            height: 40px;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            flex-shrink: 0;
        }
        .action-icon-wrapper.telegram-bg { background-color: rgba(42, 171, 238, 0.15); color: var(--color-telegram); }
        .action-icon-wrapper.dzen-bg { background-color: rgba(255, 140, 0, 0.15); color: var(--color-dzen); }
        .action-icon-wrapper .icon { width: 22px; height: 22px; }

        .action-text { line-height: 1.4; }
        .action-text h4 { font-size: 1rem; font-weight: 500; margin: 0 0 2px 0; }
        .action-text span { font-size: 0.85rem; color: var(--text-secondary-color); }

        .copy-indicator {
            margin-left: auto;
            background: none;
            border: none;
            padding: 8px;
            color: var(--text-secondary-color);
            display: flex;
            align-items: center;
            justify-content: center;
            flex-shrink: 0;
        }
        .copy-indicator .icon { width: 20px; height: 20px; }
        .copy-indicator .icon-check { animation: popIn 0.3s ease-out; }
        
        @media (min-width: 800px) {
            .promo-block {
                flex-direction: row;
                align-items: center;
                max-width: 860px;
                gap: 24px;
            }
            .main-card { flex: 1.2; }
            .secondary-actions { flex: 1; justify-content: center;}
        }
    </style>
</head>
<body>

    <div class=&quot;promo-block&quot;>
        <div class=&quot;main-card&quot; data-link=&quot;https://pay.cloudtips.ru/p/3a37d9ef&quot;>
            <div class=&quot;main-card-header&quot;>
                <h3><svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z&quot; /></svg><span>Поддержать</span></h3>
            </div>
            <div class=&quot;qr-code-wrapper&quot; id=&quot;qr-donate&quot;></div>
            <p class=&quot;link-text&quot;>pay.cloudtips.ru/p/3a37d9ef</p>
        </div>
        <div class=&quot;secondary-actions&quot;>
            <div class=&quot;action-item telegram&quot; data-link=&quot;https://t.me/pythontalk_ru&quot;>
                <div class=&quot;action-icon-wrapper telegram-bg&quot;>
                    <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5&quot; /></svg>
                </div>
                <div class=&quot;action-text&quot;>
                    <h4>Канал в Telegram</h4>
                    <span>t.me/pythontalk_ru</span>
                </div>
                <div class=&quot;copy-indicator&quot;>
                    <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m9.75 11.625c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H15M12 15h3.75&quot; /></svg>
                </div>
            </div>
             <div class=&quot;action-item dzen&quot; data-link=&quot;https://dzen.ru/pythontalk&quot;>
                <div class=&quot;action-icon-wrapper dzen-bg&quot;>
                    <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 01-2.25 2.25M16.5 7.5V18a2.25 2.25 0 002.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 002.25 2.25h13.5&quot; /></svg>
                </div>
                <div class=&quot;action-text&quot;>
                    <h4>Блог на Дзен</h4>
                    <span>dzen.ru/pythontalk</span>
                </div>
                <div class=&quot;copy-indicator&quot;>
                    <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m9.75 11.625c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H15M12 15h3.75&quot; /></svg>
                </div>
            </div>
        </div>
    </div>
    
    <script>
        document.addEventListener(&#x27;DOMContentLoaded&#x27;, () => {
            const checkIconHTML = &#x60;<svg class=&quot;icon icon-check&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M4.5 12.75l6 6 9-13.5&quot; /></svg>&#x60;;
            
            function setupMainCopyAction(card) {
                const link = card.dataset.link;
                const header = card.querySelector(&#x27;.main-card-header h3&#x27;);
                if (!link || !header) return;

                const originalHeaderHTML = header.innerHTML;
                let isClickable = true;

                card.addEventListener(&#x27;click&#x27;, () => {
                    if (!isClickable) return;
                    navigator.clipboard.writeText(link).then(() => {
                        header.innerHTML = &#x60;<span class=&quot;icon-check&quot;>${checkIconHTML}</span><span>Ссылка скопирована!</span>&#x60;;
                        isClickable = false;
                        setTimeout(() => {
                            header.innerHTML = originalHeaderHTML;
                            isClickable = true;
                        }, 2000);
                    }).catch(err => console.error(&#x27;Ошибка копирования:&#x27;, err));
                });
            }

            function setupItemCopyAction(item) {
                const link = item.dataset.link;
                const indicator = item.querySelector(&#x27;.copy-indicator&#x27;);
                if (!link || !indicator) return;

                const originalIndicatorHTML = indicator.innerHTML;
                let isClickable = true;

                item.addEventListener(&#x27;click&#x27;, () => {
                    if (!isClickable) return;
                    navigator.clipboard.writeText(link).then(() => {
                        indicator.innerHTML = checkIconHTML;
                        isClickable = false;
                        setTimeout(() => {
                            indicator.innerHTML = originalIndicatorHTML;
                            isClickable = true;
                        }, 2000);
                    }).catch(err => console.error(&#x27;Ошибка копирования:&#x27;, err));
                });
            }

            const mainCard = document.querySelector(&#x27;.main-card&#x27;);
            if (mainCard) {
                setupMainCopyAction(mainCard);
                const qrContainer = mainCard.querySelector(&#x27;.qr-code-wrapper&#x27;);
                if (qrContainer && typeof QRCode !== &#x27;undefined&#x27;) {
                    new QRCode(qrContainer, {
                        text: mainCard.dataset.link,
                        width: 120, height: 120,
                        colorDark: &quot;#000000&quot;, colorLight: &quot;#ffffff&quot;,
                        correctLevel: QRCode.CorrectLevel.H
                    });
                }
            }

            document.querySelectorAll(&#x27;.action-item&#x27;).forEach(setupItemCopyAction);
        });
    </script>
</body>
"></iframe>
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://pythontalk.olegtalks.ru/storm</guid><link>https://pythontalk.olegtalks.ru/storm?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=pythontalk</link><comments>https://pythontalk.olegtalks.ru/storm?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=pythontalk#comments</comments><dc:creator>pythontalk</dc:creator><title>STORM: Как LLM от Стэнфорда автоматизирует ресёрч и пишет статьи за вас</title><pubDate>Thu, 03 Jul 2025 10:20:07 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/b2/07/b2072d46-7575-4ad2-9231-d598ad7ca776.png"></media:content><category>Опенсорс</category><description><![CDATA[<img src="https://img3.teletype.in/files/ad/29/ad29074f-24d0-46eb-b337-cfb6f823f569.png"></img>Вот вам нужно погрузиться в новую сложную тему. Впереди часы гуглежа, десятки открытых вкладок, попытки отделить зёрна от плевел и собрать всё в единую картину. Процесс мучительный и не всегда продуктивный.]]></description><content:encoded><![CDATA[
  <p id="3sGI">Вот вам нужно погрузиться в новую сложную тему. Впереди часы гуглежа, десятки открытых вкладок, попытки отделить зёрна от плевел и собрать всё в единую картину. Процесс мучительный и не всегда продуктивный.</p>
  <p id="hlk7">И вот, кажется, ребята из Стэнфорда решили эту проблему если не полностью, то хотя бы частично автоматизировать. Они выкатили опенсорсный проект <strong>STORM</strong> — систему на базе LLM, которая берёт на себя самую нудную часть работы: исследование темы и создание структурированного черновика статьи в стиле Википедии. Сразу с цитатами и ссылками на источники.</p>
  <p id="OtVM">Конечно, это не волшебная кнопка «сделать зашибись». Сами авторы честно говорят, что на выходе получается не готовая к публикации работа, а скорее очень качественный и подробный репорт, который нужно дорабатывать. </p>
  <figure id="ePoq" class="m_column">
    <img src="https://img3.teletype.in/files/ad/29/ad29074f-24d0-46eb-b337-cfb6f823f569.png" width="4422" />
  </figure>
  <h2 id="bkjV">Что это за STORM такой и как он работает?</h2>
  <p id="iHZp">На первый взгляд, идея не нова — обернуть LLM в поисковик. Но дьявол, как всегда, в деталях. Вместо того чтобы тупо промптить модель в стиле «расскажи мне о X», STORM подходит к задаче куда хитрее. Весь процесс делится на два этапа:</p>
  <ol id="AHhu">
    <li id="yQAI"><strong>Pre-writing (Исследование):</strong> Система проводит интернет-исследование, чтобы собрать материал и составить план статьи.</li>
    <li id="8pZw"><strong>Writing (Написание):</strong> На основе собранных данных и плана генерируется полноценная статья с цитатами.</li>
  </ol>
  <figure id="0xSE" class="m_original">
    <img src="https://img4.teletype.in/files/30/5f/305fde94-a68c-41f0-b8f4-c56bb5631500.png" width="731" />
  </figure>
  <p id="x8rY">Ключевая фишка — в первом этапе. Чтобы сделать исследование глубоким и разносторонним, STORM использует две стратегии:</p>
  <ul id="bbvc">
    <li id="Pcrd"><strong>Perspective-Guided Question Asking:</strong> Система сначала изучает похожие статьи, чтобы понять, с каких разных точек зрения (например, академической, индустриальной, исторической) можно взглянуть на тему. А потом использует эти «перспективы», чтобы генерировать вопросы.</li>
    <li id="6uG5"><strong>Simulated Conversation:</strong> STORM имитирует диалог между автором статьи и экспертом по теме. Эксперт «опирается» на найденные в интернете источники. Это помогает LLM не просто вываливать факты, а углублять своё понимание темы и задавать уточняющие, релевантные вопросы по ходу дела.</li>
  </ul>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="5xsu">По сути, STORM не просто ищет информацию, а пытается воссоздать мыслительный процесс исследователя: сначала определяет разные углы обзора, а потом ведёт внутренний диалог, чтобы разобраться в теме. Это и отличает его от простых «summarizer»-ов.</p>
  </section>
  <p id="3YiC"></p>
  <h2 id="lMIv">Co-STORM: А если я хочу влезть в процесс?</h2>
  <p id="FVuD">Понимая, что полная автоматизация не всегда гуд, разработчики добавили режим <strong>Co-STORM</strong>. Он позволяет человеку активно участвовать в процессе. В этой симуляции есть три типа агентов:</p>
  <ol id="dPz1">
    <li id="s9E6"><strong>LLM-эксперты:</strong> Отвечают на вопросы, опираясь на внешние источники.</li>
    <li id="sxmn"><strong>Модератор:</strong> Задаёт наводящие вопросы, чтобы дискуссия не затухала.</li>
    <li id="DBeb"><strong>Человек:</strong> Может либо просто наблюдать за процессом, либо в любой момент вмешаться, задать свой вопрос и направить исследование в нужное русло.</li>
  </ol>
  <p id="ndPy">Для удобства вся собранная информация организуется в виде динамической ментальной карты (mind map), что должно снижать когнитивную нагрузку, когда исследование становится слишком глубоким.</p>
  <figure id="ZJUG" class="m_custom">
    <img src="https://img1.teletype.in/files/02/05/02058258-a5d7-44bd-92e6-3dae04bc478b.png" width="823.9999999999999" />
  </figure>
  <p id="OiEG"></p>
  <h2 id="EhiY">Как это пощупать?</h2>
  <p id="ktzC">Проект <a href="https://github.com/stanford-oval/storm/tree/main" target="_blank">доступен</a> на GitHub и легко ставится через pip:</p>
  <pre id="Ddyg">pip install knowledge-storm</pre>
  <p id="faZt">Дальше всё довольно модульно. Можно настраивать разные LLM (под капотом litellm, так что поддерживается почти всё, включая OpenAI, Azure и др.) и разные поисковые движки (Bing, You.com, Google, DuckDuckGo и т.д.).</p>
  <p id="fTdz">Вот упрощённый пример запуска из документации:</p>
  <pre id="fqrd" data-lang="python">import os
from knowledge_storm import STORMWikiRunnerArguments, STORMWikiRunner, STORMWikiLMConfigs
from knowledge_storm.lm import LitellmModel
from knowledge_storm.rm import YouRM # Или BingSearch, GoogleSearch...

# 1. Настраиваем модели
lm_configs = STORMWikiLMConfigs()
# Для симуляции диалога можно взять модель попроще и побыстрее
gpt_35 = LitellmModel(model=&#x27;gpt-3.5-turbo&#x27;, ...) 
# А для генерации самой статьи — что-то помощнее
gpt_4o = LitellmModel(model=&#x27;gpt-4o&#x27;, ...)
lm_configs.set_conv_simulator_lm(gpt_35)
lm_configs.set_article_gen_lm(gpt_4o)
# ... и другие компоненты

# 2. Настраиваем поисковик (retriever)
rm = YouRM(ydc_api_key=os.getenv(&#x27;YDC_API_KEY&#x27;))

# 3. Запускаем движок
engine_args = STORMWikiRunnerArguments(...)
runner = STORMWikiRunner(engine_args, lm_configs, rm)

runner.run(
    topic=&quot;Challenges in Python&#x27;s Global Interpreter Lock (GIL)&quot;,
    do_research=True,
    do_generate_outline=True,
    do_generate_article=True,
    do_polish_article=True,
)

runner.summary()</pre>
  <p id="tPcA">Выглядит довольно гибко. Можно запускать только нужные этапы, подсовывать свои поисковики и модели, что для кастомных задач самое то.</p>
  <p id="lYUJ">А для тех, кто не хочет ничего ставить, есть <a href="https://dzen.ru/away?to=https%3A%2F%2Fstorm-project.stanford.edu%2F" target="_blank"><strong>демо-сайт</strong></a>.</p>
  <p id="22LY"></p>
  <h2 id="ZLZv">Так это заменит исследователей и авторов?</h2>
  <p id="bQaY">Конечно, нет. И заявления типа &quot;STORM writes research papers like a PhD&quot; — это классический пример заигрывания с мечтами людей, которые хотят волшебную таблетку.</p>
  <p id="qu9e">STORM — это инструмент. Примерно как продвинутый IDE для программиста. Он не напишет за вас весь проект, но избавит от рутины, подсветит ошибки и ускорит работу. Здесь то же самое: STORM берёт на себя самую муторную часть — первоначальный сбор и структурирование информации.</p>
  <p id="1pj7">Ценность ведь не в самом сгенерированном тексте (контенте), который и так можно надергать из сети. Ценность в том, чтобы на основе этого черновика сделать выводы, добавить собственную экспертизу и создать что-то действительно новое. А на это пока способны только человеки 🧠</p>
  <p id="fxbV"></p>
  <figure id="iqzr" class="m_custom">
    <iframe srcdoc="<!DOCTYPE html>
<html lang=&quot;ru&quot;>
<head>
    <meta charset=&quot;UTF-8&quot;>
    <meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;>
    <title>Интерактивная плашка</title>
    <script src=&quot;https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js&quot;></script>
    <style>
        @import url(&#x27;https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap&#x27;);

        :root {
            --bg-color: #0d1117;
            --bg-gradient-start: #1c2128;
            --card-bg-color: rgba(22, 27, 34, 0.75);
            --border-color: rgba(48, 54, 61, 0.8);
            --text-color: #e6edf3;
            --text-secondary-color: #7d8590;
            
            --color-telegram: #2AABEE;
            --color-donate: #DB61A2;
            --color-dzen: #FF8C00;
        }

        @keyframes fadeInSlideUp {
            from { opacity: 0; transform: translateY(10px); }
            to { opacity: 1; transform: translateY(0); }
        }
        
        @keyframes popIn {
            from { transform: scale(0.7); opacity: 0; }
            to { transform: scale(1); opacity: 1; }
        }

        body {
            margin: 0;
            padding: 16px;
            box-sizing: border-box;
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background-color: var(--bg-color);
            background-image: 
                radial-gradient(circle at center, var(--bg-gradient-start) 0%, var(--bg-color) 80%),
                url(&quot;data:image/svg+xml,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; width=&#x27;20&#x27; height=&#x27;20&#x27;%3E%3Crect width=&#x27;20&#x27; height=&#x27;20&#x27; fill=&#x27;none&#x27;/%3E%3Ccircle cx=&#x27;4&#x27; cy=&#x27;4&#x27; r=&#x27;1&#x27; fill=&#x27;rgba(255,255,255,0.04)&#x27;/%3E%3C/svg%3E&quot;);
            font-family: &#x27;Inter&#x27;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, sans-serif;
            color: var(--text-color);
        }

        .promo-block {
            display: flex;
            flex-direction: column;
            gap: 16px;
            width: 100%;
            max-width: 420px;
        }

        .main-card {
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 16px;
            background-color: var(--card-bg-color);
            backdrop-filter: blur(12px);
            border: 1px solid var(--border-color);
            border-radius: 12px;
            cursor: pointer;
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            animation: fadeInSlideUp 0.5s ease-out forwards;
        }
        .main-card:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 5px -5px rgba(219, 97, 162, 0.3);
        }

        .main-card-header {
            display: flex;
            align-items: center;
            gap: 12px;
            margin-bottom: 12px;
            min-height: 34px;
        }
        
        .main-card-header .icon { width: 28px; height: 28px; color: var(--color-donate); }
        .main-card-header h3 { font-size: 1.25rem; font-weight: 600; margin: 0; display:flex; align-items:center; gap: 8px;}
        .main-card-header .icon-check { color: #3fb950; animation: popIn 0.3s ease-out; }

        .qr-code-wrapper {
            background-color: #ffffff;
            padding: 5px;
            border-radius: 8px;
            width: 130px;
            height: 130px;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .qr-code-wrapper img, .qr-code-wrapper canvas {
            display: block;
            border-radius: 4px;
        }
        
        .link-text {
            font-size: 0.85rem;
            color: var(--text-secondary-color);
            margin-top: 12px;
            word-break: break-all;
            line-height: 1.4;
            text-align: center;
        }
        
        .secondary-actions {
            display: flex;
            flex-direction: column;
            gap: 12px;
        }

        .action-item {
            display: flex;
            align-items: center;
            gap: 16px;
            padding: 16px;
            background-color: var(--card-bg-color);
            backdrop-filter: blur(12px);
            border: 1px solid var(--border-color);
            border-radius: 10px;
            cursor: pointer;
            opacity: 0;
            transform: translateY(10px);
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            animation: fadeInSlideUp 0.5s ease-out forwards;
        }
        .action-item:nth-child(1) { animation-delay: 0.1s; }
        .action-item:nth-child(2) { animation-delay: 0.2s; }

        .action-item.telegram:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 15px -5px rgba(42, 171, 238, 0.4);
        }
        .action-item.dzen:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 15px -5px rgba(255, 140, 0, 0.4);
        }

        .action-icon-wrapper {
            width: 40px;
            height: 40px;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            flex-shrink: 0;
        }
        .action-icon-wrapper.telegram-bg { background-color: rgba(42, 171, 238, 0.15); color: var(--color-telegram); }
        .action-icon-wrapper.dzen-bg { background-color: rgba(255, 140, 0, 0.15); color: var(--color-dzen); }
        .action-icon-wrapper .icon { width: 22px; height: 22px; }

        .action-text { line-height: 1.4; }
        .action-text h4 { font-size: 1rem; font-weight: 500; margin: 0 0 2px 0; }
        .action-text span { font-size: 0.85rem; color: var(--text-secondary-color); }

        .copy-indicator {
            margin-left: auto;
            background: none;
            border: none;
            padding: 8px;
            color: var(--text-secondary-color);
            display: flex;
            align-items: center;
            justify-content: center;
            flex-shrink: 0;
        }
        .copy-indicator .icon { width: 20px; height: 20px; }
        .copy-indicator .icon-check { animation: popIn 0.3s ease-out; }
        
        @media (min-width: 800px) {
            .promo-block {
                flex-direction: row;
                align-items: center;
                max-width: 860px;
                gap: 24px;
            }
            .main-card { flex: 1.2; }
            .secondary-actions { flex: 1; justify-content: center;}
        }
    </style>
</head>
<body>

    <div class=&quot;promo-block&quot;>
        <div class=&quot;main-card&quot; data-link=&quot;https://pay.cloudtips.ru/p/3a37d9ef&quot;>
            <div class=&quot;main-card-header&quot;>
                <h3><svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z&quot; /></svg><span>Поддержать</span></h3>
            </div>
            <div class=&quot;qr-code-wrapper&quot; id=&quot;qr-donate&quot;></div>
            <p class=&quot;link-text&quot;>pay.cloudtips.ru/p/3a37d9ef</p>
        </div>
        <div class=&quot;secondary-actions&quot;>
            <div class=&quot;action-item telegram&quot; data-link=&quot;https://t.me/pythontalk_ru&quot;>
                <div class=&quot;action-icon-wrapper telegram-bg&quot;>
                    <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5&quot; /></svg>
                </div>
                <div class=&quot;action-text&quot;>
                    <h4>Канал в Telegram</h4>
                    <span>t.me/pythontalk_ru</span>
                </div>
                <div class=&quot;copy-indicator&quot;>
                    <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m9.75 11.625c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H15M12 15h3.75&quot; /></svg>
                </div>
            </div>
             <div class=&quot;action-item dzen&quot; data-link=&quot;https://dzen.ru/pythontalk&quot;>
                <div class=&quot;action-icon-wrapper dzen-bg&quot;>
                    <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 01-2.25 2.25M16.5 7.5V18a2.25 2.25 0 002.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 002.25 2.25h13.5&quot; /></svg>
                </div>
                <div class=&quot;action-text&quot;>
                    <h4>Блог на Дзен</h4>
                    <span>dzen.ru/pythontalk</span>
                </div>
                <div class=&quot;copy-indicator&quot;>
                    <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m9.75 11.625c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H15M12 15h3.75&quot; /></svg>
                </div>
            </div>
        </div>
    </div>
    
    <script>
        document.addEventListener(&#x27;DOMContentLoaded&#x27;, () => {
            const checkIconHTML = &#x60;<svg class=&quot;icon icon-check&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M4.5 12.75l6 6 9-13.5&quot; /></svg>&#x60;;
            
            function setupMainCopyAction(card) {
                const link = card.dataset.link;
                const header = card.querySelector(&#x27;.main-card-header h3&#x27;);
                if (!link || !header) return;

                const originalHeaderHTML = header.innerHTML;
                let isClickable = true;

                card.addEventListener(&#x27;click&#x27;, () => {
                    if (!isClickable) return;
                    navigator.clipboard.writeText(link).then(() => {
                        header.innerHTML = &#x60;<span class=&quot;icon-check&quot;>${checkIconHTML}</span><span>Ссылка скопирована!</span>&#x60;;
                        isClickable = false;
                        setTimeout(() => {
                            header.innerHTML = originalHeaderHTML;
                            isClickable = true;
                        }, 2000);
                    }).catch(err => console.error(&#x27;Ошибка копирования:&#x27;, err));
                });
            }

            function setupItemCopyAction(item) {
                const link = item.dataset.link;
                const indicator = item.querySelector(&#x27;.copy-indicator&#x27;);
                if (!link || !indicator) return;

                const originalIndicatorHTML = indicator.innerHTML;
                let isClickable = true;

                item.addEventListener(&#x27;click&#x27;, () => {
                    if (!isClickable) return;
                    navigator.clipboard.writeText(link).then(() => {
                        indicator.innerHTML = checkIconHTML;
                        isClickable = false;
                        setTimeout(() => {
                            indicator.innerHTML = originalIndicatorHTML;
                            isClickable = true;
                        }, 2000);
                    }).catch(err => console.error(&#x27;Ошибка копирования:&#x27;, err));
                });
            }

            const mainCard = document.querySelector(&#x27;.main-card&#x27;);
            if (mainCard) {
                setupMainCopyAction(mainCard);
                const qrContainer = mainCard.querySelector(&#x27;.qr-code-wrapper&#x27;);
                if (qrContainer && typeof QRCode !== &#x27;undefined&#x27;) {
                    new QRCode(qrContainer, {
                        text: mainCard.dataset.link,
                        width: 120, height: 120,
                        colorDark: &quot;#000000&quot;, colorLight: &quot;#ffffff&quot;,
                        correctLevel: QRCode.CorrectLevel.H
                    });
                }
            }

            document.querySelectorAll(&#x27;.action-item&#x27;).forEach(setupItemCopyAction);
        });
    </script>
</body>
"></iframe>
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://pythontalk.olegtalks.ru/machine-learning-q-and-ai-book</guid><link>https://pythontalk.olegtalks.ru/machine-learning-q-and-ai-book?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=pythontalk</link><comments>https://pythontalk.olegtalks.ru/machine-learning-q-and-ai-book?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=pythontalk#comments</comments><dc:creator>pythontalk</dc:creator><title>Machine Learning Q and AI: книга от Себастьяна Рашки для тех, кто уже не джун</title><pubDate>Wed, 02 Jul 2025 15:24:30 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/7a/f5/7af54138-b651-43ba-b743-153a7ba80a5a.png"></media:content><category>Прочее</category><description><![CDATA[<img src="https://img2.teletype.in/files/9a/23/9a231918-9172-467b-bf45-932ef0a21d51.png"></img>Когда речь заходит об учебной литературе по ML, обычно на ум приходят либо совсем базовые вещи для новичков, либо хардкорные академические талмуды, которые без бутылки аспирина не осилить. Найти что-то толковое для человека, который уже вышел из песочницы, но ещё не готов врываться в рисерч, — та ещё задачка.]]></description><content:encoded><![CDATA[
  <p id="dKjH">Когда речь заходит об учебной литературе по ML, обычно на ум приходят либо совсем базовые вещи для новичков, либо хардкорные академические талмуды, которые без бутылки аспирина не осилить. Найти что-то толковое для человека, который уже вышел из песочницы, но ещё не готов врываться в рисерч, — та ещё задачка.</p>
  <p id="gBFG">И тут на сцену выходит Себастьян Рашка. Если вы вдруг не в курсе, это один из core-разработчиков scikit-learn и автор нескольких книг, которые уже стали культовыми. И его работа Machine Learning Q and AI — это книга для тех, у кого уже есть база, но остались вопросы и пробелы.</p>
  <figure id="CCRw" class="m_custom">
    <img src="https://img2.teletype.in/files/9a/23/9a231918-9172-467b-bf45-932ef0a21d51.png" width="353.99999999999994" />
  </figure>
  <p id="pjTz">Вся книга — это 30 самостоятельных глав, каждая из которых посвящена одному конкретному вопросу. Никакой воды и долгих вступлений. Вы открываете нужную главу и получаете концентрированный ответ с диаграммами, кодом и упражнениями для закрепления.</p>
  <p id="6NZm">Эта книга не пытается заигрывать с новичками, обещая сделать из них мидлов за полгода. Она честно ориентирована на тех, кто уже «в теме».</p>
  <p id="YexN">Темы тут вполне себе взрослые:</p>
  <ul id="Ug0a">
    <li id="z2qq">Парадигмы обучения на нескольких GPU.</li>
    <li id="T6SJ">Файнтюнинг трансформеров (и чем отличаются энкодеры от декодеров).</li>
    <li id="8R3E">Концепции, лежащие в основе Vision Transformers.</li>
    <li id="ZpsW">Как правильно считать доверительные интервалы для моделей.</li>
    <li id="QodQ">Data-centric подход к AI.</li>
    <li id="3JEl">Методы ускорения инференса моделей.</li>
    <li id="jSYc">...и ещё два десятка не менее интересных вопросов.</li>
  </ul>
  <p id="SCOl">Каждая глава — это, по сути, готовый мини-гайд по конкретной теме. Это не просто теория, а материал, подкреплённый Python-кодом и ссылками для тех, кто хочет копнуть ещё глубже.</p>
  <p id="1euU"></p>
  <p id="1D6M">Книга находится в <a href="https://sebastianraschka.com/books/ml-q-and-ai-chapters/introduction/#table-of-contents" target="_blank">полностью открытом доступе</a>. Да, бесплатно. Не нужно ничего покупать, воровать или ждать слива на торренты.</p>
  <p id="M3n4">Более того, все дополнительные материалы, включая код и данные для упражнений, лежат в <a href="https://www.google.com/url?sa=E&q=https%3A%2F%2Fgithub.com%2Frasbt%2Fml-q-and-ai-book" target="_blank">о</a><a href="https://github.com/rasbt/MachineLearning-QandAI-book?tab=readme-ov-file" target="_blank">тдельном репозитории на GitHub</a>. </p>
  <p id="S69T"></p>
  <figure id="0QPq" class="m_custom">
    <iframe srcdoc="<!DOCTYPE html>
<html lang=&quot;ru&quot;>
<head>
    <meta charset=&quot;UTF-8&quot;>
    <meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;>
    <title>Интерактивная плашка</title>
    <script src=&quot;https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js&quot;></script>
    <style>
        @import url(&#x27;https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap&#x27;);

        :root {
            --bg-color: #0d1117;
            --bg-gradient-start: #1c2128;
            --card-bg-color: rgba(22, 27, 34, 0.75);
            --border-color: rgba(48, 54, 61, 0.8);
            --text-color: #e6edf3;
            --text-secondary-color: #7d8590;
            
            --color-telegram: #2AABEE;
            --color-donate: #DB61A2;
            --color-dzen: #FF8C00;
        }

        @keyframes fadeInSlideUp {
            from { opacity: 0; transform: translateY(10px); }
            to { opacity: 1; transform: translateY(0); }
        }
        
        @keyframes popIn {
            from { transform: scale(0.7); opacity: 0; }
            to { transform: scale(1); opacity: 1; }
        }

        body {
            margin: 0;
            padding: 16px;
            box-sizing: border-box;
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background-color: var(--bg-color);
            background-image: 
                radial-gradient(circle at center, var(--bg-gradient-start) 0%, var(--bg-color) 80%),
                url(&quot;data:image/svg+xml,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; width=&#x27;20&#x27; height=&#x27;20&#x27;%3E%3Crect width=&#x27;20&#x27; height=&#x27;20&#x27; fill=&#x27;none&#x27;/%3E%3Ccircle cx=&#x27;4&#x27; cy=&#x27;4&#x27; r=&#x27;1&#x27; fill=&#x27;rgba(255,255,255,0.04)&#x27;/%3E%3C/svg%3E&quot;);
            font-family: &#x27;Inter&#x27;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, sans-serif;
            color: var(--text-color);
        }

        .promo-block {
            display: flex;
            flex-direction: column;
            gap: 16px;
            width: 100%;
            max-width: 420px;
        }

        .main-card {
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 16px;
            background-color: var(--card-bg-color);
            backdrop-filter: blur(12px);
            border: 1px solid var(--border-color);
            border-radius: 12px;
            cursor: pointer;
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            animation: fadeInSlideUp 0.5s ease-out forwards;
        }
        .main-card:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 5px -5px rgba(219, 97, 162, 0.3);
        }

        .main-card-header {
            display: flex;
            align-items: center;
            gap: 12px;
            margin-bottom: 12px;
            min-height: 34px;
        }
        
        .main-card-header .icon { width: 28px; height: 28px; color: var(--color-donate); }
        .main-card-header h3 { font-size: 1.25rem; font-weight: 600; margin: 0; display:flex; align-items:center; gap: 8px;}
        .main-card-header .icon-check { color: #3fb950; animation: popIn 0.3s ease-out; }

        .qr-code-wrapper {
            background-color: #ffffff;
            padding: 5px;
            border-radius: 8px;
            width: 130px;
            height: 130px;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .qr-code-wrapper img, .qr-code-wrapper canvas {
            display: block;
            border-radius: 4px;
        }
        
        .link-text {
            font-size: 0.85rem;
            color: var(--text-secondary-color);
            margin-top: 12px;
            word-break: break-all;
            line-height: 1.4;
            text-align: center;
        }
        
        .secondary-actions {
            display: flex;
            flex-direction: column;
            gap: 12px;
        }

        .action-item {
            display: flex;
            align-items: center;
            gap: 16px;
            padding: 16px;
            background-color: var(--card-bg-color);
            backdrop-filter: blur(12px);
            border: 1px solid var(--border-color);
            border-radius: 10px;
            cursor: pointer;
            opacity: 0;
            transform: translateY(10px);
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            animation: fadeInSlideUp 0.5s ease-out forwards;
        }
        .action-item:nth-child(1) { animation-delay: 0.1s; }
        .action-item:nth-child(2) { animation-delay: 0.2s; }

        .action-item.telegram:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 15px -5px rgba(42, 171, 238, 0.4);
        }
        .action-item.dzen:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 15px -5px rgba(255, 140, 0, 0.4);
        }

        .action-icon-wrapper {
            width: 40px;
            height: 40px;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            flex-shrink: 0;
        }
        .action-icon-wrapper.telegram-bg { background-color: rgba(42, 171, 238, 0.15); color: var(--color-telegram); }
        .action-icon-wrapper.dzen-bg { background-color: rgba(255, 140, 0, 0.15); color: var(--color-dzen); }
        .action-icon-wrapper .icon { width: 22px; height: 22px; }

        .action-text { line-height: 1.4; }
        .action-text h4 { font-size: 1rem; font-weight: 500; margin: 0 0 2px 0; }
        .action-text span { font-size: 0.85rem; color: var(--text-secondary-color); }

        .copy-indicator {
            margin-left: auto;
            background: none;
            border: none;
            padding: 8px;
            color: var(--text-secondary-color);
            display: flex;
            align-items: center;
            justify-content: center;
            flex-shrink: 0;
        }
        .copy-indicator .icon { width: 20px; height: 20px; }
        .copy-indicator .icon-check { animation: popIn 0.3s ease-out; }
        
        @media (min-width: 800px) {
            .promo-block {
                flex-direction: row;
                align-items: center;
                max-width: 860px;
                gap: 24px;
            }
            .main-card { flex: 1.2; }
            .secondary-actions { flex: 1; justify-content: center;}
        }
    </style>
</head>
<body>

    <div class=&quot;promo-block&quot;>
        <div class=&quot;main-card&quot; data-link=&quot;https://pay.cloudtips.ru/p/3a37d9ef&quot;>
            <div class=&quot;main-card-header&quot;>
                <h3><svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z&quot; /></svg><span>Поддержать</span></h3>
            </div>
            <div class=&quot;qr-code-wrapper&quot; id=&quot;qr-donate&quot;></div>
            <p class=&quot;link-text&quot;>pay.cloudtips.ru/p/3a37d9ef</p>
        </div>
        <div class=&quot;secondary-actions&quot;>
            <div class=&quot;action-item telegram&quot; data-link=&quot;https://t.me/pythontalk_ru&quot;>
                <div class=&quot;action-icon-wrapper telegram-bg&quot;>
                    <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5&quot; /></svg>
                </div>
                <div class=&quot;action-text&quot;>
                    <h4>Канал в Telegram</h4>
                    <span>t.me/pythontalk_ru</span>
                </div>
                <div class=&quot;copy-indicator&quot;>
                    <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m9.75 11.625c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H15M12 15h3.75&quot; /></svg>
                </div>
            </div>
             <div class=&quot;action-item dzen&quot; data-link=&quot;https://dzen.ru/pythontalk&quot;>
                <div class=&quot;action-icon-wrapper dzen-bg&quot;>
                    <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 01-2.25 2.25M16.5 7.5V18a2.25 2.25 0 002.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 002.25 2.25h13.5&quot; /></svg>
                </div>
                <div class=&quot;action-text&quot;>
                    <h4>Блог на Дзен</h4>
                    <span>dzen.ru/pythontalk</span>
                </div>
                <div class=&quot;copy-indicator&quot;>
                    <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m9.75 11.625c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H15M12 15h3.75&quot; /></svg>
                </div>
            </div>
        </div>
    </div>
    
    <script>
        document.addEventListener(&#x27;DOMContentLoaded&#x27;, () => {
            const checkIconHTML = &#x60;<svg class=&quot;icon icon-check&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M4.5 12.75l6 6 9-13.5&quot; /></svg>&#x60;;
            
            function setupMainCopyAction(card) {
                const link = card.dataset.link;
                const header = card.querySelector(&#x27;.main-card-header h3&#x27;);
                if (!link || !header) return;

                const originalHeaderHTML = header.innerHTML;
                let isClickable = true;

                card.addEventListener(&#x27;click&#x27;, () => {
                    if (!isClickable) return;
                    navigator.clipboard.writeText(link).then(() => {
                        header.innerHTML = &#x60;<span class=&quot;icon-check&quot;>${checkIconHTML}</span><span>Ссылка скопирована!</span>&#x60;;
                        isClickable = false;
                        setTimeout(() => {
                            header.innerHTML = originalHeaderHTML;
                            isClickable = true;
                        }, 2000);
                    }).catch(err => console.error(&#x27;Ошибка копирования:&#x27;, err));
                });
            }

            function setupItemCopyAction(item) {
                const link = item.dataset.link;
                const indicator = item.querySelector(&#x27;.copy-indicator&#x27;);
                if (!link || !indicator) return;

                const originalIndicatorHTML = indicator.innerHTML;
                let isClickable = true;

                item.addEventListener(&#x27;click&#x27;, () => {
                    if (!isClickable) return;
                    navigator.clipboard.writeText(link).then(() => {
                        indicator.innerHTML = checkIconHTML;
                        isClickable = false;
                        setTimeout(() => {
                            indicator.innerHTML = originalIndicatorHTML;
                            isClickable = true;
                        }, 2000);
                    }).catch(err => console.error(&#x27;Ошибка копирования:&#x27;, err));
                });
            }

            const mainCard = document.querySelector(&#x27;.main-card&#x27;);
            if (mainCard) {
                setupMainCopyAction(mainCard);
                const qrContainer = mainCard.querySelector(&#x27;.qr-code-wrapper&#x27;);
                if (qrContainer && typeof QRCode !== &#x27;undefined&#x27;) {
                    new QRCode(qrContainer, {
                        text: mainCard.dataset.link,
                        width: 120, height: 120,
                        colorDark: &quot;#000000&quot;, colorLight: &quot;#ffffff&quot;,
                        correctLevel: QRCode.CorrectLevel.H
                    });
                }
            }

            document.querySelectorAll(&#x27;.action-item&#x27;).forEach(setupItemCopyAction);
        });
    </script>
</body>
"></iframe>
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://pythontalk.olegtalks.ru/baidu-ernie-4-5-release</guid><link>https://pythontalk.olegtalks.ru/baidu-ernie-4-5-release?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=pythontalk</link><comments>https://pythontalk.olegtalks.ru/baidu-ernie-4-5-release?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=pythontalk#comments</comments><dc:creator>pythontalk</dc:creator><title>ERNIE 4.5 от Baidu</title><pubDate>Tue, 01 Jul 2025 10:17:18 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/f4/e5/f4e566ea-039d-4ac3-b609-2fa95fffbfec.png"></media:content><category>Опенсорс</category><description><![CDATA[<img src="https://img3.teletype.in/files/23/55/235585bd-a4cd-4c7e-b307-e151960c7aa9.png"></img>Китайский гигант Baidu выкатил в опенсорс целое семейство моделей ERNIE 4.5. И не просто веса на Hugging Face закинули, а представили полноценную экосистему с инструментами для дообучения и деплоя.]]></description><content:encoded><![CDATA[
  <p id="79vb">Китайский гигант Baidu выкатил <a href="https://github.com/PaddlePaddle/ERNIE" target="_blank">в опенсорс</a> целое семейство моделей ERNIE 4.5. И не просто <a href="https://huggingface.co/baidu" target="_blank">веса на Hugging Face</a> закинули, а представили полноценную экосистему с инструментами для дообучения и деплоя.</p>
  <p id="ey7K">Давайте разберёмся, что там под капотом 👇🏻</p>
  <h2 id="rhFv">Что вообще выкатили?</h2>
  <p id="hHnM">ERNIE 4.5 — это не одна модель, а целая семья из 10 различных вариантов, построенных на архитектуре Mixture-of-Experts (MoE) и не только.</p>
  <ul id="YySp">
    <li id="pbDq"><strong>Тяжеловесы (MoE):</strong> Самая большая модель имеет 424B параметров, но благодаря MoE-архитектуре в каждый момент времени активны «всего» 47B. Есть и версия поменьше: 21B общих и 3B активных параметров.</li>
    <li id="BClj"><strong>Малыш (Dense):</strong> Для тех, у кого нет под рукой кластера из H100, есть компактная модель на 0.3B параметров.</li>
    <li id="HKDu"><strong>Мультимодальность:</strong> Часть моделей — классические LLM (текст-в-текст), а часть — VLM, способные понимать не только текст, но и изображения с видео.</li>
  </ul>
  <p id="gFzI">Все модели доступны под либеральной лицензией Apache 2.0. Это значит — бери и используй, в том числе в коммерческих проектах.</p>
  <p id="PzbR"></p>
  <h2 id="RHZa">Ключевые фишки: чем хвастаются китайцы?</h2>
  <p id="XP3h">В документации Baidu выделяют три основных инновации, которые, по их мнению, и делают ERNIE 4.5 таким крутым.</p>
  <h3 id="z4ay">1. Мультимодальная гетерогенная MoE-архитектура 🧠</h3>
  <p id="e6YY">Звучит страшно, но идея простая. Обычно, когда пытаешься научить одну модель работать и с текстом, и с картинками, одна модальность начинает «мешать» другой. Китайцы заявляют, что придумали хитрую структуру MoE, где есть как общие для всех модальностей параметры, так и выделенные «эксперты» для каждой.</p>
  <blockquote id="ZSDw">Проще говоря, они спроектировали модель так, чтобы понимание картинок не ухудшало, а наоборот, улучшало её способности в работе с текстом. Если это действительно так, то это серьёзный шаг вперёд в построении по-настоящему мультимодальных систем.</blockquote>
  <h3 id="RRmR">2. Эффективная инфраструктура и деплой 🚀</h3>
  <p id="mwYR">Весь этот зоопарк моделей обучался на собственном фреймворке Baidu — <strong>PaddlePaddle</strong>. Они хвастаются дикой эффективностью (до 47% MFU на претрейне) и кучей оптимизаций для инференса, включая квантизацию до 4-бит и даже 2-бит без особых потерь в качестве. Это значит, что даже большие модели можно будет запускать на более-менее вменяемом железе.</p>
  <h3 id="BXyE">3. Специализированный пост-трейнинг 👨🏻‍💻</h3>
  <p id="rbi5">Базовые модели дополнительно дообучали под конкретные задачи с помощью SFT, DPO и даже собственного метода UPO. В итоге мы имеем не просто сырые pre-trained модели, а уже готовые к работе инструменты, заточенные либо под генерацию текста, либо под сложные визуально-языковые задачи.</p>
  <p id="7ano"></p>
  <h2 id="kwoy">А что по цифрам? Сравнение с конкурентами</h2>
  <p id="cmbN">Как водится, в таких релизах без пачки бенчмарков, где новая модель всех побеждает, никуда.</p>
  <ul id="1lMs">
    <li id="ogCA"><strong>ERNIE-4.5-300B-A47B</strong> (топовая LLM) якобы обходит DeepSeek-V3-671B-A37B на большинстве тестов, особенно в знании фактов и следовании инструкциям.</li>
    <li id="9Mt6"><strong>ERNIE-4.5-21B-A3B</strong> (младшая LLM) показывает себя на уровне или даже лучше Qwen3-30B-A3B на задачах по математике и логике, имея при этом на 30% меньше параметров.</li>
    <li id="mpLX">Мультимодальная <strong>ERNIE-4.5-VL-424B-A47B</strong> показывает SOTA-результаты на сложных бенчмарках вроде MathVista и MMMU, особенно в режиме &quot;thinking mode&quot; (когда модель сначала рассуждает, а потом отвечает).</li>
  </ul>
  <figure id="S7Iz" class="m_column">
    <img src="https://img3.teletype.in/files/23/55/235585bd-a4cd-4c7e-b307-e151960c7aa9.png" width="3902" />
  </figure>
  <p id="y2Ir"></p>
  <h2 id="AazP">Главный прикол: экосистема на PaddlePaddle</h2>
  <p id="rYmX">И вот мы подходим к самому интересному. Baidu выложили не просто модели, а полный инструментарий для работы с ними.</p>
  <p id="FIfV"><strong>ERNIEKit</strong> — тулкит для дообучения. Поддерживает всё, что нужно: SFT, DPO (в том числе LoRA-версии), QAT и прочие страшные аббревиатуры.</p>
  <p id="3AoC"><strong>FastDeploy</strong> — тулкит для инференса. Позволяет развернуть модель для оффлайн-обработки или поднять API-сервер, совместимый с OpenAI.</p>
  <p id="DhAN">Начать работу с самой маленькой моделью можно буквально в несколько команд:</p>
  <pre id="KQWM" data-lang="python"># Установка
# pip install ...

# Оффлайн-инференс
from fastdeploy import LLM, SamplingParams

prompt = &quot;Напиши стих про фреймворк PaddlePaddle.&quot;
sampling_params = SamplingParams(temperature=0.8, top_p=0.95)

llm = LLM(model=&quot;baidu/ERNIE-4.5-0.3B-Paddle&quot;, max_model_len=32768)

outputs = llm.generate(prompt, sampling_params)
print(outputs[0].text)</pre>
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="Glec"><strong>Вся эта красота работает исключительно на PaddlePaddle.</strong> Хочешь нашу крутую модель — добро пожаловать в нашу экосистему. Очень хитрый, но и вполне логичный способ продвижения своего фреймворка.</p>
  </section>
  <p id="P0ZM"></p>
  <h2 id="yUna">Итоги: так качать или нет?</h2>
  <p id="hBf3">Выпуск ERNIE 4.5 — это однозначно знаковое событие. Baidu не просто догнали западных конкурентов, но и предложили зрелую, полностью открытую экосистему для работы с SOTA-моделями.</p>
  <p id="fMv0"><strong>Плюсы очевидны:</strong></p>
  <ul id="jzp7">
    <li id="blAL">Отличные заявленные характеристики.</li>
    <li id="P67Y">Широкий выбор моделей под разные задачи и бюджеты.</li>
    <li id="MOVw">Полный набор инструментов для fine-tuning и деплоя.</li>
    <li id="9vzy">Лицензия Apache 2.0.</li>
  </ul>
  <p id="rC2H"><strong>Главный минус (или фича?):</strong></p>
  <ul id="aDgU">
    <li id="ZDC2">Жёсткая привязка к фреймворку PaddlePaddle. Для большинства разработчиков, привыкших к PyTorch, это станет барьером.</li>
  </ul>
  <p id="FRJr"></p>
  <figure id="xoAX" class="m_custom">
    <iframe srcdoc="<!DOCTYPE html>
<html lang=&quot;ru&quot;>
<head>
    <meta charset=&quot;UTF-8&quot;>
    <meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;>
    <title>Интерактивная плашка</title>
    <script src=&quot;https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js&quot;></script>
    <style>
        @import url(&#x27;https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap&#x27;);

        :root {
            --bg-color: #0d1117;
            --bg-gradient-start: #1c2128;
            --card-bg-color: rgba(22, 27, 34, 0.75);
            --border-color: rgba(48, 54, 61, 0.8);
            --text-color: #e6edf3;
            --text-secondary-color: #7d8590;
            
            --color-telegram: #2AABEE;
            --color-donate: #DB61A2;
            --color-dzen: #FF8C00;
        }

        @keyframes fadeInSlideUp {
            from { opacity: 0; transform: translateY(10px); }
            to { opacity: 1; transform: translateY(0); }
        }
        
        @keyframes popIn {
            from { transform: scale(0.7); opacity: 0; }
            to { transform: scale(1); opacity: 1; }
        }

        body {
            margin: 0;
            padding: 16px;
            box-sizing: border-box;
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background-color: var(--bg-color);
            background-image: 
                radial-gradient(circle at center, var(--bg-gradient-start) 0%, var(--bg-color) 80%),
                url(&quot;data:image/svg+xml,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; width=&#x27;20&#x27; height=&#x27;20&#x27;%3E%3Crect width=&#x27;20&#x27; height=&#x27;20&#x27; fill=&#x27;none&#x27;/%3E%3Ccircle cx=&#x27;4&#x27; cy=&#x27;4&#x27; r=&#x27;1&#x27; fill=&#x27;rgba(255,255,255,0.04)&#x27;/%3E%3C/svg%3E&quot;);
            font-family: &#x27;Inter&#x27;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, sans-serif;
            color: var(--text-color);
        }

        .promo-block {
            display: flex;
            flex-direction: column;
            gap: 16px;
            width: 100%;
            max-width: 420px;
        }

        .main-card {
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 16px;
            background-color: var(--card-bg-color);
            backdrop-filter: blur(12px);
            border: 1px solid var(--border-color);
            border-radius: 12px;
            cursor: pointer;
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            animation: fadeInSlideUp 0.5s ease-out forwards;
        }
        .main-card:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 5px -5px rgba(219, 97, 162, 0.3);
        }

        .main-card-header {
            display: flex;
            align-items: center;
            gap: 12px;
            margin-bottom: 12px;
            min-height: 34px;
        }
        
        .main-card-header .icon { width: 28px; height: 28px; color: var(--color-donate); }
        .main-card-header h3 { font-size: 1.25rem; font-weight: 600; margin: 0; display:flex; align-items:center; gap: 8px;}
        .main-card-header .icon-check { color: #3fb950; animation: popIn 0.3s ease-out; }

        .qr-code-wrapper {
            background-color: #ffffff;
            padding: 5px;
            border-radius: 8px;
            width: 130px;
            height: 130px;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .qr-code-wrapper img, .qr-code-wrapper canvas {
            display: block;
            border-radius: 4px;
        }
        
        .link-text {
            font-size: 0.85rem;
            color: var(--text-secondary-color);
            margin-top: 12px;
            word-break: break-all;
            line-height: 1.4;
            text-align: center;
        }
        
        .secondary-actions {
            display: flex;
            flex-direction: column;
            gap: 12px;
        }

        .action-item {
            display: flex;
            align-items: center;
            gap: 16px;
            padding: 16px;
            background-color: var(--card-bg-color);
            backdrop-filter: blur(12px);
            border: 1px solid var(--border-color);
            border-radius: 10px;
            cursor: pointer;
            opacity: 0;
            transform: translateY(10px);
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            animation: fadeInSlideUp 0.5s ease-out forwards;
        }
        .action-item:nth-child(1) { animation-delay: 0.1s; }
        .action-item:nth-child(2) { animation-delay: 0.2s; }

        .action-item.telegram:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 15px -5px rgba(42, 171, 238, 0.4);
        }
        .action-item.dzen:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 15px -5px rgba(255, 140, 0, 0.4);
        }

        .action-icon-wrapper {
            width: 40px;
            height: 40px;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            flex-shrink: 0;
        }
        .action-icon-wrapper.telegram-bg { background-color: rgba(42, 171, 238, 0.15); color: var(--color-telegram); }
        .action-icon-wrapper.dzen-bg { background-color: rgba(255, 140, 0, 0.15); color: var(--color-dzen); }
        .action-icon-wrapper .icon { width: 22px; height: 22px; }

        .action-text { line-height: 1.4; }
        .action-text h4 { font-size: 1rem; font-weight: 500; margin: 0 0 2px 0; }
        .action-text span { font-size: 0.85rem; color: var(--text-secondary-color); }

        .copy-indicator {
            margin-left: auto;
            background: none;
            border: none;
            padding: 8px;
            color: var(--text-secondary-color);
            display: flex;
            align-items: center;
            justify-content: center;
            flex-shrink: 0;
        }
        .copy-indicator .icon { width: 20px; height: 20px; }
        .copy-indicator .icon-check { animation: popIn 0.3s ease-out; }
        
        @media (min-width: 800px) {
            .promo-block {
                flex-direction: row;
                align-items: center;
                max-width: 860px;
                gap: 24px;
            }
            .main-card { flex: 1.2; }
            .secondary-actions { flex: 1; justify-content: center;}
        }
    </style>
</head>
<body>

    <div class=&quot;promo-block&quot;>
        <div class=&quot;main-card&quot; data-link=&quot;https://pay.cloudtips.ru/p/3a37d9ef&quot;>
            <div class=&quot;main-card-header&quot;>
                <h3><svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z&quot; /></svg><span>Поддержать</span></h3>
            </div>
            <div class=&quot;qr-code-wrapper&quot; id=&quot;qr-donate&quot;></div>
            <p class=&quot;link-text&quot;>pay.cloudtips.ru/p/3a37d9ef</p>
        </div>
        <div class=&quot;secondary-actions&quot;>
            <div class=&quot;action-item telegram&quot; data-link=&quot;https://t.me/pythontalk_ru&quot;>
                <div class=&quot;action-icon-wrapper telegram-bg&quot;>
                    <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5&quot; /></svg>
                </div>
                <div class=&quot;action-text&quot;>
                    <h4>Канал в Telegram</h4>
                    <span>t.me/pythontalk_ru</span>
                </div>
                <div class=&quot;copy-indicator&quot;>
                    <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m9.75 11.625c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H15M12 15h3.75&quot; /></svg>
                </div>
            </div>
             <div class=&quot;action-item dzen&quot; data-link=&quot;https://dzen.ru/pythontalk&quot;>
                <div class=&quot;action-icon-wrapper dzen-bg&quot;>
                    <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 01-2.25 2.25M16.5 7.5V18a2.25 2.25 0 002.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 002.25 2.25h13.5&quot; /></svg>
                </div>
                <div class=&quot;action-text&quot;>
                    <h4>Блог на Дзен</h4>
                    <span>dzen.ru/pythontalk</span>
                </div>
                <div class=&quot;copy-indicator&quot;>
                    <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m9.75 11.625c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H15M12 15h3.75&quot; /></svg>
                </div>
            </div>
        </div>
    </div>
    
    <script>
        document.addEventListener(&#x27;DOMContentLoaded&#x27;, () => {
            const checkIconHTML = &#x60;<svg class=&quot;icon icon-check&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M4.5 12.75l6 6 9-13.5&quot; /></svg>&#x60;;
            
            function setupMainCopyAction(card) {
                const link = card.dataset.link;
                const header = card.querySelector(&#x27;.main-card-header h3&#x27;);
                if (!link || !header) return;

                const originalHeaderHTML = header.innerHTML;
                let isClickable = true;

                card.addEventListener(&#x27;click&#x27;, () => {
                    if (!isClickable) return;
                    navigator.clipboard.writeText(link).then(() => {
                        header.innerHTML = &#x60;<span class=&quot;icon-check&quot;>${checkIconHTML}</span><span>Ссылка скопирована!</span>&#x60;;
                        isClickable = false;
                        setTimeout(() => {
                            header.innerHTML = originalHeaderHTML;
                            isClickable = true;
                        }, 2000);
                    }).catch(err => console.error(&#x27;Ошибка копирования:&#x27;, err));
                });
            }

            function setupItemCopyAction(item) {
                const link = item.dataset.link;
                const indicator = item.querySelector(&#x27;.copy-indicator&#x27;);
                if (!link || !indicator) return;

                const originalIndicatorHTML = indicator.innerHTML;
                let isClickable = true;

                item.addEventListener(&#x27;click&#x27;, () => {
                    if (!isClickable) return;
                    navigator.clipboard.writeText(link).then(() => {
                        indicator.innerHTML = checkIconHTML;
                        isClickable = false;
                        setTimeout(() => {
                            indicator.innerHTML = originalIndicatorHTML;
                            isClickable = true;
                        }, 2000);
                    }).catch(err => console.error(&#x27;Ошибка копирования:&#x27;, err));
                });
            }

            const mainCard = document.querySelector(&#x27;.main-card&#x27;);
            if (mainCard) {
                setupMainCopyAction(mainCard);
                const qrContainer = mainCard.querySelector(&#x27;.qr-code-wrapper&#x27;);
                if (qrContainer && typeof QRCode !== &#x27;undefined&#x27;) {
                    new QRCode(qrContainer, {
                        text: mainCard.dataset.link,
                        width: 120, height: 120,
                        colorDark: &quot;#000000&quot;, colorLight: &quot;#ffffff&quot;,
                        correctLevel: QRCode.CorrectLevel.H
                    });
                }
            }

            document.querySelectorAll(&#x27;.action-item&#x27;).forEach(setupItemCopyAction);
        });
    </script>
</body>
"></iframe>
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://pythontalk.olegtalks.ru/mojo-in-python</guid><link>https://pythontalk.olegtalks.ru/mojo-in-python?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=pythontalk</link><comments>https://pythontalk.olegtalks.ru/mojo-in-python?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=pythontalk#comments</comments><dc:creator>pythontalk</dc:creator><title>Mojo внутри Python: убийца или лучший друг?</title><pubDate>Fri, 27 Jun 2025 12:36:26 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/33/03/3303a085-33eb-4dd4-b9d4-7f38cc54e227.png"></media:content><category>Прочее</category><description><![CDATA[<img src="https://img2.teletype.in/files/d0/32/d0325f65-b4bb-4cee-b3d0-627b13536371.jpeg"></img>Я уже не раз иронизировал на тему &quot;убийцы Python&quot; — языка Mojo, который с момента своего анонса обещал нам золотые горы и производительность в 35 000 раз выше. Что ж, похоже, лёд тронулся. Недавно создатель языка Крис Латтнер объявил, что теперь код на Mojo можно вызывать напрямую из Python.]]></description><content:encoded><![CDATA[
  <h1 id="ZsG6">Разбираем реальный кейс и перспективы</h1>
  <p id="ywxN">Я уже не раз <a href="https://t.me/pythontalk_ru/1298" target="_blank">иронизировал</a> на тему &quot;убийцы Python&quot; — языка Mojo, который с момента своего анонса обещал нам золотые горы и производительность в 35 000 раз выше. Что ж, похоже, лёд тронулся. Недавно создатель языка Крис Латтнер объявил, что теперь код на Mojo можно вызывать напрямую из Python.</p>
  <figure id="ONIZ" class="m_custom">
    <img src="https://img2.teletype.in/files/d0/32/d0325f65-b4bb-4cee-b3d0-627b13536371.jpeg" width="388" />
  </figure>
  <p id="ZW44">В интернетах появился <a href="https://koaning.io/posts/giving-mojo-a-spin/" target="_blank">отличный эксперимент</a>, который наглядно показывает, что мы имеем на текущий момент: дико перспективную технологию или сырую поделку? Спойлер: и то, и другое.</p>
  <p id="v6d9"></p>
  <h2 id="lcEr">Как это работает?</h2>
  <p id="Sjul">Первое, что радует — порог входа стал ниже. Установка теперь делается через <code>uv</code> в одну команду, что уже прогресс по сравнению с первыми версиями.</p>
  <p id="xKix">Чтобы создать быструю функцию для Python, нужно:</p>
  <ol id="yMBs">
    <li id="CEfm">Написать её в файле <code>.mojo</code>, обернув в специальный экспортный код.</li>
    <li id="Pnod">В Python-скрипте импортировать специальный <code>max.mojo.importer</code>, после чего можно импортировать свой mojo-модуль как обычный.</li>
  </ol>
  <p id="w2DA">Выглядит это всё ещё немного громоздко, но уже вполне реально. Но давайте к самому интересному — к тестам производительности.</p>
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="gUxN">Цель: понять, можно ли использовать Mojo как замену C/Rust/Cython для ускорения &quot;тяжёлых&quot; вычислений в Python-проектах.</p>
  </section>
  <p id="ANm7"></p>
  <h2 id="Nhhq">Тест №1: Факториал. Классический провал</h2>
  <p id="zJTt">Первый тест был простым — вычисление факториала. На малых числах Mojo показал себя чуть быстрее. Но как только автор эксперимента попробовал вычислить <code>factorial(100)</code>, Mojo вернул 0.</p>
  <p id="d7zT">Причина понятна — <strong>переполнение целочисленного типа</strong>. Mojo, как и многие компилируемые языки, использует типы данных фиксированного размера (например, 64-битное целое). Python же по умолчанию использует длинную арифметику, позволяя работать с целыми числами практически неограниченного размера.</p>
  <p id="igrt">Это идеальная иллюстрация того, что Mojo — это не &quot;улучшенный Python&quot;. Это другой язык со своими правилами и своими, более низкоуровневыми, компромиссами. </p>
  <p id="2hJ2"></p>
  <h2 id="cUel">Тест №2: Простые числа. Неожиданный триумф</h2>
  <p id="uMcR">Если на факториале Mojo сел в лужу, то на вычислительно сложной задаче — подсчёте простых чисел — он показал себя во всей красе. Автор написал три одинаково наивных реализации: на чистом Python, на NumPy и на Mojo.</p>
  <p id="qB2R">Результаты для подсчёта простых чисел до 20 000:</p>
  <ul id="06YY">
    <li id="nlwm"><strong>Чистый Python:</strong> ~0.45 секунды</li>
    <li id="KDwE"><strong>NumPy:</strong> ~0.26 секунды</li>
    <li id="Fc5I"><strong>Mojo:</strong> ~0.011 секунды</li>
  </ul>
  <p id="7QDw"></p>
  <section style="background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="PLGa">Mojo оказался быстрее чистого Python примерно в 40 раз, и быстрее NumPy — в 20 раз.</p>
  </section>
  <p id="VR9K">И вот это уже очень серьёзная заявка. Обогнать NumPy, который под капотом использует оптимизированный код на C, в 20 раз — это впечатляет. Особенно если учесть, что синтаксис Mojo действительно проще для изучения, чем Rust или C++.</p>
  <p id="7Lsz"></p>
  <p id="PgaD">Что мы имеем в сухом остатке? Как будто есть потенциал. Идея получить язык, который синтаксически близок к Python, но даёт производительность на уровне (а иногда и выше) компилируемых языков, звучит заманчиво.</p>
  <p id="TqMI">Не можешь победить — присоединись 🤪</p>
  <p id="HX7a"></p>
  <figure id="gkt3" class="m_custom">
    <iframe srcdoc="<!DOCTYPE html>
<html lang=&quot;ru&quot;>
<head>
    <meta charset=&quot;UTF-8&quot;>
    <meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;>
    <title>Интерактивная плашка</title>
    <script src=&quot;https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js&quot;></script>
    <style>
        @import url(&#x27;https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap&#x27;);

        :root {
            --bg-color: #0d1117;
            --bg-gradient-start: #1c2128;
            --card-bg-color: rgba(22, 27, 34, 0.75);
            --border-color: rgba(48, 54, 61, 0.8);
            --text-color: #e6edf3;
            --text-secondary-color: #7d8590;
            
            --color-telegram: #2AABEE;
            --color-donate: #DB61A2;
            --color-dzen: #FF8C00;
        }

        @keyframes fadeInSlideUp {
            from { opacity: 0; transform: translateY(10px); }
            to { opacity: 1; transform: translateY(0); }
        }
        
        @keyframes popIn {
            from { transform: scale(0.7); opacity: 0; }
            to { transform: scale(1); opacity: 1; }
        }

        body {
            margin: 0;
            padding: 16px;
            box-sizing: border-box;
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background-color: var(--bg-color);
            background-image: 
                radial-gradient(circle at center, var(--bg-gradient-start) 0%, var(--bg-color) 80%),
                url(&quot;data:image/svg+xml,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; width=&#x27;20&#x27; height=&#x27;20&#x27;%3E%3Crect width=&#x27;20&#x27; height=&#x27;20&#x27; fill=&#x27;none&#x27;/%3E%3Ccircle cx=&#x27;4&#x27; cy=&#x27;4&#x27; r=&#x27;1&#x27; fill=&#x27;rgba(255,255,255,0.04)&#x27;/%3E%3C/svg%3E&quot;);
            font-family: &#x27;Inter&#x27;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, sans-serif;
            color: var(--text-color);
        }

        .promo-block {
            display: flex;
            flex-direction: column;
            gap: 16px;
            width: 100%;
            max-width: 420px;
        }

        .main-card {
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 16px;
            background-color: var(--card-bg-color);
            backdrop-filter: blur(12px);
            border: 1px solid var(--border-color);
            border-radius: 12px;
            cursor: pointer;
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            animation: fadeInSlideUp 0.5s ease-out forwards;
        }
        .main-card:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 5px -5px rgba(219, 97, 162, 0.3);
        }

        .main-card-header {
            display: flex;
            align-items: center;
            gap: 12px;
            margin-bottom: 12px;
            min-height: 34px;
        }
        
        .main-card-header .icon { width: 28px; height: 28px; color: var(--color-donate); }
        .main-card-header h3 { font-size: 1.25rem; font-weight: 600; margin: 0; display:flex; align-items:center; gap: 8px;}
        .main-card-header .icon-check { color: #3fb950; animation: popIn 0.3s ease-out; }

        .qr-code-wrapper {
            background-color: #ffffff;
            padding: 5px;
            border-radius: 8px;
            width: 130px;
            height: 130px;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .qr-code-wrapper img, .qr-code-wrapper canvas {
            display: block;
            border-radius: 4px;
        }
        
        .link-text {
            font-size: 0.85rem;
            color: var(--text-secondary-color);
            margin-top: 12px;
            word-break: break-all;
            line-height: 1.4;
            text-align: center;
        }
        
        .secondary-actions {
            display: flex;
            flex-direction: column;
            gap: 12px;
        }

        .action-item {
            display: flex;
            align-items: center;
            gap: 16px;
            padding: 16px;
            background-color: var(--card-bg-color);
            backdrop-filter: blur(12px);
            border: 1px solid var(--border-color);
            border-radius: 10px;
            cursor: pointer;
            opacity: 0;
            transform: translateY(10px);
            transition: transform 0.3s ease, box-shadow 0.3s ease;
            animation: fadeInSlideUp 0.5s ease-out forwards;
        }
        .action-item:nth-child(1) { animation-delay: 0.1s; }
        .action-item:nth-child(2) { animation-delay: 0.2s; }

        .action-item.telegram:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 15px -5px rgba(42, 171, 238, 0.4);
        }
        .action-item.dzen:hover {
            transform: translateY(-4px);
            box-shadow: 0 0 15px -5px rgba(255, 140, 0, 0.4);
        }

        .action-icon-wrapper {
            width: 40px;
            height: 40px;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            flex-shrink: 0;
        }
        .action-icon-wrapper.telegram-bg { background-color: rgba(42, 171, 238, 0.15); color: var(--color-telegram); }
        .action-icon-wrapper.dzen-bg { background-color: rgba(255, 140, 0, 0.15); color: var(--color-dzen); }
        .action-icon-wrapper .icon { width: 22px; height: 22px; }

        .action-text { line-height: 1.4; }
        .action-text h4 { font-size: 1rem; font-weight: 500; margin: 0 0 2px 0; }
        .action-text span { font-size: 0.85rem; color: var(--text-secondary-color); }

        .copy-indicator {
            margin-left: auto;
            background: none;
            border: none;
            padding: 8px;
            color: var(--text-secondary-color);
            display: flex;
            align-items: center;
            justify-content: center;
            flex-shrink: 0;
        }
        .copy-indicator .icon { width: 20px; height: 20px; }
        .copy-indicator .icon-check { animation: popIn 0.3s ease-out; }
        
        @media (min-width: 800px) {
            .promo-block {
                flex-direction: row;
                align-items: center;
                max-width: 860px;
                gap: 24px;
            }
            .main-card { flex: 1.2; }
            .secondary-actions { flex: 1; justify-content: center;}
        }
    </style>
</head>
<body>

    <div class=&quot;promo-block&quot;>
        <div class=&quot;main-card&quot; data-link=&quot;https://pay.cloudtips.ru/p/3a37d9ef&quot;>
            <div class=&quot;main-card-header&quot;>
                <h3><svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z&quot; /></svg><span>Поддержать</span></h3>
            </div>
            <div class=&quot;qr-code-wrapper&quot; id=&quot;qr-donate&quot;></div>
            <p class=&quot;link-text&quot;>pay.cloudtips.ru/p/3a37d9ef</p>
        </div>
        <div class=&quot;secondary-actions&quot;>
            <div class=&quot;action-item telegram&quot; data-link=&quot;https://t.me/pythontalk_ru&quot;>
                <div class=&quot;action-icon-wrapper telegram-bg&quot;>
                    <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5&quot; /></svg>
                </div>
                <div class=&quot;action-text&quot;>
                    <h4>Канал в Telegram</h4>
                    <span>t.me/pythontalk_ru</span>
                </div>
                <div class=&quot;copy-indicator&quot;>
                    <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m9.75 11.625c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H15M12 15h3.75&quot; /></svg>
                </div>
            </div>
             <div class=&quot;action-item dzen&quot; data-link=&quot;https://dzen.ru/pythontalk&quot;>
                <div class=&quot;action-icon-wrapper dzen-bg&quot;>
                    <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 01-2.25 2.25M16.5 7.5V18a2.25 2.25 0 002.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 002.25 2.25h13.5&quot; /></svg>
                </div>
                <div class=&quot;action-text&quot;>
                    <h4>Блог на Дзен</h4>
                    <span>dzen.ru/pythontalk</span>
                </div>
                <div class=&quot;copy-indicator&quot;>
                    <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m9.75 11.625c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H15M12 15h3.75&quot; /></svg>
                </div>
            </div>
        </div>
    </div>
    
    <script>
        document.addEventListener(&#x27;DOMContentLoaded&#x27;, () => {
            const checkIconHTML = &#x60;<svg class=&quot;icon icon-check&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M4.5 12.75l6 6 9-13.5&quot; /></svg>&#x60;;
            
            function setupMainCopyAction(card) {
                const link = card.dataset.link;
                const header = card.querySelector(&#x27;.main-card-header h3&#x27;);
                if (!link || !header) return;

                const originalHeaderHTML = header.innerHTML;
                let isClickable = true;

                card.addEventListener(&#x27;click&#x27;, () => {
                    if (!isClickable) return;
                    navigator.clipboard.writeText(link).then(() => {
                        header.innerHTML = &#x60;<span class=&quot;icon-check&quot;>${checkIconHTML}</span><span>Ссылка скопирована!</span>&#x60;;
                        isClickable = false;
                        setTimeout(() => {
                            header.innerHTML = originalHeaderHTML;
                            isClickable = true;
                        }, 2000);
                    }).catch(err => console.error(&#x27;Ошибка копирования:&#x27;, err));
                });
            }

            function setupItemCopyAction(item) {
                const link = item.dataset.link;
                const indicator = item.querySelector(&#x27;.copy-indicator&#x27;);
                if (!link || !indicator) return;

                const originalIndicatorHTML = indicator.innerHTML;
                let isClickable = true;

                item.addEventListener(&#x27;click&#x27;, () => {
                    if (!isClickable) return;
                    navigator.clipboard.writeText(link).then(() => {
                        indicator.innerHTML = checkIconHTML;
                        isClickable = false;
                        setTimeout(() => {
                            indicator.innerHTML = originalIndicatorHTML;
                            isClickable = true;
                        }, 2000);
                    }).catch(err => console.error(&#x27;Ошибка копирования:&#x27;, err));
                });
            }

            const mainCard = document.querySelector(&#x27;.main-card&#x27;);
            if (mainCard) {
                setupMainCopyAction(mainCard);
                const qrContainer = mainCard.querySelector(&#x27;.qr-code-wrapper&#x27;);
                if (qrContainer && typeof QRCode !== &#x27;undefined&#x27;) {
                    new QRCode(qrContainer, {
                        text: mainCard.dataset.link,
                        width: 120, height: 120,
                        colorDark: &quot;#000000&quot;, colorLight: &quot;#ffffff&quot;,
                        correctLevel: QRCode.CorrectLevel.H
                    });
                }
            }

            document.querySelectorAll(&#x27;.action-item&#x27;).forEach(setupItemCopyAction);
        });
    </script>
</body>
"></iframe>
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://pythontalk.olegtalks.ru/gemma-3n-release</guid><link>https://pythontalk.olegtalks.ru/gemma-3n-release?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=pythontalk</link><comments>https://pythontalk.olegtalks.ru/gemma-3n-release?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=pythontalk#comments</comments><dc:creator>pythontalk</dc:creator><title>Gemma 3n: новый компактная модель от Google</title><pubDate>Fri, 27 Jun 2025 05:10:56 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/dc/24/dc249afc-09b0-489c-8ba9-e12666eec7e7.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/da/d1/dad16a6b-07f6-45dd-ae6b-772654de1811.png"></img>Gemma 3n — модель, которая фокусируется не на размере, а на эффективности и работе прямо на устройствах. Давайте разберёмся, что там под капотом и есть ли в этом реальная польза для разработчика.]]></description><content:encoded><![CDATA[
  <p id="aBx6">Gemma 3n — модель, которая фокусируется не на размере, а на эффективности и работе прямо на устройствах. Давайте разберёмся, что там под капотом и есть ли в этом реальная польза для разработчика.</p>
  <figure id="Gf9a" class="m_column">
    <iframe src="https://www.youtube.com/embed/eJFJRyXEHZ0?autoplay=0&loop=0&mute=0"></iframe>
  </figure>
  <p id="5gYh"></p>
  <h2 id="ctHV">Что под капотом? Архитектура «Матрёшка»</h2>
  <p id="5WnI">Самая интересная фишка Gemma 3n — это архитектура MatFormer (Matryoshka Transformer). Аналогия с матрёшкой тут прямая: большая модель содержит внутри себя несколько полностью функциональных моделей поменьше.</p>
  <figure id="e1lm" class="m_custom">
    <img src="https://img2.teletype.in/files/da/d1/dad16a6b-07f6-45dd-ae6b-772654de1811.png" width="1073" />
  </figure>
  <p id="izQc">На практике это даёт разработчику две крутые возможности:</p>
  <ol id="I8gJ">
    <li id="CPoN"><strong>Готовые модели разного размера.</strong> Google сразу предлагает две версии: E4B (эффективные 4 млрд параметров) и E2B (2 млрд). E2B — это не отдельная модель, а просто «извлечённый» слой из E4B, который работает до 2 раз быстрее. Можно выбрать, что важнее: производительность или скорость.</li>
    <li id="EOhS"><strong>Создание кастомных моделей.</strong> С помощью техники &quot;Mix-n-Match&quot; можно самостоятельно «нарезать» модель нужного размера между E2B и E4B, подгоняя её под конкретные аппаратные ограничения. Это уже уровень серьёзного инженерного контроля, а не просто использование готового API.</li>
  </ol>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="7sqv">Gemma 3n E4B стала первой моделью &lt;10B параметров, набравшей &gt;1300 на LMArena. Требует всего 3ГБ памяти. Понимает текст, код, изображения, аудио и видео.</p>
  </section>
  <figure id="9w0d" class="m_custom">
    <img src="https://img2.teletype.in/files/5b/2a/5b2a4602-2c55-4b1d-9bc8-a38c8365e25c.png" width="1035" />
  </figure>
  <p id="gBsx">Всё это дополняется технологией Per-Layer Embeddings (PLE), которая позволяет держать в быстрой памяти (VRAM) только ядро модели (2-4 млрд параметров), а остальные веса грузить из обычной оперативки.</p>
  <p id="8ZjO"></p>
  <h2 id="Vh3k">Так, а для программиста что?</h2>
  <p id="az4O">Хорошо, архитектура интересная, но в чём практическая польза?</p>
  <p id="HSym">Во-первых, и в-главных, <strong>улучшения в программировании и логических задачах</strong>. Во-вторых, <strong>полная автономность</strong>. Возможность запускать мощную модель локально — это киллер-фича.</p>
  <ul id="oiMS">
    <li id="igR3"><strong>Приватность:</strong> Больше не нужно отправлять свой проприетарный или просто чувствительный код в облако какому-то дяде. Всё остаётся на вашей машине.</li>
    <li id="x4tb"><strong>Работа оффлайн:</strong> Можно пилить приложения, которые не зависят от интернет-соединения. Для мобильной разработки или утилит, работающих в закрытых корпоративных сетях, — это золото.</li>
    <li id="qOJL"><strong>Никаких API и rate-лимитов:</strong> Вы полностью контролируете модель. Никто не выставит вам внезапно счёт на тысячи долларов и не заблокирует доступ за превышение лимитов.</li>
  </ul>
  <p id="mfyc">В-третьих, <strong>мультимодальность на практике</strong>. Представьте себе плагин для IDE, которому можно скормить скриншот ошибки из чужого приложения, и он предложит код для её исправления. Или голосовое управление разработкой, которое работает без лагов и задержек. С локальными мультимодальными моделями это перестаёт быть фантастикой.</p>
  <p id="tknx"></p>
  <p id="lK55">Gemma 3n уже интегрирована в самые популярные инструменты, которые мы все используем:</p>
  <ul id="CuKO">
    <li id="P4vw"><strong>Hugging Face Transformers:</strong> качаете веса и вперёд.</li>
    <li id="VfK1"><strong>llama.cpp:</strong> для тех, кто любит максимальную производительность на CPU.</li>
    <li id="O6mw"><strong>Ollama:</strong> самый простой способ запустить модель локально одной командой.</li>
    <li id="5Qyc"><strong>MLX:</strong> для яблочных энтузиастов с чипами Apple Silicon.</li>
  </ul>
  <p id="Q7Zi"></p>
  <p id="YlX7">Google также выложила модели на <a href="https://huggingface.co/collections/google/gemma-3n-685065323f5984ef315c93f4" target="_blank">Hugging Face</a> и <a href="https://www.kaggle.com/models/google/gemma-3n" target="_blank">Kaggle</a>, а для быстрых тестов есть <a href="https://aistudio.google.com/prompts/new_chat?model=gemma-3n-e4b-it" target="_blank">Google AI Studio</a>.</p>
  <p id="NLot"></p>
  <figure id="yAoD" class="m_custom">
    <iframe srcdoc="<!DOCTYPE html>
<html lang=&quot;ru&quot;>
<head>
    <meta charset=&quot;UTF-8&quot;>
    <meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;>
    <title>Интерактивная плашка</title>
    <script src=&quot;https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js&quot;></script>
    <style>
        @import url(&#x27;https://fonts.googleapis.com/css2?family=Inter:wght@500;600&display=swap&#x27;);

        :root {
            --bg-color: #0d1117;
            --card-bg-color: #161b22;
            --border-color: #30363d;
            --text-color: #e6edf3;
            --text-secondary-color: #7d8590;
            
            --color-telegram: #2AABEE;
            --color-donate: #DB61A2;
            --color-dzen: #FF8C00;
        }

        body {
            margin: 0;
            padding: 16px;
            box-sizing: border-box;
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background-color: var(--bg-color);
            font-family: &#x27;Inter&#x27;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, sans-serif;
            color: var(--text-color);
        }

        .container {
            display: flex;
            gap: 16px;
            width: 100%;
            max-width: 840px;
            align-items: stretch;
        }
        
        .card {
            flex: 1;
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 20px;
            background-color: var(--card-bg-color);
            border: 1px solid var(--border-color);
            border-radius: 10px;
            text-align: center;
            transition: border-color 0.2s ease-in-out;
        }
        
        .card-telegram:hover { border-color: var(--color-telegram); }
        .card-donate:hover { border-color: var(--color-donate); }
        .card-dzen:hover { border-color: var(--color-dzen); }

        .card-header {
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 10px;
            margin-bottom: 16px;
            width: 100%;
        }

        .card-header .icon {
            width: 24px;
            height: 24px;
            flex-shrink: 0;
        }

        .card-header h3 {
            font-size: 1.1rem;
            font-weight: 600;
            margin: 0;
        }
        
        .card-telegram .icon, .card-telegram h3 { color: var(--color-telegram); }
        .card-donate .icon, .card-donate h3 { color: var(--color-donate); }
        .card-dzen .icon, .card-dzen h3 { color: var(--color-dzen); }

        .qr-code-wrapper {
            background-color: #ffffff;
            padding: 4px;
            border-radius: 6px;
            margin-bottom: 16px;
            width: 100px;
            height: 100px;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .qr-code-wrapper canvas {
            border-radius: 4px;
        }

        .copy-btn {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            gap: 8px;
            width: 100%;
            padding: 8px 16px;
            border-radius: 8px;
            border: none;
            font-size: 0.95rem;
            font-weight: 500;
            color: var(--text-secondary-color);
            background-color: var(--border-color);
            cursor: pointer;
            transition: background-color 0.2s ease, color 0.2s ease;
            white-space: nowrap;
        }

        .copy-btn:hover {
            background-color: #3e444d;
            color: var(--text-color);
        }

        .copy-btn .icon {
            width: 18px;
            height: 18px;
            flex-shrink: 0;
        }

        .copy-btn .icon-check {
            color: #3fb950;
        }

        @media (max-width: 800px) {
            .container {
                flex-direction: column;
            }
        }
    </style>
</head>
<body>

    <main class=&quot;container&quot;>
        <div class=&quot;card card-telegram&quot; data-link=&quot;https://t.me/pythontalk_ru&quot;>
            <div class=&quot;card-header&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;>
                    <path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5&quot; />
                </svg>
                <h3>Канал в Telegram</h3>
            </div>
            <div class=&quot;qr-code-wrapper&quot; id=&quot;qr-telegram&quot;></div>
            <button class=&quot;copy-btn&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&quot; /><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&quot; /></svg>
                <span>Копировать ссылку</span>
            </button>
        </div>

        <div class=&quot;card card-donate&quot; data-link=&quot;https://pay.cloudtips.ru/p/3a37d9ef&quot;>
            <div class=&quot;card-header&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;>
                    <path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z&quot; />
                </svg>
                <h3>Поддержать</h3>
            </div>
            <div class=&quot;qr-code-wrapper&quot; id=&quot;qr-donate&quot;></div>
            <button class=&quot;copy-btn&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&quot; /><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&quot; /></svg>
                <span>Копировать ссылку</span>
            </button>
        </div>
        
        <div class=&quot;card card-dzen&quot; data-link=&quot;https://dzen.ru/pythontalk&quot;>
            <div class=&quot;card-header&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;>
                    <path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 01-2.25 2.25M16.5 7.5V18a2.25 2.25 0 002.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 002.25 2.25h13.5&quot; />
                </svg>
                <h3>Блог на Дзен</h3>
            </div>
            <div class=&quot;qr-code-wrapper&quot; id=&quot;qr-dzen&quot;></div>
            <button class=&quot;copy-btn&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&quot; /><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&quot; /></svg>
                <span>Копировать ссылку</span>
            </button>
        </div>
    </main>
    
    <script>
        document.addEventListener(&#x27;DOMContentLoaded&#x27;, () => {
            const qrSize = 92;
            const copiedStateHTML = &#x60;
                <svg class=&quot;icon icon-check&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;>
                    <path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M4.5 12.75l6 6 9-13.5&quot; />
                </svg>
                <span>Скопировано</span>&#x60;;
            
            document.querySelectorAll(&#x27;.card&#x27;).forEach(card => {
                const link = card.dataset.link;
                const qrContainer = card.querySelector(&#x27;.qr-code-wrapper&#x27;);
                const copyButton = card.querySelector(&#x27;.copy-btn&#x27;);
                
                if (!link || !qrContainer || !copyButton) return;
                
                const originalButtonHTML = copyButton.innerHTML;

                if (typeof QRCode !== &#x27;undefined&#x27;) {
                    new QRCode(qrContainer, {
                        text: link,
                        width: qrSize,
                        height: qrSize,
                        colorDark: &quot;#000000&quot;,
                        colorLight: &quot;#ffffff&quot;,
                        correctLevel: QRCode.CorrectLevel.H
                    });
                }

                copyButton.addEventListener(&#x27;click&#x27;, () => {
                    if (copyButton.disabled) return;

                    navigator.clipboard.writeText(link).then(() => {
                        copyButton.innerHTML = copiedStateHTML;
                        copyButton.disabled = true;

                        setTimeout(() => {
                            copyButton.innerHTML = originalButtonHTML;
                            copyButton.disabled = false;
                        }, 2000);
                    }).catch(err => {
                        console.error(&#x27;Ошибка копирования:&#x27;, err);
                    });
                });
            });
        });
    </script>
</body>
"></iframe>
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://pythontalk.olegtalks.ru/mamba-it-husbands</guid><link>https://pythontalk.olegtalks.ru/mamba-it-husbands?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=pythontalk</link><comments>https://pythontalk.olegtalks.ru/mamba-it-husbands?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=pythontalk#comments</comments><dc:creator>pythontalk</dc:creator><title>Конец эпохи: почему айтишники больше не самые завидные женихи России</title><pubDate>Thu, 26 Jun 2025 08:05:36 GMT</pubDate><category>Новости</category><description><![CDATA[Пузырь хайпа вокруг IT, раздуваемый последние несколько лет лозунгами «войти в айти за 2 месяца и получать 300к», похоже, начал сдуваться. Очередной звоночек пришёл не с рынка труда, а из сферы куда более приземлённой — с сайта знакомств. Исследование Mamba показало: образ айтишника как идеального мужа теряет свою привлекательность.]]></description><content:encoded><![CDATA[
  <p id="7r38">Пузырь хайпа вокруг IT, раздуваемый последние несколько лет лозунгами «войти в айти за 2 месяца и получать 300к», похоже, начал сдуваться. Очередной звоночек пришёл не с рынка труда, а из сферы куда более приземлённой — с сайта знакомств. Исследование Mamba <a href="https://ria.ru/20250626/muzh-2025492124.html" target="_blank">показало</a>: образ айтишника как идеального мужа теряет свою привлекательность.</p>
  <p id="v9Da"></p>
  <h2 id="6Al9">Падение с пьедестала: что говорят цифры</h2>
  <p id="1MBU">Давайте посмотрим на результаты исследования, в котором приняли участие почти 3 тысячи человек. </p>
  <ul id="hha4">
    <li id="baUd"><strong>Резкое падение:</strong> Если в 2023 году 72% опрошенных женщин видели в IT-специалисте идеального кандидата в мужья, то сегодня эта цифра упала до 27%.</li>
    <li id="9bU7"><strong>Новые лидеры:</strong> Пальму первенства перехватили врачи (43%) и стоматологи (38%). На третьем месте — предприниматели (36%).</li>
    <li id="JYmc"><strong>Причина падения:</strong> Основной контраргумент — «Да, доход хороший, но слишком уж привязан к своему компьютеру». Стереотип о богатом и умном партнёре сменился образом замкнутого и социально неадаптированного человека.</li>
    <li id="n8w0"><strong>Родительский (не)респект:</strong> В рейтинге «зятьёв, которых одобрит мама» айтишники оказались почти на дне, обогнав только артистов и музыкантов. Лишь 3% девушек верят в гордость родителей за «зятя-компьютерщика».</li>
  </ul>
  <p id="IeLf"></p>
  <h2 id="zhKC">Почему так произошло?</h2>
  <ol id="DqIn">
    <li id="DwCU"><strong>Перенасыщение и девальвация.</strong> Когда «айтишником» становится каждый второй выпускник онлайн-курсов, ценность самого термина размывается. Из касты избранных IT-специалисты превратились в массовую профессию, как юристы и экономисты в 2000-х.</li>
    <li id="FuAd"><strong>Реальность удалёнки.</strong> Пандемия и массовый переход на удалёнку сыграли злую шутку. То, что казалось преимуществом (работа из дома), обернулось социальной изоляцией. </li>
    <li id="ewUs"><strong>Стабильность &gt; Хайп.</strong> Эпоха дикого роста прошла. Зарплаты джунов уже не поражают воображение, а конкуренция высока как никогда. На этом фоне карьера врача или стоматолога, хоть и более сложная на старте, воспринимается как более стабильная и предсказуемая в долгосрочной перспективе.</li>
  </ol>
  <figure id="H40x" class="m_custom">
    <iframe srcdoc="<!DOCTYPE html>
<html lang=&quot;ru&quot;>
<head>
    <meta charset=&quot;UTF-8&quot;>
    <meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;>
    <title>Интерактивная плашка</title>
    <script src=&quot;https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js&quot;></script>
    <style>
        @import url(&#x27;https://fonts.googleapis.com/css2?family=Inter:wght@500;600&display=swap&#x27;);

        :root {
            --bg-color: #0d1117;
            --card-bg-color: #161b22;
            --border-color: #30363d;
            --text-color: #e6edf3;
            --text-secondary-color: #7d8590;
            
            --color-telegram: #2AABEE;
            --color-donate: #DB61A2;
            --color-dzen: #FF8C00;
        }

        body {
            margin: 0;
            padding: 16px;
            box-sizing: border-box;
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background-color: var(--bg-color);
            font-family: &#x27;Inter&#x27;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, sans-serif;
            color: var(--text-color);
        }

        .container {
            display: flex;
            gap: 16px;
            width: 100%;
            max-width: 840px;
            align-items: stretch;
        }
        
        .card {
            flex: 1;
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 20px;
            background-color: var(--card-bg-color);
            border: 1px solid var(--border-color);
            border-radius: 10px;
            text-align: center;
            transition: border-color 0.2s ease-in-out;
        }
        
        .card-telegram:hover { border-color: var(--color-telegram); }
        .card-donate:hover { border-color: var(--color-donate); }
        .card-dzen:hover { border-color: var(--color-dzen); }

        .card-header {
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 10px;
            margin-bottom: 16px;
            width: 100%;
        }

        .card-header .icon {
            width: 24px;
            height: 24px;
            flex-shrink: 0;
        }

        .card-header h3 {
            font-size: 1.1rem;
            font-weight: 600;
            margin: 0;
        }
        
        .card-telegram .icon, .card-telegram h3 { color: var(--color-telegram); }
        .card-donate .icon, .card-donate h3 { color: var(--color-donate); }
        .card-dzen .icon, .card-dzen h3 { color: var(--color-dzen); }

        .qr-code-wrapper {
            background-color: #ffffff;
            padding: 4px;
            border-radius: 6px;
            margin-bottom: 16px;
            width: 100px;
            height: 100px;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .qr-code-wrapper canvas {
            border-radius: 4px;
        }

        .copy-btn {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            gap: 8px;
            width: 100%;
            padding: 8px 16px;
            border-radius: 8px;
            border: none;
            font-size: 0.95rem;
            font-weight: 500;
            color: var(--text-secondary-color);
            background-color: var(--border-color);
            cursor: pointer;
            transition: background-color 0.2s ease, color 0.2s ease;
            white-space: nowrap;
        }

        .copy-btn:hover {
            background-color: #3e444d;
            color: var(--text-color);
        }

        .copy-btn .icon {
            width: 18px;
            height: 18px;
            flex-shrink: 0;
        }

        .copy-btn .icon-check {
            color: #3fb950;
        }

        @media (max-width: 800px) {
            .container {
                flex-direction: column;
            }
        }
    </style>
</head>
<body>

    <main class=&quot;container&quot;>
        <div class=&quot;card card-telegram&quot; data-link=&quot;https://t.me/pythontalk_ru&quot;>
            <div class=&quot;card-header&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;>
                    <path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5&quot; />
                </svg>
                <h3>Канал в Telegram</h3>
            </div>
            <div class=&quot;qr-code-wrapper&quot; id=&quot;qr-telegram&quot;></div>
            <button class=&quot;copy-btn&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&quot; /><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&quot; /></svg>
                <span>Копировать ссылку</span>
            </button>
        </div>

        <div class=&quot;card card-donate&quot; data-link=&quot;https://pay.cloudtips.ru/p/3a37d9ef&quot;>
            <div class=&quot;card-header&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;>
                    <path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z&quot; />
                </svg>
                <h3>Поддержать</h3>
            </div>
            <div class=&quot;qr-code-wrapper&quot; id=&quot;qr-donate&quot;></div>
            <button class=&quot;copy-btn&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&quot; /><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&quot; /></svg>
                <span>Копировать ссылку</span>
            </button>
        </div>
        
        <div class=&quot;card card-dzen&quot; data-link=&quot;https://dzen.ru/pythontalk&quot;>
            <div class=&quot;card-header&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;>
                    <path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 01-2.25 2.25M16.5 7.5V18a2.25 2.25 0 002.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 002.25 2.25h13.5&quot; />
                </svg>
                <h3>Блог на Дзен</h3>
            </div>
            <div class=&quot;qr-code-wrapper&quot; id=&quot;qr-dzen&quot;></div>
            <button class=&quot;copy-btn&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&quot; /><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&quot; /></svg>
                <span>Копировать ссылку</span>
            </button>
        </div>
    </main>
    
    <script>
        document.addEventListener(&#x27;DOMContentLoaded&#x27;, () => {
            const qrSize = 92;
            const copiedStateHTML = &#x60;
                <svg class=&quot;icon icon-check&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;>
                    <path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M4.5 12.75l6 6 9-13.5&quot; />
                </svg>
                <span>Скопировано</span>&#x60;;
            
            document.querySelectorAll(&#x27;.card&#x27;).forEach(card => {
                const link = card.dataset.link;
                const qrContainer = card.querySelector(&#x27;.qr-code-wrapper&#x27;);
                const copyButton = card.querySelector(&#x27;.copy-btn&#x27;);
                
                if (!link || !qrContainer || !copyButton) return;
                
                const originalButtonHTML = copyButton.innerHTML;

                if (typeof QRCode !== &#x27;undefined&#x27;) {
                    new QRCode(qrContainer, {
                        text: link,
                        width: qrSize,
                        height: qrSize,
                        colorDark: &quot;#000000&quot;,
                        colorLight: &quot;#ffffff&quot;,
                        correctLevel: QRCode.CorrectLevel.H
                    });
                }

                copyButton.addEventListener(&#x27;click&#x27;, () => {
                    if (copyButton.disabled) return;

                    navigator.clipboard.writeText(link).then(() => {
                        copyButton.innerHTML = copiedStateHTML;
                        copyButton.disabled = true;

                        setTimeout(() => {
                            copyButton.innerHTML = originalButtonHTML;
                            copyButton.disabled = false;
                        }, 2000);
                    }).catch(err => {
                        console.error(&#x27;Ошибка копирования:&#x27;, err);
                    });
                });
            });
        });
    </script>
</body>
"></iframe>
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://pythontalk.olegtalks.ru/gemini-cli-release</guid><link>https://pythontalk.olegtalks.ru/gemini-cli-release?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=pythontalk</link><comments>https://pythontalk.olegtalks.ru/gemini-cli-release?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=pythontalk#comments</comments><dc:creator>pythontalk</dc:creator><title>Gemini CLI: бесплатный AI-ассистент от Google, который живёт в вашем терминале</title><pubDate>Thu, 26 Jun 2025 04:30:04 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/39/7f/397fc4b4-6587-4059-92d7-7f5981447579.png"></media:content><category>Опенсорс</category><description><![CDATA[<img src="https://img4.teletype.in/files/f6/9d/f69dfb8d-30ac-4cc5-b1b2-ffbdd01d3700.png"></img>На днях Google зарелизили Gemini CLI — открытого AI-агента, который интегрируется прямо в командную строку. Это инструмент для командной строки, который даёт вам прямой доступ к возможностям модели Gemini. Вы можете общаться с ним в режиме чата прямо в терминале, давать ему доступ к файлам вашего проекта, просить проанализировать код, автоматизировать рутину и многое другое.]]></description><content:encoded><![CDATA[
  <p id="1XBA">На днях Google <a href="https://blog.google/technology/developers/introducing-gemini-cli-open-source-ai-agent/" target="_blank">зарелизили</a> Gemini CLI — открытого AI-агента, который интегрируется прямо в командную строку. Это инструмент для командной строки, который даёт вам прямой доступ к возможностям модели Gemini. Вы можете общаться с ним в режиме чата прямо в терминале, давать ему доступ к файлам вашего проекта, просить проанализировать код, автоматизировать рутину и многое другое.</p>
  <figure id="JV4p" class="m_column">
    <img src="https://img4.teletype.in/files/f6/9d/f69dfb8d-30ac-4cc5-b1b2-ffbdd01d3700.png" width="2435" />
  </figure>
  <h2 id="dlMa">Ключевые фишки (за что стоит попробовать)</h2>
  <p id="oHzc">Давайте по пунктам, чем эта штука хороша.</p>
  <h3 id="Fdsn">1. Почти бесплатные и щедрые лимиты</h3>
  <p id="5Fac">Это, пожалуй, главный вау-фактор. Просто залогинившись своим личным Google-аккаунтом, вы получаете до 1000 запросов в день и 60 запросов в минуту. Для сравнения, аналоги от OpenAI или Anthropic за такие объемы попросят денег. Для большинства повседневных задач этого хватит с головой.</p>
  <figure id="P3AQ" class="m_column">
    <img src="https://img1.teletype.in/files/cb/17/cb17cbe6-b662-4224-91f1-9a68c64f8b0f.png" width="1000" />
  </figure>
  <h3 id="EEot">2. Работа с кодом и большим контекстом</h3>
  <p id="DM7I">Контекст составляет 1 миллион токенов. Это значит, что вы можете «скормить» ему почти любую кодовую базу, и он сможет отвечать на вопросы по архитектуре, искать баги или предлагать рефакторинг, держа в голове весь проект.</p>
  <h3 id="5X4P">3. Мультимодальность и взаимодействие с файлами</h3>
  <p id="E5TD">Gemini CLI может работать не только с текстом. Ему можно дать на вход PDF-файл с документацией или даже набросок интерфейса, и он попробует сгенерировать по нему приложение. Также он умеет работать с файлами на вашем диске: конвертировать картинки, организовывать документы и т.д.</p>
  <h3 id="9P5N">4. Интеграция с реальным миром (MCP)</h3>
  <p id="rjUH">Это уже для продвинутых. CLI поддерживает MCP серверы. Говоря проще, это способ подключить к Gemini внешние инструменты. Google уже предоставил серверы для работы со своими генераторами медиа: Imagen (картинки), Veo (видео) и Lyria (музыка). Теоретически, можно написать свой сервер для интеграции с чем угодно, от Jira до вашего умного чайника.</p>
  <h3 id="zK4U">5. Open Source</h3>
  <p id="iE5C">Код проекта <a href="https://github.com/google-gemini/gemini-cli" target="_blank">выложен</a> на GitHub под лицензией Apache 2.0. Это значит, что вы можете свободно его изучать, модифицировать и использовать в своих проектах.</p>
  <p id="xEh8"></p>
  <h2 id="GRFM">Как начать?</h2>
  <p id="0wSE">Для начала вам понадобится Node.js версии 18 или выше. </p>
  <p id="pH8h">Самый простой способ запустить — выполнить в терминале:</p>
  <pre id="tnW5" data-lang="bash">npx https://github.com/google-gemini/gemini-cli</pre>
  <p id="NqdJ">Либо можно установить глобально:</p>
  <pre id="embu" data-lang="bash">npm install -g @google/gemini-cli</pre>
  <p id="66Vz">При первом запуске он попросит залогиниться через Google-аккаунт.</p>
  <p id="epL2">Пробуем 🐸</p>
  <p id="zY8Y"></p>
  <figure id="yP70" class="m_custom">
    <iframe srcdoc="<!DOCTYPE html>
<html lang=&quot;ru&quot;>
<head>
    <meta charset=&quot;UTF-8&quot;>
    <meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;>
    <title>Интерактивная плашка</title>
    <script src=&quot;https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js&quot;></script>
    <style>
        @import url(&#x27;https://fonts.googleapis.com/css2?family=Inter:wght@500;600&display=swap&#x27;);

        :root {
            --bg-color: #0d1117;
            --card-bg-color: #161b22;
            --border-color: #30363d;
            --text-color: #e6edf3;
            --text-secondary-color: #7d8590;
            
            --color-telegram: #2AABEE;
            --color-donate: #DB61A2;
            --color-dzen: #FF8C00;
        }

        body {
            margin: 0;
            padding: 16px;
            box-sizing: border-box;
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background-color: var(--bg-color);
            font-family: &#x27;Inter&#x27;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, sans-serif;
            color: var(--text-color);
        }

        .container {
            display: flex;
            gap: 16px;
            width: 100%;
            max-width: 840px;
            align-items: stretch;
        }
        
        .card {
            flex: 1;
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 20px;
            background-color: var(--card-bg-color);
            border: 1px solid var(--border-color);
            border-radius: 10px;
            text-align: center;
            transition: border-color 0.2s ease-in-out;
        }
        
        .card-telegram:hover { border-color: var(--color-telegram); }
        .card-donate:hover { border-color: var(--color-donate); }
        .card-dzen:hover { border-color: var(--color-dzen); }

        .card-header {
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 10px;
            margin-bottom: 16px;
            width: 100%;
        }

        .card-header .icon {
            width: 24px;
            height: 24px;
            flex-shrink: 0;
        }

        .card-header h3 {
            font-size: 1.1rem;
            font-weight: 600;
            margin: 0;
        }
        
        .card-telegram .icon, .card-telegram h3 { color: var(--color-telegram); }
        .card-donate .icon, .card-donate h3 { color: var(--color-donate); }
        .card-dzen .icon, .card-dzen h3 { color: var(--color-dzen); }

        .qr-code-wrapper {
            background-color: #ffffff;
            padding: 4px;
            border-radius: 6px;
            margin-bottom: 16px;
            width: 100px;
            height: 100px;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .qr-code-wrapper canvas {
            border-radius: 4px;
        }

        .copy-btn {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            gap: 8px;
            width: 100%;
            padding: 8px 16px;
            border-radius: 8px;
            border: none;
            font-size: 0.95rem;
            font-weight: 500;
            color: var(--text-secondary-color);
            background-color: var(--border-color);
            cursor: pointer;
            transition: background-color 0.2s ease, color 0.2s ease;
            white-space: nowrap;
        }

        .copy-btn:hover {
            background-color: #3e444d;
            color: var(--text-color);
        }

        .copy-btn .icon {
            width: 18px;
            height: 18px;
            flex-shrink: 0;
        }

        .copy-btn .icon-check {
            color: #3fb950;
        }

        @media (max-width: 800px) {
            .container {
                flex-direction: column;
            }
        }
    </style>
</head>
<body>

    <main class=&quot;container&quot;>
        <div class=&quot;card card-telegram&quot; data-link=&quot;https://t.me/pythontalk_ru&quot;>
            <div class=&quot;card-header&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;>
                    <path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5&quot; />
                </svg>
                <h3>Канал в Telegram</h3>
            </div>
            <div class=&quot;qr-code-wrapper&quot; id=&quot;qr-telegram&quot;></div>
            <button class=&quot;copy-btn&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&quot; /><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&quot; /></svg>
                <span>Копировать ссылку</span>
            </button>
        </div>

        <div class=&quot;card card-donate&quot; data-link=&quot;https://pay.cloudtips.ru/p/3a37d9ef&quot;>
            <div class=&quot;card-header&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;>
                    <path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z&quot; />
                </svg>
                <h3>Поддержать</h3>
            </div>
            <div class=&quot;qr-code-wrapper&quot; id=&quot;qr-donate&quot;></div>
            <button class=&quot;copy-btn&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&quot; /><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&quot; /></svg>
                <span>Копировать ссылку</span>
            </button>
        </div>
        
        <div class=&quot;card card-dzen&quot; data-link=&quot;https://dzen.ru/pythontalk&quot;>
            <div class=&quot;card-header&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;>
                    <path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 01-2.25 2.25M16.5 7.5V18a2.25 2.25 0 002.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 002.25 2.25h13.5&quot; />
                </svg>
                <h3>Блог на Дзен</h3>
            </div>
            <div class=&quot;qr-code-wrapper&quot; id=&quot;qr-dzen&quot;></div>
            <button class=&quot;copy-btn&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&quot; /><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&quot; /></svg>
                <span>Копировать ссылку</span>
            </button>
        </div>
    </main>
    
    <script>
        document.addEventListener(&#x27;DOMContentLoaded&#x27;, () => {
            const qrSize = 92;
            const copiedStateHTML = &#x60;
                <svg class=&quot;icon icon-check&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;>
                    <path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M4.5 12.75l6 6 9-13.5&quot; />
                </svg>
                <span>Скопировано</span>&#x60;;
            
            document.querySelectorAll(&#x27;.card&#x27;).forEach(card => {
                const link = card.dataset.link;
                const qrContainer = card.querySelector(&#x27;.qr-code-wrapper&#x27;);
                const copyButton = card.querySelector(&#x27;.copy-btn&#x27;);
                
                if (!link || !qrContainer || !copyButton) return;
                
                const originalButtonHTML = copyButton.innerHTML;

                if (typeof QRCode !== &#x27;undefined&#x27;) {
                    new QRCode(qrContainer, {
                        text: link,
                        width: qrSize,
                        height: qrSize,
                        colorDark: &quot;#000000&quot;,
                        colorLight: &quot;#ffffff&quot;,
                        correctLevel: QRCode.CorrectLevel.H
                    });
                }

                copyButton.addEventListener(&#x27;click&#x27;, () => {
                    if (copyButton.disabled) return;

                    navigator.clipboard.writeText(link).then(() => {
                        copyButton.innerHTML = copiedStateHTML;
                        copyButton.disabled = true;

                        setTimeout(() => {
                            copyButton.innerHTML = originalButtonHTML;
                            copyButton.disabled = false;
                        }, 2000);
                    }).catch(err => {
                        console.error(&#x27;Ошибка копирования:&#x27;, err);
                    });
                });
            });
        });
    </script>
</body>
"></iframe>
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://pythontalk.olegtalks.ru/short-python-long-run</guid><link>https://pythontalk.olegtalks.ru/short-python-long-run?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=pythontalk</link><comments>https://pythontalk.olegtalks.ru/short-python-long-run?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=pythontalk#comments</comments><dc:creator>pythontalk</dc:creator><title>Футболка для Python-пикап-мастера 😏</title><pubDate>Tue, 24 Jun 2025 13:02:47 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/90/eb/90eb2f36-b685-471f-87af-67f5c8049649.png"></media:content><category>Смешняфка</category><description><![CDATA[<img src="https://img2.teletype.in/files/dd/3b/dd3b19bd-ad4a-44fc-be4a-7d1580e53db0.jpeg"></img>Кто не понял шутку — отмечайтесь в комментах 🌝]]></description><content:encoded><![CDATA[
  <figure id="TcNW" class="m_original">
    <img src="https://img2.teletype.in/files/dd/3b/dd3b19bd-ad4a-44fc-be4a-7d1580e53db0.jpeg" width="735" />
  </figure>
  <p id="NxeJ">Кто не понял шутку — отмечайтесь в комментах 🌝</p>
  <figure id="aXaJ" class="m_custom">
    <iframe srcdoc="<!DOCTYPE html>
<html lang=&quot;ru&quot;>
<head>
    <meta charset=&quot;UTF-8&quot;>
    <meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;>
    <title>Интерактивная плашка</title>
    <script src=&quot;https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js&quot;></script>
    <style>
        @import url(&#x27;https://fonts.googleapis.com/css2?family=Inter:wght@500;600&display=swap&#x27;);

        :root {
            --bg-color: #0d1117;
            --card-bg-color: #161b22;
            --border-color: #30363d;
            --text-color: #e6edf3;
            --text-secondary-color: #7d8590;
            
            --color-telegram: #2AABEE;
            --color-donate: #DB61A2;
            --color-dzen: #FF8C00;
        }

        body {
            margin: 0;
            padding: 16px;
            box-sizing: border-box;
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background-color: var(--bg-color);
            font-family: &#x27;Inter&#x27;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, sans-serif;
            color: var(--text-color);
        }

        .container {
            display: flex;
            gap: 16px;
            width: 100%;
            max-width: 840px;
            align-items: stretch;
        }
        
        .card {
            flex: 1;
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 20px;
            background-color: var(--card-bg-color);
            border: 1px solid var(--border-color);
            border-radius: 10px;
            text-align: center;
            transition: border-color 0.2s ease-in-out;
        }
        
        .card-telegram:hover { border-color: var(--color-telegram); }
        .card-donate:hover { border-color: var(--color-donate); }
        .card-dzen:hover { border-color: var(--color-dzen); }

        .card-header {
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 10px;
            margin-bottom: 16px;
            width: 100%;
        }

        .card-header .icon {
            width: 24px;
            height: 24px;
            flex-shrink: 0;
        }

        .card-header h3 {
            font-size: 1.1rem;
            font-weight: 600;
            margin: 0;
        }
        
        .card-telegram .icon, .card-telegram h3 { color: var(--color-telegram); }
        .card-donate .icon, .card-donate h3 { color: var(--color-donate); }
        .card-dzen .icon, .card-dzen h3 { color: var(--color-dzen); }

        .qr-code-wrapper {
            background-color: #ffffff;
            padding: 4px;
            border-radius: 6px;
            margin-bottom: 16px;
            width: 100px;
            height: 100px;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .qr-code-wrapper canvas {
            border-radius: 4px;
        }

        .copy-btn {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            gap: 8px;
            width: 100%;
            padding: 8px 16px;
            border-radius: 8px;
            border: none;
            font-size: 0.95rem;
            font-weight: 500;
            color: var(--text-secondary-color);
            background-color: var(--border-color);
            cursor: pointer;
            transition: background-color 0.2s ease, color 0.2s ease;
            white-space: nowrap;
        }

        .copy-btn:hover {
            background-color: #3e444d;
            color: var(--text-color);
        }

        .copy-btn .icon {
            width: 18px;
            height: 18px;
            flex-shrink: 0;
        }

        .copy-btn .icon-check {
            color: #3fb950;
        }

        @media (max-width: 800px) {
            .container {
                flex-direction: column;
            }
        }
    </style>
</head>
<body>

    <main class=&quot;container&quot;>
        <div class=&quot;card card-telegram&quot; data-link=&quot;https://t.me/pythontalk_ru&quot;>
            <div class=&quot;card-header&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;>
                    <path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5&quot; />
                </svg>
                <h3>Канал в Telegram</h3>
            </div>
            <div class=&quot;qr-code-wrapper&quot; id=&quot;qr-telegram&quot;></div>
            <button class=&quot;copy-btn&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&quot; /><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&quot; /></svg>
                <span>Копировать ссылку</span>
            </button>
        </div>

        <div class=&quot;card card-donate&quot; data-link=&quot;https://pay.cloudtips.ru/p/3a37d9ef&quot;>
            <div class=&quot;card-header&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;>
                    <path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z&quot; />
                </svg>
                <h3>Поддержать</h3>
            </div>
            <div class=&quot;qr-code-wrapper&quot; id=&quot;qr-donate&quot;></div>
            <button class=&quot;copy-btn&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&quot; /><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&quot; /></svg>
                <span>Копировать ссылку</span>
            </button>
        </div>
        
        <div class=&quot;card card-dzen&quot; data-link=&quot;https://dzen.ru/pythontalk&quot;>
            <div class=&quot;card-header&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;>
                    <path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 01-2.25 2.25M16.5 7.5V18a2.25 2.25 0 002.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 002.25 2.25h13.5&quot; />
                </svg>
                <h3>Блог на Дзен</h3>
            </div>
            <div class=&quot;qr-code-wrapper&quot; id=&quot;qr-dzen&quot;></div>
            <button class=&quot;copy-btn&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&quot; /><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&quot; /></svg>
                <span>Копировать ссылку</span>
            </button>
        </div>
    </main>
    
    <script>
        document.addEventListener(&#x27;DOMContentLoaded&#x27;, () => {
            const qrSize = 92;
            const copiedStateHTML = &#x60;
                <svg class=&quot;icon icon-check&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;>
                    <path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M4.5 12.75l6 6 9-13.5&quot; />
                </svg>
                <span>Скопировано</span>&#x60;;
            
            document.querySelectorAll(&#x27;.card&#x27;).forEach(card => {
                const link = card.dataset.link;
                const qrContainer = card.querySelector(&#x27;.qr-code-wrapper&#x27;);
                const copyButton = card.querySelector(&#x27;.copy-btn&#x27;);
                
                if (!link || !qrContainer || !copyButton) return;
                
                const originalButtonHTML = copyButton.innerHTML;

                if (typeof QRCode !== &#x27;undefined&#x27;) {
                    new QRCode(qrContainer, {
                        text: link,
                        width: qrSize,
                        height: qrSize,
                        colorDark: &quot;#000000&quot;,
                        colorLight: &quot;#ffffff&quot;,
                        correctLevel: QRCode.CorrectLevel.H
                    });
                }

                copyButton.addEventListener(&#x27;click&#x27;, () => {
                    if (copyButton.disabled) return;

                    navigator.clipboard.writeText(link).then(() => {
                        copyButton.innerHTML = copiedStateHTML;
                        copyButton.disabled = true;

                        setTimeout(() => {
                            copyButton.innerHTML = originalButtonHTML;
                            copyButton.disabled = false;
                        }, 2000);
                    }).catch(err => {
                        console.error(&#x27;Ошибка копирования:&#x27;, err);
                    });
                });
            });
        });
    </script>
</body>
"></iframe>
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://pythontalk.olegtalks.ru/machine-learning-cheatsheet</guid><link>https://pythontalk.olegtalks.ru/machine-learning-cheatsheet?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=pythontalk</link><comments>https://pythontalk.olegtalks.ru/machine-learning-cheatsheet?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=pythontalk#comments</comments><dc:creator>pythontalk</dc:creator><title>Карта машинного обучения: ваш путеводитель по алгоритмам и методам</title><pubDate>Mon, 23 Jun 2025 08:17:22 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/d9/08/d9080134-f057-4854-b9f8-ed209db87ac4.png"></media:content><category>Машинное обучение</category><description><![CDATA[<img src="https://img2.teletype.in/files/1e/e3/1ee3112b-e336-462c-9b5c-8e3ff873c8a4.png"></img>Постоянно вижу, как у начинающих в голове полная каша из алгоритмов, методов и терминов. Одни думают, что ML — это только нейронки, другие не отличают классификацию от кластеризации.
Чтобы навести порядок в головах, сделал вот такую шпаргалку, которая раскладывает по полочкам всё основное, что есть в машинном обучении. От классики до продвинутых штук вроде трансформеров.]]></description><content:encoded><![CDATA[
  <p id="VuNN">Постоянно вижу, как у начинающих в голове полная каша из алгоритмов, методов и терминов. Одни думают, что ML — это только нейронки, другие не отличают классификацию от кластеризации.<br />Чтобы навести порядок в головах, сделал вот такую шпаргалку, которая раскладывает по полочкам всё основное, что есть в машинном обучении. От классики до продвинутых штук вроде трансформеров.</p>
  <figure id="MHXe" class="m_custom">
    <img src="https://img2.teletype.in/files/1e/e3/1ee3112b-e336-462c-9b5c-8e3ff873c8a4.png" width="1341" />
  </figure>
  <p id="hyAZ">А чтобы эта шпаргалка всегда была под рукой, я подготовил и <strong>PDF-версию в высоком качестве (скачать можно <a href="https://disk.yandex.ru/d/3zSU_oEigMh03A" target="_blank">здесь</a>)</strong>. </p>
  <p id="QSfo"></p>
  <h2 id="b2C7">Три парадигмы машинного обучения</h2>
  <p id="TTWs">Всё ML-разнообразие можно условно поделить на три большие группы. </p>
  <h3 id="a3Vj">Обучение с учителем (Supervised Learning)</h3>
  <p id="KJcH">Это самый понятный и распространенный подход. У нас есть размеченные данные, где для каждого объекта известен правильный ответ. Алгоритм пытается найти закономерности, чтобы потом давать верные ответы на новых, невиданных ранее данных.</p>
  <ul id="8lDj">
    <li id="vB5U"><strong>Классификация:</strong> Предсказываем категорию. Спам или не спам? Уйдет клиент или останется?</li>
    <ul id="QGlw">
      <li id="Qx3K">Алгоритмы: Логистическая регрессия, k-NN, SVM, Наивный Байес.</li>
    </ul>
    <li id="e24U"><strong>Регрессия:</strong> Предсказываем конкретное число. Цена на квартиру, спрос на товар, погода.</li>
    <ul id="8dpD">
      <li id="NV5j">Алгоритмы: Линейная, Полиномиальная, Ridge, Lasso.</li>
    </ul>
  </ul>
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="x7PP">Кстати, про <strong><a href="https://pythontalk.olegtalks.ru/linreg_regularization" target="_blank">линейную регрессию и её важные подвиды с регуляризацией (Ridge, Lasso)</a></strong> я писал подробнейшую статью с примерами на Python. А про <strong><a href="https://pythontalk.olegtalks.ru/polynomial_regression" target="_blank">полиномиальную регрессию</a></strong>, которая позволяет находить более сложные зависимости, — тоже есть отдельный разбор.</p>
  </section>
  <p id="JZVc"></p>
  <h3 id="NPfc">Обучение без учителя (Unsupervised Learning)</h3>
  <p id="JOL7">Здесь всё сложнее и интереснее. У нас есть данные, но без правильных ответов. Алгоритм должен сам найти в них какие-то скрытые структуры, закономерности и взаимосвязи.</p>
  <ul id="3Bxt">
    <li id="dT1J"><strong>Кластеризация:</strong> Группировка похожих объектов. Например, сегментация клиентов по поведению.</li>
    <ul id="eoIJ">
      <li id="aI4L">Алгоритмы: K-Means, DBSCAN, Mean-Shift.</li>
    </ul>
    <li id="LoDV"><strong>Снижение размерности:</strong> Упрощение данных без потери важной информации. Когда у вас сотни признаков, а для модели нужно всего несколько.</li>
    <ul id="XlxO">
      <li id="Uylr">Алгоритмы: PCA, t-SNE, LSA, LDA.</li>
    </ul>
  </ul>
  <section style="background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="CJ69">Про то, как работает <strong><a href="https://pythontalk.olegtalks.ru/principal_component_analysis_python" target="_blank">метод главных компонент (PCA) на Python</a></strong> и как он помогает извлекать максимум из данных, у меня есть отдельный гайд.</p>
  </section>
  <ul id="wJLw">
    <li id="wF8D"><strong>Поиск ассоциаций:</strong> Поиск правил вида &quot;если купили товар А, то часто покупают и товар Б&quot;. Классика — анализ рыночной корзины.</li>
    <ul id="fnXi">
      <li id="itKD">Алгоритмы: Apriori, Eclat, FP-Growth.</li>
    </ul>
  </ul>
  <p id="nOMg"></p>
  <h3 id="ooJS">Обучение с подкреплением (Reinforcement Learning)</h3>
  <p id="JbdD">Тут у нас есть &quot;агент&quot;, который учится действовать в некой среде, получая &quot;награды&quot; и &quot;штрафы&quot; за свои действия. Его цель — максимизировать суммарную награду. На этом подходе работают автопилоты, игровые боты и торговые роботы.</p>
  <ul id="8Qyw">
    <li id="qygs">Популярные алгоритмы: Q-Learning, SARSA, DQN, A3C.</li>
  </ul>
  <p id="RJEr"></p>
  <hr />
  <h2 id="OHOv">Продвинутые методы</h2>
  <p id="rubt">Когда классических подходов не хватает, в дело вступают тяжеловесы.</p>
  <h3 id="nCJl">Ансамблевые методы</h3>
  <p id="ZdZX">Идея проста: если объединить несколько слабых моделей, можно получить одну, но очень сильную и точную.</p>
  <ul id="oQER">
    <li id="j1WO"><strong>Бэггинг (Bagging):</strong> Модели учатся параллельно на разных подвыборках данных. Ключевой пример — Случайный лес (Random Forest).</li>
    <li id="C8iN"><strong>Бустинг (Boosting):</strong> Модели учатся последовательно, каждая новая исправляет ошибки предыдущей. Тут царят XGBoost, LightGBM и, конечно, CatBoost.</li>
    <li id="uzef"><strong>Стекинг (Stacking):</strong> Результаты работы одних моделей становятся входными данными для другой, финальной мета-модели.</li>
  </ul>
  <p id="afEw"></p>
  <h3 id="mCnU">Нейросети и глубокое обучение (Deep Learning)</h3>
  <p id="LoHc">Та самая область, о которой сейчас кричат из каждого утюга. Используются для самых сложных задач с неструктурированными данными — изображениями, текстом, звуком.</p>
  <ul id="0UbL">
    <li id="GlGo"><strong>Свёрточные сети (CNN):</strong> Короли компьютерного зрения.</li>
    <li id="9xgw"><strong>Рекуррентные сети (RNN, LSTM):</strong> Созданы для работы с последовательностями (текст, речь, временные ряды).</li>
    <li id="TtyR"><strong>Трансформеры (BERT, GPT):</strong> Де-факто стандарт в NLP. На них работают все современные языковые модели.</li>
    <li id="Ctru"><strong>Генеративные сети (GAN, VAE):</strong> Умеют создавать новый контент — от фото и музыки до текстов.</li>
  </ul>
  <p id="Sn65"></p>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="SOr6">Эта карта — не исчерпывающий справочник, а скорее отправная точка для ваших исследований. Мир ML гораздо шире, но эти концепции — его основа.</p>
  </section>
  <p id="u5lz">Надеюсь, эта структура поможет вам лучше ориентироваться в мире машинного обучения. </p>
  <p id="IRHx"></p>
  <figure id="XYwj" class="m_custom">
    <iframe srcdoc="<!DOCTYPE html>
<html lang=&quot;ru&quot;>
<head>
    <meta charset=&quot;UTF-8&quot;>
    <meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;>
    <title>Интерактивная плашка</title>
    <script src=&quot;https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js&quot;></script>
    <style>
        @import url(&#x27;https://fonts.googleapis.com/css2?family=Inter:wght@500;600&display=swap&#x27;);

        :root {
            --bg-color: #0d1117;
            --card-bg-color: #161b22;
            --border-color: #30363d;
            --text-color: #e6edf3;
            --text-secondary-color: #7d8590;
            
            --color-telegram: #2AABEE;
            --color-donate: #DB61A2;
            --color-dzen: #FF8C00;
        }

        body {
            margin: 0;
            padding: 16px;
            box-sizing: border-box;
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background-color: var(--bg-color);
            font-family: &#x27;Inter&#x27;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, sans-serif;
            color: var(--text-color);
        }

        .container {
            display: flex;
            gap: 16px;
            width: 100%;
            max-width: 840px;
            align-items: stretch;
        }
        
        .card {
            flex: 1;
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 20px;
            background-color: var(--card-bg-color);
            border: 1px solid var(--border-color);
            border-radius: 10px;
            text-align: center;
            transition: border-color 0.2s ease-in-out;
        }
        
        .card-telegram:hover { border-color: var(--color-telegram); }
        .card-donate:hover { border-color: var(--color-donate); }
        .card-dzen:hover { border-color: var(--color-dzen); }

        .card-header {
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 10px;
            margin-bottom: 16px;
            width: 100%;
        }

        .card-header .icon {
            width: 24px;
            height: 24px;
            flex-shrink: 0;
        }

        .card-header h3 {
            font-size: 1.1rem;
            font-weight: 600;
            margin: 0;
        }
        
        .card-telegram .icon, .card-telegram h3 { color: var(--color-telegram); }
        .card-donate .icon, .card-donate h3 { color: var(--color-donate); }
        .card-dzen .icon, .card-dzen h3 { color: var(--color-dzen); }

        .qr-code-wrapper {
            background-color: #ffffff;
            padding: 4px;
            border-radius: 6px;
            margin-bottom: 16px;
            width: 100px;
            height: 100px;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .qr-code-wrapper canvas {
            border-radius: 4px;
        }

        .copy-btn {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            gap: 8px;
            width: 100%;
            padding: 8px 16px;
            border-radius: 8px;
            border: none;
            font-size: 0.95rem;
            font-weight: 500;
            color: var(--text-secondary-color);
            background-color: var(--border-color);
            cursor: pointer;
            transition: background-color 0.2s ease, color 0.2s ease;
            white-space: nowrap;
        }

        .copy-btn:hover {
            background-color: #3e444d;
            color: var(--text-color);
        }

        .copy-btn .icon {
            width: 18px;
            height: 18px;
            flex-shrink: 0;
        }

        .copy-btn .icon-check {
            color: #3fb950;
        }

        @media (max-width: 800px) {
            .container {
                flex-direction: column;
            }
        }
    </style>
</head>
<body>

    <main class=&quot;container&quot;>
        <div class=&quot;card card-telegram&quot; data-link=&quot;https://t.me/pythontalk_ru&quot;>
            <div class=&quot;card-header&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;>
                    <path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M6 12L3.269 3.126A59.768 59.768 0 0121.485 12 59.77 59.77 0 013.27 20.876L5.999 12zm0 0h7.5&quot; />
                </svg>
                <h3>Канал в Telegram</h3>
            </div>
            <div class=&quot;qr-code-wrapper&quot; id=&quot;qr-telegram&quot;></div>
            <button class=&quot;copy-btn&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&quot; /><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&quot; /></svg>
                <span>Копировать ссылку</span>
            </button>
        </div>

        <div class=&quot;card card-donate&quot; data-link=&quot;https://pay.cloudtips.ru/p/3a37d9ef&quot;>
            <div class=&quot;card-header&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;>
                    <path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z&quot; />
                </svg>
                <h3>Поддержать</h3>
            </div>
            <div class=&quot;qr-code-wrapper&quot; id=&quot;qr-donate&quot;></div>
            <button class=&quot;copy-btn&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&quot; /><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&quot; /></svg>
                <span>Копировать ссылку</span>
            </button>
        </div>
        
        <div class=&quot;card card-dzen&quot; data-link=&quot;https://dzen.ru/pythontalk&quot;>
            <div class=&quot;card-header&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;>
                    <path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 01-2.25 2.25M16.5 7.5V18a2.25 2.25 0 002.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 002.25 2.25h13.5&quot; />
                </svg>
                <h3>Блог на Дзен</h3>
            </div>
            <div class=&quot;qr-code-wrapper&quot; id=&quot;qr-dzen&quot;></div>
            <button class=&quot;copy-btn&quot;>
                <svg class=&quot;icon&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M8.25 7.5V6.108c0-1.135.845-2.098 1.976-2.192.373-.03.748-.03 1.125 0 1.131.094 1.976 1.057 1.976 2.192V7.5M12 14.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12zM12 17.25a.75.75 0 000-1.5H6.75a.75.75 0 000 1.5H12z&quot; /><path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M15 19.5a3 3 0 003-3V6.75a3 3 0 00-3-3H9a3 3 0 00-3 3v9.75a3 3 0 003 3h6z&quot; /></svg>
                <span>Копировать ссылку</span>
            </button>
        </div>
    </main>
    
    <script>
        document.addEventListener(&#x27;DOMContentLoaded&#x27;, () => {
            const qrSize = 92;
            const copiedStateHTML = &#x60;
                <svg class=&quot;icon icon-check&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;>
                    <path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M4.5 12.75l6 6 9-13.5&quot; />
                </svg>
                <span>Скопировано</span>&#x60;;
            
            document.querySelectorAll(&#x27;.card&#x27;).forEach(card => {
                const link = card.dataset.link;
                const qrContainer = card.querySelector(&#x27;.qr-code-wrapper&#x27;);
                const copyButton = card.querySelector(&#x27;.copy-btn&#x27;);
                
                if (!link || !qrContainer || !copyButton) return;
                
                const originalButtonHTML = copyButton.innerHTML;

                if (typeof QRCode !== &#x27;undefined&#x27;) {
                    new QRCode(qrContainer, {
                        text: link,
                        width: qrSize,
                        height: qrSize,
                        colorDark: &quot;#000000&quot;,
                        colorLight: &quot;#ffffff&quot;,
                        correctLevel: QRCode.CorrectLevel.H
                    });
                }

                copyButton.addEventListener(&#x27;click&#x27;, () => {
                    if (copyButton.disabled) return;

                    navigator.clipboard.writeText(link).then(() => {
                        copyButton.innerHTML = copiedStateHTML;
                        copyButton.disabled = true;

                        setTimeout(() => {
                            copyButton.innerHTML = originalButtonHTML;
                            copyButton.disabled = false;
                        }, 2000);
                    }).catch(err => {
                        console.error(&#x27;Ошибка копирования:&#x27;, err);
                    });
                });
            });
        });
    </script>
</body>
"></iframe>
  </figure>

]]></content:encoded></item></channel></rss>