Ваш перший штучний інтелект-агент для роботи з інструментами за допомогою 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, який вибирає та виконує дії, а не просто генерує текст.