{
  "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": "YfVGMp8AkODF",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "53728a33-6cd0-4895-b0dd-64aeab8aa89d"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m807.5/807.5 kB\u001b[0m \u001b[31m7.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m227.4/227.4 kB\u001b[0m \u001b[31m9.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.8/1.8 MB\u001b[0m \u001b[31m16.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m252.6/252.6 kB\u001b[0m \u001b[31m14.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m65.7/65.7 kB\u001b[0m \u001b[31m7.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m75.6/75.6 kB\u001b[0m \u001b[31m9.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m49.4/49.4 kB\u001b[0m \u001b[31m5.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m77.8/77.8 kB\u001b[0m \u001b[31m7.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m58.3/58.3 kB\u001b[0m \u001b[31m6.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m138.5/138.5 kB\u001b[0m \u001b[31m9.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25h"
          ]
        }
      ],
      "source": [
        "!pip install langchain openai -q"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "from getpass import getpass"
      ],
      "metadata": {
        "id": "lBznbmZ9nOa-"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Если используете ключ от OpenAI, запустите эту ячейку 👇"
      ],
      "metadata": {
        "id": "0dt0Sf3xnS3m"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import os\n",
        "from langchain.chat_models 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": "a2ZTWMEynSrk",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "91237745-fe9b-43c5-a265-5e0e2a4e30af"
      },
      "execution_count": null,
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Введите ваш OpenAI API ключ··········\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/usr/local/lib/python3.10/dist-packages/langchain_core/_api/deprecation.py:117: LangChainDeprecationWarning: The class `langchain_community.chat_models.openai.ChatOpenAI` was deprecated in langchain-community 0.0.10 and will be removed in 0.2.0. An updated version of the class exists in the langchain-openai package and should be used instead. To use it run `pip install -U langchain-openai` and import as `from langchain_openai import ChatOpenAI`.\n",
            "  warn_deprecated(\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Если используете ключ из курса, запустите эти ячейки 👇"
      ],
      "metadata": {
        "id": "S6LFfoYSnfVO"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "!wget https://raw.githubusercontent.com/a-milenkin/LLM_practical_course/main/notebooks/utils.py"
      ],
      "metadata": {
        "id": "5dTISH0jne2z",
        "outputId": "bee2d0d1-c0ca-4163-e4a0-da0bf359a5cc",
        "colab": {
          "base_uri": "https://localhost:8080/"
        }
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "--2024-02-23 10:46:04--  https://raw.githubusercontent.com/a-milenkin/LLM_practical_course/main/notebooks/utils.py\n",
            "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...\n",
            "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.\n",
            "HTTP request sent, awaiting response... 200 OK\n",
            "Length: 10822 (11K) [text/plain]\n",
            "Saving to: ‘utils.py’\n",
            "\n",
            "\rutils.py              0%[                    ]       0  --.-KB/s               \rutils.py            100%[===================>]  10.57K  --.-KB/s    in 0s      \n",
            "\n",
            "2024-02-23 10:46:05 (96.2 MB/s) - ‘utils.py’ saved [10822/10822]\n",
            "\n"
          ]
        }
      ]
    },
    {
      "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, course_api_key=course_api_key)"
      ],
      "metadata": {
        "id": "ATSJBycqnj9j"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Задание 3.3.7 🛠️ Кастомные инструменты 🧮\n",
        "\n"
      ],
      "metadata": {
        "id": "AX_cKZihoXnP"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from math import pi\n",
        "# Импортируйте tool\n",
        "from langchain.agents import tool\n",
        "import math"
      ],
      "metadata": {
        "id": "vI8mEuO-ofvp"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# 2 реализованные функции, как пример\n",
        "@tool\n",
        "def compute_arc_length(radius, angle_in_degrees):\n",
        "    \"\"\"\n",
        "    Вычисляет длину дуги по радиусу и углу в градусах.\n",
        "\n",
        "    :param radius: Радиус окружности, из которой вырезается дуга.\n",
        "    :param angle_in_degrees: Угол дуги в градусах.\n",
        "    :return: Длина дуги. Результат основан на формуле длины дуги, которая вычисляется\n",
        "    как доля окружности, соответствующая данному углу, где полная окружность соответствует 360 градусам.\n",
        "    по ключу math_answer\n",
        "    \"\"\"\n",
        "    return  {\"math_answer\": (angle_in_degrees / 360) * 2 * math.pi * radius}\n",
        "\n",
        "@tool\n",
        "def compute_triangle_area(a, b, c):\n",
        "    \"\"\"\n",
        "    Вычисляет площадь треугольника по длинам его сторон.\n",
        "\n",
        "    :param a: Длина первой стороны треугольника.\n",
        "    :param b: Длина второй стороны треугольника.\n",
        "    :param c: Длина третьей стороны треугольника.\n",
        "    :return: Площадь треугольника. Используется формула Герона для вычисления площади треугольника\n",
        "    по его сторонам, где сначала находится полупериметр треугольника, а затем вычисляется корень\n",
        "    квадратный из произведения полупериметра на разность полупериметра и каждой из сторон.\n",
        "    по ключу math_answer\n",
        "    \"\"\"\n",
        "    s = (a + b + c) / 2\n",
        "    return {\"math_answer\": math.sqrt(s * (s - a) * (s - b) * (s - c))}\n"
      ],
      "metadata": {
        "id": "SvYqtxs5ocrx"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "Список функций, которые вам нужно реализовать:\n",
        "\n",
        "- `add_numbers(num1, num2)` - Складывает два числа\n",
        "- `convert_meters_to_cm(num)` - Переводит метры в сантиметры\n",
        "- `convert_cubic_cm_to_liters(num)` - Переводит кубические сантиметры в литры\n",
        "- `compute_rectangle_perimeter(a, b)` - Вычисляет периметр прямоугольника\n",
        "- `compute_circle_area(radius)` - Вычисляет площадь круга\n",
        "- `compute_cylinder_volume(radius, height)` - Вычисляет объем цилиндра\n",
        "- `compute_cube_volume(a)` - Вычисляет объем куба\n",
        "- `convert_binary_to_decimal(binary_number: str)` - Переводит число из двоичной системы счисления в десятичную систему счисления\n",
        "- `convert_decimal_to_binary(decimal_number)` - Переводит число из десятичной системы счисления в двоичную систему счисления.\n",
        "- `get_count_ones(number: str)` - Находит количество единиц в двоичном представлении числа."
      ],
      "metadata": {
        "id": "AvHLRwMloynN"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Реализуйте функции\n",
        "@tool\n",
        "def add_numbers(num1, num2) -> dict:\n",
        "    \"\"\"\n",
        "    Вычисли сумму двух чисел.\n",
        "\n",
        "    :param num1: Первое число для сложения.\n",
        "    :param num2: Второе число для сложения.\n",
        "    :return: Сумма двух чисел по ключу math_answer.\n",
        "    \"\"\"\n",
        "    sum = num1 + num2\n",
        "    return {\"math_answer\": sum}\n",
        "\n",
        "@tool\n",
        "def convert_meters_to_cm(num):\n",
        "    \"\"\"\n",
        "    Переводит метры в сантиметры.\n",
        "\n",
        "    :param num: Число в метрах для конвертации.\n",
        "    :return: Значение в сантиметрах по ключу math_answer.\n",
        "    \"\"\"\n",
        "    convert = num * 100\n",
        "    return {\"math_answer\": convert}\n",
        "\n",
        "@tool\n",
        "def convert_cubic_cm_to_liters(num):\n",
        "    \"\"\"\n",
        "    Переводит кубические сантиметры в литры.\n",
        "\n",
        "    :param num: Объем в кубических сантиметрах для конвертации.\n",
        "    :return: Объем в литрах по ключу math_answer.\n",
        "    \"\"\"\n",
        "    convert = num / 1000\n",
        "    return {\"math_answer\": convert}\n",
        "\n",
        "@tool\n",
        "def compute_rectangle_perimeter(a, b):\n",
        "    \"\"\"\n",
        "    Вычисли периметр прямоугольника.\n",
        "\n",
        "    :param a: Длина одной стороны прямоугольника.\n",
        "    :param b: Длина другой стороны прямоугольника.\n",
        "    :return: Периметр прямоугольника по ключу math_answer.\n",
        "    \"\"\"\n",
        "    perimeter = 2 * (a + b)\n",
        "    return {\"math_answer\": perimeter}\n",
        "\n",
        "@tool\n",
        "def compute_circle_area(radius):\n",
        "    \"\"\"\n",
        "    Вычисли площадь круга.\n",
        "\n",
        "    :param radius: Радиус круга.\n",
        "    :return: Площадь круга по ключу math_answer.\n",
        "    \"\"\"\n",
        "    area = math.pi * radius ** 2\n",
        "    return {\"math_answer\": area}\n",
        "\n",
        "@tool\n",
        "def compute_cylinder_volume(radius, height):\n",
        "    \"\"\"\n",
        "    Вычисляет объем цилиндра.\n",
        "\n",
        "    :param radius: Радиус основания цилиндра.\n",
        "    :param height: Высота цилиндра.\n",
        "    :return: Объем цилиндра по ключу math_answer.\n",
        "    \"\"\"\n",
        "    volume = math.pi * radius ** 2 * height\n",
        "    return {\"math_answer\": volume}\n",
        "\n",
        "@tool\n",
        "def compute_cube_volume(a):\n",
        "    \"\"\"\n",
        "    Вычисляет объем куба.\n",
        "\n",
        "    :param a: Длина ребра куба.\n",
        "    :return: Объем куба по ключу math_answer.\n",
        "    \"\"\"\n",
        "    volume = a ** 3\n",
        "    return {\"math_answer\": volume}\n",
        "\n",
        "@tool\n",
        "def convert_binary_to_decimal(binary_number: str):\n",
        "    \"\"\"\n",
        "    Переводит число из двоичной системы счисления в десятичную систему счисления.\n",
        "\n",
        "    :param binary_number: Строка, представляющая число в двоичной системе счисления.\n",
        "    :return: Число в десятичной системе счисления по ключу math_answer.\n",
        "    \"\"\"\n",
        "    return {\"math_answer\": int(binary_number, 2)}\n",
        "\n",
        "@tool\n",
        "def convert_decimal_to_binary(decimal_number):\n",
        "    \"\"\"\n",
        "    Переводит число из десятичной системы счисления в двоичную систему счисления.\n",
        "\n",
        "    :param decimal_number: Число в десятичной системе счисления для конвертации.\n",
        "    :return: Строка, представляющая число в двоичной системе счисления по ключу math_answer.\n",
        "    \"\"\"\n",
        "    return {\"math_answer\": bin(decimal_number)[2:]}\n",
        "\n",
        "@tool\n",
        "def get_count_ones(number: str):\n",
        "    \"\"\"\n",
        "    Находит количество единиц в двоичном представлении числа.\n",
        "\n",
        "    :param number: Строка, представляющая число в двоичной системе счисления.\n",
        "    :return: Количество единиц в двоичном представлении по ключу math_answer.\n",
        "    \"\"\"\n",
        "    return {\"math_answer\": number.count('1')}\n",
        "\n"
      ],
      "metadata": {
        "id": "JKiMjkjiooX7"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Поместите все написанные функции в tools\n",
        "tools = [compute_arc_length, compute_triangle_area,\n",
        "         add_numbers, convert_meters_to_cm,\n",
        "         convert_cubic_cm_to_liters, compute_rectangle_perimeter,\n",
        "         compute_circle_area, compute_cylinder_volume,\n",
        "         compute_cube_volume, convert_binary_to_decimal,\n",
        "         convert_decimal_to_binary, get_count_ones]"
      ],
      "metadata": {
        "id": "1zACraIToqdb"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Запустите эту ячейку с тестами для проверки написанных функций\n",
        "\n",
        "assert add_numbers(-3, -5) == -8, \"Ошибка в функции: add_numbers(-3, -5) должно быть 0\"\n",
        "assert convert_meters_to_cm(2) == 200, \"Ошибка в функции: convert_meters_to_cm(2) должно быть 200\"\n",
        "assert convert_cubic_cm_to_liters(500) == 0.5, \"Ошибка в функции: convert_cubic_cm_to_liters(500) должно быть 0.5\"\n",
        "assert compute_rectangle_perimeter(5, 5) == 20, \"Ошибка в функции: compute_rectangle_perimeter(5, 5) должно быть 20\"\n",
        "assert math.isclose(compute_circle_area(2), 4 * math.pi, rel_tol=1e-5), \"Ошибка в функции: compute_circle_area(2) должно быть близко к 4 * pi\"\n",
        "assert math.isclose(compute_triangle_area(3, 4, 5), 6, rel_tol=1e-5), \"Ошибка в функции: compute_triangle_area(3, 4, 5) должно быть 6\"\n",
        "assert math.isclose(compute_cylinder_volume(2, 3), 12 * math.pi, rel_tol=1e-5), \"Ошибка в функции: compute_cylinder_volume(2, 3) должно быть близко к 12 * pi\"\n",
        "assert compute_cube_volume(3) == 27, \"Ошибка в функции: compute_cube_volume(3) должно быть 27\"\n",
        "assert math.isclose(compute_arc_length(2, 90), math.pi, rel_tol=1e-5), \"Ошибка в функции: compute_arc_length(2, 90) должно быть близко к pi\"\n",
        "assert convert_binary_to_decimal(\"1101\") == 13, \"Ошибка в функции: convert_binary_to_decimal('1101') должно быть 13\"\n",
        "assert convert_decimal_to_binary(13) == \"1101\", \"Ошибка в функции: convert_decimal_to_binary(13) должно быть '1101'\"\n",
        "assert get_count_ones(\"1010\") == 2, \"Ошибка в функции: get_count_ones('1010') должно быть 2\""
      ],
      "metadata": {
        "id": "As114MRqpWza"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "\n",
        "## Задание 3.3.8 🧑‍🎓 Грокаем с агентом школьные математические задачки\n"
      ],
      "metadata": {
        "id": "-fmE6S1G27Z3"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "Создайте своего агента-математика, использовав `tools` с предыдущего степа. Решите с помощью него предоставленные примеры и запишите ответ в столбец `answer` (только ответ, во всех задачах это числа - целые или вещественные)."
      ],
      "metadata": {
        "id": "ClDLKqax6Lxu"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import pandas as pd\n",
        "from tqdm import tqdm\n",
        "from langchain.agents import initialize_agent, AgentType\n",
        "\n",
        "df = pd.read_csv(\"https://stepik.org/media/attachments/lesson/1110884/custom_math_tools.csv\")\n",
        "df.head()"
      ],
      "metadata": {
        "id": "V0XIehJlpx8n",
        "outputId": "7978c6cc-a070-4768-ca9f-148530bdcd5f",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 206
        }
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "                                                task\n",
              "0  Периметр прямоугольника со сторонами 1.5 м и 2...\n",
              "1  Найди сумму площадей круга с радиусом 5 см и к...\n",
              "2  Переведи числа 20 и 32 из десятичной в двоичну...\n",
              "3  Переведи числа из двоичной системы счисления 1...\n",
              "4  Найди объем цилиндра с радиусом 10 см и высото..."
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-22506352-ea32-43d5-882c-7e2388975c8f\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>task</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>Периметр прямоугольника со сторонами 1.5 м и 2...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>Найди сумму площадей круга с радиусом 5 см и к...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>Переведи числа 20 и 32 из десятичной в двоичну...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>Переведи числа из двоичной системы счисления 1...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>Найди объем цилиндра с радиусом 10 см и высото...</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-22506352-ea32-43d5-882c-7e2388975c8f')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-22506352-ea32-43d5-882c-7e2388975c8f button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-22506352-ea32-43d5-882c-7e2388975c8f');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-c517c593-c799-424b-a065-d65dc4ae6198\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-c517c593-c799-424b-a065-d65dc4ae6198')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-c517c593-c799-424b-a065-d65dc4ae6198 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "df",
              "summary": "{\n  \"name\": \"df\",\n  \"rows\": 10,\n  \"fields\": [\n    {\n      \"column\": \"task\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 10,\n        \"samples\": [\n          \"\\u0421\\u0442\\u043e\\u0440\\u043e\\u043d\\u044b \\u0442\\u0440\\u0435\\u0443\\u0433\\u043e\\u043b\\u044c\\u043d\\u0438\\u043a\\u0430 \\u0441\\u043e\\u043e\\u0442\\u0432\\u0435\\u0442\\u0441\\u0442\\u0432\\u0435\\u043d\\u043d\\u043e \\u0440\\u0430\\u0432\\u043d\\u044b 30 \\u0441\\u043c, 40 \\u0441\\u043c \\u0438 110010 \\u0441\\u043c (\\u043f\\u0435\\u0440\\u0435\\u0432\\u0435\\u0434\\u0438 \\u044d\\u0442\\u043e \\u0447\\u0438\\u0441\\u043b\\u043e \\u0438\\u0437 \\u0434\\u0432\\u043e\\u0438\\u0447\\u043d\\u043e\\u0439 \\u0441\\u0438\\u0441\\u0442\\u0435\\u043c\\u044b \\u0441\\u0447\\u0438\\u0441\\u043b\\u0435\\u043d\\u0438\\u044f \\u0432 \\u0434\\u0435\\u0441\\u044f\\u0442\\u0438\\u0447\\u043d\\u0443\\u044e). \\u041d\\u0430\\u0439\\u0434\\u0438 \\u043f\\u043b\\u043e\\u0449\\u0430\\u0434\\u044c \\u044d\\u0442\\u043e\\u0433\\u043e \\u0442\\u0440\\u0435\\u0443\\u0433\\u043e\\u043b\\u044c\\u043d\\u0438\\u043a\\u0430.\",\n          \"\\u041d\\u0430\\u0439\\u0434\\u0438 \\u0441\\u0443\\u043c\\u043c\\u0443 \\u043f\\u043b\\u043e\\u0449\\u0430\\u0434\\u0435\\u0439 \\u043a\\u0440\\u0443\\u0433\\u0430 \\u0441 \\u0440\\u0430\\u0434\\u0438\\u0443\\u0441\\u043e\\u043c 5 \\u0441\\u043c \\u0438 \\u043a\\u0440\\u0443\\u0433\\u0430 \\u0441 \\u0440\\u0430\\u0434\\u0438\\u0443\\u0441\\u043e\\u043c 3 \\u0441\\u043c.\",\n          \"\\u041d\\u0430\\u0439\\u0434\\u0438 \\u0434\\u043b\\u0438\\u043d\\u0443 \\u0434\\u0443\\u0433\\u0438 \\u043e\\u043a\\u0440\\u0443\\u0436\\u043d\\u043e\\u0441\\u0442\\u0438 \\u0441 \\u0440\\u0430\\u0434\\u0438\\u0443\\u0441\\u043e\\u043c 20 \\u043c, \\u043e\\u0431\\u0440\\u0430\\u0437\\u043e\\u0432\\u0430\\u043d\\u043d\\u043e\\u0439 \\u0446\\u0435\\u043d\\u0442\\u0440\\u0430\\u043b\\u044c\\u043d\\u044b\\u043c \\u0443\\u0433\\u043b\\u043e\\u043c 60\\u00b0, \\u0437\\u0430\\u0442\\u0435\\u043c \\u043f\\u0435\\u0440\\u0435\\u0432\\u0435\\u0434\\u0438 \\u0440\\u0435\\u0437\\u0443\\u043b\\u044c\\u0442\\u0430\\u0442 \\u0432 \\u0441\\u0430\\u043d\\u0442\\u0438\\u043c\\u0435\\u0442\\u0440\\u044b.\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 8
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [],
      "metadata": {
        "id": "vqAiCQodX8Oi"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "Создадим промт и парсер"
      ],
      "metadata": {
        "id": "biKOtrWnXb6m"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "{\"math_answer\": 5}"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Km4gT_STyIJK",
        "outputId": "19632e44-513f-494c-a958-8c782ae0ea2d"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "{'math_answer': 5}"
            ]
          },
          "metadata": {},
          "execution_count": 36
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "from langchain.output_parsers import ResponseSchema, StructuredOutputParser\n",
        "# Определим схемы ответа\n",
        "math_answer_schema = ResponseSchema(name=\"math_answer\",\n",
        "                  description=\"\"\"Ответ должен быть представлен в виде целого числа, если итоговый\n",
        "результат является точным целым числом, или в виде вещественного числа\n",
        "с точностью до двух знаков после запятой, если результат содержит дробную\n",
        "часть. Не допускаеться в ответе содержания слов\"\"\")\n",
        "\n",
        "\n",
        "response_schemas = [math_answer_schema]\n",
        "output_parser = StructuredOutputParser.from_response_schemas(response_schemas) # Создаём парсер и подаём в него список со схемами\n",
        "format_instructions = output_parser.get_format_instructions() # Получаем инструкции по форматированию ответа\n",
        "\n",
        "print(format_instructions)\n",
        "print(output_parser)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Q5idKZz7X-Cf",
        "outputId": "3cd2625a-983a-411c-a79a-4e5683c62e6e"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "The output should be a markdown code snippet formatted in the following schema, including the leading and trailing \"```json\" and \"```\":\n",
            "\n",
            "```json\n",
            "{\n",
            "\t\"math_answer\": string  // Ответ должен быть представлен в виде целого числа, если итоговый\n",
            "результат является точным целым числом, или в виде вещественного числа\n",
            "с точностью до двух знаков после запятой, если результат содержит дробную\n",
            "часть. Не допускаеться в ответе содержания слов\n",
            "}\n",
            "```\n",
            "response_schemas=[ResponseSchema(name='math_answer', description='Ответ должен быть представлен в виде целого числа, если итоговый\\nрезультат является точным целым числом, или в виде вещественного числа\\nс точностью до двух знаков после запятой, если результат содержит дробную\\nчасть. Не допускаеться в ответе содержания слов', type='string')]\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "text = \"Найди сумму 3 и 5\""
      ],
      "metadata": {
        "id": "w9WShSrlNEMP"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "from langchain.prompts import PromptTemplate\n",
        "from langchain.prompts import ChatPromptTemplate\n",
        "\n",
        "template = \"\"\"Тебе нужно дать короткий ответ на этот задание ```{text}```,\n",
        "используя эти инструменты.\n",
        "Если задача кажется неоднозначной или требует уточнения, которого\n",
        "нет в условиях, напиши: \"Требуется уточнение условий задачи\".\n",
        "\n",
        "math_answer:\n",
        "Ответ на математический вопрос это число - целое или вещественное, с учетом указанных выше условий.\n",
        "\n",
        "Окончательный ответ должен быть в таком виде:\n",
        "{format_instructions}\n",
        "\"\"\"\n",
        "prompt = ChatPromptTemplate.from_template(template=template)\n",
        "\n",
        "messages = prompt.format_messages(text=text,\n",
        "                                format_instructions=format_instructions)"
      ],
      "metadata": {
        "id": "_hhOJOFVYyK6"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "agent = initialize_agent(\n",
        "    agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,\n",
        "    tools=tools,\n",
        "    template=template,\n",
        "    llm=llm,\n",
        "    output_parser=output_parser,\n",
        "    handle_parsing_errors=True,\n",
        "    )"
      ],
      "metadata": {
        "id": "ieGFa-6W3WfP",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "598c4d16-bc56-41f0-bd21-e11ec45a284b"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/usr/local/lib/python3.10/dist-packages/langchain_core/_api/deprecation.py:117: LangChainDeprecationWarning: The function `initialize_agent` was deprecated in LangChain 0.1.0 and will be removed in 0.2.0. Use Use new agent constructor methods like create_react_agent, create_json_agent, create_structured_chat_agent, etc. instead.\n",
            "  warn_deprecated(\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "response = agent(messages)\n",
        "print(response)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "xTIAlgozxE7N",
        "outputId": "4de29c13-e420-4469-8114-00b42eda3c7f"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "{'input': [HumanMessage(content='Тебе нужно дать короткий ответ на этот задание ```Найди сумму 3 и 5```,\\nиспользуя эти инструменты.\\nЕсли задача кажется неоднозначной или требует уточнения, которого\\nнет в условиях, напиши: \"Требуется уточнение условий задачи\".\\n\\nmath_answer:\\nОтвет на математический вопрос это число - целое или вещественное, с учетом указанных выше условий.\\n\\nОкончательный ответ должен быть в таком виде:\\nThe output should be a markdown code snippet formatted in the following schema, including the leading and trailing \"```json\" and \"```\":\\n\\n```json\\n{\\n\\t\"math_answer\": string  // Ответ должен быть представлен в виде целого числа, если итоговый\\nрезультат является точным целым числом, или в виде вещественного числа\\nс точностью до двух знаков после запятой, если результат содержит дробную\\nчасть. Не допускаеться в ответе содержания слов\\n}\\n```\\n')], 'output': '{ \"math_answer\": 8 }'}\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "print(response[\"output\"])"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "NYQrFc9fxOSu",
        "outputId": "3c97d31e-a7dd-465e-f396-641353b0b2a7"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "{ \"math_answer\": 8 }\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "answer_list = []\n",
        "\n",
        "for task in tqdm(df['task']):\n",
        "    messages = prompt.format_messages(text=task,\n",
        "                                format_instructions=format_instructions)\n",
        "    response = agent(messages)\n",
        "    answer_list.append(response[\"output\"])\n",
        "    # break # Для отладки. Уберите, когда убедитесь, что на одном примере работает\n",
        "\n",
        "answer_list"
      ],
      "metadata": {
        "id": "6yJmaKMtAj2p",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "6e4109b1-6c33-46a6-84bc-8cac301cef0a"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "100%|██████████| 10/10 [00:49<00:00,  4.99s/it]\n"
          ]
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "['{\\n  \"action\": \"Final Answer\",\\n  \"action_input\": \"```json\\\\n{\\\\n\\\\t\\\\\"math_answer\\\\\": \\\\\"700.0\\\\\"\\\\n}\\\\n```\"\\n}',\n",
              " '106.76',\n",
              " {'math_answer': 3},\n",
              " '1101112021',\n",
              " '9424.78',\n",
              " '{\\n  \"action\": \"Final Answer\",\\n  \"action_input\": {\\n    \"math_answer\": \"2094.40\"\\n  }\\n}',\n",
              " '{\\n  \"action\": \"Final Answer\",\\n  \"action_input\": {\\n    \"math_answer\": 7\\n  }\\n}',\n",
              " '{\\n  \"action\": \"Final Answer\",\\n  \"action_input\": \"1111101\"\\n}',\n",
              " 'The answer is 27.',\n",
              " 'Требуется уточнение условий задачи']"
            ]
          },
          "metadata": {},
          "execution_count": 118
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "answer_list"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "X5aSQ5tL0pkG",
        "outputId": "ee807fc1-18d8-4b85-f93a-b94cd6d95b1f"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "['{\\n  \"action\": \"Final Answer\",\\n  \"action_input\": \"```json\\\\n{\\\\n\\\\t\\\\\"math_answer\\\\\": \\\\\"700.0\\\\\"\\\\n}\\\\n```\"\\n}',\n",
              " '106.76',\n",
              " {'math_answer': 3},\n",
              " '1101112021',\n",
              " '9424.78',\n",
              " '{\\n  \"action\": \"Final Answer\",\\n  \"action_input\": {\\n    \"math_answer\": \"2094.40\"\\n  }\\n}',\n",
              " '{\\n  \"action\": \"Final Answer\",\\n  \"action_input\": {\\n    \"math_answer\": 7\\n  }\\n}',\n",
              " '{\\n  \"action\": \"Final Answer\",\\n  \"action_input\": \"1111101\"\\n}',\n",
              " 'The answer is 27.',\n",
              " 'Требуется уточнение условий задачи']"
            ]
          },
          "metadata": {},
          "execution_count": 119
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import json\n",
        "import re\n",
        "\n",
        "def extract_math_answers(answer_list):\n",
        "    cleaned_answers = []\n",
        "    # Улучшенное регулярное выражение для поиска 'math_answer'\n",
        "    math_answer_pattern = re.compile(r'\"math_answer\"\\s*:\\s*(?:\"([^\"]+)\"|(\\d+\\.?\\d*))')\n",
        "\n",
        "    for item in answer_list:\n",
        "        if isinstance(item, dict) and 'math_answer' in item:\n",
        "            cleaned_answers.append(item['math_answer'])\n",
        "        elif isinstance(item, (int, float)):\n",
        "            cleaned_answers.append(str(item))\n",
        "        elif isinstance(item, str) and item.replace('.', '', 1).isdigit():\n",
        "            cleaned_answers.append(item)\n",
        "        elif isinstance(item, str):\n",
        "            # Декодируем строку перед поиском\n",
        "            decoded_string = item.encode().decode('unicode_escape')\n",
        "            matches = math_answer_pattern.findall(decoded_string)\n",
        "            if matches:\n",
        "                # Добавляем все найденные значения, учитывая, что группы могут возвращать None\n",
        "                for match in matches:\n",
        "                    # match является кортежем, поэтому мы добавляем первое непустое значение\n",
        "                    cleaned_answers.append(next(filter(None, match), \"Не знаю\"))\n",
        "            else:\n",
        "                cleaned_answers.append(\"Не знаю\")\n",
        "        else:\n",
        "            cleaned_answers.append(\"Не знаю\")\n",
        "    return cleaned_answers\n",
        "\n",
        "cleaned_answers = extract_math_answers(answer_list)\n",
        "print(cleaned_answers)\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "r1blub5JjJW0",
        "outputId": "3b7f5784-7b48-4e01-b78a-e26afd7158d2"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "['700.0', '106.76', 3, '1101112021', '9424.78', '2094.40', '7', 'Не знаю', 'Не знаю', 'Не знаю']\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "df['answer'] = cleaned_answers\n",
        "df.to_csv(\"3.3.8_solution+.csv\", index=False)"
      ],
      "metadata": {
        "id": "bn5upph8nz7w"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "df.head()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 206
        },
        "id": "Auya_p0hCr2V",
        "outputId": "cc05c422-7ca1-4cbf-c206-f45624ff8878"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "                                                task  answer\n",
              "0  Периметр прямоугольника со сторонами 1.5 м и 2...   700.0\n",
              "1  Найди сумму площадей круга с радиусом 5 см и к...  106.81\n",
              "2  Переведи числа 20 и 32 из десятичной в двоичну...       3\n",
              "3  Переведи числа из двоичной системы счисления 1...   54955\n",
              "4  Найди объем цилиндра с радиусом 10 см и высото...    9.42"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-50592193-2507-416d-9c1e-2fe599800fa5\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>task</th>\n",
              "      <th>answer</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>Периметр прямоугольника со сторонами 1.5 м и 2...</td>\n",
              "      <td>700.0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>Найди сумму площадей круга с радиусом 5 см и к...</td>\n",
              "      <td>106.81</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>Переведи числа 20 и 32 из десятичной в двоичну...</td>\n",
              "      <td>3</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>Переведи числа из двоичной системы счисления 1...</td>\n",
              "      <td>54955</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>Найди объем цилиндра с радиусом 10 см и высото...</td>\n",
              "      <td>9.42</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-50592193-2507-416d-9c1e-2fe599800fa5')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-50592193-2507-416d-9c1e-2fe599800fa5 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-50592193-2507-416d-9c1e-2fe599800fa5');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-69eee751-79e7-48c3-ae83-7d9916d6b5a5\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-69eee751-79e7-48c3-ae83-7d9916d6b5a5')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-69eee751-79e7-48c3-ae83-7d9916d6b5a5 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "df",
              "summary": "{\n  \"name\": \"df\",\n  \"rows\": 10,\n  \"fields\": [\n    {\n      \"column\": \"task\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 10,\n        \"samples\": [\n          \"\\u0421\\u0442\\u043e\\u0440\\u043e\\u043d\\u044b \\u0442\\u0440\\u0435\\u0443\\u0433\\u043e\\u043b\\u044c\\u043d\\u0438\\u043a\\u0430 \\u0441\\u043e\\u043e\\u0442\\u0432\\u0435\\u0442\\u0441\\u0442\\u0432\\u0435\\u043d\\u043d\\u043e \\u0440\\u0430\\u0432\\u043d\\u044b 30 \\u0441\\u043c, 40 \\u0441\\u043c \\u0438 110010 \\u0441\\u043c (\\u043f\\u0435\\u0440\\u0435\\u0432\\u0435\\u0434\\u0438 \\u044d\\u0442\\u043e \\u0447\\u0438\\u0441\\u043b\\u043e \\u0438\\u0437 \\u0434\\u0432\\u043e\\u0438\\u0447\\u043d\\u043e\\u0439 \\u0441\\u0438\\u0441\\u0442\\u0435\\u043c\\u044b \\u0441\\u0447\\u0438\\u0441\\u043b\\u0435\\u043d\\u0438\\u044f \\u0432 \\u0434\\u0435\\u0441\\u044f\\u0442\\u0438\\u0447\\u043d\\u0443\\u044e). \\u041d\\u0430\\u0439\\u0434\\u0438 \\u043f\\u043b\\u043e\\u0449\\u0430\\u0434\\u044c \\u044d\\u0442\\u043e\\u0433\\u043e \\u0442\\u0440\\u0435\\u0443\\u0433\\u043e\\u043b\\u044c\\u043d\\u0438\\u043a\\u0430.\",\n          \"\\u041d\\u0430\\u0439\\u0434\\u0438 \\u0441\\u0443\\u043c\\u043c\\u0443 \\u043f\\u043b\\u043e\\u0449\\u0430\\u0434\\u0435\\u0439 \\u043a\\u0440\\u0443\\u0433\\u0430 \\u0441 \\u0440\\u0430\\u0434\\u0438\\u0443\\u0441\\u043e\\u043c 5 \\u0441\\u043c \\u0438 \\u043a\\u0440\\u0443\\u0433\\u0430 \\u0441 \\u0440\\u0430\\u0434\\u0438\\u0443\\u0441\\u043e\\u043c 3 \\u0441\\u043c.\",\n          \"\\u041d\\u0430\\u0439\\u0434\\u0438 \\u0434\\u043b\\u0438\\u043d\\u0443 \\u0434\\u0443\\u0433\\u0438 \\u043e\\u043a\\u0440\\u0443\\u0436\\u043d\\u043e\\u0441\\u0442\\u0438 \\u0441 \\u0440\\u0430\\u0434\\u0438\\u0443\\u0441\\u043e\\u043c 20 \\u043c, \\u043e\\u0431\\u0440\\u0430\\u0437\\u043e\\u0432\\u0430\\u043d\\u043d\\u043e\\u0439 \\u0446\\u0435\\u043d\\u0442\\u0440\\u0430\\u043b\\u044c\\u043d\\u044b\\u043c \\u0443\\u0433\\u043b\\u043e\\u043c 60\\u00b0, \\u0437\\u0430\\u0442\\u0435\\u043c \\u043f\\u0435\\u0440\\u0435\\u0432\\u0435\\u0434\\u0438 \\u0440\\u0435\\u0437\\u0443\\u043b\\u044c\\u0442\\u0430\\u0442 \\u0432 \\u0441\\u0430\\u043d\\u0442\\u0438\\u043c\\u0435\\u0442\\u0440\\u044b.\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"answer\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 10,\n        \"samples\": [\n          \"600.0\",\n          \"106.81\",\n          \"2094.40\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 85
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Задание 3.3.9 🕵️‍♂️ Агент - полиграф. 📠"
      ],
      "metadata": {
        "id": "Fb5elrFx56u6"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "Создайте агента, который смог бы отвечать на вопросы из широкого спектра областей знаний от математических примеров до научных фактов. Отвечать надо в формате: правда или ложь. На некоторые вопросы, возможно, агент не сможет ответить без вашей помощи, например про преподавателей курса 🙈, поэтому надо будет использовать инструмент `human`, о котором упоминали в ноутбуке урока."
      ],
      "metadata": {
        "id": "14_gmkF_6cZj"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import pandas as pd\n",
        "from tqdm import tqdm\n",
        "from langchain.agents import initialize_agent, AgentType\n",
        "\n",
        "df = pd.read_csv(\"https://stepik.org/media/attachments/lesson/1110884/questions.csv\")\n",
        "df.head()"
      ],
      "metadata": {
        "id": "U8D9YINt6ED-"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "tools = []"
      ],
      "metadata": {
        "id": "ukRFqqu16kFO"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "agent = initialize_agent(\n",
        "    agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,\n",
        "\n",
        ")"
      ],
      "metadata": {
        "id": "KCwe8GpJ8UOe"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "for text in tqdm(df['texts']):\n",
        "    # YOUR CODE HERE\n",
        "    break # Для отладки. Уберите, когда убедитесь, что на одном примере работает"
      ],
      "metadata": {
        "id": "nyT3pUmA8WdI"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "df[['texts', 'answers']].to_csv(\"3.3.9_solution.csv\", index=False)"
      ],
      "metadata": {
        "id": "omLhHZzJ8zdF"
      },
      "execution_count": null,
      "outputs": []
    }
  ]
}