@intlayer/docs 5.8.1 → 6.0.0-canary.0
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.
- package/blog/ar/rag_powered_documentation_assistant.md +282 -0
- package/blog/de/rag_powered_documentation_assistant.md +282 -0
- package/blog/en/rag_powered_documentation_assistant.md +289 -0
- package/blog/en-GB/rag_powered_documentation_assistant.md +284 -0
- package/blog/es/rag_powered_documentation_assistant.md +308 -0
- package/blog/fr/rag_powered_documentation_assistant.md +308 -0
- package/blog/hi/rag_powered_documentation_assistant.md +284 -0
- package/blog/it/rag_powered_documentation_assistant.md +284 -0
- package/blog/ja/rag_powered_documentation_assistant.md +284 -0
- package/blog/ko/rag_powered_documentation_assistant.md +283 -0
- package/blog/pt/rag_powered_documentation_assistant.md +284 -0
- package/blog/ru/rag_powered_documentation_assistant.md +284 -0
- package/blog/tr/index.md +69 -0
- package/blog/tr/internationalization_and_SEO.md +273 -0
- package/blog/tr/intlayer_with_i18next.md +162 -0
- package/blog/tr/intlayer_with_next-i18next.md +367 -0
- package/blog/tr/intlayer_with_next-intl.md +392 -0
- package/blog/tr/intlayer_with_react-i18next.md +346 -0
- package/blog/tr/intlayer_with_react-intl.md +345 -0
- package/blog/tr/list_i18n_technologies/CMS/drupal.md +143 -0
- package/blog/tr/list_i18n_technologies/CMS/wix.md +167 -0
- package/blog/tr/list_i18n_technologies/CMS/wordpress.md +188 -0
- package/blog/tr/list_i18n_technologies/frameworks/angular.md +125 -0
- package/blog/tr/list_i18n_technologies/frameworks/flutter.md +150 -0
- package/blog/tr/list_i18n_technologies/frameworks/react-native.md +217 -0
- package/blog/tr/list_i18n_technologies/frameworks/react.md +155 -0
- package/blog/tr/list_i18n_technologies/frameworks/svelte.md +129 -0
- package/blog/tr/list_i18n_technologies/frameworks/vue.md +130 -0
- package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +170 -0
- package/blog/tr/rag_powered_documentation_assistant.md +284 -0
- package/blog/tr/react-i18next_vs_react-intl_vs_intlayer.md +162 -0
- package/blog/tr/vue-i18n_vs_intlayer.md +276 -0
- package/blog/tr/what_is_internationalization.md +166 -0
- package/blog/zh/rag_powered_documentation_assistant.md +284 -0
- package/dist/cjs/generated/blog.entry.cjs +212 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +660 -132
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +84 -0
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/generated/legal.entry.cjs +6 -0
- package/dist/cjs/generated/legal.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +212 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +660 -132
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/esm/generated/frequentQuestions.entry.mjs +84 -0
- package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
- package/dist/esm/generated/legal.entry.mjs +6 -0
- package/dist/esm/generated/legal.entry.mjs.map +1 -1
- package/dist/types/generated/blog.entry.d.ts +1 -0
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +5 -2
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
- package/dist/types/generated/legal.entry.d.ts.map +1 -1
- package/docs/ar/autoFill.md +41 -40
- package/docs/ar/configuration.md +202 -199
- package/docs/ar/dictionary/content_file.md +1059 -0
- package/docs/ar/intlayer_CMS.md +4 -4
- package/docs/ar/intlayer_with_nestjs.md +271 -0
- package/docs/ar/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ar/intlayer_with_react_router_v7.md +533 -0
- package/docs/ar/intlayer_with_tanstack.md +465 -299
- package/docs/ar/intlayer_with_vite+preact.md +7 -7
- package/docs/ar/intlayer_with_vite+react.md +7 -7
- package/docs/ar/intlayer_with_vite+vue.md +9 -9
- package/docs/ar/packages/vite-intlayer/index.md +3 -3
- package/docs/ar/readme.md +261 -0
- package/docs/ar/testing.md +199 -0
- package/docs/de/autoFill.md +42 -19
- package/docs/de/configuration.md +155 -147
- package/docs/de/dictionary/content_file.md +1059 -0
- package/docs/de/intlayer_CMS.md +4 -5
- package/docs/de/intlayer_with_nestjs.md +270 -0
- package/docs/de/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/de/intlayer_with_react_router_v7.md +537 -0
- package/docs/de/intlayer_with_tanstack.md +469 -302
- package/docs/de/intlayer_with_vite+preact.md +7 -7
- package/docs/de/intlayer_with_vite+react.md +7 -7
- package/docs/de/intlayer_with_vite+vue.md +9 -9
- package/docs/de/packages/vite-intlayer/index.md +3 -3
- package/docs/de/readme.md +261 -0
- package/docs/de/testing.md +200 -0
- package/docs/en/CI_CD.md +4 -6
- package/docs/en/autoFill.md +25 -5
- package/docs/en/configuration.md +45 -54
- package/docs/en/dictionary/content_file.md +1054 -0
- package/docs/en/intlayer_CMS.md +8 -7
- package/docs/en/intlayer_cli.md +112 -5
- package/docs/en/intlayer_with_nestjs.md +268 -0
- package/docs/en/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/en/intlayer_with_react_router_v7.md +531 -0
- package/docs/en/intlayer_with_tanstack.md +463 -294
- package/docs/en/intlayer_with_vite+preact.md +8 -8
- package/docs/en/intlayer_with_vite+react.md +8 -8
- package/docs/en/intlayer_with_vite+vue.md +8 -8
- package/docs/en/packages/intlayer/getLocalizedUrl.md +102 -25
- package/docs/en/packages/vite-intlayer/index.md +3 -3
- package/docs/en/readme.md +261 -0
- package/docs/en/testing.md +200 -0
- package/docs/en-GB/autoFill.md +29 -6
- package/docs/en-GB/configuration.md +79 -71
- package/docs/en-GB/dictionary/content_file.md +1084 -0
- package/docs/en-GB/intlayer_CMS.md +4 -5
- package/docs/en-GB/intlayer_with_nestjs.md +268 -0
- package/docs/en-GB/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/en-GB/intlayer_with_react_router_v7.md +533 -0
- package/docs/en-GB/intlayer_with_tanstack.md +466 -299
- package/docs/en-GB/intlayer_with_vite+preact.md +7 -7
- package/docs/en-GB/intlayer_with_vite+react.md +7 -7
- package/docs/en-GB/intlayer_with_vite+vue.md +9 -9
- package/docs/en-GB/packages/vite-intlayer/index.md +3 -3
- package/docs/en-GB/readme.md +261 -0
- package/docs/en-GB/testing.md +200 -0
- package/docs/es/autoFill.md +45 -23
- package/docs/es/configuration.md +171 -167
- package/docs/es/dictionary/content_file.md +1088 -0
- package/docs/es/intlayer_CMS.md +4 -5
- package/docs/es/intlayer_with_nestjs.md +268 -0
- package/docs/es/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/es/intlayer_with_react_router_v7.md +533 -0
- package/docs/es/intlayer_with_tanstack.md +469 -280
- package/docs/es/intlayer_with_vite+preact.md +7 -7
- package/docs/es/intlayer_with_vite+react.md +7 -7
- package/docs/es/intlayer_with_vite+vue.md +9 -9
- package/docs/es/packages/vite-intlayer/index.md +3 -3
- package/docs/es/readme.md +261 -0
- package/docs/es/testing.md +200 -0
- package/docs/fr/autoFill.md +47 -24
- package/docs/fr/configuration.md +213 -198
- package/docs/fr/dictionary/content_file.md +1054 -0
- package/docs/fr/intlayer_CMS.md +4 -5
- package/docs/fr/intlayer_with_nestjs.md +268 -0
- package/docs/fr/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/fr/intlayer_with_react_router_v7.md +549 -0
- package/docs/fr/intlayer_with_tanstack.md +465 -279
- package/docs/fr/intlayer_with_vite+preact.md +7 -7
- package/docs/fr/intlayer_with_vite+react.md +7 -7
- package/docs/fr/intlayer_with_vite+vue.md +9 -9
- package/docs/fr/packages/vite-intlayer/index.md +3 -3
- package/docs/fr/readme.md +261 -0
- package/docs/fr/testing.md +200 -0
- package/docs/hi/autoFill.md +47 -25
- package/docs/hi/configuration.md +194 -189
- package/docs/hi/dictionary/content_file.md +1056 -0
- package/docs/hi/intlayer_CMS.md +4 -5
- package/docs/hi/intlayer_with_nestjs.md +269 -0
- package/docs/hi/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/hi/intlayer_with_react_router_v7.md +533 -0
- package/docs/hi/intlayer_with_tanstack.md +467 -282
- package/docs/hi/intlayer_with_vite+preact.md +7 -7
- package/docs/hi/intlayer_with_vite+react.md +7 -7
- package/docs/hi/intlayer_with_vite+vue.md +9 -9
- package/docs/hi/packages/vite-intlayer/index.md +3 -3
- package/docs/hi/readme.md +261 -0
- package/docs/hi/testing.md +200 -0
- package/docs/it/autoFill.md +46 -24
- package/docs/it/configuration.md +169 -161
- package/docs/it/dictionary/content_file.md +1061 -0
- package/docs/it/intlayer_CMS.md +4 -5
- package/docs/it/intlayer_with_nestjs.md +268 -0
- package/docs/it/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/it/intlayer_with_react_router_v7.md +535 -0
- package/docs/it/intlayer_with_tanstack.md +467 -301
- package/docs/it/intlayer_with_vite+preact.md +7 -7
- package/docs/it/intlayer_with_vite+react.md +7 -7
- package/docs/it/intlayer_with_vite+vue.md +9 -9
- package/docs/it/packages/vite-intlayer/index.md +3 -3
- package/docs/it/readme.md +261 -0
- package/docs/it/testing.md +200 -0
- package/docs/ja/autoFill.md +45 -23
- package/docs/ja/configuration.md +243 -204
- package/docs/ja/dictionary/content_file.md +1064 -0
- package/docs/ja/intlayer_CMS.md +4 -5
- package/docs/ja/intlayer_with_nestjs.md +268 -0
- package/docs/ja/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ja/intlayer_with_react_router_v7.md +534 -0
- package/docs/ja/intlayer_with_tanstack.md +467 -303
- package/docs/ja/intlayer_with_vite+preact.md +7 -7
- package/docs/ja/intlayer_with_vite+react.md +7 -7
- package/docs/ja/intlayer_with_vite+vue.md +9 -9
- package/docs/ja/packages/vite-intlayer/index.md +3 -3
- package/docs/ja/readme.md +263 -0
- package/docs/ja/testing.md +200 -0
- package/docs/ko/autoFill.md +39 -16
- package/docs/ko/configuration.md +217 -197
- package/docs/ko/dictionary/content_file.md +1060 -0
- package/docs/ko/intlayer_CMS.md +4 -5
- package/docs/ko/intlayer_with_nestjs.md +268 -0
- package/docs/ko/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ko/intlayer_with_react_router_v7.md +540 -0
- package/docs/ko/intlayer_with_tanstack.md +466 -302
- package/docs/ko/intlayer_with_vite+preact.md +7 -7
- package/docs/ko/intlayer_with_vite+react.md +7 -7
- package/docs/ko/intlayer_with_vite+vue.md +9 -9
- package/docs/ko/packages/vite-intlayer/index.md +3 -3
- package/docs/ko/readme.md +261 -0
- package/docs/ko/testing.md +200 -0
- package/docs/pt/autoFill.md +39 -15
- package/docs/pt/configuration.md +165 -147
- package/docs/pt/dictionary/content_file.md +1062 -0
- package/docs/pt/intlayer_CMS.md +4 -5
- package/docs/pt/intlayer_with_nestjs.md +271 -0
- package/docs/pt/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/pt/intlayer_with_react_router_v7.md +535 -0
- package/docs/pt/intlayer_with_tanstack.md +469 -300
- package/docs/pt/intlayer_with_vite+preact.md +7 -7
- package/docs/pt/intlayer_with_vite+react.md +7 -7
- package/docs/pt/intlayer_with_vite+vue.md +9 -9
- package/docs/pt/packages/vite-intlayer/index.md +3 -3
- package/docs/pt/readme.md +261 -0
- package/docs/pt/testing.md +200 -0
- package/docs/ru/autoFill.md +52 -30
- package/docs/ru/configuration.md +164 -117
- package/docs/ru/dictionary/content_file.md +1064 -0
- package/docs/ru/intlayer_CMS.md +4 -4
- package/docs/ru/intlayer_with_nestjs.md +270 -0
- package/docs/ru/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ru/intlayer_with_react_router_v7.md +534 -0
- package/docs/ru/intlayer_with_tanstack.md +470 -305
- package/docs/ru/intlayer_with_vite+preact.md +7 -7
- package/docs/ru/intlayer_with_vite+react.md +7 -7
- package/docs/ru/intlayer_with_vite+vue.md +9 -9
- package/docs/ru/packages/vite-intlayer/index.md +3 -3
- package/docs/ru/readme.md +261 -0
- package/docs/ru/testing.md +202 -0
- package/docs/tr/CI_CD.md +198 -0
- package/docs/tr/autoFill.md +201 -0
- package/docs/tr/configuration.md +585 -0
- package/docs/tr/dictionary/condition.md +243 -0
- package/docs/tr/dictionary/content_file.md +1055 -0
- package/docs/tr/dictionary/enumeration.md +251 -0
- package/docs/tr/dictionary/file.md +228 -0
- package/docs/tr/dictionary/function_fetching.md +218 -0
- package/docs/tr/dictionary/gender.md +279 -0
- package/docs/tr/dictionary/insertion.md +191 -0
- package/docs/tr/dictionary/markdown.md +385 -0
- package/docs/tr/dictionary/nesting.md +279 -0
- package/docs/tr/dictionary/translation.md +315 -0
- package/docs/tr/formatters.md +618 -0
- package/docs/tr/how_works_intlayer.md +254 -0
- package/docs/tr/index.md +168 -0
- package/docs/tr/interest_of_intlayer.md +288 -0
- package/docs/tr/intlayer_CMS.md +347 -0
- package/docs/tr/intlayer_cli.md +570 -0
- package/docs/tr/intlayer_visual_editor.md +269 -0
- package/docs/tr/intlayer_with_angular.md +694 -0
- package/docs/tr/intlayer_with_create_react_app.md +1218 -0
- package/docs/tr/intlayer_with_express.md +415 -0
- package/docs/tr/intlayer_with_lynx+react.md +511 -0
- package/docs/tr/intlayer_with_nestjs.md +268 -0
- package/docs/tr/intlayer_with_nextjs_14.md +1029 -0
- package/docs/tr/intlayer_with_nextjs_15.md +1506 -0
- package/docs/tr/intlayer_with_nextjs_page_router.md +1484 -0
- package/docs/tr/intlayer_with_nuxt.md +773 -0
- package/docs/tr/intlayer_with_react_native+expo.md +660 -0
- package/docs/tr/intlayer_with_react_router_v7.md +531 -0
- package/docs/tr/intlayer_with_tanstack.md +452 -0
- package/docs/tr/intlayer_with_vite+preact.md +1673 -0
- package/docs/tr/intlayer_with_vite+react.md +1632 -0
- package/docs/tr/intlayer_with_vite+solid.md +288 -0
- package/docs/tr/intlayer_with_vite+svelte.md +288 -0
- package/docs/tr/intlayer_with_vite+vue.md +1042 -0
- package/docs/tr/introduction.md +209 -0
- package/docs/tr/locale_mapper.md +244 -0
- package/docs/tr/mcp_server.md +207 -0
- package/docs/tr/packages/@intlayer/api/index.md +58 -0
- package/docs/tr/packages/@intlayer/chokidar/index.md +57 -0
- package/docs/tr/packages/@intlayer/cli/index.md +47 -0
- package/docs/tr/packages/@intlayer/config/index.md +142 -0
- package/docs/tr/packages/@intlayer/core/index.md +51 -0
- package/docs/tr/packages/@intlayer/design-system/index.md +47 -0
- package/docs/tr/packages/@intlayer/dictionary-entry/index.md +53 -0
- package/docs/tr/packages/@intlayer/editor/index.md +47 -0
- package/docs/tr/packages/@intlayer/editor-react/index.md +47 -0
- package/docs/tr/packages/@intlayer/webpack/index.md +61 -0
- package/docs/tr/packages/angular-intlayer/index.md +59 -0
- package/docs/tr/packages/express-intlayer/index.md +258 -0
- package/docs/tr/packages/express-intlayer/t.md +459 -0
- package/docs/tr/packages/intlayer/getConfiguration.md +151 -0
- package/docs/tr/packages/intlayer/getEnumeration.md +165 -0
- package/docs/tr/packages/intlayer/getHTMLTextDir.md +127 -0
- package/docs/tr/packages/intlayer/getLocaleLang.md +87 -0
- package/docs/tr/packages/intlayer/getLocaleName.md +124 -0
- package/docs/tr/packages/intlayer/getLocalizedUrl.md +324 -0
- package/docs/tr/packages/intlayer/getMultilingualUrls.md +225 -0
- package/docs/tr/packages/intlayer/getPathWithoutLocale.md +81 -0
- package/docs/tr/packages/intlayer/getTranslation.md +196 -0
- package/docs/tr/packages/intlayer/getTranslationContent.md +195 -0
- package/docs/tr/packages/intlayer/index.md +505 -0
- package/docs/tr/packages/intlayer-cli/index.md +71 -0
- package/docs/tr/packages/intlayer-editor/index.md +139 -0
- package/docs/tr/packages/lynx-intlayer/index.md +85 -0
- package/docs/tr/packages/next-intlayer/index.md +154 -0
- package/docs/tr/packages/next-intlayer/t.md +354 -0
- package/docs/tr/packages/next-intlayer/useDictionary.md +270 -0
- package/docs/tr/packages/next-intlayer/useIntlayer.md +265 -0
- package/docs/tr/packages/next-intlayer/useLocale.md +133 -0
- package/docs/tr/packages/nuxt-intlayer/index.md +59 -0
- package/docs/tr/packages/preact-intlayer/index.md +55 -0
- package/docs/tr/packages/react-intlayer/index.md +148 -0
- package/docs/tr/packages/react-intlayer/t.md +304 -0
- package/docs/tr/packages/react-intlayer/useDictionary.md +554 -0
- package/docs/tr/packages/react-intlayer/useI18n.md +478 -0
- package/docs/tr/packages/react-intlayer/useIntlayer.md +253 -0
- package/docs/tr/packages/react-intlayer/useLocale.md +212 -0
- package/docs/tr/packages/react-native-intlayer/index.md +85 -0
- package/docs/tr/packages/react-scripts-intlayer/index.md +82 -0
- package/docs/tr/packages/solid-intlayer/index.md +56 -0
- package/docs/tr/packages/svelte-intlayer/index.md +55 -0
- package/docs/tr/packages/vite-intlayer/index.md +82 -0
- package/docs/tr/packages/vue-intlayer/index.md +59 -0
- package/docs/tr/per_locale_file.md +321 -0
- package/docs/tr/readme.md +261 -0
- package/docs/tr/roadmap.md +338 -0
- package/docs/tr/testing.md +200 -0
- package/docs/tr/vs_code_extension.md +154 -0
- package/docs/zh/autoFill.md +40 -18
- package/docs/zh/configuration.md +245 -226
- package/docs/zh/dictionary/content_file.md +1064 -0
- package/docs/zh/intlayer_CMS.md +4 -5
- package/docs/zh/intlayer_with_nestjs.md +268 -0
- package/docs/zh/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/zh/intlayer_with_react_router_v7.md +535 -0
- package/docs/zh/intlayer_with_tanstack.md +468 -278
- package/docs/zh/intlayer_with_vite+preact.md +7 -7
- package/docs/zh/intlayer_with_vite+react.md +7 -7
- package/docs/zh/intlayer_with_vite+vue.md +7 -7
- package/docs/zh/packages/vite-intlayer/index.md +3 -3
- package/docs/zh/readme.md +261 -0
- package/docs/zh/testing.md +198 -0
- package/frequent_questions/tr/SSR_Next_no_[locale].md +105 -0
- package/frequent_questions/tr/array_as_content_declaration.md +72 -0
- package/frequent_questions/tr/build_dictionaries.md +59 -0
- package/frequent_questions/tr/build_error_CI_CD.md +75 -0
- package/frequent_questions/tr/customized_locale_list.md +65 -0
- package/frequent_questions/tr/domain_routing.md +114 -0
- package/frequent_questions/tr/esbuild_error.md +30 -0
- package/frequent_questions/tr/get_locale_cookie.md +142 -0
- package/frequent_questions/tr/intlayer_command_undefined.md +156 -0
- package/frequent_questions/tr/locale_incorect_in_url.md +74 -0
- package/frequent_questions/tr/static_rendering.md +45 -0
- package/frequent_questions/tr/translated_path_url.md +56 -0
- package/frequent_questions/tr/unknown_command.md +98 -0
- package/legal/tr/privacy_notice.md +83 -0
- package/legal/tr/terms_of_service.md +55 -0
- package/package.json +12 -12
- package/src/generated/blog.entry.ts +212 -0
- package/src/generated/docs.entry.ts +663 -135
- package/src/generated/frequentQuestions.entry.ts +85 -1
- package/src/generated/legal.entry.ts +7 -1
- package/docs/ar/dictionary/content_extention_customization.md +0 -100
- package/docs/ar/dictionary/get_started.md +0 -527
- package/docs/de/dictionary/content_extention_customization.md +0 -100
- package/docs/de/dictionary/get_started.md +0 -531
- package/docs/en/dictionary/content_extention_customization.md +0 -102
- package/docs/en/dictionary/get_started.md +0 -529
- package/docs/en-GB/dictionary/content_extention_customization.md +0 -100
- package/docs/en-GB/dictionary/get_started.md +0 -591
- package/docs/es/dictionary/content_extention_customization.md +0 -100
- package/docs/es/dictionary/get_started.md +0 -527
- package/docs/fr/dictionary/content_extention_customization.md +0 -100
- package/docs/fr/dictionary/get_started.md +0 -527
- package/docs/hi/dictionary/content_extention_customization.md +0 -100
- package/docs/hi/dictionary/get_started.md +0 -527
- package/docs/it/dictionary/content_extention_customization.md +0 -113
- package/docs/it/dictionary/get_started.md +0 -573
- package/docs/ja/dictionary/content_extention_customization.md +0 -113
- package/docs/ja/dictionary/get_started.md +0 -576
- package/docs/ko/dictionary/content_extention_customization.md +0 -100
- package/docs/ko/dictionary/get_started.md +0 -530
- package/docs/pt/dictionary/content_extention_customization.md +0 -100
- package/docs/pt/dictionary/get_started.md +0 -532
- package/docs/ru/dictionary/content_extention_customization.md +0 -100
- package/docs/ru/dictionary/get_started.md +0 -575
- package/docs/zh/dictionary/content_extention_customization.md +0 -117
- package/docs/zh/dictionary/get_started.md +0 -533
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-09-10
|
|
3
|
+
updatedAt: 2025-09-10
|
|
4
|
+
title: Construyendo un Asistente de Documentación Potenciado por RAG (Fragmentación, Embeddings y Búsqueda)
|
|
5
|
+
description: Construyendo un Asistente de Documentación Potenciado por RAG (Fragmentación, Embeddings y Búsqueda)
|
|
6
|
+
keywords:
|
|
7
|
+
- RAG
|
|
8
|
+
- Documentación
|
|
9
|
+
- Asistente
|
|
10
|
+
- Fragmentación
|
|
11
|
+
- Embeddings
|
|
12
|
+
- Búsqueda
|
|
13
|
+
slugs:
|
|
14
|
+
- blog
|
|
15
|
+
- rag-powered-documentation-assistant
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# Construyendo un Asistente de Documentación Potenciado por RAG (Fragmentación, Embeddings y Búsqueda)
|
|
19
|
+
|
|
20
|
+
## Lo que obtienes
|
|
21
|
+
|
|
22
|
+
He construido un asistente de documentación potenciado por RAG y lo empaqueté en una plantilla que puedes usar de inmediato.
|
|
23
|
+
|
|
24
|
+
- Viene con una aplicación lista para usar (Next.js + API de OpenAI)
|
|
25
|
+
- Incluye una pipeline RAG funcional (fragmentación, embeddings, similitud coseno)
|
|
26
|
+
- Proporciona una interfaz completa de chatbot construida en React
|
|
27
|
+
- Todos los componentes de la interfaz de usuario son completamente editables con Tailwind CSS
|
|
28
|
+
- Registra cada consulta del usuario para ayudar a identificar documentación faltante, puntos de dolor del usuario y oportunidades de producto
|
|
29
|
+
|
|
30
|
+
👉 [Demostración en vivo](https://intlayer.org/doc/why) 👉 [Plantilla de código](https://github.com/aymericzip/smart_doc_RAG)
|
|
31
|
+
|
|
32
|
+
## Introducción
|
|
33
|
+
|
|
34
|
+
Si alguna vez te has perdido en la documentación, desplazándote sin fin en busca de una respuesta, sabes lo doloroso que puede ser. La documentación es útil, pero es estática y buscar en ella a menudo se siente torpe.
|
|
35
|
+
|
|
36
|
+
Ahí es donde entra **RAG (Generación Aumentada por Recuperación)**. En lugar de obligar a los usuarios a buscar entre el texto, podemos combinar **recuperación** (encontrar las partes correctas de la documentación) con **generación** (dejar que un LLM lo explique de forma natural).
|
|
37
|
+
|
|
38
|
+
En esta publicación, te guiaré a través de cómo construí un chatbot de documentación potenciado por RAG y cómo no solo ayuda a los usuarios a encontrar respuestas más rápido, sino que también ofrece a los equipos de producto una nueva forma de entender los puntos de dolor de los usuarios.
|
|
39
|
+
|
|
40
|
+
## ¿Por qué usar RAG para la documentación?
|
|
41
|
+
|
|
42
|
+
RAG se ha convertido en un enfoque popular por una razón: es una de las formas más prácticas de hacer que los grandes modelos de lenguaje sean realmente útiles.
|
|
43
|
+
|
|
44
|
+
Para la documentación, los beneficios son claros:
|
|
45
|
+
|
|
46
|
+
- Respuestas instantáneas: los usuarios preguntan en lenguaje natural y obtienen respuestas relevantes.
|
|
47
|
+
- Mejor contexto: el modelo solo ve las secciones de documentación más relevantes, reduciendo las alucinaciones.
|
|
48
|
+
- Búsqueda que se siente humana: más como Algolia + FAQ + chatbot, todo en uno.
|
|
49
|
+
- Ciclo de retroalimentación: al almacenar las consultas, descubres con qué realmente tienen dificultades los usuarios.
|
|
50
|
+
|
|
51
|
+
Ese último punto es crucial. Un sistema RAG no solo responde preguntas, sino que te dice qué es lo que la gente está preguntando. Eso significa:
|
|
52
|
+
|
|
53
|
+
- Descubres información faltante en tus documentos.
|
|
54
|
+
- Ves solicitudes de funciones emergentes.
|
|
55
|
+
- Detectas patrones que incluso pueden guiar la estrategia del producto.
|
|
56
|
+
|
|
57
|
+
Así que, RAG no es solo una herramienta de soporte. También es un **motor de descubrimiento de producto**.
|
|
58
|
+
|
|
59
|
+
## Cómo funciona la canalización RAG
|
|
60
|
+
|
|
61
|
+

|
|
62
|
+
|
|
63
|
+
A grandes rasgos, esta es la receta que usé:
|
|
64
|
+
|
|
65
|
+
1. **Dividir la documentación en fragmentos** Los archivos grandes de Markdown se dividen en fragmentos. Dividir permite proporcionar como contexto solo las partes relevantes de la documentación.
|
|
66
|
+
2. **Generar embeddings** Cada fragmento se convierte en un vector usando la API de embeddings de OpenAI (text-embedding-3-large) o una base de datos vectorial (Chroma, Qdrant, Pinecone).
|
|
67
|
+
3. **Indexación y almacenamiento** Los embeddings se almacenan en un archivo JSON simple (para mi demo), pero en producción, probablemente usarías una base de datos vectorial.
|
|
68
|
+
4. **Recuperación (R en RAG)** Se incrusta la consulta del usuario, se calcula la similitud coseno y se recuperan los fragmentos que mejor coinciden.
|
|
69
|
+
5. **Aumento + Generación (AG en RAG)** Esos fragmentos se inyectan en el prompt para ChatGPT, de modo que el modelo responda con el contexto real de la documentación.
|
|
70
|
+
6. **Registro de consultas para retroalimentación** Cada consulta del usuario se almacena. Esto es oro para entender puntos problemáticos, documentación faltante o nuevas oportunidades.
|
|
71
|
+
|
|
72
|
+
## Paso 1: Leer la documentación
|
|
73
|
+
|
|
74
|
+
El primer paso fue simple: necesitaba una forma de escanear una carpeta docs/ para todos los archivos .md. Usando Node.js y glob, obtuve el contenido de cada archivo Markdown en memoria.
|
|
75
|
+
|
|
76
|
+
Esto mantiene la canalización flexible: en lugar de Markdown, podrías obtener documentos de una base de datos, un CMS o incluso una API.
|
|
77
|
+
|
|
78
|
+
## Paso 2: Dividir la Documentación en Fragmentos
|
|
79
|
+
|
|
80
|
+
¿Por qué dividir en fragmentos? Porque los modelos de lenguaje tienen **límites de contexto**. Alimentarlos con un libro entero de documentación no funcionará.
|
|
81
|
+
|
|
82
|
+
Entonces, la idea es dividir el texto en fragmentos manejables (por ejemplo, 500 tokens cada uno) con solapamiento (por ejemplo, 100 tokens). El solapamiento asegura continuidad para que no pierdas el significado en los límites de los fragmentos.
|
|
83
|
+
|
|
84
|
+
**Ejemplo:**
|
|
85
|
+
|
|
86
|
+
- Fragmento 1 → “…la vieja biblioteca que muchos habían olvidado. Sus estanterías imponentes estaban llenas de libros…”
|
|
87
|
+
- Fragmento 2 → “…las estanterías estaban llenas de libros de todos los géneros imaginables, cada uno susurrando historias…”
|
|
88
|
+
|
|
89
|
+
El solapamiento asegura que ambos fragmentos contengan contexto compartido, por lo que la recuperación permanece coherente.
|
|
90
|
+
|
|
91
|
+
Este compromiso (tamaño del fragmento vs superposición) es clave para la eficiencia de RAG:
|
|
92
|
+
|
|
93
|
+
- Demasiado pequeño → obtienes ruido.
|
|
94
|
+
- Demasiado grande → explotas el tamaño del contexto.
|
|
95
|
+
|
|
96
|
+
## Paso 3: Generación de Embeddings
|
|
97
|
+
|
|
98
|
+
Una vez que los documentos están fragmentados, generamos **embeddings** — vectores de alta dimensión que representan cada fragmento.
|
|
99
|
+
|
|
100
|
+
Usé el modelo text-embedding-3-large de OpenAI, pero podrías usar cualquier modelo moderno de embeddings.
|
|
101
|
+
|
|
102
|
+
**Ejemplo de embedding:**
|
|
103
|
+
|
|
104
|
+
```js
|
|
105
|
+
[
|
|
106
|
+
-0.0002630692, -0.029749284, 0.010225477, -0.009224428, -0.0065269712,
|
|
107
|
+
-0.002665544, 0.003214777, 0.04235309, -0.033162255, -0.00080789323,
|
|
108
|
+
//...+1533 elementos
|
|
109
|
+
];
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Cada vector es una huella matemática del texto, que permite la búsqueda por similitud.
|
|
113
|
+
|
|
114
|
+
## Paso 4: Indexación y Almacenamiento de Embeddings
|
|
115
|
+
|
|
116
|
+
Para evitar regenerar embeddings múltiples veces, los almacené en embeddings.json.
|
|
117
|
+
|
|
118
|
+
En producción, probablemente querrás una base de datos vectorial como:
|
|
119
|
+
|
|
120
|
+
- Chroma
|
|
121
|
+
- Qdrant
|
|
122
|
+
- Pinecone
|
|
123
|
+
- FAISS, Weaviate, Milvus, etc.
|
|
124
|
+
|
|
125
|
+
Las bases de datos vectoriales manejan la indexación, escalabilidad y búsqueda rápida. Pero para mi prototipo, un JSON local funcionó bien.
|
|
126
|
+
|
|
127
|
+
## Paso 5: Recuperación con Similitud del Coseno
|
|
128
|
+
|
|
129
|
+
Cuando un usuario hace una pregunta:
|
|
130
|
+
|
|
131
|
+
1. Generar un embedding para la consulta.
|
|
132
|
+
2. Compararlo con todos los embeddings de los documentos usando **similitud del coseno**.
|
|
133
|
+
3. Mantener solo los N fragmentos más similares.
|
|
134
|
+
|
|
135
|
+
La similitud del coseno mide el ángulo entre dos vectores. Una coincidencia perfecta obtiene un puntaje de **1.0**.
|
|
136
|
+
|
|
137
|
+
De esta manera, el sistema encuentra los pasajes del documento más cercanos a la consulta.
|
|
138
|
+
|
|
139
|
+
## Paso 6: Aumento + Generación
|
|
140
|
+
|
|
141
|
+
Ahora viene la magia. Tomamos los fragmentos principales y los inyectamos en el **prompt del sistema** para ChatGPT.
|
|
142
|
+
|
|
143
|
+
Eso significa que el modelo responde como si esos fragmentos fueran parte de la conversación.
|
|
144
|
+
|
|
145
|
+
El resultado: respuestas precisas y **basadas en la documentación**.
|
|
146
|
+
|
|
147
|
+
## Paso 7: Registro de Consultas de Usuarios
|
|
148
|
+
|
|
149
|
+
Este es el superpoder oculto.
|
|
150
|
+
|
|
151
|
+
Cada pregunta realizada se almacena. Con el tiempo, construyes un conjunto de datos de:
|
|
152
|
+
|
|
153
|
+
- Preguntas más frecuentes (ideal para FAQs)
|
|
154
|
+
- Preguntas sin respuesta (documentación faltante o poco clara)
|
|
155
|
+
- Solicitudes de funciones disfrazadas de preguntas (“¿Se integra con X?”)
|
|
156
|
+
- Casos de uso emergentes que no habías previsto
|
|
157
|
+
|
|
158
|
+
Esto convierte a tu asistente RAG en una **herramienta continua de investigación de usuarios**.
|
|
159
|
+
|
|
160
|
+
## ¿Cuánto Cuesta?
|
|
161
|
+
|
|
162
|
+
Una objeción común a RAG es el costo. En la práctica, es sorprendentemente barato:
|
|
163
|
+
|
|
164
|
+
- Generar embeddings para ~200 documentos toma alrededor de **5 minutos** y cuesta **1–2 euros**.
|
|
165
|
+
- La función de búsqueda en documentos es 100% gratuita.
|
|
166
|
+
- Para las consultas, usamos gpt-4o-latest sin el modo de “pensamiento”. En Intlayer, vemos alrededor de **300 consultas de chat por mes**, y la factura de la API de OpenAI rara vez supera los **10 $**.
|
|
167
|
+
|
|
168
|
+
Además de eso, puedes incluir el costo de alojamiento.
|
|
169
|
+
|
|
170
|
+
## Detalles de Implementación
|
|
171
|
+
|
|
172
|
+
Stack:
|
|
173
|
+
|
|
174
|
+
- Monorepo: espacio de trabajo pnpm
|
|
175
|
+
- Paquete de documentación: Node.js / TypeScript / API de OpenAI
|
|
176
|
+
- Frontend: Next.js / React / Tailwind CSS
|
|
177
|
+
- Backend: ruta API de Node.js / API de OpenAI
|
|
178
|
+
|
|
179
|
+
El paquete `@smart-doc/docs` es un paquete TypeScript que maneja el procesamiento de la documentación. Cuando se agrega o modifica un archivo markdown, el paquete incluye un script `build` que reconstruye la lista de documentación en cada idioma, genera embeddings y los almacena en un archivo `embeddings.json`.
|
|
180
|
+
|
|
181
|
+
Para el frontend, usamos una aplicación Next.js que proporciona:
|
|
182
|
+
|
|
183
|
+
- Renderizado de Markdown a HTML
|
|
184
|
+
- Una barra de búsqueda para encontrar documentación relevante
|
|
185
|
+
- Una interfaz de chatbot para hacer preguntas sobre la documentación
|
|
186
|
+
|
|
187
|
+
Para realizar una búsqueda en la documentación, la aplicación Next.js incluye una ruta API que llama a una función del paquete `@smart-doc/docs` para recuperar fragmentos de documentación que coincidan con la consulta. Usando estos fragmentos, podemos devolver una lista de páginas de documentación relevantes para la búsqueda del usuario.
|
|
188
|
+
|
|
189
|
+
Para la funcionalidad del chatbot, seguimos el mismo proceso de búsqueda pero además inyectamos los fragmentos de documentación recuperados en el prompt enviado a ChatGPT.
|
|
190
|
+
|
|
191
|
+
Aquí hay un ejemplo de un prompt enviado a ChatGPT:
|
|
192
|
+
|
|
193
|
+
Prompt del sistema:
|
|
194
|
+
|
|
195
|
+
```txt
|
|
196
|
+
Eres un asistente útil que puede responder preguntas sobre la documentación de Intlayer.
|
|
197
|
+
|
|
198
|
+
Fragmentos relacionados:
|
|
199
|
+
|
|
200
|
+
-----
|
|
201
|
+
docName: "getting-started"
|
|
202
|
+
docChunk: "1/3"
|
|
203
|
+
docUrl: "https://example.com/docs/es/getting-started"
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
# Cómo empezar
|
|
207
|
+
|
|
208
|
+
...
|
|
209
|
+
|
|
210
|
+
-----
|
|
211
|
+
docName: "another-doc"
|
|
212
|
+
docChunk: "1/5"
|
|
213
|
+
docUrl: "https://example.com/docs/es/another-doc"
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
# Otro documento
|
|
217
|
+
|
|
218
|
+
...
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Consulta del usuario:
|
|
222
|
+
|
|
223
|
+
```txt
|
|
224
|
+
¿Cómo empezar?
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
Usamos SSE para transmitir la respuesta desde la ruta API.
|
|
228
|
+
|
|
229
|
+
Como se mencionó, usamos gpt-4-turbo sin modo "pensando". Las respuestas son relevantes y la latencia es baja.
|
|
230
|
+
Experimentamos con gpt-5, pero la latencia era demasiado alta (a veces hasta 15 segundos para una respuesta). Pero lo revisaremos en el futuro.
|
|
231
|
+
|
|
232
|
+
👉 [Prueba la demo aquí](https://intlayer.org/doc/why) 👉 [Consulta la plantilla de código en GitHub](https://github.com/aymericzip/smart_doc_RAG)
|
|
233
|
+
|
|
234
|
+
## Ir más allá
|
|
235
|
+
|
|
236
|
+
Este proyecto es una implementación mínima. Pero puedes ampliarlo de muchas maneras:
|
|
237
|
+
|
|
238
|
+
- Servidor MCP → la función de búsqueda en la documentación a un servidor MCP para conectar la documentación con cualquier asistente de IA
|
|
239
|
+
|
|
240
|
+
- Bases de datos vectoriales → escalar a millones de fragmentos de documentación
|
|
241
|
+
- LangChain / LlamaIndex → frameworks listos para usar para pipelines RAG
|
|
242
|
+
- Paneles de análisis → visualizar consultas de usuarios y puntos problemáticos
|
|
243
|
+
- Recuperación multisource → obtener no solo documentos, sino entradas de bases de datos, publicaciones de blogs, tickets, etc.
|
|
244
|
+
- Mejora en el prompting → reordenamiento, filtrado y búsqueda híbrida (palabra clave + semántica)
|
|
245
|
+
|
|
246
|
+
## Limitaciones que hemos encontrado
|
|
247
|
+
|
|
248
|
+
- La segmentación y el solapamiento son empíricos. El equilibrio correcto (tamaño del fragmento, porcentaje de solapamiento, número de fragmentos recuperados) requiere iteración y pruebas.
|
|
249
|
+
- Los embeddings no se regeneran automáticamente cuando los documentos cambian. Nuestro sistema reinicia los embeddings para un archivo solo si el número de fragmentos difiere de lo almacenado.
|
|
250
|
+
- En este prototipo, los embeddings se almacenan en JSON. Esto funciona para demostraciones pero contamina Git. En producción, es mejor usar una base de datos o un almacén vectorial dedicado.
|
|
251
|
+
|
|
252
|
+
## Por qué esto importa más allá de la documentación
|
|
253
|
+
|
|
254
|
+
La parte interesante no es solo el chatbot. Es el **bucle de retroalimentación**.
|
|
255
|
+
|
|
256
|
+
Con RAG, no solo respondes:
|
|
257
|
+
|
|
258
|
+
- Aprendes qué confunde a los usuarios.
|
|
259
|
+
- Descubres qué características esperan.
|
|
260
|
+
- Adaptas tu estrategia de producto basándote en consultas reales.
|
|
261
|
+
|
|
262
|
+
**Ejemplo:**
|
|
263
|
+
|
|
264
|
+
Imagina lanzar una nueva función y ver instantáneamente:
|
|
265
|
+
|
|
266
|
+
- El 50% de las preguntas son sobre el mismo paso de configuración poco claro
|
|
267
|
+
- Los usuarios piden repetidamente una integración que aún no soportas
|
|
268
|
+
- La gente busca términos que revelan un nuevo caso de uso
|
|
269
|
+
|
|
270
|
+
Eso es **inteligencia de producto** directamente de tus usuarios.
|
|
271
|
+
|
|
272
|
+
## Conclusión
|
|
273
|
+
|
|
274
|
+
- En este prototipo, los embeddings se almacenan en JSON. Esto funciona para demostraciones pero contamina Git. En producción, es mejor usar una base de datos o un almacén vectorial dedicado.
|
|
275
|
+
|
|
276
|
+
## Por qué esto importa más allá de la documentación
|
|
277
|
+
|
|
278
|
+
La parte interesante no es solo el chatbot. Es el **ciclo de retroalimentación**.
|
|
279
|
+
|
|
280
|
+
Con RAG, no solo respondes:
|
|
281
|
+
|
|
282
|
+
- Aprendes qué confunde a los usuarios.
|
|
283
|
+
- Descubres qué funciones esperan.
|
|
284
|
+
- Adaptas tu estrategia de producto basándote en consultas reales.
|
|
285
|
+
|
|
286
|
+
**Ejemplo:**
|
|
287
|
+
|
|
288
|
+
Imagina lanzar una nueva función y ver instantáneamente:
|
|
289
|
+
|
|
290
|
+
- El 50% de las preguntas son sobre el mismo paso de configuración poco claro
|
|
291
|
+
- Los usuarios piden repetidamente una integración que aún no soportas
|
|
292
|
+
- La gente busca términos que revelan un nuevo caso de uso
|
|
293
|
+
|
|
294
|
+
Eso es **inteligencia de producto** directamente de tus usuarios.
|
|
295
|
+
|
|
296
|
+
## Conclusión
|
|
297
|
+
|
|
298
|
+
RAG es una de las formas más simples y poderosas de hacer que los LLMs sean prácticos. Al combinar **recuperación + generación**, puedes convertir documentos estáticos en un **asistente inteligente** y, al mismo tiempo, obtener un flujo continuo de información sobre el producto.
|
|
299
|
+
|
|
300
|
+
Para mí, este proyecto mostró que RAG no es solo un truco técnico. Es una forma de transformar la documentación en:
|
|
301
|
+
|
|
302
|
+
- un sistema de soporte interactivo
|
|
303
|
+
- un canal de retroalimentación
|
|
304
|
+
- una herramienta de estrategia de producto
|
|
305
|
+
|
|
306
|
+
👉 [Prueba la demo aquí](https://intlayer.org/doc/why) 👉 [Consulta la plantilla de código en GitHub](https://github.com/aymericzip/smart_doc_RAG)
|
|
307
|
+
|
|
308
|
+
Y si también estás experimentando con RAG, me encantaría saber cómo lo estás usando.
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-09-10
|
|
3
|
+
updatedAt: 2025-09-10
|
|
4
|
+
title: Création d’un assistant de documentation propulsé par RAG (Segmentation, Embeddings et Recherche)
|
|
5
|
+
description: Création d’un assistant de documentation propulsé par RAG (Segmentation, Embeddings et Recherche)
|
|
6
|
+
keywords:
|
|
7
|
+
- RAG
|
|
8
|
+
- Documentation
|
|
9
|
+
- Assistant
|
|
10
|
+
- Segmentation
|
|
11
|
+
- Embeddings
|
|
12
|
+
- Recherche
|
|
13
|
+
slugs:
|
|
14
|
+
- blog
|
|
15
|
+
- rag-powered-documentation-assistant
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# Création d’un assistant de documentation propulsé par RAG (Segmentation, Embeddings et Recherche)
|
|
19
|
+
|
|
20
|
+
## Ce que vous obtenez
|
|
21
|
+
|
|
22
|
+
J’ai créé un assistant de documentation propulsé par RAG et l’ai emballé dans un boilerplate que vous pouvez utiliser immédiatement.
|
|
23
|
+
|
|
24
|
+
- Livré avec une application prête à l’emploi (Next.js + API OpenAI)
|
|
25
|
+
- Comprend une pipeline RAG fonctionnelle (segmentation, embeddings, similarité cosinus)
|
|
26
|
+
- Fournit une interface complète de chatbot construite en React
|
|
27
|
+
- Tous les composants UI sont entièrement modifiables avec Tailwind CSS
|
|
28
|
+
- Enregistre chaque requête utilisateur pour aider à identifier les documents manquants, les points de douleur des utilisateurs et les opportunités produit
|
|
29
|
+
|
|
30
|
+
👉 [Démo en direct](https://intlayer.org/doc/why) 👉 [Boilerplate de code](https://github.com/aymericzip/smart_doc_RAG)
|
|
31
|
+
|
|
32
|
+
## Introduction
|
|
33
|
+
|
|
34
|
+
Si vous vous êtes déjà perdu dans une documentation, à faire défiler sans fin pour trouver une réponse, vous savez à quel point cela peut être pénible. Les docs sont utiles, mais elles sont statiques et leur recherche est souvent maladroite.
|
|
35
|
+
|
|
36
|
+
C’est là qu’intervient **RAG (Retrieval-Augmented Generation)**. Au lieu de forcer les utilisateurs à fouiller dans le texte, nous pouvons combiner la **récupération** (trouver les bonnes parties de la doc) avec la **génération** (laisser un LLM l’expliquer naturellement).
|
|
37
|
+
|
|
38
|
+
Dans cet article, je vais vous expliquer comment j’ai construit un chatbot de documentation alimenté par RAG et comment il ne se contente pas d’aider les utilisateurs à trouver des réponses plus rapidement, mais offre également aux équipes produit une nouvelle manière de comprendre les points de douleur des utilisateurs.
|
|
39
|
+
|
|
40
|
+
## Pourquoi utiliser RAG pour la documentation ?
|
|
41
|
+
|
|
42
|
+
RAG est devenu une approche populaire pour une raison : c’est l’une des façons les plus pratiques de rendre les grands modèles de langage réellement utiles.
|
|
43
|
+
|
|
44
|
+
Pour la documentation, les avantages sont clairs :
|
|
45
|
+
|
|
46
|
+
- Réponses instantanées : les utilisateurs posent des questions en langage naturel et obtiennent des réponses pertinentes.
|
|
47
|
+
- Meilleur contexte : le modèle ne voit que les sections de documentation les plus pertinentes, réduisant ainsi les hallucinations.
|
|
48
|
+
- Recherche qui semble humaine : un mélange d’Algolia + FAQ + chatbot, tout en un.
|
|
49
|
+
- Boucle de rétroaction : en stockant les requêtes, vous découvrez ce avec quoi les utilisateurs ont vraiment du mal.
|
|
50
|
+
|
|
51
|
+
Ce dernier point est crucial. Un système RAG ne se contente pas de répondre aux questions, il vous indique ce que les gens demandent. Cela signifie :
|
|
52
|
+
|
|
53
|
+
- Vous découvrez des informations manquantes dans votre documentation.
|
|
54
|
+
- Vous voyez apparaître des demandes de fonctionnalités.
|
|
55
|
+
- Vous repérez des tendances qui peuvent même orienter la stratégie produit.
|
|
56
|
+
|
|
57
|
+
Ainsi, RAG n’est pas seulement un outil de support. C’est aussi un **moteur de découverte produit**.
|
|
58
|
+
|
|
59
|
+
## Comment fonctionne le pipeline RAG
|
|
60
|
+
|
|
61
|
+

|
|
62
|
+
|
|
63
|
+
À un niveau élevé, voici la recette que j’ai utilisée :
|
|
64
|
+
|
|
65
|
+
1. **Découpage de la documentation** De gros fichiers Markdown sont divisés en morceaux. Le découpage permet de fournir comme contexte uniquement les parties pertinentes de la documentation.
|
|
66
|
+
2. **Génération des embeddings** Chaque morceau est transformé en vecteur en utilisant l’API d’embeddings d’OpenAI (text-embedding-3-large) ou une base de données vectorielle (Chroma, Qdrant, Pinecone).
|
|
67
|
+
3. **Indexation et stockage** Les embeddings sont stockés dans un simple fichier JSON (pour ma démo), mais en production, vous utiliseriez probablement une base de données vectorielle.
|
|
68
|
+
4. **Récupération (R dans RAG)** Une requête utilisateur est transformée en embedding, la similarité cosinus est calculée, et les chunks les plus pertinents sont récupérés.
|
|
69
|
+
5. **Augmentation + Génération (AG dans RAG)** Ces chunks sont injectés dans le prompt pour ChatGPT, afin que le modèle réponde avec le contexte réel de la documentation.
|
|
70
|
+
6. **Enregistrement des requêtes pour feedback** Chaque requête utilisateur est stockée. C’est une mine d’or pour comprendre les points de douleur, les documents manquants ou les nouvelles opportunités.
|
|
71
|
+
|
|
72
|
+
## Étape 1 : Lecture des Docs
|
|
73
|
+
|
|
74
|
+
La première étape était simple : j’avais besoin d’un moyen pour scanner un dossier docs/ à la recherche de tous les fichiers .md. En utilisant Node.js et glob, j’ai récupéré le contenu de chaque fichier Markdown en mémoire.
|
|
75
|
+
|
|
76
|
+
Cela maintient la flexibilité du pipeline : au lieu de Markdown, vous pourriez récupérer les documents depuis une base de données, un CMS, ou même une API.
|
|
77
|
+
|
|
78
|
+
## Étape 2 : Découpage de la documentation
|
|
79
|
+
|
|
80
|
+
Pourquoi découper ? Parce que les modèles de langage ont des **limites de contexte**. Leur fournir un livre entier de documentation ne fonctionnera pas.
|
|
81
|
+
|
|
82
|
+
L’idée est donc de diviser le texte en morceaux gérables (par exemple 500 tokens chacun) avec un chevauchement (par exemple 100 tokens). Le chevauchement assure la continuité pour ne pas perdre le sens aux frontières des morceaux.
|
|
83
|
+
|
|
84
|
+
**Exemple :**
|
|
85
|
+
|
|
86
|
+
- Morceau 1 → « …la vieille bibliothèque que beaucoup avaient oubliée. Ses étagères imposantes étaient remplies de livres… »
|
|
87
|
+
- Morceau 2 → « …les étagères étaient remplies de livres de tous genres imaginables, chacun murmurant des histoires… »
|
|
88
|
+
|
|
89
|
+
Le chevauchement garantit que les deux morceaux contiennent un contexte partagé, ce qui rend la récupération cohérente.
|
|
90
|
+
|
|
91
|
+
Ce compromis (taille des chunks vs chevauchement) est essentiel pour l'efficacité du RAG :
|
|
92
|
+
|
|
93
|
+
- Trop petit → vous obtenez du bruit.
|
|
94
|
+
- Trop grand → vous explosez la taille du contexte.
|
|
95
|
+
|
|
96
|
+
## Étape 3 : Génération des embeddings
|
|
97
|
+
|
|
98
|
+
Une fois les documents découpés en chunks, nous générons des **embeddings** — des vecteurs de haute dimension représentant chaque chunk.
|
|
99
|
+
|
|
100
|
+
J'ai utilisé le modèle text-embedding-3-large d'OpenAI, mais vous pouvez utiliser n'importe quel modèle d'embedding moderne.
|
|
101
|
+
|
|
102
|
+
**Exemple d'embedding :**
|
|
103
|
+
|
|
104
|
+
```js
|
|
105
|
+
[
|
|
106
|
+
-0.0002630692, -0.029749284, 0.010225477, -0.009224428, -0.0065269712,
|
|
107
|
+
-0.002665544, 0.003214777, 0.04235309, -0.033162255, -0.00080789323,
|
|
108
|
+
//...+1533 éléments
|
|
109
|
+
];
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Chaque vecteur est une empreinte mathématique du texte, permettant la recherche de similarité.
|
|
113
|
+
|
|
114
|
+
## Étape 4 : Indexation et stockage des embeddings
|
|
115
|
+
|
|
116
|
+
Pour éviter de régénérer les embeddings plusieurs fois, je les ai stockés dans embeddings.json.
|
|
117
|
+
|
|
118
|
+
En production, vous voudriez probablement une base de données vectorielle telle que :
|
|
119
|
+
|
|
120
|
+
- Chroma
|
|
121
|
+
- Qdrant
|
|
122
|
+
- Pinecone
|
|
123
|
+
- FAISS, Weaviate, Milvus, etc.
|
|
124
|
+
|
|
125
|
+
Les bases de données vectorielles gèrent l’indexation, la scalabilité et la recherche rapide. Mais pour mon prototype, un JSON local a très bien fonctionné.
|
|
126
|
+
|
|
127
|
+
## Étape 5 : Recherche avec similarité cosinus
|
|
128
|
+
|
|
129
|
+
Lorsqu’un utilisateur pose une question :
|
|
130
|
+
|
|
131
|
+
1. Générer un embedding pour la requête.
|
|
132
|
+
2. Le comparer à tous les embeddings des documents en utilisant la **similarité cosinus**.
|
|
133
|
+
3. Ne garder que les N chunks les plus similaires.
|
|
134
|
+
|
|
135
|
+
La similarité cosinus mesure l’angle entre deux vecteurs. Une correspondance parfaite obtient un score de **1.0**.
|
|
136
|
+
|
|
137
|
+
Ainsi, le système trouve les passages de documents les plus proches de la requête.
|
|
138
|
+
|
|
139
|
+
## Étape 6 : Augmentation + Génération
|
|
140
|
+
|
|
141
|
+
Voici la magie. Nous prenons les meilleurs chunks et les injectons dans le **prompt système** pour ChatGPT.
|
|
142
|
+
|
|
143
|
+
Cela signifie que le modèle répond comme si ces extraits faisaient partie de la conversation.
|
|
144
|
+
|
|
145
|
+
Le résultat : des réponses précises, **fondées sur la documentation**.
|
|
146
|
+
|
|
147
|
+
## Étape 7 : Enregistrement des requêtes utilisateur
|
|
148
|
+
|
|
149
|
+
C’est la superpuissance cachée.
|
|
150
|
+
|
|
151
|
+
Chaque question posée est stockée. Au fil du temps, vous constituez un ensemble de données comprenant :
|
|
152
|
+
|
|
153
|
+
- Les questions les plus fréquentes (idéal pour les FAQ)
|
|
154
|
+
- Les questions sans réponse (documentation manquante ou peu claire)
|
|
155
|
+
- Les demandes de fonctionnalités déguisées en questions (« Est-ce que cela s’intègre avec X ? »)
|
|
156
|
+
- Les cas d’utilisation émergents auxquels vous n’aviez pas pensé
|
|
157
|
+
|
|
158
|
+
Cela transforme votre assistant RAG en un **outil continu de recherche utilisateur**.
|
|
159
|
+
|
|
160
|
+
## Quel est le coût ?
|
|
161
|
+
|
|
162
|
+
Une objection courante au RAG est le coût. En pratique, c’est étonnamment peu cher :
|
|
163
|
+
|
|
164
|
+
- Générer des embeddings pour environ 200 documents prend environ **5 minutes** et coûte **1 à 2 euros**.
|
|
165
|
+
- La fonctionnalité de recherche dans la documentation est 100 % gratuite.
|
|
166
|
+
- Pour les requêtes, nous utilisons gpt-4o-latest sans le mode « réflexion ». Sur Intlayer, nous observons environ **300 requêtes de chat par mois**, et la facture de l’API OpenAI dépasse rarement **10 $**.
|
|
167
|
+
|
|
168
|
+
En plus de cela, vous pouvez inclure le coût d’hébergement.
|
|
169
|
+
|
|
170
|
+
## Détails de l’implémentation
|
|
171
|
+
|
|
172
|
+
Stack :
|
|
173
|
+
|
|
174
|
+
- Monorepo : espace de travail pnpm
|
|
175
|
+
- Package doc : Node.js / TypeScript / API OpenAI
|
|
176
|
+
- Frontend : Next.js / React / Tailwind CSS
|
|
177
|
+
- Backend : route API Node.js / API OpenAI
|
|
178
|
+
|
|
179
|
+
Le package `@smart-doc/docs` est un package TypeScript qui gère le traitement de la documentation. Lorsqu’un fichier markdown est ajouté ou modifié, le package inclut un script `build` qui reconstruit la liste de documentation dans chaque langue, génère des embeddings, et les stocke dans un fichier `embeddings.json`.
|
|
180
|
+
|
|
181
|
+
Pour le frontend, nous utilisons une application Next.js qui fournit :
|
|
182
|
+
|
|
183
|
+
- Rendu Markdown vers HTML
|
|
184
|
+
- Une barre de recherche pour trouver la documentation pertinente
|
|
185
|
+
- Une interface de chatbot pour poser des questions sur la documentation
|
|
186
|
+
|
|
187
|
+
Pour effectuer une recherche dans la documentation, l’application Next.js inclut une route API qui appelle une fonction du package `@smart-doc/docs` pour récupérer les segments de documentation correspondant à la requête. En utilisant ces segments, nous pouvons retourner une liste de pages de documentation pertinentes pour la recherche de l’utilisateur.
|
|
188
|
+
|
|
189
|
+
Pour la fonctionnalité de chatbot, nous suivons le même processus de recherche mais injectons en plus les segments de documentation récupérés dans le prompt envoyé à ChatGPT.
|
|
190
|
+
|
|
191
|
+
Voici un exemple de prompt envoyé à ChatGPT :
|
|
192
|
+
|
|
193
|
+
Prompt système :
|
|
194
|
+
|
|
195
|
+
```txt
|
|
196
|
+
Vous êtes un assistant utile capable de répondre aux questions concernant la documentation Intlayer.
|
|
197
|
+
|
|
198
|
+
Segments liés :
|
|
199
|
+
|
|
200
|
+
-----
|
|
201
|
+
docName: "getting-started"
|
|
202
|
+
docChunk: "1/3"
|
|
203
|
+
docUrl: "https://example.com/docs/fr/getting-started"
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
# Comment démarrer
|
|
207
|
+
|
|
208
|
+
...
|
|
209
|
+
|
|
210
|
+
-----
|
|
211
|
+
docName: "another-doc"
|
|
212
|
+
docChunk: "1/5"
|
|
213
|
+
docUrl: "https://example.com/docs/fr/another-doc"
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
# Un autre document
|
|
217
|
+
|
|
218
|
+
...
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Requête utilisateur :
|
|
222
|
+
|
|
223
|
+
```txt
|
|
224
|
+
Comment démarrer ?
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
Nous utilisons SSE pour diffuser la réponse depuis la route API.
|
|
228
|
+
|
|
229
|
+
Comme mentionné, nous utilisons gpt-4-turbo sans mode "réflexion". Les réponses sont pertinentes et la latence est faible.
|
|
230
|
+
Nous avons expérimenté avec gpt-5, mais la latence était trop élevée (parfois jusqu'à 15 secondes pour une réponse). Nous y reviendrons à l'avenir.
|
|
231
|
+
|
|
232
|
+
👉 [Essayez la démo ici](https://intlayer.org/doc/why) 👉 [Consultez le modèle de code sur GitHub](https://github.com/aymericzip/smart_doc_RAG)
|
|
233
|
+
|
|
234
|
+
## Aller plus loin
|
|
235
|
+
|
|
236
|
+
Ce projet est une implémentation minimale. Mais vous pouvez l'étendre de nombreuses façons :
|
|
237
|
+
|
|
238
|
+
- Serveur MCP → la fonction de recherche dans la documentation vers un serveur MCP pour connecter la documentation à n'importe quel assistant IA
|
|
239
|
+
|
|
240
|
+
- Bases de données vectorielles → évoluer jusqu'à des millions de fragments de documentation
|
|
241
|
+
- LangChain / LlamaIndex → frameworks prêts à l'emploi pour les pipelines RAG
|
|
242
|
+
- Tableaux de bord analytiques → visualiser les requêtes des utilisateurs et les points de douleur
|
|
243
|
+
- Recherche multi-source → extraire non seulement des documents, mais aussi des entrées de base de données, articles de blog, tickets, etc.
|
|
244
|
+
- Amélioration des prompts → reranking, filtrage, et recherche hybride (mot-clé + sémantique)
|
|
245
|
+
|
|
246
|
+
## Limitations rencontrées
|
|
247
|
+
|
|
248
|
+
- Le découpage en fragments et le chevauchement sont empiriques. Le bon équilibre (taille des fragments, pourcentage de chevauchement, nombre de fragments récupérés) nécessite des itérations et des tests.
|
|
249
|
+
- Les embeddings ne sont pas régénérés automatiquement lorsque les documents changent. Notre système réinitialise les embeddings d'un fichier uniquement si le nombre de fragments diffère de ce qui est stocké.
|
|
250
|
+
- Dans ce prototype, les embeddings sont stockés en JSON. Cela fonctionne pour des démonstrations mais pollue Git. En production, une base de données ou un magasin vectoriel dédié est préférable.
|
|
251
|
+
|
|
252
|
+
## Pourquoi c’est important au-delà de la documentation
|
|
253
|
+
|
|
254
|
+
La partie intéressante n’est pas seulement le chatbot. C’est la **boucle de rétroaction**.
|
|
255
|
+
|
|
256
|
+
Avec RAG, vous ne vous contentez pas de répondre :
|
|
257
|
+
|
|
258
|
+
- Vous apprenez ce qui embrouille les utilisateurs.
|
|
259
|
+
- Vous découvrez quelles fonctionnalités ils attendent.
|
|
260
|
+
- Vous adaptez votre stratégie produit en fonction des requêtes réelles.
|
|
261
|
+
|
|
262
|
+
**Exemple :**
|
|
263
|
+
|
|
264
|
+
Imaginez lancer une nouvelle fonctionnalité et voir instantanément :
|
|
265
|
+
|
|
266
|
+
- 50 % des questions portent sur la même étape de configuration peu claire
|
|
267
|
+
- Les utilisateurs demandent à plusieurs reprises une intégration que vous ne supportez pas encore
|
|
268
|
+
- Les gens recherchent des termes qui révèlent un nouveau cas d’usage
|
|
269
|
+
|
|
270
|
+
C’est de **l’intelligence produit** directement issue de vos utilisateurs.
|
|
271
|
+
|
|
272
|
+
## Conclusion
|
|
273
|
+
|
|
274
|
+
- Dans ce prototype, les embeddings sont stockés en JSON. Cela fonctionne pour des démonstrations mais pollue Git. En production, une base de données ou un magasin vectoriel dédié est préférable.
|
|
275
|
+
|
|
276
|
+
## Pourquoi c’est important au-delà de la documentation
|
|
277
|
+
|
|
278
|
+
L’aspect intéressant ne se limite pas au chatbot. C’est la **boucle de rétroaction**.
|
|
279
|
+
|
|
280
|
+
Avec RAG, vous ne faites pas que répondre :
|
|
281
|
+
|
|
282
|
+
- Vous apprenez ce qui embrouille les utilisateurs.
|
|
283
|
+
- Vous découvrez quelles fonctionnalités ils attendent.
|
|
284
|
+
- Vous adaptez votre stratégie produit en fonction des requêtes réelles.
|
|
285
|
+
|
|
286
|
+
**Exemple :**
|
|
287
|
+
|
|
288
|
+
Imaginez lancer une nouvelle fonctionnalité et voir instantanément :
|
|
289
|
+
|
|
290
|
+
- 50 % des questions portent sur la même étape de configuration peu claire
|
|
291
|
+
- Les utilisateurs demandent à plusieurs reprises une intégration que vous ne supportez pas encore
|
|
292
|
+
- Les gens recherchent des termes qui révèlent un nouveau cas d’usage
|
|
293
|
+
|
|
294
|
+
C’est de **l’intelligence produit** directement issue de vos utilisateurs.
|
|
295
|
+
|
|
296
|
+
## Conclusion
|
|
297
|
+
|
|
298
|
+
RAG est l’une des manières les plus simples et puissantes de rendre les LLM pratiques. En combinant **récupération + génération**, vous pouvez transformer des docs statiques en un **assistant intelligent** et, en même temps, obtenir un flux continu d’informations produit.
|
|
299
|
+
|
|
300
|
+
Pour moi, ce projet a montré que RAG n’est pas qu’un simple tour technique. C’est une façon de transformer la documentation en :
|
|
301
|
+
|
|
302
|
+
- un système de support interactif
|
|
303
|
+
- un canal de retour d’expérience
|
|
304
|
+
- un outil de stratégie produit
|
|
305
|
+
|
|
306
|
+
👉 [Essayez la démo ici](https://intlayer.org/doc/why) 👉 [Consultez le modèle de code sur GitHub](https://github.com/aymericzip/smart_doc_RAG)
|
|
307
|
+
|
|
308
|
+
Et si vous expérimentez aussi avec RAG, j’aimerais beaucoup savoir comment vous l’utilisez.
|