Inside the LLM Black Box: що входить у контекст і чому це важливо

Inside the LLM Black Box: що входить у контекст і чому це важливо

Великі мовні моделі (LLM), такі як GPT-4, Claude, Mistral та інші, здаються розумними у своїх відповідях — але справжня магія полягає в тому, як вони сприймають і інтерпретують контекст. Розуміння того, що входить у контекст LLM і як це впливає на результат, критично важливе для розробників, дослідників і дизайнерів продуктів, які працюють із генеративним ШІ. У цій публікації я хочу дослідити складові контексту, його структуру, обмеження та взаємодію з найбільш поширеними сценаріями використання, такими як використання інструментів (Tools, MCP) і включення додаткових знань з Retrieval-Augmented Generation (RAG). --- ## Що таке контекст у LLM? **Контекст** — це весь вхід, який модель бачить в одному запиті. Він включає: * Системні інструкції (наприклад, "Ти — корисний асистент. Відповідай на питання користувача так, ніби ти Дональд Трамп.") * Спогади - перелік важливих фактів із попередніх взаємодій, стиснена коротка версія попередніх розмов. * Історію розмови - попередні повідомлення користувача/асистента, зазвичай останні або "поточні" чати. * Поточний запит користувача — це те, що він питає зараз. Це сам текст, який користувач вводить у чат. * Зовнішні знання (якщо використовується RAG) * Відповіді інструментів — якщо модель використовує інструменти (напр., функції OpenAI або MCP сервери) * Дані про інструменти — список доступних інструментів та їх сигнатури Усе це серіалізується і токенізується, утворюючи запит, на основі якого модель генерує відповідь. І крім цієї інформації немає більше нічого, лише те, що закодовано в самій моделі і цей запит. --- ## Що таке вікно контексту? **Вікно контексту** — це максимальна кількість токенів, яку модель може обробити за один раз. Воно визначає, скільки інформації (інструкцій, повідомлень, документів тощо) може поміститися у взаємодії. Розміри вікна для різних моделей: * GPT-3.5: 4,096 токенів * GPT-4: 8,192 токени * GPT-4-turbo: 128,000 токенів * Claude 2: 100,000 токенів * Claude 3 Opus: понад 200,000 токенів Існує тенденція до збільшення розміру вікна контексту. Нові моделі переважно мають більше токенів у вікні контексту. Якщо запит перевищує ліміт: * Він може бути відхилений з помилкою “перевищено довжину контексту” * Частина запиту може бути просто відкинута (або початок, або кінець) * Перші системні інструкції або спогади можуть бути видалені Відповідальність за дотримання ліміту несе розробник або шар оркестрації — через обрізання, резюмування або поділ вмісту. ![Context window](/blog/image/ukr-inside-the-llm-black-box-what-goes-into-context-and-why-it-matters/1.png) --- ## Компоненти контексту ### 1. Системна інструкція Інструкція, що встановлює поведінку асистента: ```json { "role": "system", "content": "You are a helpful assistant. Respond to a user like you were Donald Trump." } ``` Це стандарт для більшості LLM API. Часто прихована від користувача. --- ### 2. Спогади Системи можуть зберігати довготривалі знання, як-от: ```json { "role": "system", "content": "Memory: The user is studying for the bar exam and prefers concise answers." } ``` Іноді зберігаються під власною роллю або у вигляді підписаних фактів у запиті користувача. Спогади не є стандартом. Їх можна організовувати по різному. Це не є обов’язковою частиною контексту, і модель LLM не відповідає за організацію памʼяті.. Я описав як можна працювати з памʼяттю AI асистента у статті [Implementing AI Chat Memory with MCP](/blog/post/implementing-ai-chat-memory-with-mcp/). --- ### 3. Історія розмови Діалог між користувачем і асистентом: ```json { "role": "user", "content": "How do I cook rice?" }, { "role": "assistant", "content": "Use a 2:1 water-to-rice ratio..." } ``` Зазвичай найдовша частина контексту, що допомагає моделі розуміти поточний стан розмови. Фактично, це попередні запитання та відповіді між користувачем і асистентом. Здебільшого, лише поточний чат. Повідомлення передаються в контекст "як є". Тобто без скорочення або резюмування. --- ### 4. Поточний запит користувача Це є сам текст, який користувач вводить у чат. Наприклад: ```json { "role": "user", "content": "Write a poem about what we talked about with you." } ``` Можна назвати його головною частиною контексту. Переважно це одна з найкоротших частин контексту. Але для моделі ця частина контексту не є чимось особливим. Вона просто передається в контекст, як і всі інші частини. --- ### 5. Зовнішні знання (RAG) RAG дозволяє LLM використовувати свіжі або специфічні знання. Те, що не було в базі знань на яких модель навчалася. На практиці, це власні дані компаній або документи, які витягуються з зовнішніх джерел (пошукові системи, векторні бази даних тощо) і вставляються у запит. Організація RAG може бути різною, як і отримання даних з бази даних. В кінцевому результаті, дані отримані зовні вставляються у контекст, зазвичай, перед запитом користувача: ```json { "role": "user", "content": "Context:\n- Doc 1: ...\n- Doc 2: ...\n\nQuestion: What is X?" } ``` --- ### 6. Виклики інструментів і результати Підтримка інструментів реалізується через виклики та відповіді. Не всі моделі підтримують інструменти, але якщо так, то їх визначення та результати можуть бути передані у контекст. Підтримка інструментів зараз переважно реалізується через MCP (Model Context Protocol). Виклик інструменту виглядає так: * Модель замість "звичайної текстової" відповіді відповідає "очікую виклик інструмента з такими параметрами" * Асистент викликає інструмент, отримує результат і додає відповідь назад в історію розмови (у контекст). * Асистент знову робить запит до ЛЛМ вже з результатом інструмента. * Отримується остаточна відповідь, або модель знову хоче виклик інструмента, тоді процес повторюється. * Далі повідомлення з вимогою моделі про виклик інструмента і відповідь інструмента можуть бути видалені з історії. ```json { "role": "role", "content": "What is the weather in London?" } { "role": "assistant", "content": "I will check the weather for you." } { "role": "assistant", "tool_calls": [{"name": "get_weather", "arguments": {"location": "London"}}] } { "role": "tool", "name": "get_weather", "content": "It is 16°C and sunny in London." } { "role": "assistant", "content": "The weather in London is 16°C and sunny. This is the great weather!" } ``` Для того щоб інструмент міг викликатися моделлю він має бути описаний у контексті. Це окремий розділ в структурі контексту. І тут виникає проблема - якщо у вас багато інструментів, використання вікна контексту може бути неефективним. --- ![Context window](/blog/image/ukr-inside-the-llm-black-box-what-goes-into-context-and-why-it-matters/2.png) ## Як вмістити дані у вікно контексту. Баланс вирішує все. Неможливо просто передати до ЛЛМ все що хочеш — контекстне вікно обмежене. Кожен AI асистент повинен дбати про це. Дані, які ви включаєте в контекст — баланс між системою підказкою, памʼяттю, історією розмови, зовнішніми знаннями інтеграцією інструментів — мають вирішальне значення для того, щоб модель генерувала доречні й узгоджені відповіді. Цей баланс насправді є ключем до успішного проєктування AI-асистента. Ефективне проєктування підказок і стратегії обрізання повідомлень є критично важливими для того, щоб залишатися в межах ліміту. На схемі показано, як можна збалансувати контекст. Оскільки він обмежений, завжди існує компроміс між системним підказом, памʼяттю, історією розмови та зовнішніми знаннями. Пошук цього балансу є критично важливим для створення ефективного AI-асистента. --- ## Приклади використання контексту * **Малюнок 1**: Довга розмова — скоро потрібно буде обрізати старі повідомлення. Також підключено забагато інструментів. * **Малюнок 2**: Великий обсяг спогадів — асистент пам’ятає багато фактів про користувача, є декілька викликів інструментів. * **Малюнок 3**: RAG — більшість контексту займають зовнішні документи. --- ## Токенізація: Вартість обчислень Вікно контексту вимірюється в токенах, а не в символах чи словах. Але наші дані зазвичай подаються у вигляді слів. Більше того, ми працюємо з JSON-документом. Як дізнатися, скільки токенів ми маємо перед тим, як надіслати запит? Текст перед обробкою токенізується (розбивається на підслова або фрагменти слів). Грубе правило для англійської мови: **1 токен ≈ 0.75 слова** Приклад: > "Hello, world!" → 3 токени Якщо вам потрібна точна кількість токенів, ви можете оцінити або виміряти її за допомогою таких інструментів, як: * tiktoken від OpenAI * transformers від HuggingFace Ці інструменти допоможуть вам точно порахувати кількість токенів у тексті або навіть у структурованих даних, таких як JSON. ### Python-приклад підрахунку токенів: ```python import tiktoken # Choose your model model_name = "gpt-3.5-turbo" # Get encoding for the model encoding = tiktoken.encoding_for_model(model_name) # Your text prompt prompt = "Once upon a time in a world far, far away..." # Encode the text to tokens tokens = encoding.encode(prompt) # Count tokens print(f"Token count: {len(tokens)}") ``` --- ## Стиснення контексту і стратегії пам’яті Якщо ваш контекст занадто довгий, ви можете: * Відкинути давніші повідомлення з останніх розмов (розуміючи, що дані можуть втратитися) * Резюмування історії, тобто використання додаткових інструментів для скорочення тексту, для виділення основних фактів та ін. * Використання RAG. Тобто, перенести дані в окрему базу даних, а потім витягувати їх за допомогою векторного пошуку та вставляти в контекст лише найбільш релевантні дані. * Обмеження кількості інструментів * Довготривала пам’ять (епізодична або збережена) --- ## Інструменти й контекст Якщо інструменти увімкнені, список інструментів і їхні сигнатури (вхідні параметри) включаються в контекст. Модель самостійно вирішує, чи викликати інструмент. Якщо інструмент викликається, його результат додається до контексту перед наступною відповіддю LLM. Я не знайшов чітких рекомендацій щодо того, скільки інструментів оптимально використовувати в одному AI-агенті. Але точно не варто використовувати їх надто багато. Це пов’язано з кількома проблемами: * Розмір контексту: кожен інструмент і його опис займає місце в контекстному вікні. * Навігація моделі: можна припустити, що чим більше інструментів, тим складніше моделі обрати правильний. Це може знизити ефективність і точність викликів. Тому варто обирати лише ті інструменти, які справді потрібні для задач, які розвʼязує агент. Це особливо зараз, коли появився протокол MCP (Model Context Protocol) для роботи з інструментами. Ентузіасти публікують сотні нових серверів MCP, які реалізують різні інструменти. Існує спокуся підключити все і одразу. Але досвід показує, що це не завжди найкраще рішення. --- ## RAG і контекст RAG розширює знання моделі, вставляючи витягнутий текст перед питанням. Це дозволяє уникнути перенавчання. В плані балансу контексту, документи вибрані з RAG можуть займати багато місця. Тому важливо обмежити кількість документів до 2–5 найбільш релевантних. Тобто, використовувати рішення, які дозволяють обирати найбільш релевантні документи для запиту. --- ## Кращі практики управління контекстом * Системні інструкції мають бути чіткими й короткими * Системні інструкції мають бути на початку запиту завжди (поширена помилка — їх видаляти коли обрізається історія) * Історію обрізати обережно — залишати актуальне. Часто, зменшення історії виконується з допомогою додаткових інструментів, які резюмують історію. * Структурована пам’ять для важливих фактів. Отримується через аналіз всіх запитів і відповідей. * Обмежувати RAG до 2–5 документів, контролювати загальний розмір та якість документів * Порахувати токени перед відправленням * Уникати перевантаження інструментами. Використовувати лише ті, які дійсно потрібні для задачі --- ## Що варто пам’ятати * Ви відповідаєте за розмір контексту * LLM не обрізають та не оптимізують запит автоматично * Системні інструкції мають залишатися, навіть якщо історію обрізано --- ## Висновок Контекст є ключовим елементом ефективної взаємодії з LLM. Від структури контексту залежить ефективність роботи моделі, корисність її відповідей. Дизайн, управління й оптимізація контексту — ключ до створення ефективного ШІ асистента. Розуміння структури й обмежень дає змогу перейти від простого промптування до справжньої інженерії запитів. Ми, прості інженери, не можемо самі створювати ЛЛМ моделі так, щоб вони були кращі ніж у конкурентів. Це потребує значних ресурсів. Але ми можемо шукати оптимальну структуру контексту запиту до ЛЛМ щоб отримати найкращі результати в наших асистентів, чи навіть в майбутньому AGI.

Previous Post:

MCP, LLM
Implementing the Most Universal MCP Server Ever
23 May 2025

This post explores the design and implementation of a highly adaptable MCP server capable of handling diverse use cases.

Continue Reading
Implementing the Most Universal MCP Server Ever

Next Post:

Artificial Intelligence
The End of The Holocene: 2. The Hideout
31 May 2025

In the wake of the Great Cyber Attack, a group of survivors seeks refuge in an underground hideout, where they must confront the consequences of their actions and the nature of their reality.

Continue Reading
The End of The Holocene: 2. The Hideout