Інтеграція LLM (ChatGPT/Claude) в мобільного чат-бота
Прямий вияв до OpenAI API з мобільного додатку працює на прототипах і вбиває продакшн: ключ в APK — це питання годин до його компрометації. Правильна архітектура завжди передбачає прокси-сервер між додатком і LLM. Це не ускладнення — це обов'язкова умова.
Архітектура: що повинно бути на сервері
Бекенд виконує кілька завдань, які неможливо перекладати на клієнт:
- Зберігання API-ключів OpenAI / Anthropic
- Rate limiting по користувачу — без нього один активний юзер може вигоріти весь місячний ліміт
- Історія діалогу — LLM stateless, кожен запит повинен включати попередні повідомлення
-
Модерація —
omni-moderation-latestвід OpenAI або власна перевірка перед відправленням у модель - Кешування однакових запитів (FAQ, часто повторювані питання)
Історія діалогу — найдорожча аспект. Кожен додатковий обмін репліками збільшує контекст, а значить — вартість запиту. Для чат-бота підтримки немає сенсу зберігати всю історію: достатньо останніх 10–20 повідомлень плюс system prompt.
Streaming на мобільному клієнті
Користувач не буде чекати 5–10 секунд поки модель сформує відповідь цілком. Потрібен streaming: сервер передає токени по мірі генерації через Server-Sent Events (SSE) або WebSocket, клієнт показує їх в реальному часі.
OpenAI API підтримує SSE через параметр stream: true. На сервері:
const stream = await openai.chat.completions.create({
model: 'gpt-4o',
messages: conversationHistory,
stream: true,
});
for await (const chunk of stream) {
const delta = chunk.choices[0]?.delta?.content;
if (delta) {
res.write(`data: ${JSON.stringify({ token: delta })}\n\n`);
}
}
res.write('data: [DONE]\n\n');
res.end();
На Android клієнт читає SSE через OkHttp EventSource:
val request = Request.Builder()
.url("$baseUrl/chat/stream")
.post(body)
.build()
val listener = object : EventSourceListener() {
override fun onEvent(source: EventSource, id: String?, type: String?, data: String) {
if (data == "[DONE]") return
val token = Json.decodeFromString<TokenEvent>(data).token
viewModel.appendToken(token)
}
}
EventSources.createFactory(okHttpClient).newEventSource(request, listener)
На iOS — використовуйте URLSession з dataTaskPublisher або AsyncSequence для читання SSE рядок за рядком.
System prompt: головний інструмент управління поведінкою
Якість бота на 80% визначається system prompt, а не вибором між GPT-4o та Claude. Типові помилки:
Занадто загальний промпт. «Ти — корисний асистент магазину» залишає модель занадто широкий простір для дій. Модель почне міркувати на відвлечені теми та галюцинувати неіснуючі акції.
Немає обмежень на області знань. Явно пишемо: «Відповідай тільки на питання про продукти компанії X. Якщо питання не по темі — ввічливо відмовляй».
Не вказаний формат відповіді. Для чат-бота в мобільному додатку довгі абзаци незручні — просимо модель відповідати коротко, використовувати списки тільки коли необхідно.
Anthropic Claude через Messages API працює аналогічно, але у нього немає system в масиві messages — він передається окремим параметром. Claude краще тримає роль при спробах jailbreak, що актуально для публічних ботів.
Функціональні виклики (Tool Use / Function Calling)
Для бота, який повинен здійснювати дії (створити замовлення, перевірити статус, знайти товар), потрібен механізм function calling. Модель повертає не текст, а JSON з ім'ям функції та параметрами. Сервер виконує функцію та отримує результат назад моделі для формування відповіді.
tools = [{
"type": "function",
"function": {
"name": "get_order_status",
"description": "Отримати статус замовлення по його номеру",
"parameters": {
"type": "object",
"properties": {
"order_id": {"type": "string", "description": "Номер замовлення"}
},
"required": ["order_id"]
}
}
}]
Це дозволяє будувати ботів, які реально виконують завдання, а не тільки відповідають на питання.
Вибір моделі
| Модель | Контекст | Швидкість | Застосування |
|---|---|---|---|
| GPT-4o | 128K | Середня | Складні сценарії, довгі документи |
| GPT-4o mini | 128K | Швидка | FAQ, прості запити |
| Claude 3.5 Haiku | 200K | Дуже швидка | Масові чати, streaming |
| Claude 3.5 Sonnet | 200K | Середня | Якісні відповіді, tool use |
Для мобільного чат-бота підтримки GPT-4o mini або Claude 3.5 Haiku дають найкращий баланс швидкості та вартості.
Процес розробки
Проектування архітектури: сценарії використання, інструменти (functions), зберігання історії.
Розробка бекенду: API-прокси, rate limiting, зберігання контексту.
Системний промпт: тестування на граничних випадках, залишання на темі.
Мобільний клієнт: SSE/WebSocket для streaming, UI анімації «пише...».
Навантажувальне тестування та налаштування лімітів перед запуском.
Орієнтири за часом
Базовий LLM чат-бот + мобільний клієнт — 3–5 днів. З function calling, історією, rate limiting, модерацією та аналітикою діалогів — 2–4 тижні.







