Главная / Статьи / Что на самом деле предлагает LangChain помимо простого вызова инструментов

Что на самом деле предлагает LangChain помимо простого вызова инструментов

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

810 слов

Приложения на основе ИИ могут напрямую обращаться к API LLM и контролировать каждую деталь. У такого подхода есть реальные преимущества: логика управления видна наглядно. Однако он сопряжен и с издержками. Как только продукт выходит за рамки одного диалога, появляется множество кодовых элементов, которые на самом деле не являются частью логики продукта.

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

  • Определение инструментов и схем
  • Отправка инструментов в модель
  • Обработка ответов от модели
  • Выполнение запрошенных функций
  • Возврат результатов инструментов
  • Хранение истории диалога
  • Координация нескольких вызовов инструментов
  • Управление циклом «модель↔инструменты»

Эти шаги отлично подходят для обучения. Однако в приложениях для доставки повторение их вручную превращается в постоянную работу.

Фреймворки вроде LangChain существуют для устранения такой необходимости в повторении действий.

Издержки ручного выполнения всех операций

Представьте себе крошечный инструмент-калькулятор. Без фреймворка путь реализации выглядит примерно так:

User
  ↓
LLM API
  ↓
LLM requests calculator
  ↓
Our code detects the request
  ↓
Our code executes calculator()
  ↓
Our code sends the result back
  ↓
LLM generates the final answer

С одним инструментом всё легко управлять. Но двадцать инструментов, несколько моделей, сохранение состояния чата, повторные попытки и ветвящиеся рабочие процессы превращают «простую логику продукта» в проект оркестрации.

Абстракции необходимы, потому что сложность системы растёт быстрее, чем список функций.

Что вносит LangChain

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

Создание инструмента

Обычная функция на Python превращается в инструмент:

from langchain.tools import tool

def calculator(a: float, b: float, operation: str):
    """Perform a mathematical calculation."""
    if operation == "add":
        return a + b
    elif operation == "subtract":
        return a - b
    elif operation == "multiply":
        return a * b
    elif operation == "divide":
        if b == 0:
            return "Cannot divide by zero."
        return a / b
    return "Unknown operation."

Сама логика калькулятора остаётся частью приложения. LangChain лишь оборачивает её, чтобы большие языки модели могли к ней обращаться.

Подключение инструмента к модели

from langchain_google_genai import ChatGoogleGenerativeAI

model = ChatGoogleGenerativeAI(
    model="gemini-3.5-flash-lite"
)
model_with_tools = model.bind_tools([calculator])

Затем происходит вызов:

response = model_with_tools.invoke(
    "What is 2 + 6?"
)

Модель может ответить с запросом на использование структурированного инструмента, например:

calculator(
    a=2,
    b=6,
    operation="add"
)

bind_tools() не запускает калькулятор. Он лишь указывает на его доступность: модель может запросить этот инструмент по мере необходимости.

Где проявляется абстракция

Вручную инженер управляет длинной цепочкой операций:

Create function
     ↓
Create tool schema
     ↓
Send schema to LLM
     ↓
Receive tool call
     ↓
Extract arguments
     ↓
Execute function
     ↓
Create tool result
     ↓
Send result back to LLM
     ↓
Check if another tool call is needed
     ↓
Repeat

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

What capability does my application need?
              ↓
        Define the tool
              ↓
      Give it to the model
              ↓
       Build the application

Сложность не исчезла — она просто переместилась за определенные границы.

Что на самом деле достигается

LangChain не изобретает механизмы вызова инструментов; существующие API уже поддерживают их. Преимущество заключается не в повторном создании схем, циклов и механизмов обработки истории для каждой функции. Время тратится на решение вопросов, связанных с продуктом:

  • Что должен уметь делать ассистент?
  • Какие инструменты входят в рамки его функционала?
  • Что происходит, если инструмент не сработает?
  • Как должно реагировать остальное приложение?
  • Какие бизнес-правила обязательно должны быть закодированы жестко?
  • Должен ли каждый проект использовать фреймворк?

    Не всегда. Ручное вызов инструментов по-прежнему остается лучшим способом обучения. Один раз пройдясь по циклу:

    LLM
     ↓
    Tool call
     ↓
    Application
     ↓
    Tool execution
     ↓
    Tool result
     ↓
    LLM
    

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

    Хорошая привычка: сначала изучите основные механизмы, затем применяйте абстракции, чтобы не переписывать их для каждого задания. Команды, которые пропускают первый шаг, часто воспринимают LangChain как что-то волшебное и теряются, когда схема инструмента или политика повторных попыток начинает работать некорректно. Команды, которые развивают обе навыки, действуют быстрее и сохраняют возможность обращаться к базовым механизмам в случае необходимости при производственных сбоях.