@intlayer/docs 7.5.12 → 7.5.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/blog/ar/per-component_vs_centralized_i18n.md +248 -0
  2. package/blog/de/per-component_vs_centralized_i18n.md +248 -0
  3. package/blog/en/_per-component_vs_centralized_i18n.md +252 -0
  4. package/blog/en/per-component_vs_centralized_i18n.md +248 -0
  5. package/blog/en-GB/per-component_vs_centralized_i18n.md +247 -0
  6. package/blog/es/per-component_vs_centralized_i18n.md +245 -0
  7. package/blog/fr/per-component_vs_centralized_i18n.md +245 -0
  8. package/blog/hi/per-component_vs_centralized_i18n.md +249 -0
  9. package/blog/id/per-component_vs_centralized_i18n.md +248 -0
  10. package/blog/it/per-component_vs_centralized_i18n.md +247 -0
  11. package/blog/ja/per-component_vs_centralized_i18n.md +247 -0
  12. package/blog/ko/per-component_vs_centralized_i18n.md +246 -0
  13. package/blog/pl/per-component_vs_centralized_i18n.md +247 -0
  14. package/blog/pt/per-component_vs_centralized_i18n.md +246 -0
  15. package/blog/ru/per-component_vs_centralized_i18n.md +251 -0
  16. package/blog/tr/per-component_vs_centralized_i18n.md +244 -0
  17. package/blog/uk/compiler_vs_declarative_i18n.md +224 -0
  18. package/blog/uk/i18n_using_next-i18next.md +1086 -0
  19. package/blog/uk/i18n_using_next-intl.md +760 -0
  20. package/blog/uk/index.md +69 -0
  21. package/blog/uk/internationalization_and_SEO.md +273 -0
  22. package/blog/uk/intlayer_with_i18next.md +211 -0
  23. package/blog/uk/intlayer_with_next-i18next.md +202 -0
  24. package/blog/uk/intlayer_with_next-intl.md +203 -0
  25. package/blog/uk/intlayer_with_react-i18next.md +200 -0
  26. package/blog/uk/intlayer_with_react-intl.md +202 -0
  27. package/blog/uk/intlayer_with_vue-i18n.md +206 -0
  28. package/blog/uk/l10n_platform_alternative/Lokalise.md +80 -0
  29. package/blog/uk/l10n_platform_alternative/crowdin.md +80 -0
  30. package/blog/uk/l10n_platform_alternative/phrase.md +78 -0
  31. package/blog/uk/list_i18n_technologies/CMS/drupal.md +143 -0
  32. package/blog/uk/list_i18n_technologies/CMS/wix.md +167 -0
  33. package/blog/uk/list_i18n_technologies/CMS/wordpress.md +189 -0
  34. package/blog/uk/list_i18n_technologies/frameworks/angular.md +125 -0
  35. package/blog/uk/list_i18n_technologies/frameworks/flutter.md +128 -0
  36. package/blog/uk/list_i18n_technologies/frameworks/react-native.md +217 -0
  37. package/blog/uk/list_i18n_technologies/frameworks/react.md +155 -0
  38. package/blog/uk/list_i18n_technologies/frameworks/svelte.md +145 -0
  39. package/blog/uk/list_i18n_technologies/frameworks/vue.md +144 -0
  40. package/blog/uk/next-i18next_vs_next-intl_vs_intlayer.md +1499 -0
  41. package/blog/uk/nextjs-multilingual-seo-comparison.md +360 -0
  42. package/blog/uk/per-component_vs_centralized_i18n.md +248 -0
  43. package/blog/uk/rag_powered_documentation_assistant.md +288 -0
  44. package/blog/uk/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
  45. package/blog/uk/vue-i18n_vs_intlayer.md +279 -0
  46. package/blog/uk/what_is_internationalization.md +167 -0
  47. package/blog/vi/per-component_vs_centralized_i18n.md +246 -0
  48. package/blog/zh/per-component_vs_centralized_i18n.md +248 -0
  49. package/dist/cjs/common.cjs.map +1 -1
  50. package/dist/cjs/generated/blog.entry.cjs +20 -0
  51. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  52. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  53. package/dist/cjs/generated/frequentQuestions.entry.cjs +20 -0
  54. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  55. package/dist/cjs/generated/legal.entry.cjs.map +1 -1
  56. package/dist/esm/common.mjs.map +1 -1
  57. package/dist/esm/generated/blog.entry.mjs +20 -0
  58. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  59. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  60. package/dist/esm/generated/frequentQuestions.entry.mjs +20 -0
  61. package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
  62. package/dist/esm/generated/legal.entry.mjs.map +1 -1
  63. package/dist/types/generated/blog.entry.d.ts +1 -0
  64. package/dist/types/generated/blog.entry.d.ts.map +1 -1
  65. package/dist/types/generated/frequentQuestions.entry.d.ts +1 -0
  66. package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
  67. package/docs/ar/configuration.md +6 -1
  68. package/docs/ar/dictionary/content_file.md +6 -1
  69. package/docs/de/configuration.md +6 -1
  70. package/docs/de/dictionary/content_file.md +6 -1
  71. package/docs/en/configuration.md +6 -1
  72. package/docs/en/dictionary/content_file.md +6 -1
  73. package/docs/en-GB/configuration.md +6 -1
  74. package/docs/en-GB/dictionary/content_file.md +3 -1
  75. package/docs/es/configuration.md +6 -1
  76. package/docs/es/dictionary/content_file.md +6 -1
  77. package/docs/fr/configuration.md +6 -1
  78. package/docs/fr/dictionary/content_file.md +3 -1
  79. package/docs/hi/configuration.md +6 -1
  80. package/docs/hi/dictionary/content_file.md +3 -1
  81. package/docs/id/configuration.md +6 -1
  82. package/docs/id/dictionary/content_file.md +3 -1
  83. package/docs/it/configuration.md +6 -1
  84. package/docs/it/dictionary/content_file.md +3 -1
  85. package/docs/ja/configuration.md +6 -1
  86. package/docs/ja/dictionary/content_file.md +3 -1
  87. package/docs/ko/configuration.md +6 -1
  88. package/docs/ko/dictionary/content_file.md +3 -1
  89. package/docs/pl/configuration.md +3 -1
  90. package/docs/pl/dictionary/content_file.md +3 -1
  91. package/docs/pt/configuration.md +6 -1
  92. package/docs/pt/dictionary/content_file.md +3 -1
  93. package/docs/ru/configuration.md +6 -1
  94. package/docs/ru/dictionary/content_file.md +6 -1
  95. package/docs/tr/configuration.md +6 -1
  96. package/docs/tr/dictionary/content_file.md +3 -1
  97. package/docs/uk/CI_CD.md +198 -0
  98. package/docs/uk/autoFill.md +307 -0
  99. package/docs/uk/bundle_optimization.md +185 -0
  100. package/docs/uk/cli/build.md +64 -0
  101. package/docs/uk/cli/ci.md +137 -0
  102. package/docs/uk/cli/configuration.md +63 -0
  103. package/docs/uk/cli/debug.md +46 -0
  104. package/docs/uk/cli/doc-review.md +43 -0
  105. package/docs/uk/cli/doc-translate.md +132 -0
  106. package/docs/uk/cli/editor.md +28 -0
  107. package/docs/uk/cli/fill.md +130 -0
  108. package/docs/uk/cli/index.md +190 -0
  109. package/docs/uk/cli/init.md +84 -0
  110. package/docs/uk/cli/list.md +90 -0
  111. package/docs/uk/cli/list_projects.md +128 -0
  112. package/docs/uk/cli/live.md +41 -0
  113. package/docs/uk/cli/login.md +157 -0
  114. package/docs/uk/cli/pull.md +78 -0
  115. package/docs/uk/cli/push.md +98 -0
  116. package/docs/uk/cli/sdk.md +71 -0
  117. package/docs/uk/cli/test.md +76 -0
  118. package/docs/uk/cli/transform.md +65 -0
  119. package/docs/uk/cli/version.md +24 -0
  120. package/docs/uk/cli/watch.md +37 -0
  121. package/docs/uk/configuration.md +742 -0
  122. package/docs/uk/dictionary/condition.md +237 -0
  123. package/docs/uk/dictionary/content_file.md +1134 -0
  124. package/docs/uk/dictionary/enumeration.md +245 -0
  125. package/docs/uk/dictionary/file.md +232 -0
  126. package/docs/uk/dictionary/function_fetching.md +212 -0
  127. package/docs/uk/dictionary/gender.md +273 -0
  128. package/docs/uk/dictionary/insertion.md +187 -0
  129. package/docs/uk/dictionary/markdown.md +383 -0
  130. package/docs/uk/dictionary/nesting.md +273 -0
  131. package/docs/uk/dictionary/translation.md +332 -0
  132. package/docs/uk/formatters.md +595 -0
  133. package/docs/uk/how_works_intlayer.md +256 -0
  134. package/docs/uk/index.md +175 -0
  135. package/docs/uk/interest_of_intlayer.md +297 -0
  136. package/docs/uk/intlayer_CMS.md +569 -0
  137. package/docs/uk/intlayer_visual_editor.md +292 -0
  138. package/docs/uk/intlayer_with_angular.md +710 -0
  139. package/docs/uk/intlayer_with_astro.md +256 -0
  140. package/docs/uk/intlayer_with_create_react_app.md +1258 -0
  141. package/docs/uk/intlayer_with_express.md +429 -0
  142. package/docs/uk/intlayer_with_fastify.md +446 -0
  143. package/docs/uk/intlayer_with_lynx+react.md +548 -0
  144. package/docs/uk/intlayer_with_nestjs.md +283 -0
  145. package/docs/uk/intlayer_with_next-i18next.md +640 -0
  146. package/docs/uk/intlayer_with_next-intl.md +456 -0
  147. package/docs/uk/intlayer_with_nextjs_page_router.md +1541 -0
  148. package/docs/uk/intlayer_with_nuxt.md +711 -0
  149. package/docs/uk/intlayer_with_react_router_v7.md +600 -0
  150. package/docs/uk/intlayer_with_react_router_v7_fs_routes.md +669 -0
  151. package/docs/uk/intlayer_with_svelte_kit.md +579 -0
  152. package/docs/uk/intlayer_with_tanstack.md +818 -0
  153. package/docs/uk/intlayer_with_vite+preact.md +1748 -0
  154. package/docs/uk/intlayer_with_vite+react.md +1449 -0
  155. package/docs/uk/intlayer_with_vite+solid.md +302 -0
  156. package/docs/uk/intlayer_with_vite+svelte.md +520 -0
  157. package/docs/uk/intlayer_with_vite+vue.md +1113 -0
  158. package/docs/uk/introduction.md +222 -0
  159. package/docs/uk/locale_mapper.md +242 -0
  160. package/docs/uk/mcp_server.md +211 -0
  161. package/docs/uk/packages/express-intlayer/t.md +465 -0
  162. package/docs/uk/packages/intlayer/getEnumeration.md +159 -0
  163. package/docs/uk/packages/intlayer/getHTMLTextDir.md +121 -0
  164. package/docs/uk/packages/intlayer/getLocaleLang.md +81 -0
  165. package/docs/uk/packages/intlayer/getLocaleName.md +135 -0
  166. package/docs/uk/packages/intlayer/getLocalizedUrl.md +338 -0
  167. package/docs/uk/packages/intlayer/getMultilingualUrls.md +359 -0
  168. package/docs/uk/packages/intlayer/getPathWithoutLocale.md +75 -0
  169. package/docs/uk/packages/intlayer/getPrefix.md +213 -0
  170. package/docs/uk/packages/intlayer/getTranslation.md +190 -0
  171. package/docs/uk/packages/intlayer/getTranslationContent.md +189 -0
  172. package/docs/uk/packages/next-intlayer/t.md +365 -0
  173. package/docs/uk/packages/next-intlayer/useDictionary.md +276 -0
  174. package/docs/uk/packages/next-intlayer/useIntlayer.md +263 -0
  175. package/docs/uk/packages/next-intlayer/useLocale.md +166 -0
  176. package/docs/uk/packages/react-intlayer/t.md +311 -0
  177. package/docs/uk/packages/react-intlayer/useDictionary.md +295 -0
  178. package/docs/uk/packages/react-intlayer/useI18n.md +250 -0
  179. package/docs/uk/packages/react-intlayer/useIntlayer.md +251 -0
  180. package/docs/uk/packages/react-intlayer/useLocale.md +210 -0
  181. package/docs/uk/per_locale_file.md +345 -0
  182. package/docs/uk/plugins/sync-json.md +398 -0
  183. package/docs/uk/readme.md +265 -0
  184. package/docs/uk/releases/v6.md +305 -0
  185. package/docs/uk/releases/v7.md +624 -0
  186. package/docs/uk/roadmap.md +346 -0
  187. package/docs/uk/testing.md +204 -0
  188. package/docs/vi/configuration.md +6 -1
  189. package/docs/vi/dictionary/content_file.md +6 -1
  190. package/docs/zh/configuration.md +6 -1
  191. package/docs/zh/dictionary/content_file.md +6 -1
  192. package/frequent_questions/ar/error-vite-env-only.md +77 -0
  193. package/frequent_questions/de/error-vite-env-only.md +77 -0
  194. package/frequent_questions/en/error-vite-env-only.md +77 -0
  195. package/frequent_questions/en-GB/error-vite-env-only.md +77 -0
  196. package/frequent_questions/es/error-vite-env-only.md +76 -0
  197. package/frequent_questions/fr/error-vite-env-only.md +77 -0
  198. package/frequent_questions/hi/error-vite-env-only.md +77 -0
  199. package/frequent_questions/id/error-vite-env-only.md +77 -0
  200. package/frequent_questions/it/error-vite-env-only.md +77 -0
  201. package/frequent_questions/ja/error-vite-env-only.md +77 -0
  202. package/frequent_questions/ko/error-vite-env-only.md +77 -0
  203. package/frequent_questions/pl/error-vite-env-only.md +77 -0
  204. package/frequent_questions/pt/error-vite-env-only.md +77 -0
  205. package/frequent_questions/ru/error-vite-env-only.md +77 -0
  206. package/frequent_questions/tr/error-vite-env-only.md +77 -0
  207. package/frequent_questions/uk/SSR_Next_no_[locale].md +104 -0
  208. package/frequent_questions/uk/array_as_content_declaration.md +72 -0
  209. package/frequent_questions/uk/build_dictionaries.md +58 -0
  210. package/frequent_questions/uk/build_error_CI_CD.md +74 -0
  211. package/frequent_questions/uk/bun_set_up.md +53 -0
  212. package/frequent_questions/uk/customized_locale_list.md +64 -0
  213. package/frequent_questions/uk/domain_routing.md +113 -0
  214. package/frequent_questions/uk/error-vite-env-only.md +77 -0
  215. package/frequent_questions/uk/esbuild_error.md +29 -0
  216. package/frequent_questions/uk/get_locale_cookie.md +142 -0
  217. package/frequent_questions/uk/intlayer_command_undefined.md +155 -0
  218. package/frequent_questions/uk/locale_incorect_in_url.md +73 -0
  219. package/frequent_questions/uk/package_version_error.md +181 -0
  220. package/frequent_questions/uk/static_rendering.md +44 -0
  221. package/frequent_questions/uk/translated_path_url.md +55 -0
  222. package/frequent_questions/uk/unknown_command.md +97 -0
  223. package/frequent_questions/vi/error-vite-env-only.md +77 -0
  224. package/frequent_questions/zh/error-vite-env-only.md +77 -0
  225. package/legal/uk/privacy_notice.md +83 -0
  226. package/legal/uk/terms_of_service.md +55 -0
  227. package/package.json +9 -9
  228. package/src/generated/blog.entry.ts +20 -0
  229. package/src/generated/frequentQuestions.entry.ts +20 -0
@@ -0,0 +1,288 @@
1
+ ---
2
+ createdAt: 2025-09-10
3
+ updatedAt: 2025-09-10
4
+ title: "Створення помічника з документацією на основі RAG (розбиття на фрагменти, ембеддинги та пошук)"
5
+ description: "Створення помічника з документацією на основі RAG (розбиття на фрагменти, ембеддинги та пошук)"
6
+ keywords:
7
+ - RAG
8
+ - Документація
9
+ - Помічник
10
+ - Розбиття на фрагменти
11
+ - Ембеддинги
12
+ - Пошук
13
+ slugs:
14
+ - blog
15
+ - rag-powered-documentation-assistant
16
+ ---
17
+
18
+ # Створення помічника з документацією на основі RAG (розбиття на фрагменти, ембеддинги та пошук)
19
+
20
+ ## Що ви отримаєте
21
+
22
+ Я створив помічника з документацією на основі RAG і упакував його у boilerplate, який ви можете використати одразу.
23
+
24
+ - Містить готовий до використання додаток (Next.js + OpenAI API)
25
+ - Включає робочий RAG-пайплайн (розбиття на фрагменти, ембеддинги, косинусна схожість)
26
+ - Надає повний інтерфейс чат-бота, побудований на React
27
+ - Усі UI-компоненти повністю редагуються за допомогою Tailwind CSS
28
+ - Реєструє кожний запит користувача, щоб допомогти виявити відсутню документацію, болі користувачів та продуктові можливості
29
+
30
+ 👉 [Жива демонстрація](https://intlayer.org/doc/why) 👉 [Шаблон коду](https://github.com/aymericzip/smart_doc_RAG)
31
+
32
+ ## Вступ
33
+
34
+ Якщо ви колись губилися у документації, нескінченно гортали в пошуках однієї відповіді, ви знаєте, наскільки це болісно. Документація корисна, але вона статична, і пошук у ній часто здається незручним.
35
+
36
+ Ось тут і з’являється **RAG (Retrieval-Augmented Generation)**. Замість того, щоб змушувати користувачів ритися в тексті, ми можемо поєднати **retrieval** (пошук потрібних частин документації) з **generation** (коли LLM природно пояснює їх).
37
+
38
+ У цій статті я покажу, як я створив чатбот для документації на базі RAG і як він не лише допомагає користувачам швидше знаходити відповіді, а й дає продуктовим командам новий спосіб розуміти болючі точки користувачів.
39
+
40
+ ## Чому варто використовувати RAG для документації?
41
+
42
+ RAG став популярним не випадково: це один із найпрактичніших способів зробити великі мовні моделі дійсно корисними.
43
+
44
+ Для документації переваги очевидні:
45
+
46
+ - Миттєві відповіді: користувачі запитують природною мовою і отримують релевантні відповіді.
47
+ - Кращий контекст: модель бачить лише найбільш релевантні розділи документації, що зменшує галюцинації.
48
+ - Пошук, який відчувається природно: поєднання Algolia + FAQ + чатбот в одному.
49
+ - Зворотний зв'язок: зберігаючи запити, ви виявляєте, з чим насправді мають труднощі користувачі.
50
+
51
+ Той останній пункт є вирішальним. Система RAG не лише відповідає на запитання — вона показує, що саме запитують користувачі. Це означає:
52
+
53
+ - Ви виявляєте відсутню інформацію в документації.
54
+ - Ви бачите появу запитів на нові фічі.
55
+ - Ви помічаєте патерни, які можуть навіть спрямовувати продуктову стратегію.
56
+
57
+ Отже, RAG — це не лише інструмент підтримки. Це також **двигун product discovery**.
58
+
59
+ ## Як працює RAG-пайплайн
60
+
61
+ ![RAG-пайплайн](https://github.com/aymericzip/intlayer/blob/main/docs/assets/rag_flow.svg)
62
+
63
+ У загальних рисах, ось рецепт, який я використав:
64
+
65
+ 1. **Розбиття документації на чанки** Великі Markdown-файли розбиваються на чанки. Розбиття дозволяє передавати у контекст лише релевантні частини документації.
66
+ 2. **Генерація embeddings** Кожен шматок перетворюється на вектор за допомогою embedding API від OpenAI (text-embedding-3-large) або через векторну базу даних (Chroma, Qdrant, Pinecone).
67
+ 3. **Індексація & зберігання** Embeddings зберігаються у простому JSON-файлі (для мого демо), але в продакшні ви, ймовірно, використовуватимете векторну БД.
68
+ 4. **Пошук (R у RAG)** Запит користувача перетворюється на embedding, обчислюється косинусна схожість, і витягуються топ-найбільш підхожі шматки.
69
+ 5. **Augmentation + Generation (AG у RAG)** Ці шматки вставляються в prompt для ChatGPT, тож модель відповідає з урахуванням реального контексту документації.
70
+ 6. **Логування запитів для зворотного зв'язку** Кожен запит користувача зберігається. Це золото для розуміння больових точок, відсутньої документації або нових можливостей.
71
+
72
+ ## Крок 1: Читання документації
73
+
74
+ Перший крок був простим: мені потрібно було просканувати папку docs/ на предмет усіх .md файлів. Використовуючи Node.js та glob, я завантажив вміст кожного Markdown-файлу в пам'ять.
75
+
76
+ Це робить конвеєр гнучким: замість Markdown ви можете отримувати документацію з бази даних, CMS або навіть через API.
77
+
78
+ ## Крок 2: Розбиття документації на чанки
79
+
80
+ Навіщо розбивати? Тому що мовні моделі мають **обмеження контексту**. Підживлення їх цілою книгою документації не спрацює.
81
+
82
+ Отже, ідея полягає в тому, щоб розбити текст на керовані частини (наприклад 500 токенів кожна) з перекриттям (наприклад 100 токенів). Перекриття забезпечує безперервність, щоб ви не втрачали сенс на межах частин.
83
+
84
+ <p align="center">
85
+ <img width="480" alt="Надійне джерело даних" src="https://github.com/user-attachments/assets/ee548851-7206-4cc6-821e-de8a4366c6a3" />
86
+ </p>
87
+
88
+ **Приклад:**
89
+
90
+ - Chunk 1 → “…стару бібліотеку, яку багато хто забув. Її велетенські полиці були заповнені книгами…”
91
+ - Chunk 2 → “…полиці були заповнені книгами з усіх уявних жанрів, кожна шепотіла свої історії…”
92
+
93
+ Перекриття гарантує, що обидва чанки містять спільний контекст, тож retrieval залишається послідовним.
94
+
95
+ Цей компроміс (розмір чанка проти перекриття) є ключовим для ефективності RAG:
96
+
97
+ - Занадто маленький → отримаєте шум.
98
+ - Занадто великий → ви перевантажите розмір контексту.
99
+
100
+ ## Крок 3: Генерація embeddings
101
+
102
+ Як тільки документи розбиті на чанки, ми генеруємо **embeddings** — високорозмірні вектори, що представляють кожний чанк.
103
+
104
+ Я використовував модель OpenAI’s text-embedding-3-large, але ви можете використати будь-яку сучасну модель embeddings.
105
+
106
+ **Приклад embedding:**
107
+
108
+ ```js
109
+ [
110
+ -0.0002630692, -0.029749284, 0.010225477, -0.009224428, -0.0065269712,
111
+ -0.002665544, 0.003214777, 0.04235309, -0.033162255, -0.00080789323,
112
+ //...+1533 елементів
113
+ ];
114
+ ```
115
+
116
+ Кожний вектор — це математичний відбиток тексту, що дозволяє виконувати пошук за схожістю.
117
+
118
+ ## Крок 4: Індексування та збереження embeddings
119
+
120
+ Щоб уникнути багаторазової регенерації embeddings, я зберіг їх у embeddings.json.
121
+
122
+ У продакшні ви, ймовірно, захочете використовувати векторну базу даних, наприклад:
123
+
124
+ - Chroma
125
+ - Qdrant
126
+ - Pinecone
127
+ - FAISS, Weaviate, Milvus тощо
128
+
129
+ Векторні БД обробляють індексування, масштабованість і швидкий пошук. Але для мого прототипу локальний JSON працював добре.
130
+
131
+ ## Крок 5: Отримання за допомогою **косинусної схожості**
132
+
133
+ Коли користувач ставить запитання:
134
+
135
+ 1. Згенерувати embedding для запиту.
136
+ 2. Порівняти його з усіма embeddings документа за допомогою **косинусної схожості**.
137
+ 3. Залишити лише топ N найбільш схожих chunks.
138
+
139
+ Косинусна схожість вимірює кут між двома векторами. Ідеальне співпадіння має оцінку **1.0**.
140
+
141
+ Таким чином система знаходить найближчі фрагменти документації до запиту.
142
+
143
+ ## Крок 6: Розширення (Augmentation) + Генерація
144
+
145
+ Тепер починається магія. Ми беремо топові сегменти та вставляємо їх у **system prompt** для ChatGPT.
146
+
147
+ Це означає, що модель відповідає так, ніби ці сегменти були частиною розмови.
148
+
149
+ Результат: точні, **відповіді, засновані на документації**.
150
+
151
+ ## Крок 7: Логування запитів користувачів
152
+
153
+ Це прихована суперсила.
154
+
155
+ Кожне поставлене питання зберігається. З часом ви формуєте набір даних із:
156
+
157
+ - Найчастіших питань (чудово підходить для FAQ)
158
+ - Питань без відповіді (документація відсутня або нечітка)
159
+ - Запитів на функціональність, замаскованих під питання (“Чи інтегрується це з X?”)
160
+ - Нових сценаріїв використання, на які ви не розраховували
161
+
162
+ This turns your RAG assistant into a **continuous user research tool**.
163
+
164
+ ## Скільки це коштує?
165
+
166
+ Одне з поширених зауважень щодо RAG — це вартість. Насправді це дивно дешево:
167
+
168
+ - Генерація embeddings для ~200 документів займає близько **5 хвилин** і коштує **1–2 євро**.
169
+ - Пошук по документації повністю безкоштовний.
170
+ - Для запитів ми використовуємо gpt-4o-latest без режиму «thinking». На Intlayer у нас близько **300 запитів у чаті на місяць**, і рахунок за OpenAI API рідко перевищує **$10**.
171
+
172
+ Крім того, можна додати вартість хостингу.
173
+
174
+ ## Деталі реалізації
175
+
176
+ Стек:
177
+
178
+ - Монорепозиторій: pnpm workspace
179
+ - Пакет документації: Node.js / TypeScript / OpenAI API
180
+ - Фронтенд: Next.js / React / Tailwind CSS
181
+ - Бекенд: Node.js API route / OpenAI API
182
+
183
+ Пакет `@smart-doc/docs` — це пакет на TypeScript, який відповідає за обробку документації. Коли файл Markdown додається або змінюється, пакет містить скрипт `build`, який перебудовує список документації для кожної мови, генерує embeddings і зберігає їх у файлі `embeddings.json`.
184
+
185
+ Для фронтенду ми використовуємо застосунок Next.js, який надає:
186
+
187
+ - Рендеринг Markdown у HTML
188
+ - Рядок пошуку для знаходження релевантної документації
189
+ - Інтерфейс чат-бота для запитань щодо документації
190
+
191
+ Щоб виконати пошук по документації, Next.js-застосунок містить API-рут, який викликає функцію з пакета `@smart-doc/docs` для отримання фрагментів документації, що відповідають запиту. Використовуючи ці фрагменти, ми можемо повернути список сторінок документації, релевантних до пошуку користувача.
192
+
193
+ Для функціоналу чатбота ми дотримуємося того ж процесу пошуку, але додатково вставляємо отримані фрагменти документації у промпт, який відправляється до ChatGPT.
194
+
195
+ Ось приклад промпту, який надсилається в ChatGPT:
196
+
197
+ System prompt :
198
+
199
+ ```txt
200
+ You are a helpful assistant that can answer questions about the Intlayer documentation.
201
+
202
+ Related chunks :
203
+
204
+ -----
205
+ docName: "getting-started"
206
+ docChunk: "1/3"
207
+ docUrl: "https://example.com/docs/uk/getting-started"
208
+ ---
209
+
210
+ # Як почати
211
+
212
+ ...
213
+
214
+ -----
215
+ docName: "another-doc"
216
+ docChunk: "1/5"
217
+ docUrl: "https://example.com/docs/uk/another-doc"
218
+ ---
219
+
220
+ # Ще один документ
221
+
222
+ ...
223
+ ```
224
+
225
+ User query :
226
+
227
+ ```txt
228
+ Як почати?
229
+ ```
230
+
231
+ Ми використовуємо SSE для потокової передачі відповіді з API-роуту.
232
+
233
+ Як уже згадувалося, ми використовуємо gpt-4-turbo без "thinking" режиму. Відповіді релевантні, а затримки низькі.
234
+ Ми експериментували з gpt-5, але затримка була занадто великою (іноді до 15 секунд на відповідь). Проте ми повернемося до цього в майбутньому.
235
+
236
+ 👉 [Спробувати демо тут](https://intlayer.org/doc/why) 👉 [Переглянути шаблон коду на GitHub](https://github.com/aymericzip/smart_doc_RAG)
237
+
238
+ ## Подальші кроки
239
+
240
+ Цей проєкт — мінімальна реалізація. Але ви можете розширити його багатьма способами:
241
+
242
+ - MCP server → перемістити функцію пошуку по документації на MCP-сервер, щоб підключати документацію до будь-якого AI-помічника
243
+
244
+ - Vector DBs → масштабувати до мільйонів фрагментів документації
245
+ - LangChain / LlamaIndex → готові фреймворки для RAG-пайплайнів
246
+ - Analytics dashboards → візуалізувати запити користувачів та проблемні місця
247
+ - Multi-source retrieval → витягувати не лише документацію, а й записи з баз даних, пости в блогах, тікети тощо.
248
+ - Покращені підказки → reranking, filtering та гібридний пошук (ключові слова + семантичний)
249
+
250
+ ## Обмеження, з якими ми зіткнулися
251
+
252
+ - Розбивка на фрагменти (chunking) та перекриття мають емпіричний характер. Пошук правильного балансу (розмір фрагмента, відсоток перекриття, кількість витягнутих фрагментів) вимагає ітерацій та тестування.
253
+ - Векторні представлення (embeddings) не оновлюються автоматично при зміні документів. Наша система скидає embeddings для файлу лише якщо кількість фрагментів відрізняється від збереженої.
254
+ - У цьому прототипі embeddings зберігаються в JSON. Це підходить для демо, але засмічує репозиторій Git. В продакшні краще використовувати базу даних або спеціалізоване сховище векторів (vector store).
255
+
256
+ ## Чому це важливо поза межами документації
257
+
258
+ Цікаво не лише в чат-боті. Це — механізм зворотного зв'язку (feedback loop).
259
+
260
+ З RAG ви не просто відповідаєте на запити:
261
+
262
+ - Ви дізнаєтеся, що плутає користувачів.
263
+ - Ви виявляєте, які функції вони очікують.
264
+ - Ви адаптуєте свою продуктову стратегію на основі реальних запитів.
265
+
266
+ **Приклад:**
267
+
268
+ Уявіть запуск нової фічі й миттєве бачення:
269
+
270
+ - 50% запитань стосуються одного й того ж незрозумілого кроку налаштування
271
+ - Користувачі неодноразово просять інтеграцію, яку ви ще не підтримуєте
272
+ - Люди шукають терміни, що виявляють новий сценарій використання
273
+
274
+ Це — **product intelligence** прямо від ваших користувачів.
275
+
276
+ ## Висновок
277
+
278
+ RAG — це один із найпростіших і найпотужніших способів зробити LLMs практичними. Поєднавши **retrieval + generation**, ви можете перетворити статичну документацію на **smart assistant** і, одночасно, отримувати безперервний потік insights про продукт.
279
+
280
+ Для мене цей проєкт показав, що RAG — це не просто технічний трюк. Це спосіб трансформувати документацію у:
281
+
282
+ - інтерактивну систему підтримки
283
+ - канал зворотного зв'язку
284
+ - інструмент для продуктової стратегії
285
+
286
+ 👉 [Спробуйте демо тут](https://intlayer.org/doc/why) 👉 [Перегляньте шаблон коду на GitHub](https://github.com/aymericzip/smart_doc_RAG)
287
+
288
+ І якщо ви теж експериментуєте з RAG, мені було б цікаво дізнатися, як ви його використовуєте.
@@ -0,0 +1,164 @@
1
+ ---
2
+ createdAt: 2025-01-02
3
+ updatedAt: 2025-06-29
4
+ title: react-i18next vs react-intl vs Intlayer
5
+ description: Інтеграція react-i18next з next-intl та Intlayer для інтернаціоналізації (i18n) React-додатка
6
+ keywords:
7
+ - next-intl
8
+ - react-i18next
9
+ - Intlayer
10
+ - Інтернаціоналізація
11
+ - Блог
12
+ - Next.js
13
+ - JavaScript
14
+ - React
15
+ slugs:
16
+ - blog
17
+ - react-i18next-vs-react-intl-vs-intlayer
18
+ ---
19
+
20
+ # react-Intl VS react-i18next VS intlayer | Інтернаціоналізація React (i18n)
21
+
22
+ Цей посібник порівнює три визнані варіанти i18n для **React**: **react-intl** (FormatJS), **react-i18next** (i18next) та **Intlayer**.
23
+ Ми зосереджені на **plain React** додатках (наприклад, Vite, CRA, SPA). Якщо ви використовуєте Next.js, див. наше окреме порівняння для Next.js.
24
+
25
+ Ми оцінюємо:
26
+
27
+ - Архітектура та організація контенту
28
+ - TypeScript і безпека
29
+ - Обробка відсутніх перекладів
30
+ - Можливості для багатого контенту та форматування
31
+ - Продуктивність та поведінка завантаження
32
+ - Досвід розробника (DX), інструменти та супровід
33
+ - SEO/маршрутизація (залежить від фреймворку)
34
+
35
+ <TOC/>
36
+
37
+ > **tl;dr**: Усі три можуть локалізувати React-додаток. Якщо ви хочете **контент, прив'язаний до компонентів**, **суворі TypeScript-типи**, **перевірки відсутніх ключів під час збірки**, **tree-shaken словники**, та вбудовані редакційні інструменти (Visual Editor/CMS + необов'язковий AI-переклад), **Intlayer** є найповнішим вибором для модульних React-кодових баз.
38
+
39
+ ---
40
+
41
+ ## Високорівневе позиціонування
42
+
43
+ - **react-intl** - орієнтований на ICU, форматування, узгоджене зі стандартами (дати/числа/множини), зі зрілим API. Каталоги зазвичай централізовані; безпека ключів і перевірки на етапі збірки в основному на вас.
44
+ - **react-i18next** - надзвичайно популярний і гнучкий; namespaces, detectors і багато плагінів (ICU, backends). Потужний, але конфігурація може розростатися зі збільшенням проєкту.
45
+ - **Intlayer** - модель контенту, орієнтована на компоненти для React, зі **строгим типізуванням TS**, **перевірками на етапі збірки**, **tree-shaking**, а також **Visual Editor/CMS** і **AI‑асистованими перекладами**. Працює з React Router, Vite, CRA тощо.
46
+
47
+ ---
48
+
49
+ ## Матриця функцій (фокус на React)
50
+
51
+ | Особливість | `react-intlayer` (Intlayer) | `react-i18next` (i18next) | `react-intl` (FormatJS) |
52
+ | --------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- |
53
+ | **Translations Near Components** | ✅ Так, контент розміщено поруч із кожним компонентом | ❌ Ні | ❌ Ні |
54
+ | **TypeScript Integration** | ✅ Розвинена інтеграція, автоматично згенеровані строгі типи | ⚠️ Базова; потрібна додаткова конфігурація для безпеки | ✅ Добра інтеграція, але менш сувора |
55
+ | **Виявлення відсутніх перекладів** | ✅ Підсвітка помилок TypeScript та помилки/попередження під час збірки | ⚠️ Переважно використовуються запасні рядки під час виконання | ⚠️ Запасні рядки |
56
+ | **Багатий вміст (JSX/Markdown/компоненти)** | ✅ Пряма підтримка | ⚠️ Обмежено / лише інтерполяція | ⚠️ Синтаксис ICU, не справжній JSX |
57
+ | **AI-переклад** | ✅ Так, підтримує кількох AI-провайдерів. Можна використовувати власні API-ключі. Бере до уваги контекст вашого застосунку та обсяг контенту | ❌ Ні | ❌ Ні |
58
+ | **Візуальний редактор** | ✅ Так, локальний Visual Editor + опційна CMS; може винести контент із codebase; вбудовуваний | ❌ Ні / доступно через зовнішні платформи локалізації | ❌ Ні / доступно через зовнішні платформи локалізації |
59
+ | **Локалізована маршрутизація** | ✅ Так, підтримує локалізовані шляхи "з коробки" (працює з Next.js & Vite) | ⚠️ Немає вбудованої підтримки, потребує плагінів (наприклад `next-i18next`) або налаштування власного роутера | ❌ Ні, лише форматування повідомлень; маршрутизацію потрібно робити вручну |
60
+ | **Динамічна генерація маршрутів** | ✅ Так | ⚠️ Плагіни/екосистема або ручне налаштування | ❌ Не надається |
61
+ | **Плюралізація** | ✅ Шаблони на основі переліку | ✅ Налаштовується (плагіни, наприклад i18next-icu) | ✅ (ICU) |
62
+ | **Форматування (дат, чисел, валют)** | ✅ Оптимізовані форматери (Intl під капотом) | ⚠️ Через плагіни або кастомне використання Intl | ✅ Форматери ICU |
63
+ | **Формат контенту** | ✅ .tsx, .ts, .js, .json, .md, .txt, (.yaml WIP) | ⚠️ .json | ✅ .json, .js |
64
+ | **Підтримка ICU** | ⚠️ WIP | ⚠️ Через плагін (i18next-icu) | ✅ Так |
65
+ | **Інструменти SEO (hreflang, sitemap)** | ✅ Вбудовані інструменти: помічники для sitemap, robots.txt, метаданих | ⚠️ Плагіни спільноти/ручні рішення | ❌ Не є частиною ядра |
66
+ | **Екосистема / Спільнота** | ⚠️ Менша, але швидко зростає та оперативна | ✅ Найбільша та зріла | ✅ Велика |
67
+ | **Server-side Rendering та Server Components** | ✅ Так, оптимізовано для SSR / React Server Components | ⚠️ Підтримується на рівні сторінки, але потрібно передавати t-functions по дереву компонентів для дочірніх Server Components | ❌ Не підтримується, потрібно передавати t-functions по дереву компонентів для дочірніх Server Components |
68
+ | **Tree-shaking (завантаження лише використовуваного контенту)** | ✅ Так, на рівні компонентів під час збірки через плагіни Babel/SWC | ⚠️ Зазвичай завантажує все (можна покращити через namespaces/code-splitting) | ⚠️ Зазвичай завантажує все |
69
+ | **Ліниве завантаження** | ✅ Так, для кожної локалі / кожного словника | ✅ Так (наприклад, бекенди/неймспейси за запитом) | ✅ Так (розбиття бандлів за локалями) |
70
+ | **Очищення невикористовуваного контенту** | ✅ Так, для кожного словника під час збірки | ❌ Ні, лише через ручну сегментацію неймспейсів | ❌ Ні, усі оголошені повідомлення включені в бандл |
71
+ | **Управління великими проєктами** | ✅ Заохочує модульність, підходить для design-system | ⚠️ Потребує доброї дисципліни в організації файлів | ⚠️ Центральні каталоги можуть стати великими |
72
+
73
+ ---
74
+
75
+ ## Поглиблене порівняння
76
+
77
+ ### 1) Архітектура та масштабованість
78
+
79
+ - **react-intl / react-i18next**: Більшість налаштувань використовують **централізовані папки локалей** для кожної мови, іноді розділені на **namespaces** (i18next). Добре працює на початку, але стає спільною зоною відповідальності у міру зростання додатків.
80
+ - **Intlayer**: Заохочує використання **словників на рівні компонента (або фічі)**, **розміщених разом** з UI, якому вони служать. Це зберігає чітку відповідальність, полегшує дублювання/міграцію компонентів і зменшує кількість змін ключів між командами. Невикористовуваний контент легше виявити та видалити.
81
+
82
+ **Чому це важливо:** Модульний контент відображає модульний UI. Великі React codebases залишаються чистішими, коли переклади живуть разом із компонентами, яким вони належать.
83
+
84
+ ---
85
+
86
+ ### 2) TypeScript & безпека
87
+
88
+ - **react-intl**: Надійна типізація, але **немає автоматичної типізації ключів**; вам доводиться самостійно запроваджувати патерни для забезпечення безпеки.
89
+ - **react-i18next**: Сильна типізація для hooks; **строга типізація ключів** зазвичай вимагає додаткової конфігурації або генераторів.
90
+ - **Intlayer**: **Автоматично генерує строгі типи** з вашого контенту. Автодоповнення IDE та **помилки на етапі компіляції** виявляють опечатки та відсутні ключі до запуску.
91
+
92
+ **Чому це важливо:** Перенесення помилок **вліво** (на етап збірки/CI) зменшує проблеми в продакшені та пришвидшує цикл зворотного зв’язку для розробників.
93
+
94
+ ---
95
+
96
+ ### 3) Обробка відсутніх перекладів
97
+
98
+ - **react-intl / react-i18next**: За замовчуванням використовують **запасні варіанти під час виконання** (відображення ключа або локаль за замовчуванням). Можна додати лінтери/плагіни, але це не гарантується на етапі збірки.
99
+ - **Intlayer**: **Виявлення під час збірки** з попередженнями або помилками, коли відсутні потрібні локалі/ключі.
100
+
101
+ **Чому це важливо:** Якщо CI падає через відсутні рядки, це запобігає витоку «таємної англійської» в інтерфейси іншими мовами.
102
+
103
+ ---
104
+
105
+ ### 4) Багатий контент і форматування
106
+
107
+ - **react-intl**: Відмінна підтримка **ICU** для plurals, selects, дат/чисел та композиції повідомлень. Можна використовувати JSX, але ментальна модель залишається орієнтованою на повідомлення.
108
+ - **react-i18next**: Гнучка інтерполяція та **`<Trans>`** для вбудовування елементів/компонентів; ICU доступне через плагін.
109
+ - **Intlayer**: Файли контенту можуть містити **rich nodes** (JSX/Markdown/components) та **metadata**. Форматування використовує Intl під капотом; шаблони множини зручні.
110
+
111
+ **Чому це важливо:** Складні тексти інтерфейсу (посилання, виділені фрагменти, інлайнові компоненти) простіше реалізовувати, коли бібліотека природно працює з React-нодами.
112
+
113
+ ---
114
+
115
+ ### 5) Продуктивність і поведінка завантаження
116
+
117
+ - **react-intl / react-i18next**: Зазвичай ви вручну керуєте **розбиттям каталогів (catalog splitting)** та **ледачим завантаженням (lazy loading)** (namespaces/dynamic imports). Ефективно, але вимагає дисципліни.
118
+ - **Intlayer**: **Tree-shakes** непотрібні словники і підтримує **per-dictionary/per-locale lazy loading** з коробки.
119
+
120
+ **Чому це важливо:** Менші бандли і менше невикористаних рядків покращують час запуску та продуктивність навігації.
121
+
122
+ ---
123
+
124
+ ### 6) DX, інструменти та супровід
125
+
126
+ - **react-intl / react-i18next**: Широка екосистема спільноти; для редакційних робочих процесів ви зазвичай використовуєте зовнішні платформи локалізації.
127
+ - **Intlayer**: Надає **безкоштовний візуальний редактор** та **опційний CMS** (зберігайте контент у Git або зовнішньо). Також пропонує **розширення для VSCode** для створення контенту та **переклад із допомогою ШІ** з використанням ваших власних ключів провайдера.
128
+
129
+ **Чому це важливо:** Вбудовані інструменти скорочують цикл між розробниками та авторами контенту — менше допоміжного коду, менше залежностей від постачальників.
130
+
131
+ ---
132
+
133
+ ## Коли обирати який варіант?
134
+
135
+ - **Оберіть react-intl** якщо ви хочете **форматування повідомлень, орієнтоване на ICU**, з простим, відповідним стандартам API, і ваша команда комфортно підтримує каталоги та перевірки вручну.
136
+ - **Оберіть react-i18next** якщо вам потрібна **широта екосистеми i18next** (детектори, бекенди, плагін ICU, інтеграції) і ви готові до більшої конфігурації заради гнучкості.
137
+ - **Обирайте Intlayer** якщо ви цінуєте **component-scoped content**, **strict TypeScript**, **build-time guarantees**, **tree-shaking** та **batteries-included** редакторські інструменти — особливо для **large, modular** React-додатків, design-systems тощо.
138
+
139
+ ---
140
+
141
+ ## Сумісність з `react-intl` та `react-i18next`
142
+
143
+ `intlayer` також може допомогти керувати вашими неймспейсами `react-intl` і `react-i18next`.
144
+
145
+ Використовуючи `intlayer`, ви можете оголошувати ваш контент у форматі улюбленої i18n-бібліотеки, і intlayer згенерує ваші неймспейси у вибраному місці (приклад: `/messages/{{locale}}/{{namespace}}.json`).
146
+
147
+ Дивіться опції [`dictionaryOutput` and `i18nextResourcesDir`](https://intlayer.org/doc/concept/configuration#content-configuration) для детальнішої інформації.
148
+
149
+ ---
150
+
151
+ ## Зірки GitHub
152
+
153
+ GitHub-зірки — це вагомий індикатор популярності проєкту, довіри спільноти та його довгострокової релевантності. Хоча вони не є прямим показником технічної якості, вони відображають, скільки розробників вважають проєкт корисним, стежать за його розвитком і ймовірно його приймуть. Для оцінки цінності проєкту зірки допомагають порівнювати популярність між альтернативами та дають уявлення про зростання екосистеми.
154
+
155
+ ## [![Діаграма історії зірок](https://api.star-history.com/svg?repos=formatjs/formatjs&repos=i18next/react-i18next&repos=aymericzip/intlayer&type=Date)](https://www.star-history.com/#formatjs/formatjs&i18next/react-i18next&aymericzip/intlayer)
156
+
157
+ ## Висновок
158
+
159
+ Усі три бібліотеки ефективно локалізують React. Відмінність — у тому, скільки **infrastructure** вам потрібно побудувати, щоб досягти **safe, scalable** setup:
160
+
161
+ - З **Intlayer** **модульний контент**, **сувора типізація TS**, **безпека на етапі збірки**, **tree-shaken bundles** та **редакційні інструменти** — це налаштування за замовчуванням, а не рутинні завдання.
162
+ - Якщо ваша команда цінує **підтримуваність і швидкість** у multi-locale, компонентно-орієнтованих React-додатках, Intlayer сьогодні пропонує **найповніший** робочий процес для розробників і контенту.
163
+
164
+ Дивіться документ [«Чому Intlayer?»](https://intlayer.org/doc/why) для детальнішої інформації.