{
  "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"
      },
      "outputs": [],
      "source": [
        "!pip install langchain openai langchain-openai langchain-community -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_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": "a2ZTWMEynSrk"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "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"
      },
      "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": "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"
      ],
      "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",
        "    return (angle_in_degrees / 360) * 2 * math.pi * radius\n",
        "\n",
        "\n",
        "@tool\n",
        "def compute_triangle_area(a, b, c):\n",
        "    \"\"\"Вычисляет площадь треугольника по длинам его сторон\"\"\"\n",
        "    s = (a + b + c) / 2\n",
        "    return math.sqrt(s * (s - a) * (s - b) * (s - c))"
      ],
      "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": [
        "# Реализуйте функции"
      ],
      "metadata": {
        "id": "JKiMjkjiooX7"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Поместите все написанные функции в tools\n",
        "tools = [compute_arc_length, compute_triangle_area, ...]"
      ],
      "metadata": {
        "id": "1zACraIToqdb"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# Запустите эту ячейку с тестами для проверки написанных функций\n",
        "\n",
        "assert add_numbers(-3, -5) == -8, \"Ошибка в функции: add_numbers(-3, -5) должно быть -8\"\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"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "agent = initialize_agent(\n",
        "    agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION\n",
        ")"
      ],
      "metadata": {
        "id": "ieGFa-6W3WfP"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "for task in tqdm(df['task']):\n",
        "    # YOUR CODE HERE\n",
        "    break # Для отладки. Уберите, когда убедитесь, что на одном примере работает"
      ],
      "metadata": {
        "id": "wsSQKz6H3fhM"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "df[['task', 'answer']].to_csv(\"3.3.8_solution.csv\", index=False)"
      ],
      "metadata": {
        "id": "h0ZbN-Tl3kPc"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "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": "code",
      "source": [
        "agent = initialize_agent(\n",
        "    agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,\n",
        "\n",
        ")"
      ],
      "metadata": {
        "id": "KCwe8GpJ8UOe"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "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": []
    }
  ]
}