Главная / Статьи / Ваш первый ИИ-агент для работы с инструментами с использованием LangChain

Ваш первый ИИ-агент для работы с инструментами с использованием LangChain

Создайте небольшого математического агента LangChain на Python: инициализируйте модель для чатов, зарегистрируйте инструменты, позвольте большой языковой модели выбрать функцию для вызова и наблюдайте за использованием нескольких инструментов подряд.

1062 слов

Короткое упражнение на Python + LangChain позволяет создать агента в стиле калькулятора, который при необходимости может вызывать функции для сложения, вычитания, умножения, деления или нахождения квадратного корня.

Арифметика здесь второстепенна. Важный урок заключается в том, чтобы наблюдать за ИИ-моделью, которая получает доступ к функциям и решает, какую из них вызвать и на каком этапе.

Примеры задач, которые может решать готовый агент:

Умножьте 25 на 4. Найдите квадратный корень из 144, затем умножьте полученный результат на 5.

Вместо того чтобы заранее прописать точную последовательность вычислений, регистрируются несколько функций. Модель выбирает среди них в зависимости от формулировки пользователя.

1. Инициализация модели

Начните с создания чат-модели:

from langchain.chat_models import init_chat_model

model = init_chat_model("openai:gpt-4o-mini")

Пока не существует ничего похожего на агента — только текстовая модель, способная читать и писать.

2. Регистрация функций-помощников

Агенты становятся полезными, когда они выходят за рамки простого генерирования текста и могут вызывать функции приложения.

Определите пять минимальных вспомогательных функций:

from langchain.tools import tool
import math

@tool
def add(a: float, b: float) -> float:
    """Add two numbers."""
    return a + b

@tool
def subtract(a: float, b: float) -> float:
    """Subtract two numbers."""
    return a - b


@tool
def multiply(a: float, b: float) -> float:
    """Multiply two numbers."""
    return a * b


@tool
def divide(a: float, b: float) -> float:
    """Divide two numbers."""
    if b == 0:
        raise ValueError("Cannot divide by zero.")
    return a / b


@tool
def square_root(a: float) -> float:
    """Calculate the square root of a number."""
    if a < 0:
        raise ValueError("Cannot calculate square root of a negative number.")
    return math.sqrt(a)

Использование атрибута @tool позволяет представить каждую функцию в формате, понятном движку агента.

Два фактора влияют на работу модели:

  1. Аннотированные параметры указывают на тип ожидаемых аргументов.
a: float
b: float
  1. Описания функций в виде документации содержат простые на языке человека формулировки, которые модель использует для определения релевантности.

Для инструментов агентов описательная часть функции является частью интерфейса управления, а не элементом декорирования.

"""Multiply two numbers."""

3. Подключение агента

Прикрепите вспомогательные функции к модели:

from langchain.agents import create_agent

agent = create_agent(
    model=model,
    tools=[
        add,
        subtract,
        multiply,
        divide,
        square_root
    ],
)

Теперь чат-модель может действовать в качестве агента, а не просто отвечать на один вопрос.

Типичные шаги включают:

  1. Анализ намерения пользователя
  • Определить, требуется ли помощник
  • Выбрать помощника
  • Предоставить аргументы
  • Использовать возвращаемое значение помощника
  • Решить, нужен ли следующий шаг
  • Отправить окончательный ответ
  • В общих чертах:

    User
     ↓
    Agent
     ↓
    Should I use a tool?
     ↓
    Choose tool
     ↓
    Execute tool
     ↓
    Get result
     ↓
    Final response
    

    Вопросы с несколькими шагами могут повторять этот цикл.

    4. Запуск процесса

    Для его выполнения достаточно простого обёртывающего кода:

    def run_agent(question: str):
        """Run the agent and print the execution trace."""
    
        print(f"User: {question}")
    
        result = agent.invoke({
            "message": [("user", question)],
        })
    
        print("Agent:", result)
    

    Вызвать его с простым вопросом:

    run_agent("What is 25 multiplied by 4?")
    

    Обратите внимание: нет указания на то, чтобы «позвонить multiply». Предоставлен лишь каталог помощников.

    Исходя из формулировки и описания каждого помощника, модель делает вывод, что умножение является подходящим вариантом.

    5. Связывание более чем одного помощника

    Попробуйте составный запрос:

    run_agent(
        "Calculate the square root of 144 and multiply the result by 5."
    )
    

    Требуются две операции.

    Концептуальная структура выглядит так:

    User:
    
    Calculate √144 × 5
            ↓
    Agent chooses square_root
            ↓
    square_root(144)
            ↓
    12
            ↓
    Agent chooses multiply
            ↓
    multiply(12, 5)
            ↓
    60
            ↓
    Final answer
    

    Этот цикл — выбор, вызов, наблюдение, повторный выбор — и есть суть агентов, использующих инструменты.

    Код приложения не обязан заранее задавать полный порядок действий.

    Модель может определить следующий шаг на основе оставшихся инструментов и состояния разговора.

    6. Сравнение с обычным LLM

    Без инструментов модель может просто придумать текст «Ответ — 60».

    При наличии зарегистрированных инструментов она может передавать числовые вычисления реальным функциям.

    Изменение механизма управления

    Путь только с текстом: пользователь → модель → строка ответа

    против:

    Tool-using agent
    
    User
      ↓
    LLM
      ↓
    Choose tool
      ↓
    Execute code
      ↓
    Observe result
      ↓
    LLM
      ↓
    Answer
    

    Модель больше не обязана выполнять все вычисления самостоятельно.

    Она предлагает какое действие следует выполнить дальше; приложение решает, какие действия существуют и как они выполняются.

    7. Граница, которую стоит защищать

    Калькулятор — это учебная игрушка.

    Основная идея заключается в разделении оценки модели и полномочий по выполнению действий.

    Понимание естественного языка и выбор действий хорошо сочетаются с LLM.

    Выполнение этих действий должно происходить в Python под вашим контролем.

    Модель может прийти к выводу о необходимости такого разделения.

    Ваш процесс отвечает за реализацию этого разделения и его побочные эффекты.

    Замените простые математические инструменты на операции конкретной области, такие как:

    get_customer()
    search_transactions()
    create_report()
    send_email()
    query_database()
    get_weather()
    create_ticket()
    

    и тот же паттерн оркестрации начинает напоминать дизайны агентов в производственных средах.

    Краткий обзор упражнения

    Несколько модулей создали агента, способного:

    • Интерпретировать вопросы свободного формата
    • Выбирать из нескольких зарегистрированных инструментов
    • Правильно связывать аргументы
    • Сочетать инструменты в рамках одной сессии
    • Подавать результаты работы инструментов обратно для дальнейших рассуждений
  • Ответьте пользователю после завершения цепочки действий
  • Коротко говоря: LLM, который выбирает и выполняет действия, а не тот, который лишь генерирует прозу.