Разработка AI-агента на базе LLM
AI-агент на базе LLM — система, в которой языковая модель выступает «мозгом», принимающим решения: что делать дальше, какие инструменты использовать, как интерпретировать результаты. В отличие от RAG-системы или chatbot, агент не просто генерирует ответ — он выполняет последовательность действий для достижения цели.
Компоненты AI-агента
┌─────────────────────────────────────────┐
│ LLM (reasoning) │
│ ┌─────────┐ ┌──────────┐ ┌────────┐ │
│ │Planning │ │ Tool │ │Memory │ │
│ │ │ │ Calling │ │ │ │
│ └─────────┘ └──────────┘ └────────┘ │
└─────────────────────────────────────────┘
↓ ↓
┌─────────┐ ┌──────────────┐
│ Actions │ │ Tools │
└─────────┘ ├──────────────┤
│ Web Search │
│ Code Exec │
│ DB Query │
│ API Calls │
│ File I/O │
└──────────────┘
ReAct паттерн: основа большинства агентов
ReAct (Reasoning + Acting) — паттерн, где модель чередует рассуждение и действия:
Thought: Нужно найти текущий курс USD/RUB
Action: search_web("курс доллара ЦБ РФ сегодня")
Observation: По данным ЦБ РФ на 28.03.2026: 1 USD = 89.43 RUB
Thought: Нашёл курс. Теперь могу рассчитать сумму
Action: calculate(amount_usd=1500 * 89.43)
Observation: 134145.0
Thought: Расчёт выполнен. Итоговый ответ: 134 145 рублей
Final Answer: При курсе 89.43 руб/долл, 1500 USD = 134 145 руб.
Базовая реализация агента с OpenAI Tools
from openai import OpenAI
import json
client = OpenAI()
# Определение инструментов
tools = [
{
"type": "function",
"function": {
"name": "search_documents",
"description": "Поиск информации в корпоративной базе знаний",
"parameters": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "Поисковый запрос"},
"doc_type": {"type": "string", "enum": ["contract", "policy", "faq"]},
},
"required": ["query"],
},
},
},
{
"type": "function",
"function": {
"name": "execute_sql",
"description": "Выполнить SQL-запрос к базе данных компании",
"parameters": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "SQL-запрос только SELECT"},
},
"required": ["query"],
},
},
},
{
"type": "function",
"function": {
"name": "send_email",
"description": "Отправить email",
"parameters": {
"type": "object",
"properties": {
"to": {"type": "string"},
"subject": {"type": "string"},
"body": {"type": "string"},
},
"required": ["to", "subject", "body"],
},
},
},
]
# Обработчики инструментов
def execute_tool(tool_name: str, tool_args: dict) -> str:
if tool_name == "search_documents":
results = vectorstore.similarity_search(tool_args["query"], k=3)
return "\n".join([r.page_content for r in results])
elif tool_name == "execute_sql":
results = db.execute(tool_args["query"])
return str(results[:20]) # Ограничиваем вывод
elif tool_name == "send_email":
email_service.send(**tool_args)
return "Email отправлен успешно"
return "Tool not found"
# Агентный цикл
def run_agent(user_message: str, max_iterations: int = 10) -> str:
messages = [
{"role": "system", "content": "Ты — корпоративный AI-ассистент. Используй инструменты для выполнения задач."},
{"role": "user", "content": user_message},
]
for iteration in range(max_iterations):
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=tools,
tool_choice="auto",
)
message = response.choices[0].message
# Если нет вызовов инструментов — финальный ответ
if not message.tool_calls:
return message.content
# Обрабатываем вызовы инструментов
messages.append(message)
for tool_call in message.tool_calls:
tool_name = tool_call.function.name
tool_args = json.loads(tool_call.function.arguments)
result = execute_tool(tool_name, tool_args)
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": result,
})
return "Превышено максимальное число итераций"
Практический кейс: агент для обработки запросов на закупку
Задача: агент получает запрос на закупку от сотрудника, проверяет бюджет, находит подходящих поставщиков в реестре, создаёт черновик договора, отправляет на согласование.
Инструменты агента:
-
check_budget(department, category)— проверка остатка бюджета -
search_suppliers(category, requirements)— поиск поставщиков -
generate_contract_draft(supplier_id, terms)— генерация договора -
create_task_in_jira(title, description, assignee)— создание задачи -
send_notification(user_id, message)— уведомление
Метрики за 3 месяца:
- Время обработки запроса: 4.5 дня → 2.1 часа
- Доля автоматически обработанных (без правок): 68%
- Ошибки (неправильный поставщик/превышение бюджета): 4%
Guardrails: агент не выполняет финансовые операции напрямую — только подготовку документов и уведомления. Финальное утверждение — за человеком.
Memory: краткосрочная и долгосрочная
from langchain.memory import ConversationBufferWindowMemory, ConversationSummaryMemory
# Краткосрочная память: последние N сообщений
short_term = ConversationBufferWindowMemory(k=10, return_messages=True)
# Долгосрочная: суммаризованная история
long_term = ConversationSummaryMemory(llm=ChatOpenAI(), max_token_limit=2000)
# Семантическая память: важные факты в векторном хранилище
from langchain.memory import VectorStoreRetrieverMemory
semantic_memory = VectorStoreRetrieverMemory(
retriever=vectorstore.as_retriever(search_kwargs={"k": 3})
)
Сроки
- Разработка базового агента с 3–5 инструментами: 2–3 недели
- Разработка корпоративного агента с интеграциями: 6–10 недель







