Ваш первый ИИ-агент для работы с инструментами с использованием LangChain
Создайте небольшого математического агента LangChain на Python: инициализируйте модель для чатов, зарегистрируйте инструменты, позвольте большой языковой модели выбрать функцию для вызова и наблюдайте за использованием нескольких инструментов подряд.
Короткое упражнение на 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 позволяет представить каждую функцию в формате, понятном движку агента.
Два фактора влияют на работу модели:
- Аннотированные параметры указывают на тип ожидаемых аргументов.
a: float
b: float
- Описания функций в виде документации содержат простые на языке человека формулировки, которые модель использует для определения релевантности.
Для инструментов агентов описательная часть функции является частью интерфейса управления, а не элементом декорирования.
"""Multiply two numbers."""
3. Подключение агента
Прикрепите вспомогательные функции к модели:
from langchain.agents import create_agent
agent = create_agent(
model=model,
tools=[
add,
subtract,
multiply,
divide,
square_root
],
)
Теперь чат-модель может действовать в качестве агента, а не просто отвечать на один вопрос.
Типичные шаги включают:
- Анализ намерения пользователя
В общих чертах:
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, который выбирает и выполняет действия, а не тот, который лишь генерирует прозу.