Розвиток AI-агента на базі LLM
AI-агент на базі LLM — система, в якій мовна модель виступає "мозком", приймаючи рішення: що робити далі, які інструменти використовувати, як інтерпретувати результати. На відміну від RAG-системи або чатбота, агент не просто генерує відповідь — він виконує послідовність дій для досягнення мети.
Компоненти 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 RUB.
Базова реалізація агента з 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 тижнів







