@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,284 @@
|
|
|
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-संचालित दस्तावेज़ सहायक बनाया है और इसे एक बॉयलरप्लेट में पैकेज किया है जिसे आप तुरंत उपयोग कर सकते हैं।
|
|
23
|
+
|
|
24
|
+
- एक तैयार-से-उपयोग एप्लिकेशन के साथ आता है (Next.js + OpenAI API)
|
|
25
|
+
- एक कार्यशील RAG पाइपलाइन शामिल है (चंकिंग, एम्बेडिंग्स, कोसाइन समानता)
|
|
26
|
+
- React में निर्मित एक पूर्ण चैटबॉट UI प्रदान करता है
|
|
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 (रिट्रीवल-ऑगमेंटेड जनरेशन)** आता है। उपयोगकर्ताओं को टेक्स्ट के माध्यम से खुदाई करने के लिए मजबूर करने के बजाय, हम **रिट्रीवल** (दस्तावेज़ के सही हिस्सों को खोजने) को **जनरेशन** (एक 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 केवल एक सहायता उपकरण नहीं है। यह एक **उत्पाद खोज इंजन** भी है।
|
|
58
|
+
|
|
59
|
+
## RAG पाइपलाइन कैसे काम करती है
|
|
60
|
+
|
|
61
|
+

|
|
62
|
+
|
|
63
|
+
उच्च स्तर पर, यहाँ वह विधि है जिसका मैंने उपयोग किया:
|
|
64
|
+
|
|
65
|
+
1. **दस्तावेज़ को टुकड़ों में बांटना** बड़े Markdown फ़ाइलों को टुकड़ों में विभाजित किया जाता है। टुकड़ों में बांटने से केवल प्रासंगिक दस्तावेज़ भागों को संदर्भ के रूप में प्रदान करना संभव होता है।
|
|
66
|
+
2. **एम्बेडिंग्स बनाना** प्रत्येक टुकड़े को OpenAI के एम्बेडिंग API (text-embedding-3-large) या एक वेक्टर डेटाबेस (Chroma, Qdrant, Pinecone) का उपयोग करके वेक्टर में बदला जाता है।
|
|
67
|
+
3. **इंडेक्सिंग और संग्रहण** एम्बेडिंग्स को एक सरल JSON फ़ाइल में संग्रहित किया जाता है (मेरे डेमो के लिए), लेकिन उत्पादन में, आप संभवतः एक वेक्टर DB का उपयोग करेंगे।
|
|
68
|
+
4. **रिकवरी (RAG में R)** एक उपयोगकर्ता क्वेरी को एम्बेड किया जाता है, कोसाइन समानता की गणना की जाती है, और शीर्ष मेल खाने वाले टुकड़े पुनः प्राप्त किए जाते हैं।
|
|
69
|
+
5. **ऑगमेंटेशन + जनरेशन (RAG में AG)** उन टुकड़ों को 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
|
+
**उदाहरण:**
|
|
85
|
+
|
|
86
|
+
- टुकड़ा 1 → “…पुरानी लाइब्रेरी जिसे कई लोग भूल चुके थे। इसकी ऊंची शेल्फ़ किताबों से भरी हुई थीं…”
|
|
87
|
+
- टुकड़ा 2 → “…शेल्फ़ हर कल्पनीय शैली की किताबों से भरे हुए थे, प्रत्येक अपनी कहानियां फुसफुसा रहा था…”
|
|
88
|
+
|
|
89
|
+
ओवरलैप सुनिश्चित करता है कि दोनों टुकड़ों में साझा संदर्भ हो, जिससे पुनः प्राप्ति सुसंगत बनी रहे।
|
|
90
|
+
|
|
91
|
+
यह समझौता (टुकड़े का आकार बनाम ओवरलैप) RAG की दक्षता के लिए महत्वपूर्ण है:
|
|
92
|
+
|
|
93
|
+
- बहुत छोटा → आपको शोर मिलेगा।
|
|
94
|
+
- बहुत बड़ा → आप संदर्भ आकार को बढ़ा देते हैं।
|
|
95
|
+
|
|
96
|
+
## चरण 3: एम्बेडिंग्स जनरेट करना
|
|
97
|
+
|
|
98
|
+
एक बार जब दस्तावेज़ों को टुकड़ों में बांट दिया जाता है, तो हम **एम्बेडिंग्स** बनाते हैं — उच्च-आयामी वेक्टर जो प्रत्येक टुकड़े का प्रतिनिधित्व करते हैं।
|
|
99
|
+
|
|
100
|
+
मैंने OpenAI के text-embedding-3-large मॉडल का उपयोग किया, लेकिन आप कोई भी आधुनिक एम्बेडिंग मॉडल उपयोग कर सकते हैं।
|
|
101
|
+
|
|
102
|
+
**उदाहरण एम्बेडिंग:**
|
|
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 elements
|
|
109
|
+
];
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
प्रत्येक वेक्टर टेक्स्ट की एक गणितीय फिंगरप्रिंट है, जो समानता खोज को सक्षम बनाता है।
|
|
113
|
+
|
|
114
|
+
## चरण 4: एम्बेडिंग्स का इंडेक्सिंग और संग्रहण
|
|
115
|
+
|
|
116
|
+
बार-बार एम्बेडिंग्स को पुनः उत्पन्न करने से बचने के लिए, मैंने उन्हें embeddings.json में संग्रहित किया।
|
|
117
|
+
|
|
118
|
+
उत्पादन में, आप संभवतः निम्नलिखित जैसे वेक्टर डेटाबेस चाहते होंगे:
|
|
119
|
+
|
|
120
|
+
- Chroma
|
|
121
|
+
- Qdrant
|
|
122
|
+
- Pinecone
|
|
123
|
+
- FAISS, Weaviate, Milvus, आदि।
|
|
124
|
+
|
|
125
|
+
वेक्टर डेटाबेस इंडेक्सिंग, स्केलेबिलिटी, और तेज़ खोज को संभालते हैं। लेकिन मेरे प्रोटोटाइप के लिए, एक स्थानीय JSON ठीक काम करता था।
|
|
126
|
+
|
|
127
|
+
## चरण 5: कोसाइन सिमिलैरिटी के साथ पुनःप्राप्ति
|
|
128
|
+
|
|
129
|
+
जब कोई उपयोगकर्ता प्रश्न पूछता है:
|
|
130
|
+
|
|
131
|
+
1. क्वेरी के लिए एक एम्बेडिंग जनरेट करें।
|
|
132
|
+
2. इसे सभी दस्तावेज़ एम्बेडिंग्स के साथ **कोसाइन सिमिलैरिटी** का उपयोग करके तुलना करें।
|
|
133
|
+
3. केवल शीर्ष N सबसे समान टुकड़ों को रखें।
|
|
134
|
+
|
|
135
|
+
कोसाइन सिमिलैरिटी दो वेक्टरों के बीच कोण को मापती है। एक पूर्ण मेल का स्कोर **1.0** होता है।
|
|
136
|
+
|
|
137
|
+
इस तरह, सिस्टम क्वेरी के सबसे निकट दस्तावेज़ अंश खोजता है।
|
|
138
|
+
|
|
139
|
+
## चरण 6: संवर्धन + जनरेशन
|
|
140
|
+
|
|
141
|
+
अब जादू आता है। हम शीर्ष टुकड़ों को लेते हैं और उन्हें ChatGPT के **सिस्टम प्रॉम्प्ट** में इंजेक्ट करते हैं।
|
|
142
|
+
|
|
143
|
+
इसका मतलब है कि मॉडल ऐसे जवाब देता है जैसे वे चंक्स बातचीत का हिस्सा हों।
|
|
144
|
+
|
|
145
|
+
परिणाम: सटीक, **दस्तावेज़-आधारित उत्तर**।
|
|
146
|
+
|
|
147
|
+
## चरण 7: उपयोगकर्ता प्रश्नों का लॉगिंग
|
|
148
|
+
|
|
149
|
+
यह छुपी हुई सुपरपावर है।
|
|
150
|
+
|
|
151
|
+
पूछे गए हर प्रश्न को संग्रहीत किया जाता है। समय के साथ, आप एक डेटासेट बनाते हैं जिसमें शामिल हैं:
|
|
152
|
+
|
|
153
|
+
- सबसे अधिक पूछे जाने वाले प्रश्न (FAQs के लिए बेहतरीन)
|
|
154
|
+
- अनुत्तरित प्रश्न (दस्तावेज़ गायब हैं या अस्पष्ट हैं)
|
|
155
|
+
- प्रश्न के रूप में छिपे फीचर अनुरोध (“क्या यह X के साथ एकीकृत होता है?”)
|
|
156
|
+
- उभरते हुए उपयोग के मामले जिनकी आपने योजना नहीं बनाई थी
|
|
157
|
+
|
|
158
|
+
यह आपके RAG सहायक को एक **लगातार उपयोगकर्ता अनुसंधान उपकरण** में बदल देता है।
|
|
159
|
+
|
|
160
|
+
## इसकी लागत क्या है?
|
|
161
|
+
|
|
162
|
+
RAG के लिए एक सामान्य आपत्ति लागत है। व्यवहार में, यह आश्चर्यजनक रूप से सस्ता है:
|
|
163
|
+
|
|
164
|
+
- लगभग 200 दस्तावेज़ों के लिए एम्बेडिंग जनरेट करने में लगभग **5 मिनट** लगते हैं और इसकी लागत **1–2 यूरो** होती है।
|
|
165
|
+
- दस्तावेज़ खोजने की सुविधा 100% मुफ्त है।
|
|
166
|
+
- क्वेरीज़ के लिए, हम "थिंकिंग" मोड के बिना gpt-4o-latest का उपयोग करते हैं। Intlayer पर, हम प्रति माह लगभग **300 चैट क्वेरीज़** देखते हैं, और OpenAI API बिल शायद ही कभी **$10** से अधिक होता है।
|
|
167
|
+
|
|
168
|
+
इसके ऊपर, आप होस्टिंग लागत भी शामिल कर सकते हैं।
|
|
169
|
+
|
|
170
|
+
## कार्यान्वयन विवरण
|
|
171
|
+
|
|
172
|
+
स्टैक:
|
|
173
|
+
|
|
174
|
+
- मोनोरेपो: pnpm वर्कस्पेस
|
|
175
|
+
- डॉक पैकेज: Node.js / TypeScript / OpenAI API
|
|
176
|
+
- फ्रंटेंड: Next.js / React / Tailwind CSS
|
|
177
|
+
- बैकेंड: Node.js API रूट / OpenAI API
|
|
178
|
+
|
|
179
|
+
`@smart-doc/docs` पैकेज एक TypeScript पैकेज है जो दस्तावेज़ प्रसंस्करण को संभालता है। जब कोई मार्कडाउन फ़ाइल जोड़ी या संशोधित की जाती है, तो पैकेज में एक `build` स्क्रिप्ट शामिल होती है जो प्रत्येक भाषा में दस्तावेज़ सूची को पुनर्निर्मित करता है, एम्बेडिंग्स उत्पन्न करता है, और उन्हें `embeddings.json` फ़ाइल में संग्रहीत करता है।
|
|
180
|
+
|
|
181
|
+
फ्रंटेंड के लिए, हम एक Next.js एप्लिकेशन का उपयोग करते हैं जो प्रदान करता है:
|
|
182
|
+
|
|
183
|
+
- मार्कडाउन को HTML में रेंडर करना
|
|
184
|
+
- प्रासंगिक दस्तावेज़ खोजने के लिए एक खोज बार
|
|
185
|
+
- दस्तावेज़ों के बारे में प्रश्न पूछने के लिए एक चैटबॉट इंटरफ़ेस
|
|
186
|
+
|
|
187
|
+
दस्तावेज़ खोज करने के लिए, Next.js एप्लिकेशन में एक API रूट शामिल है जो `@smart-doc/docs` पैकेज में एक फ़ंक्शन को कॉल करता है ताकि क्वेरी से मेल खाने वाले डॉक चंक्स प्राप्त किए जा सकें। इन चंक्स का उपयोग करके, हम उपयोगकर्ता की खोज से संबंधित दस्तावेज़ पृष्ठों की एक सूची वापस कर सकते हैं।
|
|
188
|
+
|
|
189
|
+
चैटबॉट कार्यक्षमता के लिए, हम समान खोज प्रक्रिया का पालन करते हैं लेकिन अतिरिक्त रूप से प्राप्त डॉक चंक्स को ChatGPT को भेजे गए प्रॉम्प्ट में इंजेक्ट करते हैं।
|
|
190
|
+
|
|
191
|
+
यहाँ ChatGPT को भेजे गए प्रॉम्प्ट का एक उदाहरण है:
|
|
192
|
+
|
|
193
|
+
सिस्टम प्रॉम्प्ट :
|
|
194
|
+
|
|
195
|
+
```txt
|
|
196
|
+
आप एक सहायक सहायक हैं जो Intlayer दस्तावेज़ के बारे में प्रश्नों का उत्तर दे सकता है।
|
|
197
|
+
|
|
198
|
+
संबंधित चंक्स :
|
|
199
|
+
|
|
200
|
+
-----
|
|
201
|
+
docName: "getting-started"
|
|
202
|
+
docChunk: "1/3"
|
|
203
|
+
docUrl: "https://example.com/docs/hi/getting-started"
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
# कैसे शुरू करें
|
|
207
|
+
|
|
208
|
+
...
|
|
209
|
+
|
|
210
|
+
-----
|
|
211
|
+
docName: "another-doc"
|
|
212
|
+
docChunk: "1/5"
|
|
213
|
+
docUrl: "https://example.com/docs/hi/another-doc"
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
# एक और दस्तावेज़
|
|
217
|
+
|
|
218
|
+
...
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
उपयोगकर्ता क्वेरी :
|
|
222
|
+
|
|
223
|
+
```txt
|
|
224
|
+
कैसे शुरू करें?
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
हम API रूट से प्रतिक्रिया को स्ट्रीम करने के लिए SSE का उपयोग करते हैं।
|
|
228
|
+
|
|
229
|
+
जैसा कि उल्लेख किया गया है, हम "थिंकिंग" मोड के बिना gpt-4-turbo का उपयोग करते हैं। प्रतिक्रियाएँ प्रासंगिक होती हैं, और विलंबता कम होती है।
|
|
230
|
+
हमने gpt-5 के साथ प्रयोग किया, लेकिन विलंबता बहुत अधिक थी (कभी-कभी उत्तर के लिए 15 सेकंड तक)। लेकिन हम भविष्य में इसे फिर से देखेंगे।
|
|
231
|
+
|
|
232
|
+
👉 [यहाँ डेमो आज़माएँ](https://intlayer.org/doc/why) 👉 [GitHub पर कोड टेम्पलेट देखें](https://github.com/aymericzip/smart_doc_RAG)
|
|
233
|
+
|
|
234
|
+
## आगे बढ़ना
|
|
235
|
+
|
|
236
|
+
यह परियोजना एक न्यूनतम कार्यान्वयन है। लेकिन आप इसे कई तरीकों से बढ़ा सकते हैं:
|
|
237
|
+
|
|
238
|
+
- MCP सर्वर → डॉक्यूमेंटेशन को किसी भी AI असिस्टेंट से कनेक्ट करने के लिए डॉक रिसर्च फ़ंक्शन को MCP सर्वर में बदलना
|
|
239
|
+
|
|
240
|
+
- वेक्टर DBs → लाखों डॉक चंक्स तक स्केल करना
|
|
241
|
+
- LangChain / LlamaIndex → RAG पाइपलाइनों के लिए रेडी-मेड फ्रेमवर्क
|
|
242
|
+
- एनालिटिक्स डैशबोर्ड → उपयोगकर्ता क्वेरी और समस्याओं को विज़ुअलाइज़ करना
|
|
243
|
+
- मल्टी-सोर्स रिट्रीवल → केवल डॉक नहीं, बल्कि डेटाबेस एंट्री, ब्लॉग पोस्ट, टिकट आदि भी खींचना
|
|
244
|
+
- बेहतर प्रॉम्प्टिंग → रीरैंकिंग, फ़िल्टरिंग, और हाइब्रिड सर्च (कीवर्ड + सेमांटिक)
|
|
245
|
+
|
|
246
|
+
## सीमाएँ जिनका सामना करना पड़ा
|
|
247
|
+
|
|
248
|
+
- चंकिन्ग और ओवरलैप अनुभवजन्य हैं। सही संतुलन (चंक साइज, ओवरलैप प्रतिशत, प्राप्त किए गए चंक्स की संख्या) के लिए पुनरावृत्ति और परीक्षण आवश्यक है।
|
|
249
|
+
- जब डॉक बदलते हैं तो एम्बेडिंग्स स्वचालित रूप से पुनः उत्पन्न नहीं होती हैं। हमारा सिस्टम केवल तभी फाइल के लिए एम्बेडिंग्स रीसेट करता है जब चंक्स की संख्या संग्रहीत संख्या से भिन्न होती है।
|
|
250
|
+
- इस प्रोटोटाइप में, एम्बेडिंग्स JSON में संग्रहीत की जाती हैं। यह डेमो के लिए काम करता है लेकिन Git को प्रदूषित करता है। उत्पादन में, एक डेटाबेस या समर्पित वेक्टर स्टोर बेहतर होता है।
|
|
251
|
+
|
|
252
|
+
## यह दस्तावेज़ों से परे क्यों महत्वपूर्ण है
|
|
253
|
+
|
|
254
|
+
दिलचस्प हिस्सा केवल चैटबॉट नहीं है। यह **फीडबैक लूप** है।
|
|
255
|
+
|
|
256
|
+
RAG के साथ, आप केवल उत्तर नहीं देते:
|
|
257
|
+
|
|
258
|
+
- आप सीखते हैं कि उपयोगकर्ताओं को क्या भ्रमित करता है।
|
|
259
|
+
- आप पता लगाते हैं कि वे कौन-से फीचर्स की उम्मीद करते हैं।
|
|
260
|
+
- आप वास्तविक प्रश्नों के आधार पर अपनी उत्पाद रणनीति को अनुकूलित करते हैं।
|
|
261
|
+
|
|
262
|
+
**उदाहरण:**
|
|
263
|
+
|
|
264
|
+
कल्पना करें कि आप एक नया फीचर लॉन्च करते हैं और तुरंत देखते हैं:
|
|
265
|
+
|
|
266
|
+
- 50% प्रश्न एक ही अस्पष्ट सेटअप चरण के बारे में हैं
|
|
267
|
+
- उपयोगकर्ता बार-बार एक ऐसे इंटीग्रेशन के लिए पूछते हैं जिसे आप अभी तक सपोर्ट नहीं करते
|
|
268
|
+
- लोग ऐसे शब्द खोजते हैं जो एक नए उपयोग मामले को प्रकट करते हैं
|
|
269
|
+
|
|
270
|
+
यह है आपके उपयोगकर्ताओं से सीधे **उत्पाद बुद्धिमत्ता**।
|
|
271
|
+
|
|
272
|
+
## निष्कर्ष
|
|
273
|
+
|
|
274
|
+
RAG LLMs को व्यावहारिक बनाने के सबसे सरल और सबसे शक्तिशाली तरीकों में से एक है। **रिकवरी + जनरेशन** को मिलाकर, आप स्थिर दस्तावेज़ों को एक **स्मार्ट असिस्टेंट** में बदल सकते हैं और साथ ही, उत्पाद अंतर्दृष्टि की एक निरंतर धारा प्राप्त कर सकते हैं।
|
|
275
|
+
|
|
276
|
+
मेरे लिए, इस परियोजना ने दिखाया कि RAG केवल एक तकनीकी चाल नहीं है। यह दस्तावेज़ीकरण को बदलने का एक तरीका है:
|
|
277
|
+
|
|
278
|
+
- एक इंटरैक्टिव समर्थन प्रणाली
|
|
279
|
+
- एक प्रतिक्रिया चैनल
|
|
280
|
+
- एक उत्पाद रणनीति उपकरण
|
|
281
|
+
|
|
282
|
+
👉 [यहाँ डेमो आज़माएँ](https://intlayer.org/doc/why) 👉 [GitHub पर कोड टेम्पलेट देखें](https://github.com/aymericzip/smart_doc_RAG)
|
|
283
|
+
|
|
284
|
+
और यदि आप भी RAG के साथ प्रयोग कर रहे हैं, तो मैं सुनना चाहूंगा कि आप इसे कैसे उपयोग कर रहे हैं।
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-09-10
|
|
3
|
+
updatedAt: 2025-09-10
|
|
4
|
+
title: Costruire un Assistente alla Documentazione Potenziato da RAG (Chunking, Embeddings e Ricerca)
|
|
5
|
+
description: Costruire un Assistente alla Documentazione Potenziato da RAG (Chunking, Embeddings e Ricerca)
|
|
6
|
+
keywords:
|
|
7
|
+
- RAG
|
|
8
|
+
- Documentazione
|
|
9
|
+
- Assistente
|
|
10
|
+
- Chunking
|
|
11
|
+
- Embeddings
|
|
12
|
+
- Ricerca
|
|
13
|
+
slugs:
|
|
14
|
+
- blog
|
|
15
|
+
- rag-powered-documentation-assistant
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# Costruire un Assistente alla Documentazione Potenziato da RAG (Chunking, Embeddings e Ricerca)
|
|
19
|
+
|
|
20
|
+
## Cosa ottieni
|
|
21
|
+
|
|
22
|
+
Ho costruito un assistente alla documentazione potenziato da RAG e l'ho confezionato in un boilerplate che puoi usare immediatamente.
|
|
23
|
+
|
|
24
|
+
- Include un'applicazione pronta all'uso (Next.js + OpenAI API)
|
|
25
|
+
- Include una pipeline RAG funzionante (chunking, embeddings, similarità coseno)
|
|
26
|
+
- Fornisce un'interfaccia chatbot completa costruita in React
|
|
27
|
+
- Tutti i componenti UI sono completamente modificabili con Tailwind CSS
|
|
28
|
+
- Registra ogni query dell'utente per aiutare a identificare documentazione mancante, punti dolenti degli utenti e opportunità di prodotto
|
|
29
|
+
|
|
30
|
+
👉 [Demo live](https://intlayer.org/doc/why) 👉 [Boilerplate del codice](https://github.com/aymericzip/smart_doc_RAG)
|
|
31
|
+
|
|
32
|
+
## Introduzione
|
|
33
|
+
|
|
34
|
+
Se ti sei mai perso nella documentazione, scorrendo all'infinito alla ricerca di una risposta, sai quanto può essere frustrante. La documentazione è utile, ma è statica e la ricerca spesso risulta macchinosa.
|
|
35
|
+
|
|
36
|
+
Ed è qui che entra in gioco **RAG (Retrieval-Augmented Generation)**. Invece di costringere gli utenti a scavare nel testo, possiamo combinare **retrieval** (trovare le parti giuste della documentazione) con **generation** (permettendo a un LLM di spiegarla in modo naturale).
|
|
37
|
+
|
|
38
|
+
In questo post, ti guiderò attraverso il modo in cui ho costruito un chatbot per la documentazione alimentato da RAG e come questo non solo aiuta gli utenti a trovare risposte più velocemente, ma offre anche ai team di prodotto un nuovo modo per comprendere i punti dolenti degli utenti.
|
|
39
|
+
|
|
40
|
+
## Perché usare RAG per la documentazione?
|
|
41
|
+
|
|
42
|
+
RAG è diventato un approccio popolare per una ragione: è uno dei modi più pratici per rendere i modelli di linguaggio di grandi dimensioni realmente utili.
|
|
43
|
+
|
|
44
|
+
Per la documentazione, i vantaggi sono chiari:
|
|
45
|
+
|
|
46
|
+
- Risposte istantanee: gli utenti chiedono in linguaggio naturale e ricevono risposte pertinenti.
|
|
47
|
+
- Contesto migliore: il modello vede solo le sezioni della documentazione più rilevanti, riducendo le allucinazioni.
|
|
48
|
+
- Ricerca che sembra umana: più simile a una combinazione di Algolia + FAQ + chatbot.
|
|
49
|
+
- Ciclo di feedback: memorizzando le query, si scopre ciò con cui gli utenti hanno davvero difficoltà.
|
|
50
|
+
|
|
51
|
+
Quel ultimo punto è cruciale. Un sistema RAG non si limita a rispondere alle domande, ma ti dice cosa le persone stanno chiedendo. Questo significa:
|
|
52
|
+
|
|
53
|
+
- Scopri informazioni mancanti nella tua documentazione.
|
|
54
|
+
- Vedi emergere richieste di funzionalità.
|
|
55
|
+
- Individui schemi che possono persino guidare la strategia di prodotto.
|
|
56
|
+
|
|
57
|
+
Quindi, RAG non è solo uno strumento di supporto. È anche un **motore di scoperta del prodotto**.
|
|
58
|
+
|
|
59
|
+
## Come funziona la pipeline RAG
|
|
60
|
+
|
|
61
|
+

|
|
62
|
+
|
|
63
|
+
Ad alto livello, ecco la ricetta che ho usato:
|
|
64
|
+
|
|
65
|
+
1. **Suddivisione della documentazione in chunk** Grandi file Markdown vengono divisi in chunk. La suddivisione permette di fornire come contesto solo le parti rilevanti della documentazione.
|
|
66
|
+
2. **Generazione degli embeddings** Ogni chunk viene trasformato in un vettore usando l’API di embedding di OpenAI (text-embedding-3-large) o un database vettoriale (Chroma, Qdrant, Pinecone).
|
|
67
|
+
3. **Indicizzazione e memorizzazione** Gli embeddings vengono memorizzati in un semplice file JSON (per la mia demo), ma in produzione probabilmente useresti un database vettoriale.
|
|
68
|
+
4. **Recupero (R in RAG)** La query dell’utente viene trasformata in embedding, si calcola la similarità coseno e si recuperano i chunk più pertinenti.
|
|
69
|
+
5. **Aumento + Generazione (AG in RAG)** Quei chunk vengono inseriti nel prompt per ChatGPT, così il modello risponde con il contesto reale della documentazione.
|
|
70
|
+
6. **Registrazione delle query per feedback** Ogni query utente viene memorizzata. Questo è prezioso per capire i punti critici, la documentazione mancante o nuove opportunità.
|
|
71
|
+
|
|
72
|
+
## Passo 1: Lettura della Documentazione
|
|
73
|
+
|
|
74
|
+
Il primo passo è stato semplice: avevo bisogno di un modo per scansionare una cartella docs/ per tutti i file .md. Usando Node.js e glob, ho recuperato il contenuto di ogni file Markdown in memoria.
|
|
75
|
+
|
|
76
|
+
Questo mantiene la pipeline flessibile: invece di Markdown, potresti recuperare la documentazione da un database, un CMS o anche un'API.
|
|
77
|
+
|
|
78
|
+
## Passo 2: Suddividere la Documentazione in Chunk
|
|
79
|
+
|
|
80
|
+
Perché suddividere in chunk? Perché i modelli linguistici hanno **limiti di contesto**. Fornire loro un intero libro di documentazione non funzionerà.
|
|
81
|
+
|
|
82
|
+
Quindi l'idea è di spezzare il testo in chunk gestibili (ad esempio 500 token ciascuno) con sovrapposizione (ad esempio 100 token). La sovrapposizione garantisce continuità così da non perdere il significato ai confini dei chunk.
|
|
83
|
+
|
|
84
|
+
**Esempio:**
|
|
85
|
+
|
|
86
|
+
- Chunk 1 → “…la vecchia biblioteca che molti avevano dimenticato. Le sue scaffalature imponenti erano piene di libri…”
|
|
87
|
+
- Chunk 2 → “…le scaffalature erano piene di libri di ogni genere immaginabile, ognuno sussurrando storie…”
|
|
88
|
+
|
|
89
|
+
La sovrapposizione assicura che entrambi i chunk contengano un contesto condiviso, così il recupero rimane coerente.
|
|
90
|
+
|
|
91
|
+
Questo compromesso (dimensione del chunk vs sovrapposizione) è fondamentale per l’efficienza di RAG:
|
|
92
|
+
|
|
93
|
+
- Troppo piccolo → si genera rumore.
|
|
94
|
+
- Troppo grande → si satura la dimensione del contesto.
|
|
95
|
+
|
|
96
|
+
## Passo 3: Generazione degli Embeddings
|
|
97
|
+
|
|
98
|
+
Una volta che i documenti sono stati suddivisi in chunk, generiamo gli **embeddings** — vettori ad alta dimensione che rappresentano ogni chunk.
|
|
99
|
+
|
|
100
|
+
Ho utilizzato il modello text-embedding-3-large di OpenAI, ma potresti usare qualsiasi modello moderno di embedding.
|
|
101
|
+
|
|
102
|
+
**Esempio di 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 elementi
|
|
109
|
+
];
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Ogni vettore è un’impronta matematica del testo, che permette la ricerca per similarità.
|
|
113
|
+
|
|
114
|
+
## Passo 4: Indicizzazione e Memorizzazione degli Embeddings
|
|
115
|
+
|
|
116
|
+
Per evitare di rigenerare gli embeddings più volte, li ho memorizzati in embeddings.json.
|
|
117
|
+
|
|
118
|
+
In produzione, probabilmente vorresti un database vettoriale come:
|
|
119
|
+
|
|
120
|
+
- Chroma
|
|
121
|
+
- Qdrant
|
|
122
|
+
- Pinecone
|
|
123
|
+
- FAISS, Weaviate, Milvus, ecc.
|
|
124
|
+
|
|
125
|
+
I database vettoriali gestiscono indicizzazione, scalabilità e ricerca veloce. Ma per il mio prototipo, un JSON locale ha funzionato bene.
|
|
126
|
+
|
|
127
|
+
## Passo 5: Recupero con Similarità Coseno
|
|
128
|
+
|
|
129
|
+
Quando un utente fa una domanda:
|
|
130
|
+
|
|
131
|
+
1. Genera un embedding per la query.
|
|
132
|
+
2. Confrontalo con tutti gli embedding dei documenti usando la **similarità coseno**.
|
|
133
|
+
3. Conserva solo i primi N chunk più simili.
|
|
134
|
+
|
|
135
|
+
La similarità coseno misura l'angolo tra due vettori. Una corrispondenza perfetta ottiene un punteggio di **1.0**.
|
|
136
|
+
|
|
137
|
+
In questo modo, il sistema trova i passaggi del documento più vicini alla query.
|
|
138
|
+
|
|
139
|
+
## Passo 6: Aggiunta + Generazione
|
|
140
|
+
|
|
141
|
+
Ora arriva la magia. Prendiamo i chunk migliori e li inseriamo nel **prompt di sistema** per ChatGPT.
|
|
142
|
+
|
|
143
|
+
Ciò significa che il modello risponde come se quei frammenti facessero parte della conversazione.
|
|
144
|
+
|
|
145
|
+
Il risultato: risposte accurate e **basate sulla documentazione**.
|
|
146
|
+
|
|
147
|
+
## Passo 7: Registrazione delle Query degli Utenti
|
|
148
|
+
|
|
149
|
+
Questa è la superpotenza nascosta.
|
|
150
|
+
|
|
151
|
+
Ogni domanda posta viene memorizzata. Nel tempo, si costruisce un dataset di:
|
|
152
|
+
|
|
153
|
+
- Domande più frequenti (ottimo per le FAQ)
|
|
154
|
+
- Domande senza risposta (documentazione mancante o poco chiara)
|
|
155
|
+
- Richieste di funzionalità mascherate da domande (“Si integra con X?”)
|
|
156
|
+
- Casi d’uso emergenti che non avevi previsto
|
|
157
|
+
|
|
158
|
+
Questo trasforma il tuo assistente RAG in uno **strumento continuo di ricerca utenti**.
|
|
159
|
+
|
|
160
|
+
## Quanto Costa?
|
|
161
|
+
|
|
162
|
+
Una comune obiezione al RAG è il costo. In pratica, è sorprendentemente economico:
|
|
163
|
+
|
|
164
|
+
- Generare embedding per circa 200 documenti richiede circa **5 minuti** e costa **1–2 euro**.
|
|
165
|
+
- La funzione di ricerca nei documenti è completamente gratuita.
|
|
166
|
+
- Per le query, utilizziamo gpt-4o-latest senza la modalità “thinking”. Su Intlayer, registriamo circa **300 query chat al mese**, e la fattura dell’API OpenAI raramente supera i **10$**.
|
|
167
|
+
|
|
168
|
+
Oltre a questo, puoi includere il costo dell’hosting.
|
|
169
|
+
|
|
170
|
+
## Dettagli di Implementazione
|
|
171
|
+
|
|
172
|
+
Stack:
|
|
173
|
+
|
|
174
|
+
- Monorepo: workspace pnpm
|
|
175
|
+
- Pacchetto Doc: Node.js / TypeScript / OpenAI API
|
|
176
|
+
- Frontend: Next.js / React / Tailwind CSS
|
|
177
|
+
- Backend: route API Node.js / OpenAI API
|
|
178
|
+
|
|
179
|
+
Il pacchetto `@smart-doc/docs` è un pacchetto TypeScript che gestisce l’elaborazione della documentazione. Quando un file markdown viene aggiunto o modificato, il pacchetto include uno script `build` che ricostruisce la lista della documentazione in ogni lingua, genera gli embeddings e li memorizza in un file `embeddings.json`.
|
|
180
|
+
|
|
181
|
+
Per il frontend, utilizziamo un’applicazione Next.js che fornisce:
|
|
182
|
+
|
|
183
|
+
- Rendering da Markdown a HTML
|
|
184
|
+
- Una barra di ricerca per trovare la documentazione rilevante
|
|
185
|
+
- Un'interfaccia chatbot per porre domande sulla documentazione
|
|
186
|
+
|
|
187
|
+
Per eseguire una ricerca nella documentazione, l'applicazione Next.js include una route API che chiama una funzione nel pacchetto `@smart-doc/docs` per recuperare i frammenti di documentazione corrispondenti alla query. Utilizzando questi frammenti, possiamo restituire una lista di pagine della documentazione rilevanti per la ricerca dell'utente.
|
|
188
|
+
|
|
189
|
+
Per la funzionalità chatbot, seguiamo lo stesso processo di ricerca ma in aggiunta iniettiamo i frammenti di documentazione recuperati nel prompt inviato a ChatGPT.
|
|
190
|
+
|
|
191
|
+
Ecco un esempio di prompt inviato a ChatGPT:
|
|
192
|
+
|
|
193
|
+
Prompt di sistema:
|
|
194
|
+
|
|
195
|
+
```txt
|
|
196
|
+
Sei un assistente utile che può rispondere a domande sulla documentazione di Intlayer.
|
|
197
|
+
|
|
198
|
+
Frammenti correlati:
|
|
199
|
+
|
|
200
|
+
-----
|
|
201
|
+
docName: "getting-started"
|
|
202
|
+
docChunk: "1/3"
|
|
203
|
+
docUrl: "https://example.com/docs/it/getting-started"
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
# Come iniziare
|
|
207
|
+
|
|
208
|
+
...
|
|
209
|
+
|
|
210
|
+
-----
|
|
211
|
+
docName: "another-doc"
|
|
212
|
+
docChunk: "1/5"
|
|
213
|
+
docUrl: "https://example.com/docs/it/another-doc"
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
# Un altro documento
|
|
217
|
+
|
|
218
|
+
...
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Query utente :
|
|
222
|
+
|
|
223
|
+
```txt
|
|
224
|
+
Come iniziare?
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
Usiamo SSE per trasmettere la risposta dalla route API.
|
|
228
|
+
|
|
229
|
+
Come accennato, utilizziamo gpt-4-turbo senza la modalità "thinking". Le risposte sono pertinenti e la latenza è bassa.
|
|
230
|
+
Abbiamo sperimentato con gpt-5, ma la latenza era troppo alta (a volte fino a 15 secondi per una risposta). Tuttavia, lo rivaluteremo in futuro.
|
|
231
|
+
|
|
232
|
+
👉 [Prova la demo qui](https://intlayer.org/doc/why) 👉 [Controlla il modello di codice su GitHub](https://github.com/aymericzip/smart_doc_RAG)
|
|
233
|
+
|
|
234
|
+
## Andare oltre
|
|
235
|
+
|
|
236
|
+
Questo progetto è una implementazione minima. Ma puoi estenderlo in molti modi:
|
|
237
|
+
|
|
238
|
+
- Server MCP → la funzione di ricerca nella documentazione verso un server MCP per connettere la documentazione a qualsiasi assistente AI
|
|
239
|
+
|
|
240
|
+
- Database vettoriali → scalare a milioni di frammenti di documenti
|
|
241
|
+
- LangChain / LlamaIndex → framework pronti all'uso per pipeline RAG
|
|
242
|
+
- Cruscotti di analisi → visualizzare le query degli utenti e i punti critici
|
|
243
|
+
- Recupero multi-sorgente → estrarre non solo documenti, ma anche voci di database, post di blog, ticket, ecc.
|
|
244
|
+
- Prompting migliorato → riordinamento, filtraggio e ricerca ibrida (parola chiave + semantica)
|
|
245
|
+
|
|
246
|
+
## Limitazioni che abbiamo incontrato
|
|
247
|
+
|
|
248
|
+
- La suddivisione in frammenti e la sovrapposizione sono empiriche. Il giusto equilibrio (dimensione del frammento, percentuale di sovrapposizione, numero di frammenti recuperati) richiede iterazione e test.
|
|
249
|
+
- Gli embeddings non vengono rigenerati automaticamente quando i documenti cambiano. Il nostro sistema resetta gli embeddings per un file solo se il numero di frammenti differisce da quello memorizzato.
|
|
250
|
+
- In questo prototipo, gli embeddings sono memorizzati in JSON. Questo funziona per le demo ma inquina Git. In produzione, è meglio utilizzare un database o un archivio vettoriale dedicato.
|
|
251
|
+
|
|
252
|
+
## Perché Questo È Importante Oltre la Documentazione
|
|
253
|
+
|
|
254
|
+
La parte interessante non è solo il chatbot. È il **ciclo di feedback**.
|
|
255
|
+
|
|
256
|
+
Con RAG, non ti limiti a rispondere:
|
|
257
|
+
|
|
258
|
+
- Impari cosa confonde gli utenti.
|
|
259
|
+
- Scopri quali funzionalità si aspettano.
|
|
260
|
+
- Adatti la tua strategia di prodotto basandoti sulle query reali.
|
|
261
|
+
|
|
262
|
+
**Esempio:**
|
|
263
|
+
|
|
264
|
+
Immagina di lanciare una nuova funzionalità e vedere immediatamente:
|
|
265
|
+
|
|
266
|
+
- Il 50% delle domande riguarda lo stesso passaggio di configurazione poco chiaro
|
|
267
|
+
- Gli utenti chiedono ripetutamente un’integrazione che ancora non supporti
|
|
268
|
+
- Le persone cercano termini che rivelano un nuovo caso d’uso
|
|
269
|
+
|
|
270
|
+
Questa è **intelligenza di prodotto** direttamente dai tuoi utenti.
|
|
271
|
+
|
|
272
|
+
## Conclusione
|
|
273
|
+
|
|
274
|
+
RAG è uno dei modi più semplici e potenti per rendere pratici i LLM. Combinando **recupero + generazione**, puoi trasformare documenti statici in un **assistente intelligente** e, allo stesso tempo, ottenere un flusso continuo di approfondimenti sul prodotto.
|
|
275
|
+
|
|
276
|
+
Per me, questo progetto ha dimostrato che RAG non è solo un trucco tecnico. È un modo per trasformare la documentazione in:
|
|
277
|
+
|
|
278
|
+
- un sistema di supporto interattivo
|
|
279
|
+
- un canale di feedback
|
|
280
|
+
- uno strumento di strategia di prodotto
|
|
281
|
+
|
|
282
|
+
👉 [Prova la demo qui](https://intlayer.org/doc/why) 👉 [Controlla il modello di codice su GitHub](https://github.com/aymericzip/smart_doc_RAG)
|
|
283
|
+
|
|
284
|
+
E se anche tu stai sperimentando con RAG, mi piacerebbe sapere come lo stai usando.
|