{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "2a32b630-c884-40b1-abf0-2b0c1c0278df",
   "metadata": {},
   "source": [
    "# <center>⚡️🏁 Welcome! Как запустить эти ваши ноутбуки с курса? 🤔📔 </center>\n",
    "\n",
    "<img src='../images/choice_api.jpeg' 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": 2,
   "id": "2da22ebe-7cbc-4612-99ca-d9f0a6586026",
   "metadata": {
    "tags": []
   },
   "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": []
   },
   "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": []
   },
   "source": [
    "# <center id=\"part1\">  🤖 Как использовать API от `OpenAI` напрямую?!"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6faf094d-1e16-4048-9b2d-7bfdce07b98f",
   "metadata": {},
   "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": []
   },
   "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": {},
   "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": 3,
   "id": "a3acbd8d-41dd-4c8a-b20a-2cb0b8573f2a",
   "metadata": {
    "tags": []
   },
   "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": {},
   "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": []
   },
   "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": 10,
   "id": "8f4745c2-19ce-4f44-9cc2-990c56d5a411",
   "metadata": {
    "tags": []
   },
   "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": []
   },
   "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": {},
   "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": []
   },
   "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": {},
   "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": {},
   "source": [
    "<div class=\"alert alert-info\">\n",
    "    \n",
    "✅ __Все!__ Этого уже достаточно, чтобы просто получать ответы от `ChatGPT` кодом. Если для ваших задач этого хватает, то можно использовать уже так. Для удобства, можно еще обернуть дополнительно в функцию."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "11ae714b-ec50-43a0-a9ff-138b8e93e212",
   "metadata": {},
   "source": [
    "# <center id=\"part2\"> 🤖 `API` от `СhatGPT` с ключом курса (рекомендуется)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "98b3ddcc-a235-49ab-bce9-5fb7c37fa729",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "# Для работы в колабе, загрузите наш скрипт для использования ChatGPT с сервера курса!\n",
    "# !wget https://raw.githubusercontent.com/a-milenkin/LLM_practical_course/main/notebooks/utils.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "be3d6997-3cb2-4b65-be6d-963b126982ff",
   "metadata": {
    "tags": []
   },
   "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": []
   },
   "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": 1,
   "id": "57a22aa5-bdbd-4e28-8fe6-7abc5521c595",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "from utils import NDTOpenAI\n",
    "\n",
    "client = NDTOpenAI(\n",
    "    api_key=course_api_key,  # ключ для доступа к апи\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "2bd1b68f-43a3-487b-b1d5-85c4625ac752",
   "metadata": {
    "tags": []
   },
   "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": {},
   "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": []
   },
   "source": [
    "# <center id=\"part3\"> 🤐 Чат модели и объект `ChatOpenAI` от `LangChain`"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "31d2322b-e928-4680-b446-9357a15a5b6f",
   "metadata": {},
   "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": []
   },
   "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": {},
   "source": [
    "# <center> 🤘 Чат модели и наша версия `ChatOpenAI` (рекомендуется)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "45a386eb-72bc-4e4e-a85d-f202c92f4416",
   "metadata": {
    "tags": []
   },
   "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": []
   },
   "source": [
    "# <center id=\"part4\"> 🤗 Исследуем мир Open Source: `API` от `HuggingFaceHub`"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "259fd3f3-4cd0-4a07-902c-627d5646fe7a",
   "metadata": {
    "tags": []
   },
   "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": 13,
   "id": "3dd7d6b0-0d57-474d-8fed-9b2c7acc1e85",
   "metadata": {
    "tags": []
   },
   "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": 14,
   "id": "ea0dd5e4-de74-4346-9bb6-0a73981d92fe",
   "metadata": {
    "tags": []
   },
   "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": {},
   "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": {},
   "source": [
    "# <center id=\"part5\"> 💻 Ваш собственный ChatGPT: запуск LLM локально"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d7852390-b4a9-43af-bc13-e35c15945bbb",
   "metadata": {},
   "source": [
    "> Для локального использования моделей `HuggingFace` (на вашем локальном компьютере или сервере), необходима библиотека `transformers`, а также должны быть скачаны веса необходимой модели."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "020451fb-af1c-4256-91d9-04f4e384d8ff",
   "metadata": {},
   "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": 17,
   "id": "b68b323b-f6ed-4ef7-b33d-6c2c287278fc",
   "metadata": {
    "tags": []
   },
   "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": {},
   "source": [
    "<div class=\"alert alert-info\">\n",
    "\n",
    "✅ __Все!__ Теперь вам даже интерент не нужен. Грузите себе локально и ускоряйте! Однако, следите за качеством выбираемой модели. Как вы убедились выше, не у всех моделей качество генерации высокое!"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ad219825-0062-4c16-ac75-7f2625781370",
   "metadata": {},
   "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"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
