3.3 🕵️‍♂️ Агенты intro

🛠️ Кастомные инструменты 🧮

(🧑🏿‍🦱 или задача про 10 негритят функций)

В этой и следующей задаче мы создадим агента со своими собственными математическими инструментами и используем его для решения нескольких примеров.


В текущей задаче вам нужно реализовать инструменты с помощью декоратора @tool

Не забывайте в каждую функцию обязательно добавлять описание (docstring), чтобы агент понимал для чего её нужно применять!

Вот список функций, которые вам нужно реализовать:

  • add_numbers(num1, num2) - Складывает два числа
  • convert_meters_to_cm(num) - Переводит метры в сантиметры
  • convert_cubic_cm_to_liters(num) - Переводит кубические сантиметры в литры
  • compute_rectangle_perimeter(a, b) - Вычисляет периметр прямоугольника
  • compute_circle_area(radius) - Вычисляет площадь круга
  • compute_cylinder_volume(radius, height) - Вычисляет объем цилиндра
  • compute_cube_volume(a) - Вычисляет объем куба
  • convert_binary_to_decimal(binary_number: str) - Переводит число из двоичной системы счисления в десятичную систему счисления
  • convert_decimal_to_binary(decimal_number) - Переводит число из десятичной системы счисления в двоичную систему счисления.
  • get_count_ones(number: str) - Находит количество единиц в двоичном представлении числа.

Функции, которые реализованы как пример, не удаляйте их, но можете изменить при желании:

  • compute_arc_length(radius, angle_in_degrees) - Вычисляет длину дуги по радиусу и углу в градусах
  • compute_triangle_area(a, b, c) - Вычисляет площадь треугольника по формуле Герона

После объявления всех функций, поместите их в список tools.

При отправлении решения, не используйте подключение langchain. Считайте, что строка from langchain.agents import tool уже выполнена и вы уже можете использовать нужный декоратор.

P.S. Не забывайте, что всегда можно попросить помощи в написании функций у ChatGPT.


Не могу понять в чем проблема?
мой код: 
from math import pi
from functools import wraps

def tool(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper

# 2 реализованные функции, как пример
@tool
def compute_arc_length(radius, angle_in_degrees):
    """Вычисляет длину дуги по радиусу и углу в градусах"""
    return (angle_in_degrees / 360) * 2 * math.pi * radius


@tool
def compute_triangle_area(a, b, c):
    """Вычисляет площадь треугольника по длинам его сторон"""
    s = (a + b + c) / 2
    return math.sqrt(s * (s - a) * (s - b) * (s - c))


@tool
def add_numbers(num1, num2):
    """
    Adds two numbers.
    
    :param num1: The first number.
    :param num2: The second number.
    :return: The sum of num1 and num2.
    """
    return num1 + num2

@tool
def convert_meters_to_cm(num):
    """
    Converts meters to centimeters.
    
    :param num: The number in meters.
    :return: The number in centimeters.
    """
    return num * 100

@tool
def convert_cubic_cm_to_liters(num):
    """
    Converts cubic centimeters to liters.
    
    :param num: The number in cubic centimeters.
    :return: The number in liters.
    """
    return num / 1000
 

tools = [
    add_numbers,
    convert_meters_to_cm,
    convert_cubic_cm_to_liters,
    compute_rectangle_perimeter,
    compute_circle_area,
    compute_cylinder_volume,
    compute_cube_volume,
    convert_binary_to_decimal,
    convert_decimal_to_binary,
    get_count_ones,
    compute_arc_length,
    compute_triangle_area
]



выдает ошибку: Failed. Runtime error Error: Traceback (most recent call last): File "jailed_code", line 187, in <module> assert False, f"Подсказка: Функция {func.__name__} не использует декоратор @tool" AssertionError: Подсказка: Функция add_numbers не использует декоратор @tool

@Timur_Muratov, нe нужно переопределять декоратор tool

Описание задачи - это готовый промпт для подачи в Chat LangChain =)

Описание задачи - это готовый промпт для подачи LLM`ке (~1500 токенов) -)

.

from math import pi
# 2 реализованные функции, как пример
@tool
def compute_arc_length(radius, angle_in_degrees):
    """Вычисляет длину дуги по радиусу и углу в градусах"""
    return (angle_in_degrees / 360) * 2 * math.pi * radius
@tool
def compute_triangle_area(a, b, c):
    """Вычисляет площадь треугольника по длинам его сторон"""
    s = (a + b + c) / 2
    return math.sqrt(s * (s - a) * (s - b) * (s - c))
# Реализуйте остальные функции
@tool
def add_numbers(num1, num2):
    """Складывает два числа"""
    return num1 + num2
@tool
def convert_meters_to_cm(num):
    """Переводит метры в сантиметры"""
    return num * 100
@tool
def convert_cubic_cm_to_liters(num):
    """
    Переводит кубические сантиметры в литры.
    """
    return num / 1000
@tool
def compute_rectangle_perimeter(a, b):
    """Вычисляет периметр прямоугольника"""
    return (a + b) * 2
@tool
def compute_circle_area(radius):
    """
    Вычисляет площадь круга по заданному радиусу.
    """
    if radius < 0:
        raise ValueError("Радиус не может быть отрицательным")
    return math.pi * radius ** 2
@tool
def compute_cylinder_volume(radius, height):
    """
    Вычисляет объем цилиндра по заданному радиусу основания и высоте.
    """
    if radius < 0 or height < 0:
        raise ValueError("Радиус и высота должны быть положительными числами")
    base_area = math.pi * radius ** 2
    volume = base_area * height
    return volume
@tool
def compute_cube_volume(a):
    """
    Вычисляет объем куба по заданной длине ребра.
    """
    if a < 0:
        raise ValueError("Длина ребра куба должна быть положительным числом")
    volume = a ** 3
    return volume
@tool
def convert_binary_to_decimal(binary_number: str) -> int:
    """
    Переводит число из двоичной системы счисления в десятичную систему счисления.
    :param binary_number: Строка, представляющая двоичное число
    :return: Десятичное число
    """
    return int(binary_number, 2)
@tool
def convert_decimal_to_binary(decimal_number: int) -> str:
    """
    Переводит число из десятичной системы счисления в двоичную систему счисления.
    :param decimal_number: Десятичное число
    :return: Строка, представляющая двоичное число
    """
    return bin(decimal_number)[2:]  # [2:] убирает префикс '0b'
@tool
def get_count_ones(number: str) -> int:
    """
    Находит количество единиц в двоичном представлении числа.
    :param number: Строка, представляющая двоичное число
    :return: Количество единиц в двоичном представлении
    """
    return number.count('1')
# Поместите все написанные функции в tools      
tools = [compute_arc_length, compute_triangle_area, add_numbers, convert_meters_to_cm, convert_cubic_cm_to_liters,  compute_rectangle_perimeter, compute_circle_area, compute_cylinder_volume, compute_cube_volume, convert_binary_to_decimal, convert_decimal_to_binary, get_count_ones]

   

from math import pi
# 2 реализованные функции, как пример
@tool
def compute_arc_length(radius, angle_in_degrees):
    """Вычисляет длину дуги по радиусу и углу в градусах"""
    return (angle_in_degrees / 360) * 2 * math.pi * radius
@tool
def compute_triangle_area(a, b, c):
    """Вычисляет площадь треугольника по длинам его сторон"""
    s = (a + b + c) / 2
    return math.sqrt(s * (s - a) * (s - b) * (s - c))
@tool
def add_numbers(num1, num2):
    """Складывает два числа."""
    return num1 + num2
@tool
def convert_meters_to_cm(num):
    """Переводит метры в сантиметры."""
    return num * 100
@tool
def convert_cubic_cm_to_liters(num):
    """Переводит кубические сантиметры в литры."""
    return num / 1000
@tool
def compute_rectangle_perimeter(a, b):
    """Вычисляет периметр прямоугольника."""
    return 2 * (a + b)
@tool
def compute_circle_area(radius):
    """Вычисляет площадь круга."""
    return math.pi * (radius ** 2)
@tool
def compute_cylinder_volume(radius, height):
    """Вычисляет объем цилиндра."""
    return math.pi * (radius ** 2) * height
@tool
def compute_cube_volume(a):
    """Вычисляет объем куба."""
    return a ** 3
@tool
def convert_binary_to_decimal(binary_number: str):
    """Переводит число из двоичной системы счисления в десятичную систему счисления."""
    return int(binary_number, 2)
@tool
def convert_decimal_to_binary(decimal_number):
    """Переводит число из десятичной системы счисления в двоичную систему счисления."""
    return bin(decimal_number)[2:]
@tool
def get_count_ones(number: str):
    """Находит количество единиц в двоичном представлении числа."""
    return number.count('1')
# Поместите все написанные функции в tools      
tools = [
    compute_arc_length,
    compute_triangle_area,
    add_numbers,
    convert_meters_to_cm,
    convert_cubic_cm_to_liters,
    compute_rectangle_perimeter,
    compute_circle_area,
    compute_cylinder_volume,
    compute_cube_volume,
    convert_binary_to_decimal,
    convert_decimal_to_binary,
    get_count_ones
]