В последние годы большие языковые модели (LLM) произвели революцию в области искусственного интеллекта. LLM-агенты представляют собой следующий шаг эволюции, позволяя моделям не просто генерировать текст, но и взаимодействовать с окружением, использовать инструменты и выполнять сложные задачи автономно.
Что такое LLM-агенты и как они работают?
LLM-агент — это система, использующая LLM в качестве своего «мозга» для принятия решений и выполнения действий. В отличие от простого вызова LLM для генерации текста, агент использует модель для рассуждения о том, какое действие предпринять для достижения поставленной цели. Получив задачу, агент анализирует ее, выбирает подходящий инструмент (если необходимо), выполняет действие с помощью этого инструмента, получает результат, анализирует его и решает, какое действие предпринять дальше, пока задача не будет выполнена или не будет достигнуто определенное условие остановки. Этот итеративный процесс «мысль -> действие -> наблюдение» (Thought -> Action -> Observation) является ключевым в работе агентов.
Основные компоненты LLM-агента: LLM, инструменты, память.
LLM (Large Language Model): Ядро агента, отвечающее за понимание задачи, рассуждение, планирование и принятие решений. Качество и возможности LLM напрямую влияют на производительность агента.
Инструменты (Tools): Функции или API, которые агент может вызывать для взаимодействия с внешним миром или выполнения специфических задач, недоступных LLM напрямую. Примеры: поиск в интернете, выполнение кода Python, запросы к базам данных, взаимодействие с API сервисов.
Память (Memory): Механизм, позволяющий агенту сохранять информацию о предыдущих шагах взаимодействия, результатах действий и контексте диалога. Память необходима для поддержания последовательности рассуждений и выполнения многошаговых задач.
Примеры использования LLM-агентов в различных областях
Веб-программирование: Автоматизация тестирования UI, генерация boilerplate-кода, анализ логов сервера.
Интернет-маркетинг: Анализ эффективности рекламных кампаний (сбор данных через API рекламных платформ), генерация креативов, SEO-анализ контента, автоматизация ответов на отзывы.
Data Analysis: Автоматизация рутинных задач по обработке данных, генерация отчетов на основе данных из баз данных, выполнение SQL-запросов по текстовому описанию.
Контекстная реклама: Создание и оптимизация рекламных объявлений, анализ ключевых слов, мониторинг конкурентов.
Создание простого LLM-агента на Python: Пошаговая инструкция
Рассмотрим создание простого агента с использованием популярной библиотеки LangChain и OpenAI API.
Необходимые библиотеки и инструменты: установка и настройка (LangChain, OpenAI API)
Прежде всего, необходимо установить библиотеки и получить API-ключ от OpenAI (или другого провайдера LLM).
pip install langchain langchain-openai python-dotenvСоздайте файл .env в корне проекта и добавьте ваш API-ключ:
OPENAI_API_KEY='ваш_api_ключ_openai'Проектирование агента: определение цели, инструментов и логики
Цель: Создать агента, который может отвечать на вопросы, используя поиск в интернете, если не знает ответа.
Инструменты:
Стандартный инструмент LLM для ответа на общие вопросы.
Инструмент поиска (например, через Tavily Search API или DuckDuckGo).
Логика: Агент получает вопрос. LLM пытается ответить на основе своих знаний. Если уверенности недостаточно или вопрос требует актуальной информации, LLM решает использовать инструмент поиска. Результат поиска передается LLM для генерации финального ответа.
Реализация агента: написание кода на Python (примеры кода)
import os
from typing import Any, Type
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.agents import tool, AgentExecutor, create_react_agent
from langchain_core.prompts import ChatPromptTemplate
from langchain import hub
# Загрузка переменных окружения (API ключей)
load_dotenv()
# Определение кастомного инструмента (пример)
@tool
def get_word_length(word: str) -> int:
"""Возвращает длину переданного слова."""
# Пример простой логики инструмента
if not isinstance(word, str):
raise TypeError("Input 'word' must be a string.")
return len(word)
# Инициализация LLM
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
# Определение списка инструментов для агента
tools = [get_word_length]
# Получение базового промпта ReAct из LangChain Hub
prompt = hub.pull("hwchase17/react")
# Создание агента с использованием LLM, инструментов и промпта
agent = create_react_agent(llm, tools, prompt)
# Создание исполнителя агента
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
def run_agent(query: str) -> Any:
"""Запускает агент с заданным запросом.
Args:
query: Строка запроса для агента.
Returns:
Результат выполнения агента.
"""
if not isinstance(query, str):
raise TypeError("Input 'query' must be a string.")
try:
result = agent_executor.invoke({"input": query})
return result
except Exception as e:
# Обработка возможных ошибок при выполнении агента
print(f"An error occurred: {e}")
return None
# Пример использования
if __name__ == "__main__":
user_query = "какая длина у слова 'программирование'?"
response = run_agent(user_query)
if response:
print("\nИтоговый ответ:")
print(response.get('output', 'Нет ответа'))
user_query_error = "какая длина у слова 123?" # Некорректный тип
# run_agent(user_query_error) # Вызовет ошибку внутри инструментаПримечание: Для использования реального поиска потребуется интеграция соответствующего инструмента (например, TavilySearchResults) и API ключа.
Тестирование и отладка агента
Тестирование включает проверку способности агента правильно выбирать инструменты, обрабатывать ответы инструментов и достигать поставленной цели. Используйте параметр verbose=True в AgentExecutor для отслеживания хода мыслей (chain of thought) агента, его действий и наблюдений. Это основной инструмент для отладки логики агента.
Продвинутые техники создания LLM-агентов
Простые агенты могут решать ограниченный круг задач. Для более сложных сценариев применяются продвинутые техники.
Использование memory (памяти) для улучшения работы агента
Память позволяет агенту помнить предыдущие взаимодействия в рамках одного сеанса. Это критично для диалоговых агентов или задач, требующих контекста.
ConversationBufferMemory: Хранит историю диалога в виде списка сообщений.
ConversationSummaryMemory: Суммаризирует историю диалога с помощью LLM, экономя токены.
VectorStoreRetrieverMemory: Хранит информацию в векторной базе данных и извлекает наиболее релевантные части для текущего шага.
Интеграция памяти обычно происходит при создании AgentExecutor.
Реализация сложных цепочек действий (chains) для решения задач
LangChain позволяет создавать цепочки (Chains), где выход одного компонента (LLM, инструмента) становится входом для другого. Это позволяет строить сложные рабочие процессы.
SequentialChain: Простая последовательность вызовов.
RouterChain: Направляет входные данные в одну из нескольких подцепочек на основе инструкций LLM.
Кастомные цепочки: Возможность создавать собственные цепочки с произвольной логикой.
Агенты сами по себе являются типом цепочки, но иногда требуется явно определить последовательность шагов для повышения надежности или реализации специфической логики.
Интеграция с внешними API и базами данных
Сила агентов раскрывается при взаимодействии с внешними системами. Это достигается созданием кастомных инструментов.
API: Инструмент может отправлять запросы к REST/GraphQL API (например, CRM, рекламных кабинетов, сервисов аналитики) и обрабатывать ответы.
Базы данных: Инструмент может выполнять SQL-запросы (например, SQLDatabaseToolkit в LangChain) или взаимодействовать с NoSQL базами.
При создании таких инструментов важно обеспечить безопасность (управление API-ключами, права доступа) и корректную обработку ошибок.
Примеры кода AI-агентов на Python и разбор кейсов
Рассмотрим более сложные примеры.
Агент-помощник для поиска информации в интернете (пример кода)
Этот агент использует инструмент поиска для ответа на актуальные вопросы.
# ... (импорты и настройка как в предыдущем примере)
# Требуется: pip install langchain_community tavily-python
from langchain_community.tools.tavily_search import TavilySearchResults
# Инструмент поиска
# Требует установки переменной окружения TAVILY_API_KEY
tavily_tool = TavilySearchResults(max_results=3)
# Список инструментов
tools = [tavily_tool]
# Инициализация LLM
llm = ChatOpenAI(model="gpt-4o", temperature=0)
# Промпт для агента (можно использовать стандартный или кастомизировать)
prompt = hub.pull("hwchase17/react")
# Создание агента и исполнителя
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# Запуск
if __name__ == "__main__":
response = agent_executor.invoke({
"input": "Какая сейчас погода в Москве и какие главные новости в мире AI?"
})
print("\nИтоговый ответ:")
print(response.get('output', 'Нет ответа'))Агент для автоматизации задач в CRM-системе (пример кода)
Представим агента, который может найти контакт в CRM по email и добавить заметку.
import os
from typing import Dict, Any
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.agents import tool, AgentExecutor, create_react_agent
from langchain_core.prompts import ChatPromptTemplate
from langchain import hub
# Загрузка переменных окружения
load_dotenv()
# --- Имитация CRM API ---
MOCK_CRM_DB = {
"test@example.com": {"id": "123", "name": "Тест Тестов", "notes": []},
"another@example.com": {"id": "456", "name": "Иван Иванов", "notes": ["Звонил 10.05"]}
}
@tool
def find_contact_by_email(email: str) -> Dict[str, Any]:
"""Находит контакт в CRM по email адресу."""
print(f"---> Вызов find_contact_by_email с email: {email}")
contact = MOCK_CRM_DB.get(email)
if contact:
# Возвращаем копию, чтобы не изменять MOCK_CRM_DB напрямую
return {k: v for k, v in contact.items() if k != 'notes'} # Не возвращаем заметки списком
else:
return {"error": "Контакт не найден"}
@tool
def add_note_to_contact(contact_id: str, note_text: str) -> Dict[str, Any]:
"""Добавляет заметку к контакту по его ID."""
print(f"---> Вызов add_note_to_contact с ID: {contact_id}, Заметка: {note_text}")
found = False
for email, data in MOCK_CRM_DB.items():
if data['id'] == contact_id:
data['notes'].append(note_text)
found = True
break
if found:
return {"success": True, "message": f"Заметка добавлена к контакту {contact_id}"}
else:
return {"success": False, "error": f"Контакт с ID {contact_id} не найден"}
# --- Конец имитации CRM API ---
# Инициализация LLM
llm = ChatOpenAI(model="gpt-4o", temperature=0)
# Инструменты
tools = [find_contact_by_email, add_note_to_contact]
# Промпт
prompt = hub.pull("hwchase17/react")
# Агент и исполнитель
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True)
# Запуск
if __name__ == "__main__":
user_task = "Найди контакт с email 'test@example.com' и добавь ему заметку 'Провел демонстрацию продукта'."
response = agent_executor.invoke({"input": user_task})
print("\nИтоговый ответ:")
print(response.get('output', 'Нет ответа'))
# Проверка добавления заметки (для демонстрации)
print("\nСостояние MOCK_CRM_DB после выполнения:")
print(MOCK_CRM_DB)В реальном приложении вместо MOCK_CRM_DB и функций find_contact_by_email, add_note_to_contact будут вызовы настоящего CRM API.
Агент для написания текстов (пример кода)
Такой агент может использовать LLM для генерации и улучшения текста, возможно, с использованием инструментов для проверки грамматики или стилистики.
# ... (основные импорты и настройка LLM)
from langchain_openai import ChatOpenAI
from langchain.agents import tool, AgentExecutor, create_react_agent
from langchain import hub
# Примерный инструмент для стилистической правки (может быть вызовом другого LLM или API)
@tool
def improve_text_style(text: str) -> str:
"""Улучшает стиль переданного текста, делая его более формальным."""
# В реальном сценарии здесь может быть вызов API или другой LLM
# Для примера просто добавим формальное приветствие/завершение
print(f"---> Вызов improve_text_style для текста: '{text[:50]}...'" )
# Простая имитация улучшения стиля
if len(text) < 20:
return f"Уважаемые коллеги, {text.lower()}. С уважением."
else:
# Более сложная логика может быть здесь
processed_text = text.replace("привет", "здравствуйте")
return f"Уважаемые дамы и господа, \n\n{processed_text}\n\nС наилучшими пожеланиями."
# Инициализация LLM (можно использовать другую модель для креативных задач)
llm = ChatOpenAI(model="gpt-4o", temperature=0.7)
tools = [improve_text_style]
prompt = hub.pull("hwchase17/react") # Можно создать более специфичный промпт
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
if __name__ == "__main__":
task = "Напиши короткое сообщение коллегам о совещании завтра в 10 утра. Потом улучши стиль этого сообщения."
response = agent_executor.invoke({"input": task})
print("\nИтоговый ответ:")
print(response.get('output', 'Нет ответа'))Заключение и дальнейшие шаги
LLM-агенты открывают новые горизонты для автоматизации сложных задач, требующих рассуждения и взаимодействия с внешним миром. Мы рассмотрели основы их работы и создания с помощью Python и LangChain.
Перспективы развития LLM-агентов
Мультимодальность: Агенты смогут обрабатывать и генерировать не только текст, но и изображения, аудио, видео.
Улучшенное планирование: Развитие более сложных алгоритмов планирования и разбиения задач (например, ReAct, Plan-and-Solve).
Автономность и самообучение: Агенты смогут обучаться на собственном опыте и адаптироваться к новым задачам.
Коллаборация агентов: Создание систем, где несколько агентов взаимодействуют для решения общей проблемы.
Ресурсы для дальнейшего изучения (документация, туториалы, библиотеки)
LangChain Documentation: Основной ресурс по библиотеке LangChain.
OpenAI API Documentation: Документация по моделям и API OpenAI.
Hugging Face Agents: Альтернативная концепция агентов.
Научные статьи: Ищите публикации по темам "LLM Agents", "ReAct Framework", "Autonomous Agents".
Советы по улучшению работы и безопасности LLM-агентов
Четкие инструкции (Prompt Engineering): Качество промпта критически важно для управления поведением агента.
Ограничение инструментов: Предоставляйте агенту только те инструменты, которые действительно необходимы для задачи.
Валидация вводов/выводов: Проверяйте данные, передаваемые инструментам и получаемые от них.
Управление затратами: Мониторьте использование API, так как агенты могут делать множество вызовов LLM и инструментов.
Безопасность: Никогда не позволяйте агентам выполнять произвольный код или иметь неограниченный доступ к файловой системе или внешним ресурсам без строгих мер безопасности и контроля.