{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "2a32b630-c884-40b1-abf0-2b0c1c0278df",
      "metadata": {
        "id": "2a32b630-c884-40b1-abf0-2b0c1c0278df"
      },
      "source": [
        "# <center>⚡️🏁 Welcome! Как запустить эти ваши ноутбуки с курса? 🤔📔 </center>\n",
        "\n",
        "<img src='https://github.com/a-milenkin/LLM_practical_course/blob/main/images/choice_api.jpeg?raw=1' align=\"right\" width=\"400\" height=\"400\" >\n",
        "\n",
        "## Оглавление ноутбука\n",
        "\n",
        " * [🚀 API от OpenAI.](#part1)\n",
        " * [🛠 API от OpenAI с __нашего сервера__.](#part2)\n",
        " * [🤐 Чат-модели и объект ChatOpenAI](#part3)\n",
        " * [🔧 Open Source LLM модели и API от HuggingFaceHub.](#part4)\n",
        " * [🔋 Локальный запуск LLM без интернета и API ключей.](#part5)\n",
        " * [🧸 Выводы и заключения.](#part6)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "2da22ebe-7cbc-4612-99ca-d9f0a6586026",
      "metadata": {
        "tags": [],
        "id": "2da22ebe-7cbc-4612-99ca-d9f0a6586026"
      },
      "outputs": [],
      "source": [
        "import os\n",
        "import warnings\n",
        "from getpass import getpass  # Для скрытого ввода API ключей\n",
        "\n",
        "warnings.filterwarnings(\"ignore\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "dd19488a-23da-41fd-93f8-82f3fe448e8e",
      "metadata": {
        "tags": [],
        "id": "dd19488a-23da-41fd-93f8-82f3fe448e8e"
      },
      "outputs": [],
      "source": [
        "# Установим нужные библиотеки\n",
        "!pip install openai langchain huggingface_hub langchain-openai langchain-community transformers -q"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a6fe2415-cfc6-462f-843d-f7cfd44647ad",
      "metadata": {
        "tags": [],
        "id": "a6fe2415-cfc6-462f-843d-f7cfd44647ad"
      },
      "source": [
        "# <center id=\"part1\">  🤖 Как использовать API от `OpenAI` напрямую?!"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6faf094d-1e16-4048-9b2d-7bfdce07b98f",
      "metadata": {
        "id": "6faf094d-1e16-4048-9b2d-7bfdce07b98f"
      },
      "source": [
        "<div class=\"alert alert-block alert-danger\"> Если хотите использовать официальное <code>API</code> от <code>OpenAI</code> в РФ, то используйте <code>VPN</code> или запускайте код через <code>Google Colab</code>."
      ]
    },
    {
      "cell_type": "markdown",
      "id": "c221dbe6-190e-42bc-8298-e7be64f9c734",
      "metadata": {
        "tags": [],
        "id": "c221dbe6-190e-42bc-8298-e7be64f9c734"
      },
      "source": [
        "<div class=\"alert alert-info\">\n",
        "    \n",
        "**🔑 Получение ключа для использования `OpenAI API`**\n",
        "\n",
        "> При создании своего первого ключа, вы получите бесплатные 5$ для использования платформы.\n",
        "\n",
        "0. Если вы из РФ, то используйте __VPN__ при заходе на сайт.\n",
        "1. Если нет аккаунта от OpenAI, то для регистрации потребуется __зарубежная симкарта__ (можно приобрести в интернете, либо купить доступ к уже зарегистрированному аккаунту, ~100 руб.\n",
        "2. Перейдите по [ссылке](https://platform.openai.com/account/api-keys) и авторизуйтесь на сайте `OpenAI`.\n",
        "3. После успешной авторизации на сайте, нажмите на кнопку `+ Create new secret key` и введите любое название для ключа.\n",
        "4. Скопируйте полученный ключ и поместите его в переменную среды `OPENAI_API_KEY`\n",
        "5. Для оплаты новых нокенов из РФ, потребуется __иностранная карта__!"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bb9d067b-908c-4fd8-a369-d08281777fe7",
      "metadata": {
        "id": "bb9d067b-908c-4fd8-a369-d08281777fe7"
      },
      "source": [
        "* ⚙️ Начнем с прямых вызовов к API от OpenAI.\n",
        "* 🗂 [Документация](https://platform.openai.com/docs/api-reference/making-requests) по использованию API\n",
        "* 👨‍🍳 Полезный [Cookbook](https://cookbook.openai.com/)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "a3acbd8d-41dd-4c8a-b20a-2cb0b8573f2a",
      "metadata": {
        "tags": [],
        "id": "a3acbd8d-41dd-4c8a-b20a-2cb0b8573f2a",
        "outputId": "2108d6e2-79c0-434f-abaa-15eaa3bc94c5"
      },
      "outputs": [
        {
          "name": "stdin",
          "output_type": "stream",
          "text": [
            "Введите ваш OpenAI API ключ ········\n"
          ]
        }
      ],
      "source": [
        "# openai_api_key = \"Введите ваш OpenAI API ключ\"\n",
        "openai_api_key = getpass(prompt=\"Введите ваш OpenAI API ключ\")\n",
        "os.environ[\"OPENAI_API_KEY\"] = openai_api_key"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b34e683f-bd75-4a3b-b972-d84e6b3ca2e0",
      "metadata": {
        "id": "b34e683f-bd75-4a3b-b972-d84e6b3ca2e0"
      },
      "source": [
        "Рассмотрим некоторые параметры функции `.chat.completions.create()`\n",
        "\n",
        "О всех параметрах можно узнать на [странице](https://platform.openai.com/docs/api-reference/chat/create)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "4ecb4191-eb0c-41ec-91d4-f3f62b887aea",
      "metadata": {
        "tags": [],
        "id": "4ecb4191-eb0c-41ec-91d4-f3f62b887aea"
      },
      "outputs": [],
      "source": [
        "import openai\n",
        "from openai import OpenAI\n",
        "\n",
        "openai.api_key = openai_api_key\n",
        "\n",
        "client = OpenAI(\n",
        "    # defaults to os.environ.get(\"OPENAI_API_KEY\")\n",
        "    api_key=openai_api_key,\n",
        ")\n",
        "\n",
        "#print(client.models.list()) # Выведет все возможные модели от OpenAI, которые можно указать в параметре model"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "8f4745c2-19ce-4f44-9cc2-990c56d5a411",
      "metadata": {
        "tags": [],
        "id": "8f4745c2-19ce-4f44-9cc2-990c56d5a411"
      },
      "outputs": [],
      "source": [
        "from openai import OpenAI\n",
        "\n",
        "client = OpenAI(\n",
        "    # defaults to os.environ.get(\"OPENAI_API_KEY\")\n",
        "    api_key=openai_api_key,\n",
        ")\n",
        "messages = [\n",
        "    {\n",
        "        \"role\": \"user\",  # Роль - ассистент или юзер\n",
        "        \"content\": \"1+1\",  # Сам промпт для подачи в chatGPT\n",
        "    }\n",
        "]\n",
        "\n",
        "chat_completion = client.chat.completions.create(\n",
        "    max_tokens=100,\n",
        "    model=\"gpt-3.5-turbo\",  # модель для выбора\n",
        "    messages=messages,  # сообщение\n",
        "    temperature=0,  # степень креативности ответа\n",
        ")\n",
        "\n",
        "print(chat_completion.choices[0].message.content)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6eabc3ec-019b-459a-a0f5-81b1790e6d99",
      "metadata": {
        "tags": [],
        "id": "6eabc3ec-019b-459a-a0f5-81b1790e6d99"
      },
      "source": [
        "<div class=\"alert alert-info\">\n",
        "\n",
        "**😎 Два обязательных параметра**\n",
        "    \n",
        "- `messages` - список объектов сообщений, где каждый объект имеет два обязательных поля:\n",
        "    - `content` - содержимое вашего сообщения\n",
        "    - `role` - роль автора сообщений (`system`, `user` или `assistant`)\n",
        "- `model` - модель, используемая для генерации сообщения (доступные модели на [странице](https://platform.openai.com/docs/models/model-endpoint-compatibility))"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b10b6897-b57e-44b0-aee5-910ac7808728",
      "metadata": {
        "id": "b10b6897-b57e-44b0-aee5-910ac7808728"
      },
      "source": [
        "<div class=\"alert alert-info\">\n",
        "\n",
        "**🥸 Полезно использовать**\n",
        "    \n",
        "- `max_tokens` - максимальное количество токенов, генерируемых в сообщении\n",
        "- `n` - сколько вариантов ответа должно быть сгенерировано для каждого входного сообщения (по умолчанию 1)\n",
        "- `temperature` - влияет на степень случайности генерации (принимает значения от 0 до 2, по умолчанию 1). Высокое значение температуры делает вероятности всех слов в выводе более равномерными, что приводит к более случайному и разнообразному тексту. При низком значении температуры модель будет склонна генерировать более предсказуемый и детерминированный текст.\n",
        "- `top_p` - тоже влияет на степень случайности генерации. Определяет, какой процент наиболее вероятных слов будет включен в генерацию. Например, если top-p равно 0.8, то модель будет использовать вероятности слов так, чтобы включить в генерацию слова, составляющие 80% верхней части распределения вероятностей.\n",
        "\n",
        "> Рекомендуем изменять либо параметр `temperature`, либо `top_p`, но не оба одновременно"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bf81b4d3-3557-4197-a689-0cb18b85dabe",
      "metadata": {
        "tags": [],
        "id": "bf81b4d3-3557-4197-a689-0cb18b85dabe"
      },
      "source": [
        "```python\n",
        "{\n",
        "  \"id\": \"chatcmpl-8B6YmCk5OiK7Z6RkRrkx72mEQaPGF\",\n",
        "  \"object\": \"chat.completion\",\n",
        "  \"created\": 1697657516,\n",
        "  \"model\": \"gpt-3.5-turbo-0613\",\n",
        "  \"choices\": [\n",
        "    {\n",
        "      \"index\": 0,\n",
        "      \"message\": {\n",
        "        \"role\": \"assistant\",\n",
        "        \"content\": \"1+1 equals 2.\"\n",
        "      },\n",
        "      \"finish_reason\": \"stop\"\n",
        "    }\n",
        "  ],\n",
        "  \"usage\": {\n",
        "    \"prompt_tokens\": 10,\n",
        "    \"completion_tokens\": 7,\n",
        "    \"total_tokens\": 17\n",
        "  }\n",
        "}\n",
        "```"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2b361c22-a86e-493d-84c0-3d92edf8ffad",
      "metadata": {
        "id": "2b361c22-a86e-493d-84c0-3d92edf8ffad"
      },
      "source": [
        "<div class=\"alert alert-info\">\n",
        "\n",
        "**🧐 А что получается в выводе?**\n",
        "\n",
        "- `id` - уникальный идентификатор запроса\n",
        "- `object` - тип возвращаемого объекта\n",
        "- `created` - время запроса в timestamp-формате\n",
        "- `model` - полное название модели, которая использовалась для генерации ответа\n",
        "- `choices` - список объектов ответа (только один, если не изменяли параметр `n`)\n",
        "    - `index` - индекс ответа в списке вариантов\n",
        "    - `message` - объект сообщения, сгенерированный моделью, содержит `role` и `content`\n",
        "    - `finish_reason` - причина, по которой модель закончила генерировать ответ\n",
        "        - `stop` - достигнута естественная точка остановки\n",
        "        - `length` - достигнуто максимальное количество токенов, указанное в запросе\n",
        "        - `content_filter` - сгенерированный текст содержит нежелательный материал, который нарушает правила\n",
        "- `usage` - количество используемых токенов\n",
        "    - `prompt_tokens` - для распознавания вопроса\n",
        "    - `completition_tokens` - для генерации ответа\n",
        "    - `total_tokens` - для всего запроса (вопрос + ответ)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "822fb30d-6169-4f8d-a3c7-e1b6cd4431bc",
      "metadata": {
        "id": "822fb30d-6169-4f8d-a3c7-e1b6cd4431bc"
      },
      "source": [
        "<div class=\"alert alert-info\">\n",
        "    \n",
        "✅ __Все!__ Этого уже достаточно, чтобы просто получать ответы от `ChatGPT` кодом. Если для ваших задач этого хватает, то можно использовать уже так. Для удобства, можно еще обернуть дополнительно в функцию."
      ]
    },
    {
      "cell_type": "markdown",
      "id": "11ae714b-ec50-43a0-a9ff-138b8e93e212",
      "metadata": {
        "id": "11ae714b-ec50-43a0-a9ff-138b8e93e212"
      },
      "source": [
        "# <center id=\"part2\"> 🤖 `API` от `СhatGPT` с ключом курса (рекомендуется)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "98b3ddcc-a235-49ab-bce9-5fb7c37fa729",
      "metadata": {
        "tags": [],
        "id": "98b3ddcc-a235-49ab-bce9-5fb7c37fa729"
      },
      "outputs": [],
      "source": [
        "# Для работы в колабе, загрузите наш скрипт для использования ChatGPT с сервера курса!\n",
        "# !wget https://raw.githubusercontent.com/a-milenkin/LLM_practical_course/main/notebooks/utils.py"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "be3d6997-3cb2-4b65-be6d-963b126982ff",
      "metadata": {
        "tags": [],
        "id": "be3d6997-3cb2-4b65-be6d-963b126982ff",
        "outputId": "b104de5e-c248-448a-a02a-54e3425824f3"
      },
      "outputs": [
        {
          "name": "stdin",
          "output_type": "stream",
          "text": [
            "Введите ваш API-ключ, который получили в боте ········\n"
          ]
        }
      ],
      "source": [
        "# course_api_key = 'Введите ваш API-ключ, который получили в боте'\n",
        "course_api_key = getpass(prompt=\"Введите ваш API-ключ, который получили в боте\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "95e1e565-64d3-45de-a451-53669a155b17",
      "metadata": {
        "tags": [],
        "id": "95e1e565-64d3-45de-a451-53669a155b17"
      },
      "source": [
        "<div class=\"alert alert-info\">\n",
        "\n",
        "**🔑 Получение ключа для использования модели на нашем сервере через API**\n",
        "\n",
        "1. Перейдите по [ссылке](https://t.me/llm_course_bot) в нашего телеграмм-бота.\n",
        "2. Авторизуйтесь, указав в нем свой `Stepik id`, с которым занимаетесь на курсе.\n",
        "3. Получите свой ключ и используйте наш API для прохождения курса.\n",
        "4. Также в боте можно проверить действие вашего ключа, узнать сколько осталось доступных токенов и дату, когда ключ перестанет действовать.\n",
        "\n",
        "> Если возникли трудности, ошибки, вопросы или бот не работает, то смело пишите в чат курса, мы вам поможем."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "57a22aa5-bdbd-4e28-8fe6-7abc5521c595",
      "metadata": {
        "tags": [],
        "id": "57a22aa5-bdbd-4e28-8fe6-7abc5521c595"
      },
      "outputs": [],
      "source": [
        "from utils import NDTOpenAI\n",
        "\n",
        "client = NDTOpenAI(\n",
        "    api_key=course_api_key,  # ключ для доступа к апи\n",
        ")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "2bd1b68f-43a3-487b-b1d5-85c4625ac752",
      "metadata": {
        "tags": [],
        "id": "2bd1b68f-43a3-487b-b1d5-85c4625ac752",
        "outputId": "4b6ea2b8-5650-4c7f-c61d-630459045a71"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "1+1 equals 2.\n"
          ]
        }
      ],
      "source": [
        "prompt = \"1+1\"\n",
        "\n",
        "messages = [\n",
        "    {\n",
        "        \"role\": \"user\",  # Роль - ассистент или юзер\n",
        "        \"content\": prompt ,  # Сам промпт для подачи в ChatGPT\n",
        "    }\n",
        "]\n",
        "\n",
        "response = client.chat.completions.create(\n",
        "    model=\"gpt-3.5-turbo\",  # модель для выбора\n",
        "    messages=messages,  # сообщение\n",
        "    temperature=0,  # степень креативности ответа\n",
        ")\n",
        "\n",
        "print(response.choices[0].message.content)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a295e7c8-1e17-4125-9ca5-4a96ad372e62",
      "metadata": {
        "id": "a295e7c8-1e17-4125-9ca5-4a96ad372e62"
      },
      "source": [
        "<div class=\"alert alert-info\">\n",
        "\n",
        "При выполнении функции при помощи `print(response)`, кроме сгенерированного ответа, на экран выводится дополнительная информация:\n",
        "- `prompt_tokens` - сколько токенов ушло на распознование вашего `prompt`\n",
        "- `completion_tokens` - сколько токенов ушло на генерацию ответа\n",
        "- `available_tokens` - сколько у вас осталось доступных токенов (можно также проверить в боте)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a34695bf-d5ee-4b74-ab16-f2ba012ccc56",
      "metadata": {
        "tags": [],
        "id": "a34695bf-d5ee-4b74-ab16-f2ba012ccc56"
      },
      "source": [
        "# <center id=\"part3\"> 🤐 Чат модели и объект `ChatOpenAI` от `LangChain`"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "31d2322b-e928-4680-b446-9357a15a5b6f",
      "metadata": {
        "id": "31d2322b-e928-4680-b446-9357a15a5b6f"
      },
      "source": [
        "<div class=\"alert alert-block alert-danger\"> Если хотите использовать официальное <code>API</code> от <code>OpenAI</code> в РФ, то используйте <code>VPN</code> или запускайте код через <code>Google Colab</code>."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "1f1cfdbf-8486-4403-aec8-74406e39abe0",
      "metadata": {
        "tags": [],
        "id": "1f1cfdbf-8486-4403-aec8-74406e39abe0"
      },
      "outputs": [],
      "source": [
        "from langchain_openai import ChatOpenAI # <-- класс из LangChain\n",
        "from langchain.chains import LLMChain\n",
        "from langchain.prompts import PromptTemplate\n",
        "\n",
        "template = \"\"\"Вопрос: {question}\n",
        "Ответ: Дай короткий ответ\"\"\"\n",
        "\n",
        "prompt = PromptTemplate(template=template, input_variables=[\"question\"])\n",
        "\n",
        "openai_llm = ChatOpenAI(temperature=0.0, openai_api_key=openai_api_key)\n",
        "\n",
        "llm_chain = LLMChain(prompt=prompt, llm=openai_llm)\n",
        "\n",
        "question = \"Когда человек первый раз полетел в космос?\"\n",
        "\n",
        "print(llm_chain.invoke(question).content)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "585c7f02-602a-46bd-b97c-0928a7d92a25",
      "metadata": {
        "id": "585c7f02-602a-46bd-b97c-0928a7d92a25"
      },
      "source": [
        "# <center> 🤘 Чат модели и наша версия `ChatOpenAI` (рекомендуется)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "45a386eb-72bc-4e4e-a85d-f202c92f4416",
      "metadata": {
        "tags": [],
        "id": "45a386eb-72bc-4e4e-a85d-f202c92f4416",
        "outputId": "0103976d-9e45-4a1c-d20e-4d74dfae5ef9"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "12 апреля 1961 года\n"
          ]
        }
      ],
      "source": [
        "from utils import ChatOpenAI  # <-- наш класс!\n",
        "from langchain.chains import LLMChain\n",
        "from langchain.prompts import PromptTemplate\n",
        "\n",
        "template = \"\"\"Вопрос: {question}\n",
        "Ответ: Дай короткий ответ\n",
        "\"\"\"\n",
        "\n",
        "prompt = PromptTemplate(template=template, input_variables=[\"question\"])\n",
        "\n",
        "openai_llm = ChatOpenAI(temperature=0.0, course_api_key=course_api_key)\n",
        "\n",
        "llm_chain = LLMChain(prompt=prompt, llm=openai_llm)\n",
        "\n",
        "question = \"Когда человек первый раз полетел в космос?\"\n",
        "\n",
        "print(llm_chain.invoke(question).content)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "cccd2c55-75b2-4a6a-9b8d-be845d20fd3e",
      "metadata": {
        "tags": [],
        "id": "cccd2c55-75b2-4a6a-9b8d-be845d20fd3e"
      },
      "source": [
        "# <center id=\"part4\"> 🤗 Исследуем мир Open Source: `API` от `HuggingFaceHub`"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "259fd3f3-4cd0-4a07-902c-627d5646fe7a",
      "metadata": {
        "tags": [],
        "id": "259fd3f3-4cd0-4a07-902c-627d5646fe7a"
      },
      "source": [
        "<div class=\"alert alert-info\">\n",
        "    \n",
        "**Получение ключа для использования `HuggingFaceHub` `API`**\n",
        "\n",
        "1. Авторизуйтесь или зарегистрируйтесь на сайте [HuggingFace](https://huggingface.co/).\n",
        "2. Перейдите по [ссылке](https://huggingface.co/settings/tokens) и нажмите на кнопку `New token`.\n",
        "3. Введите любое название и нажмите на кнопку `Generate a token`.\n",
        "4. Скопируйте полученный ключ и поместите его в переменную среды `HUGGINGFACEHUB_API_TOKEN`\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "3dd7d6b0-0d57-474d-8fed-9b2c7acc1e85",
      "metadata": {
        "tags": [],
        "id": "3dd7d6b0-0d57-474d-8fed-9b2c7acc1e85",
        "outputId": "491efa7c-2fd9-4b19-ade3-0cf9054c85e9"
      },
      "outputs": [
        {
          "name": "stdin",
          "output_type": "stream",
          "text": [
            "Введите ваш HuggingFaceHub API ключ ········\n"
          ]
        }
      ],
      "source": [
        "# os.environ['HUGGINGFACEHUB_API_TOKEN'] = 'Введите ваш HuggingFaceHub API ключ'\n",
        "os.environ[\"HUGGINGFACEHUB_API_TOKEN\"] = getpass(\n",
        "    prompt=\"Введите ваш HuggingFaceHub API ключ\"\n",
        ")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "ea0dd5e4-de74-4346-9bb6-0a73981d92fe",
      "metadata": {
        "tags": [],
        "id": "ea0dd5e4-de74-4346-9bb6-0a73981d92fe",
        "outputId": "167b7ed6-685e-473c-effd-545d3d8e654f"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            " The first manned space flight was on April 12, 1961. The\n"
          ]
        }
      ],
      "source": [
        "from langchain.chains import LLMChain\n",
        "from langchain_community.llms import HuggingFaceEndpoint\n",
        "from langchain.prompts import PromptTemplate\n",
        "\n",
        "# initialize HF LLM\n",
        "hf_llm = HuggingFaceEndpoint(\n",
        "    repo_id=\"mistralai/Mistral-7B-Instruct-v0.2\", # вводим название модели с HuggingFace\n",
        "    #repo_id=\"google/flan-t5-base\",\n",
        ")\n",
        "\n",
        "# build prompt template for simple question-answering\n",
        "template = \"\"\"Question: {question}.\n",
        "\n",
        "Answer:\"\"\"\n",
        "\n",
        "prompt = PromptTemplate(template=template, input_variables=[\"question\"])\n",
        "\n",
        "llm_chain = LLMChain(prompt=prompt, llm=hf_llm)\n",
        "\n",
        "question = \"When did man first fly into space?\"\n",
        "\n",
        "print(llm_chain.invoke(question)['text'])"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6bb0a74a-c0e6-4f33-844d-225676d788fd",
      "metadata": {
        "id": "6bb0a74a-c0e6-4f33-844d-225676d788fd"
      },
      "source": [
        "<div class=\"alert alert-info\">\n",
        "    \n",
        "✅ __Все!__ теперь мы можете даже не спускать свои деньги не токены! Вот вам весь зоопарк моделей на [HuggingFace.com](https://huggingface.co/models?pipeline_tag=text-generation&sort=trending). Выбирайте любую хайповую модельку, хоть даже [meta-llama/Llama-2-7b](https://huggingface.co/meta-llama/Llama-2-7b) и кайфуйте! Нужен только токен."
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9f974a89-3e5f-456f-9710-9a47101d2d80",
      "metadata": {
        "id": "9f974a89-3e5f-456f-9710-9a47101d2d80"
      },
      "source": [
        "# <center id=\"part5\"> 💻 Ваш собственный ChatGPT: запуск LLM локально"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d7852390-b4a9-43af-bc13-e35c15945bbb",
      "metadata": {
        "id": "d7852390-b4a9-43af-bc13-e35c15945bbb"
      },
      "source": [
        "> Для локального использования моделей `HuggingFace` (на вашем локальном компьютере или сервере), необходима библиотека `transformers`, а также должны быть скачаны веса необходимой модели."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "020451fb-af1c-4256-91d9-04f4e384d8ff",
      "metadata": {
        "id": "020451fb-af1c-4256-91d9-04f4e384d8ff"
      },
      "outputs": [],
      "source": [
        "from langchain.chains import LLMChain\n",
        "from langchain.llms import HuggingFacePipeline\n",
        "from langchain.prompts import PromptTemplate\n",
        "\n",
        "bloom = HuggingFacePipeline.from_model_id(\n",
        "    model_id=\"bigscience/bloom-1b7\",  # Название и версия модели, позже покажем вам весь LLM-зоопарк\n",
        "    task=\"text-generation\",  # Вид задачи, в нашем случае - генерация текста\n",
        "    model_kwargs={\n",
        "        \"temperature\": 0,\n",
        "        \"max_length\": 64,\n",
        "    },  # все те же креативность и максимальная длина\n",
        "    device=0,  # Номер GPU карточки, если есть!\n",
        ")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "b68b323b-f6ed-4ef7-b33d-6c2c287278fc",
      "metadata": {
        "tags": [],
        "id": "b68b323b-f6ed-4ef7-b33d-6c2c287278fc",
        "outputId": "62cd045a-5d3b-4e56-e310-93c97483fdde"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            " The first man to fly into space was the American astronaut\n",
            "John Glenn, who was born in New York City on January 1, 1903. He was\n",
            "the son of a carpenter and a housewife. He was a very intelligent boy,\n",
            "and\n"
          ]
        }
      ],
      "source": [
        "template = \"\"\"Question: {question}.\n",
        "\n",
        "Answer:\"\"\"\n",
        "\n",
        "prompt = PromptTemplate(template=template, input_variables=[\"question\"])\n",
        "\n",
        "llm_chain = LLMChain(prompt=prompt, llm=bloom)\n",
        "\n",
        "question = \"When did man first fly into space?\"\n",
        "\n",
        "print(llm_chain.invoke(question)['text'])"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "8dcf98d7-08c6-4147-8097-44593d5f3ab2",
      "metadata": {
        "id": "8dcf98d7-08c6-4147-8097-44593d5f3ab2"
      },
      "source": [
        "<div class=\"alert alert-info\">\n",
        "\n",
        "✅ __Все!__ Теперь вам даже интерент не нужен. Грузите себе локально и ускоряйте! Однако, следите за качеством выбираемой модели. Как вы убедились выше, не у всех моделей качество генерации высокое!"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ad219825-0062-4c16-ac75-7f2625781370",
      "metadata": {
        "id": "ad219825-0062-4c16-ac75-7f2625781370"
      },
      "source": [
        "# <center id=\"part6\"> 🧸 Выводы и заключения ✅\n",
        "    \n",
        "* ✅ Вы умеете запускать код через API\n",
        "* ✅ Вы знаете откуда стягивать модели\n",
        "* 🔑 Даже если у вас нет VPN, иностранного номера и счета, то у вас есть ключ от команды курса!\n",
        "* ✅ Под каждую задачу есть своя оптимальная модель подходящего качества и размера, не одним ChatGPT едины!"
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3 (ipykernel)",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.10.13"
    },
    "colab": {
      "provenance": []
    }
  },
  "nbformat": 4,
  "nbformat_minor": 5
}