{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "gEG2cGnXfVBM"
      },
      "outputs": [],
      "source": [
        "!pip install langchain openai langchain-openai langchain-community -q"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import re\n",
        "import pandas as pd\n",
        "from tqdm import tqdm\n",
        "from getpass import getpass\n",
        "\n",
        "from langchain.prompts import PromptTemplate\n",
        "from langchain.chains import LLMChain, TransformChain\n",
        "from langchain.output_parsers import ResponseSchema, StructuredOutputParser"
      ],
      "metadata": {
        "id": "ix68Au3nfW94"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Если используете ключ от OpenAI, запустите эту ячейку 👇"
      ],
      "metadata": {
        "id": "C0K7awRZfciu"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import os\n",
        "from langchain_openai import ChatOpenAI\n",
        "\n",
        "\n",
        "# os.environ['OPENAI_API_KEY'] = \"Введите ваш OpenAI API ключ\"\n",
        "os.environ['OPENAI_API_KEY'] = getpass(prompt='Введите ваш OpenAI API ключ')\n",
        "\n",
        "# Инициализируем языковую модель\n",
        "llm = ChatOpenAI(temperature=0.0)"
      ],
      "metadata": {
        "id": "oSaeU0STfbxu"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Если используете ключ из курса, запустите эти ячейки 👇\n"
      ],
      "metadata": {
        "id": "KfBKAJ0vfiCh"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "!wget https://raw.githubusercontent.com/a-milenkin/LLM_practical_course/main/notebooks/utils.py"
      ],
      "metadata": {
        "id": "mOvzGTXyfgAw"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "from utils import ChatOpenAI\n",
        "from getpass import getpass\n",
        "\n",
        "#course_api_key= \"Введите ваш API ключ, полученный в боте курса\"\n",
        "course_api_key = getpass(prompt='Введите ваш API ключ, полученный в боте курса')\n",
        "\n",
        "# инициализируем языковую модель\n",
        "llm = ChatOpenAI(temperature=0.0, course_api_key=course_api_key)"
      ],
      "metadata": {
        "id": "_baYTEnSfex7"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Задание 3.2.9 🤔 Кажется, это что-то на LLM-ском? 🧐"
      ],
      "metadata": {
        "id": "z2JH453Ufm4L"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "df = pd.read_csv(\"https://stepik.org/media/attachments/lesson/1110883/raw_texts.csv\")\n",
        "df.head()"
      ],
      "metadata": {
        "id": "HExe1XOeflIq"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "Напишем функцию, которая очистит текст от ненужных символов: `¿, ¡, £`"
      ],
      "metadata": {
        "id": "lECMhfEigA2x"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "def clean_text(inputs: dict) -> dict:\n",
        "    text = inputs[\"text\"]\n",
        "\n",
        "    # YOUR CODE HERE ...\n",
        "\n",
        "    return {\"text\": text}"
      ],
      "metadata": {
        "id": "kcQcCsnqgDo-"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "Будем просить у модели определять язык и имя главного персонажа и выдавать ответ в виде словаря. Для этого создадим `Output parser`, с которым вы уже познакомились в прошлых уроках."
      ],
      "metadata": {
        "id": "I5fppZD7gISy"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Определим схемы ответа\n",
        "language_schema = ...\n",
        "\n",
        "person_schema = ...\n",
        "\n",
        "response_schemas = [language_schema, person_schema]\n",
        "output_parser = ... # Создаём парсер и подаём в него список со схемами\n",
        "format_instructions = ... # Получаем инструкции по форматированию ответа"
      ],
      "metadata": {
        "id": "sMwNyCdigKr3"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "Напишем шаблон промпта со своим вопросом и инструкциями по форматированию ответа. Будем передавать в этот промпт сырой текст"
      ],
      "metadata": {
        "id": "X4sjobt8gaeC"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "prompt = PromptTemplate(\n",
        "    #YOUR CODE HERE\n",
        ")"
      ],
      "metadata": {
        "id": "YO0jk4_rgaCH"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "Создадим цепочку с помощью `LCEL`"
      ],
      "metadata": {
        "id": "Uf9zTeF4gi4H"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "chain = # YOUR CODE HERE"
      ],
      "metadata": {
        "id": "u3DdWjgQggEF"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "for text in tqdm(df['raw_text']):\n",
        "    # YOUR CODE HERE\n",
        "    break # Для отладки. Уберите, когда убедитесь, что на одном примере работает"
      ],
      "metadata": {
        "id": "ZrDjre54gpVs"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "Сохраним всё в итоговый файл. Убедитесь, что на этом этапе у вас в столбцах\n",
        "\n",
        "- `text` - очищенный текст (без символов ¿, ¡, £)\n",
        "- `language` - язык, на котором написан текст (название языка указать на английском языке)\n",
        "- `main_character` - имя главного персонажа в тексте (указать на том языке, на котором и написан сам текст)"
      ],
      "metadata": {
        "id": "HsW9_cn6gy7-"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "df[['text', 'language', 'main_character']].to_csv('3.2.9_solution.csv', index=False)"
      ],
      "metadata": {
        "id": "p9CUjXZsgveh"
      },
      "execution_count": null,
      "outputs": []
    }
  ]
}