@mytechtoday/augment-extensions 0.1.2 → 0.4.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/README.md +614 -39
- package/augment-extensions/coding-standards/bash/README.md +196 -0
- package/augment-extensions/coding-standards/bash/module.json +163 -0
- package/augment-extensions/coding-standards/bash/rules/naming-conventions.md +336 -0
- package/augment-extensions/coding-standards/bash/rules/universal-standards.md +289 -0
- package/augment-extensions/coding-standards/css/README.md +40 -0
- package/augment-extensions/coding-standards/css/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/css/module.json +44 -0
- package/augment-extensions/coding-standards/css/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/css/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html/README.md +40 -0
- package/augment-extensions/coding-standards/html/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html/module.json +44 -0
- package/augment-extensions/coding-standards/html/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/README.md +194 -0
- package/augment-extensions/coding-standards/html-css-js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/html-css-js/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/html-css-js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/html-css-js/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html-css-js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/html-css-js/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html-css-js/module.json +48 -0
- package/augment-extensions/coding-standards/html-css-js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html-css-js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/html-css-js/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/html-css-js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/html-css-js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/js/README.md +46 -0
- package/augment-extensions/coding-standards/js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/js/module.json +49 -0
- package/augment-extensions/coding-standards/js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/php/README.md +248 -0
- package/augment-extensions/coding-standards/php/examples/api-endpoint-example.php +204 -0
- package/augment-extensions/coding-standards/php/examples/cli-command-example.php +206 -0
- package/augment-extensions/coding-standards/php/examples/legacy-refactoring-example.php +234 -0
- package/augment-extensions/coding-standards/php/examples/web-application-example.php +211 -0
- package/augment-extensions/coding-standards/php/examples/woocommerce-extension-example.php +215 -0
- package/augment-extensions/coding-standards/php/examples/wordpress-plugin-example.php +189 -0
- package/augment-extensions/coding-standards/php/module.json +166 -0
- package/augment-extensions/coding-standards/php/rules/api-development.md +480 -0
- package/augment-extensions/coding-standards/php/rules/category-configuration.md +332 -0
- package/augment-extensions/coding-standards/php/rules/cli-tools.md +472 -0
- package/augment-extensions/coding-standards/php/rules/cms-integration.md +561 -0
- package/augment-extensions/coding-standards/php/rules/code-quality.md +402 -0
- package/augment-extensions/coding-standards/php/rules/documentation.md +425 -0
- package/augment-extensions/coding-standards/php/rules/ecommerce.md +627 -0
- package/augment-extensions/coding-standards/php/rules/error-handling.md +336 -0
- package/augment-extensions/coding-standards/php/rules/legacy-migration.md +677 -0
- package/augment-extensions/coding-standards/php/rules/naming-conventions.md +279 -0
- package/augment-extensions/coding-standards/php/rules/performance.md +392 -0
- package/augment-extensions/coding-standards/php/rules/psr-standards.md +186 -0
- package/augment-extensions/coding-standards/php/rules/security.md +358 -0
- package/augment-extensions/coding-standards/php/rules/testing.md +403 -0
- package/augment-extensions/coding-standards/php/rules/type-declarations.md +331 -0
- package/augment-extensions/coding-standards/php/rules/web-applications.md +426 -0
- package/augment-extensions/coding-standards/powershell/README.md +154 -0
- package/augment-extensions/coding-standards/powershell/examples/admin-example.ps1 +272 -0
- package/augment-extensions/coding-standards/powershell/examples/automation-example.ps1 +173 -0
- package/augment-extensions/coding-standards/powershell/examples/cloud-example.ps1 +243 -0
- package/augment-extensions/coding-standards/powershell/examples/cross-platform-example.ps1 +297 -0
- package/augment-extensions/coding-standards/powershell/examples/dsc-example.ps1 +224 -0
- package/augment-extensions/coding-standards/powershell/examples/legacy-migration-example.ps1 +340 -0
- package/augment-extensions/coding-standards/powershell/examples/module-example.psm1 +255 -0
- package/augment-extensions/coding-standards/powershell/module.json +165 -0
- package/augment-extensions/coding-standards/powershell/rules/administrative-tools.md +439 -0
- package/augment-extensions/coding-standards/powershell/rules/automation-scripts.md +240 -0
- package/augment-extensions/coding-standards/powershell/rules/cloud-orchestration.md +384 -0
- package/augment-extensions/coding-standards/powershell/rules/configuration-schema.md +383 -0
- package/augment-extensions/coding-standards/powershell/rules/cross-platform-scripts.md +482 -0
- package/augment-extensions/coding-standards/powershell/rules/dsc-configurations.md +296 -0
- package/augment-extensions/coding-standards/powershell/rules/error-handling.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/legacy-migrations.md +466 -0
- package/augment-extensions/coding-standards/powershell/rules/modules-functions.md +244 -0
- package/augment-extensions/coding-standards/powershell/rules/naming-conventions.md +266 -0
- package/augment-extensions/coding-standards/powershell/rules/performance-optimization.md +209 -0
- package/augment-extensions/coding-standards/powershell/rules/security-practices.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/testing-guidelines.md +268 -0
- package/augment-extensions/coding-standards/powershell/rules/universal-standards.md +197 -0
- package/augment-extensions/coding-standards/python/README.md +12 -8
- package/augment-extensions/coding-standards/python/examples/best-practices.py +373 -0
- package/augment-extensions/coding-standards/python/module.json +8 -4
- package/augment-extensions/coding-standards/python/rules/async-patterns.md +884 -0
- package/augment-extensions/coding-standards/python/rules/documentation.md +831 -0
- package/augment-extensions/coding-standards/python/rules/error-handling.md +855 -68
- package/augment-extensions/coding-standards/python/rules/testing.md +409 -0
- package/augment-extensions/coding-standards/python/rules/tooling.md +446 -0
- package/augment-extensions/coding-standards/python/rules/type-hints.md +115 -50
- package/augment-extensions/collections/html-css-js/README.md +82 -0
- package/augment-extensions/collections/html-css-js/collection.json +41 -0
- package/augment-extensions/domain-rules/database/README.md +161 -0
- package/augment-extensions/domain-rules/database/examples/flat-database-example.md +793 -0
- package/augment-extensions/domain-rules/database/examples/hybrid-database-example.md +1132 -0
- package/augment-extensions/domain-rules/database/examples/nosql-document-example.md +868 -0
- package/augment-extensions/domain-rules/database/examples/nosql-graph-example.md +805 -0
- package/augment-extensions/domain-rules/database/examples/relational-schema-example.md +621 -0
- package/augment-extensions/domain-rules/database/examples/vector-database-example.md +965 -0
- package/augment-extensions/domain-rules/database/module.json +28 -0
- package/augment-extensions/domain-rules/database/rules/flat-databases.md +624 -0
- package/augment-extensions/domain-rules/database/rules/nosql-databases.md +588 -0
- package/augment-extensions/domain-rules/database/rules/nosql-document-stores.md +856 -0
- package/augment-extensions/domain-rules/database/rules/nosql-graph-databases.md +778 -0
- package/augment-extensions/domain-rules/database/rules/nosql-key-value-stores.md +963 -0
- package/augment-extensions/domain-rules/database/rules/performance-optimization.md +1076 -0
- package/augment-extensions/domain-rules/database/rules/relational-databases.md +697 -0
- package/augment-extensions/domain-rules/database/rules/relational-indexing.md +671 -0
- package/augment-extensions/domain-rules/database/rules/relational-query-optimization.md +607 -0
- package/augment-extensions/domain-rules/database/rules/relational-schema-design.md +907 -0
- package/augment-extensions/domain-rules/database/rules/relational-transactions.md +783 -0
- package/augment-extensions/domain-rules/database/rules/security-standards.md +980 -0
- package/augment-extensions/domain-rules/database/rules/universal-best-practices.md +485 -0
- package/augment-extensions/domain-rules/database/rules/vector-databases.md +521 -0
- package/augment-extensions/domain-rules/database/rules/vector-embeddings.md +858 -0
- package/augment-extensions/domain-rules/database/rules/vector-indexing.md +934 -0
- package/augment-extensions/domain-rules/mcp/README.md +150 -0
- package/augment-extensions/domain-rules/mcp/examples/compressed-example.md +522 -0
- package/augment-extensions/domain-rules/mcp/examples/graph-augmented-example.md +520 -0
- package/augment-extensions/domain-rules/mcp/examples/hybrid-example.md +570 -0
- package/augment-extensions/domain-rules/mcp/examples/state-based-example.md +427 -0
- package/augment-extensions/domain-rules/mcp/examples/token-based-example.md +435 -0
- package/augment-extensions/domain-rules/mcp/examples/vector-based-example.md +502 -0
- package/augment-extensions/domain-rules/mcp/module.json +49 -0
- package/augment-extensions/domain-rules/mcp/rules/compressed-mcp.md +595 -0
- package/augment-extensions/domain-rules/mcp/rules/configuration.md +345 -0
- package/augment-extensions/domain-rules/mcp/rules/graph-augmented-mcp.md +687 -0
- package/augment-extensions/domain-rules/mcp/rules/hybrid-mcp.md +636 -0
- package/augment-extensions/domain-rules/mcp/rules/state-based-mcp.md +484 -0
- package/augment-extensions/domain-rules/mcp/rules/testing-validation.md +360 -0
- package/augment-extensions/domain-rules/mcp/rules/token-based-mcp.md +393 -0
- package/augment-extensions/domain-rules/mcp/rules/universal-rules.md +194 -0
- package/augment-extensions/domain-rules/mcp/rules/vector-based-mcp.md +625 -0
- package/augment-extensions/domain-rules/wordpress/README.md +163 -0
- package/augment-extensions/domain-rules/wordpress/module.json +32 -0
- package/augment-extensions/domain-rules/wordpress/rules/coding-standards.md +617 -0
- package/augment-extensions/domain-rules/wordpress/rules/directory-structure.md +270 -0
- package/augment-extensions/domain-rules/wordpress/rules/file-patterns.md +423 -0
- package/augment-extensions/domain-rules/wordpress/rules/gutenberg-blocks.md +493 -0
- package/augment-extensions/domain-rules/wordpress/rules/performance.md +568 -0
- package/augment-extensions/domain-rules/wordpress/rules/plugin-development.md +510 -0
- package/augment-extensions/domain-rules/wordpress/rules/project-detection.md +251 -0
- package/augment-extensions/domain-rules/wordpress/rules/rest-api.md +501 -0
- package/augment-extensions/domain-rules/wordpress/rules/security.md +564 -0
- package/augment-extensions/domain-rules/wordpress/rules/theme-development.md +388 -0
- package/augment-extensions/domain-rules/wordpress/rules/woocommerce.md +441 -0
- package/augment-extensions/domain-rules/wordpress-plugin/README.md +139 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/ajax-plugin.md +1599 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/custom-post-type-plugin.md +1727 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block-plugin.md +428 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block.md +422 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/mvc-plugin.md +1623 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/object-oriented-plugin.md +1343 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/rest-endpoint.md +734 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/settings-page-plugin.md +1350 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/simple-procedural-plugin.md +503 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/singleton-plugin.md +971 -0
- package/augment-extensions/domain-rules/wordpress-plugin/module.json +53 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/activation-hooks.md +770 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/admin-interface.md +874 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/ajax-handlers.md +629 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/asset-management.md +559 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/context-providers.md +709 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/cron-jobs.md +736 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/database-management.md +1057 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/documentation-standards.md +463 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/frontend-functionality.md +478 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/gutenberg-blocks.md +818 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/internationalization.md +416 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/migration.md +667 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/performance-optimization.md +878 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-architecture.md +693 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-structure.md +352 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/rest-api.md +818 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/scaffolding-workflow.md +624 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/security-best-practices.md +866 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing-patterns.md +1165 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing.md +414 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/vscode-integration.md +751 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/woocommerce-integration.md +949 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/wordpress-org-submission.md +458 -0
- package/augment-extensions/examples/gutenberg-block-plugin/README.md +101 -0
- package/augment-extensions/examples/gutenberg-block-plugin/examples/testimonial-block.md +428 -0
- package/augment-extensions/examples/gutenberg-block-plugin/module.json +40 -0
- package/augment-extensions/examples/rest-api-plugin/README.md +98 -0
- package/augment-extensions/examples/rest-api-plugin/examples/task-manager-api.md +1299 -0
- package/augment-extensions/examples/rest-api-plugin/module.json +40 -0
- package/augment-extensions/examples/woocommerce-extension/README.md +98 -0
- package/augment-extensions/examples/woocommerce-extension/examples/product-customizer.md +763 -0
- package/augment-extensions/examples/woocommerce-extension/module.json +40 -0
- package/augment-extensions/workflows/beads/module.json +4 -3
- package/augment-extensions/workflows/database/README.md +195 -0
- package/augment-extensions/workflows/database/ai-prompt-testing.md +295 -0
- package/augment-extensions/workflows/database/examples/migration-example.md +498 -0
- package/augment-extensions/workflows/database/examples/optimization-example.md +496 -0
- package/augment-extensions/workflows/database/examples/schema-design-example.md +444 -0
- package/augment-extensions/workflows/database/module.json +42 -0
- package/augment-extensions/workflows/database/rules/data-migration.md +249 -0
- package/augment-extensions/workflows/database/rules/documentation-standards.md +339 -0
- package/augment-extensions/workflows/database/rules/migration-workflow.md +352 -0
- package/augment-extensions/workflows/database/rules/optimization-workflow.md +435 -0
- package/augment-extensions/workflows/database/rules/schema-design-workflow.md +535 -0
- package/augment-extensions/workflows/database/rules/testing-patterns.md +305 -0
- package/augment-extensions/workflows/database/rules/workflow.md +458 -0
- package/augment-extensions/workflows/openspec/module.json +4 -3
- package/augment-extensions/workflows/wordpress-plugin/README.md +232 -0
- package/augment-extensions/workflows/wordpress-plugin/ai-prompts.md +839 -0
- package/augment-extensions/workflows/wordpress-plugin/bead-decomposition-patterns.md +854 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/complete-plugin-example.md +540 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/custom-post-type-example.md +1083 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/feature-addition-workflow.md +669 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/plugin-creation-workflow.md +597 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/secure-form-handler-example.md +925 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/security-audit-workflow.md +752 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/wordpress-org-submission-workflow.md +773 -0
- package/augment-extensions/workflows/wordpress-plugin/module.json +49 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/best-practices.md +942 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/development-workflow.md +702 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/submission-workflow.md +728 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/testing-workflow.md +775 -0
- package/augment-extensions/writing-standards/screenplay/README.md +171 -0
- package/augment-extensions/writing-standards/screenplay/examples/aaa-hollywood-scene.fountain +164 -0
- package/augment-extensions/writing-standards/screenplay/module.json +124 -0
- package/augment-extensions/writing-standards/screenplay/rules/universal-formatting.md +339 -0
- package/cli/MODULES.md +302 -0
- package/cli/dist/cli.js +142 -9
- package/cli/dist/cli.js.map +1 -1
- package/cli/dist/commands/catalog.d.ts +13 -0
- package/cli/dist/commands/catalog.d.ts.map +1 -0
- package/cli/dist/commands/catalog.js +104 -0
- package/cli/dist/commands/catalog.js.map +1 -0
- package/cli/dist/commands/gui.d.ts +6 -0
- package/cli/dist/commands/gui.d.ts.map +1 -0
- package/cli/dist/commands/gui.js +211 -0
- package/cli/dist/commands/gui.js.map +1 -0
- package/cli/dist/commands/init.d.ts.map +1 -1
- package/cli/dist/commands/init.js +12 -0
- package/cli/dist/commands/init.js.map +1 -1
- package/cli/dist/commands/install-rules.d.ts +14 -0
- package/cli/dist/commands/install-rules.d.ts.map +1 -0
- package/cli/dist/commands/install-rules.js +127 -0
- package/cli/dist/commands/install-rules.js.map +1 -0
- package/cli/dist/commands/link.d.ts.map +1 -1
- package/cli/dist/commands/link.js +9 -11
- package/cli/dist/commands/link.js.map +1 -1
- package/cli/dist/commands/list.d.ts.map +1 -1
- package/cli/dist/commands/list.js +11 -28
- package/cli/dist/commands/list.js.map +1 -1
- package/cli/dist/commands/mcp.d.ts +48 -0
- package/cli/dist/commands/mcp.d.ts.map +1 -0
- package/cli/dist/commands/mcp.js +229 -0
- package/cli/dist/commands/mcp.js.map +1 -0
- package/cli/dist/commands/self-remove.d.ts +7 -0
- package/cli/dist/commands/self-remove.d.ts.map +1 -0
- package/cli/dist/commands/self-remove.js +179 -0
- package/cli/dist/commands/self-remove.js.map +1 -0
- package/cli/dist/commands/show.d.ts.map +1 -1
- package/cli/dist/commands/show.js +42 -71
- package/cli/dist/commands/show.js.map +1 -1
- package/cli/dist/commands/skill.d.ts +67 -0
- package/cli/dist/commands/skill.d.ts.map +1 -0
- package/cli/dist/commands/skill.js +513 -0
- package/cli/dist/commands/skill.js.map +1 -0
- package/cli/dist/commands/unlink.d.ts +6 -0
- package/cli/dist/commands/unlink.d.ts.map +1 -0
- package/cli/dist/commands/unlink.js +115 -0
- package/cli/dist/commands/unlink.js.map +1 -0
- package/cli/dist/commands/validate.d.ts +6 -0
- package/cli/dist/commands/validate.d.ts.map +1 -0
- package/cli/dist/commands/validate.js +159 -0
- package/cli/dist/commands/validate.js.map +1 -0
- package/cli/dist/utils/catalog-sync.d.ts +22 -0
- package/cli/dist/utils/catalog-sync.d.ts.map +1 -0
- package/cli/dist/utils/catalog-sync.js +157 -0
- package/cli/dist/utils/catalog-sync.js.map +1 -0
- package/cli/dist/utils/character-count.d.ts +56 -0
- package/cli/dist/utils/character-count.d.ts.map +1 -0
- package/cli/dist/utils/character-count.js +190 -0
- package/cli/dist/utils/character-count.js.map +1 -0
- package/cli/dist/utils/documentation-validator.d.ts +18 -0
- package/cli/dist/utils/documentation-validator.d.ts.map +1 -0
- package/cli/dist/utils/documentation-validator.js +233 -0
- package/cli/dist/utils/documentation-validator.js.map +1 -0
- package/cli/dist/utils/install-rules.d.ts +32 -0
- package/cli/dist/utils/install-rules.d.ts.map +1 -0
- package/cli/dist/utils/install-rules.js +375 -0
- package/cli/dist/utils/install-rules.js.map +1 -0
- package/cli/dist/utils/mcp-integration.d.ts +70 -0
- package/cli/dist/utils/mcp-integration.d.ts.map +1 -0
- package/cli/dist/utils/mcp-integration.js +292 -0
- package/cli/dist/utils/mcp-integration.js.map +1 -0
- package/cli/dist/utils/module-system.d.ts +153 -0
- package/cli/dist/utils/module-system.d.ts.map +1 -0
- package/cli/dist/utils/module-system.js +528 -0
- package/cli/dist/utils/module-system.js.map +1 -0
- package/cli/dist/utils/modules-catalog.d.ts +33 -0
- package/cli/dist/utils/modules-catalog.d.ts.map +1 -0
- package/cli/dist/utils/modules-catalog.js +163 -0
- package/cli/dist/utils/modules-catalog.js.map +1 -0
- package/cli/dist/utils/rule-install-hooks.d.ts +19 -0
- package/cli/dist/utils/rule-install-hooks.d.ts.map +1 -0
- package/cli/dist/utils/rule-install-hooks.js +224 -0
- package/cli/dist/utils/rule-install-hooks.js.map +1 -0
- package/cli/dist/utils/skill-system.d.ts +95 -0
- package/cli/dist/utils/skill-system.d.ts.map +1 -0
- package/cli/dist/utils/skill-system.js +313 -0
- package/cli/dist/utils/skill-system.js.map +1 -0
- package/modules.md +534 -70
- package/package.json +12 -3
|
@@ -0,0 +1,934 @@
|
|
|
1
|
+
# Vector Indexing
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This document covers vector indexing fundamentals, including index types (HNSW, IVF, Flat, LSH), index parameters (ef_construction, M, nlist, nprobe), index selection criteria, index building strategies, index maintenance, performance tuning, and accuracy vs speed tradeoffs.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## What is Vector Indexing?
|
|
10
|
+
|
|
11
|
+
### Definition
|
|
12
|
+
|
|
13
|
+
**Vector Index**: Data structure optimized for fast similarity search in high-dimensional vector spaces
|
|
14
|
+
|
|
15
|
+
**Key Concepts:**
|
|
16
|
+
- Enables fast approximate nearest neighbor (ANN) search
|
|
17
|
+
- Trade-off between accuracy and speed
|
|
18
|
+
- Different index types for different use cases
|
|
19
|
+
- Critical for large-scale vector databases (>100k vectors)
|
|
20
|
+
|
|
21
|
+
**Why Indexing Matters:**
|
|
22
|
+
- **Without index**: Linear scan (O(n)) - slow for large datasets
|
|
23
|
+
- **With index**: Sublinear search (O(log n) or better) - fast even for billions of vectors
|
|
24
|
+
|
|
25
|
+
**Example:**
|
|
26
|
+
```
|
|
27
|
+
Dataset: 1 million vectors (1536 dimensions)
|
|
28
|
+
Linear scan: ~1000ms per query
|
|
29
|
+
HNSW index: ~10ms per query (100x faster!)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Index Types
|
|
35
|
+
|
|
36
|
+
### 1. HNSW (Hierarchical Navigable Small World)
|
|
37
|
+
|
|
38
|
+
**Overview:**
|
|
39
|
+
- Graph-based index
|
|
40
|
+
- Best accuracy/speed trade-off
|
|
41
|
+
- Most popular for production systems
|
|
42
|
+
- Used by: Pinecone, Weaviate, Qdrant, Milvus
|
|
43
|
+
|
|
44
|
+
**How it works:**
|
|
45
|
+
- Builds multi-layer graph of vectors
|
|
46
|
+
- Each layer has different connectivity
|
|
47
|
+
- Search starts at top layer, navigates down
|
|
48
|
+
- Finds approximate nearest neighbors efficiently
|
|
49
|
+
|
|
50
|
+
**Pros:**
|
|
51
|
+
- ✅ Excellent accuracy (>95% recall)
|
|
52
|
+
- ✅ Fast search (milliseconds)
|
|
53
|
+
- ✅ Good for high-dimensional data
|
|
54
|
+
- ✅ Incremental updates supported
|
|
55
|
+
|
|
56
|
+
**Cons:**
|
|
57
|
+
- ❌ High memory usage (stores full graph)
|
|
58
|
+
- ❌ Slower index building
|
|
59
|
+
- ❌ Not ideal for very large datasets (>100M vectors)
|
|
60
|
+
|
|
61
|
+
**Best for:**
|
|
62
|
+
- Production applications
|
|
63
|
+
- High accuracy requirements
|
|
64
|
+
- Real-time search
|
|
65
|
+
- Datasets < 100M vectors
|
|
66
|
+
|
|
67
|
+
**Key Parameters:**
|
|
68
|
+
- `M`: Number of connections per node (16-64)
|
|
69
|
+
- `ef_construction`: Search depth during index building (100-500)
|
|
70
|
+
- `ef_search`: Search depth during querying (50-500)
|
|
71
|
+
|
|
72
|
+
### 2. IVF (Inverted File Index)
|
|
73
|
+
|
|
74
|
+
**Overview:**
|
|
75
|
+
- Clustering-based index
|
|
76
|
+
- Partitions vectors into clusters
|
|
77
|
+
- Searches only relevant clusters
|
|
78
|
+
- Used by: Milvus, Faiss
|
|
79
|
+
|
|
80
|
+
**How it works:**
|
|
81
|
+
- Cluster vectors using k-means
|
|
82
|
+
- Create inverted index mapping clusters to vectors
|
|
83
|
+
- Search: find nearest clusters, search within clusters
|
|
84
|
+
- Trade accuracy for speed (fewer clusters searched)
|
|
85
|
+
|
|
86
|
+
**Pros:**
|
|
87
|
+
- ✅ Lower memory usage than HNSW
|
|
88
|
+
- ✅ Faster search for very large datasets
|
|
89
|
+
- ✅ Scalable to billions of vectors
|
|
90
|
+
- ✅ Good for distributed systems
|
|
91
|
+
|
|
92
|
+
**Cons:**
|
|
93
|
+
- ❌ Lower accuracy than HNSW (80-90% recall)
|
|
94
|
+
- ❌ Requires full rebuild for updates
|
|
95
|
+
- ❌ Sensitive to cluster quality
|
|
96
|
+
- ❌ Slower for small datasets
|
|
97
|
+
|
|
98
|
+
**Best for:**
|
|
99
|
+
- Very large datasets (>100M vectors)
|
|
100
|
+
- Distributed systems
|
|
101
|
+
- Batch processing
|
|
102
|
+
- Lower accuracy tolerance
|
|
103
|
+
|
|
104
|
+
**Key Parameters:**
|
|
105
|
+
- `nlist`: Number of clusters (sqrt(n) to 4*sqrt(n))
|
|
106
|
+
- `nprobe`: Number of clusters to search (1-nlist)
|
|
107
|
+
|
|
108
|
+
### 3. Flat (Exact Search)
|
|
109
|
+
|
|
110
|
+
**Overview:**
|
|
111
|
+
- No index, linear scan
|
|
112
|
+
- Exact nearest neighbor search
|
|
113
|
+
- Baseline for accuracy comparison
|
|
114
|
+
|
|
115
|
+
**How it works:**
|
|
116
|
+
- Compare query vector to every vector in database
|
|
117
|
+
- Return k most similar vectors
|
|
118
|
+
- Guaranteed exact results
|
|
119
|
+
|
|
120
|
+
**Pros:**
|
|
121
|
+
- ✅ 100% accuracy (exact search)
|
|
122
|
+
- ✅ No index building time
|
|
123
|
+
- ✅ No memory overhead
|
|
124
|
+
- ✅ Simple implementation
|
|
125
|
+
|
|
126
|
+
**Cons:**
|
|
127
|
+
- ❌ Very slow for large datasets (O(n))
|
|
128
|
+
- ❌ Not scalable
|
|
129
|
+
- ❌ High query latency
|
|
130
|
+
|
|
131
|
+
**Best for:**
|
|
132
|
+
- Small datasets (<10k vectors)
|
|
133
|
+
- Accuracy benchmarking
|
|
134
|
+
- Development/testing
|
|
135
|
+
- When exact results are critical
|
|
136
|
+
|
|
137
|
+
**Key Parameters:**
|
|
138
|
+
- None (no index)
|
|
139
|
+
|
|
140
|
+
### 4. LSH (Locality-Sensitive Hashing)
|
|
141
|
+
|
|
142
|
+
**Overview:**
|
|
143
|
+
- Hash-based index
|
|
144
|
+
- Maps similar vectors to same hash buckets
|
|
145
|
+
- Probabilistic search
|
|
146
|
+
|
|
147
|
+
**How it works:**
|
|
148
|
+
- Hash vectors using LSH functions
|
|
149
|
+
- Similar vectors hash to same buckets
|
|
150
|
+
- Search: hash query, search matching buckets
|
|
151
|
+
- Trade accuracy for speed
|
|
152
|
+
|
|
153
|
+
**Pros:**
|
|
154
|
+
- ✅ Very fast search
|
|
155
|
+
- ✅ Low memory usage
|
|
156
|
+
- ✅ Good for very high dimensions
|
|
157
|
+
- ✅ Supports streaming updates
|
|
158
|
+
|
|
159
|
+
**Cons:**
|
|
160
|
+
- ❌ Lower accuracy (70-85% recall)
|
|
161
|
+
- ❌ Requires careful tuning
|
|
162
|
+
- ❌ Sensitive to hash function choice
|
|
163
|
+
- ❌ Less popular (fewer implementations)
|
|
164
|
+
|
|
165
|
+
**Best for:**
|
|
166
|
+
- Very high-dimensional data (>2000 dimensions)
|
|
167
|
+
- Streaming data
|
|
168
|
+
- Extreme speed requirements
|
|
169
|
+
- Lower accuracy tolerance
|
|
170
|
+
|
|
171
|
+
**Key Parameters:**
|
|
172
|
+
- `num_tables`: Number of hash tables (10-50)
|
|
173
|
+
- `num_bits`: Hash size (8-32 bits)
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Index Selection Criteria
|
|
178
|
+
|
|
179
|
+
### Decision Matrix
|
|
180
|
+
|
|
181
|
+
| Dataset Size | Accuracy Need | Memory Budget | Recommended Index |
|
|
182
|
+
|--------------|---------------|---------------|-------------------|
|
|
183
|
+
| < 10k | Exact | Any | Flat |
|
|
184
|
+
| 10k - 1M | High (>95%) | High | HNSW |
|
|
185
|
+
| 1M - 100M | High (>95%) | High | HNSW |
|
|
186
|
+
| 100M+ | High (>95%) | Very High | HNSW (distributed) |
|
|
187
|
+
| 1M - 100M | Medium (85-95%) | Medium | IVF |
|
|
188
|
+
| 100M+ | Medium (85-95%) | Medium | IVF |
|
|
189
|
+
| Any | Low (<85%) | Low | LSH |
|
|
190
|
+
|
|
191
|
+
### Selection Guidelines
|
|
192
|
+
|
|
193
|
+
**Choose HNSW if:**
|
|
194
|
+
- You need high accuracy (>95% recall)
|
|
195
|
+
- Dataset < 100M vectors
|
|
196
|
+
- Memory is available
|
|
197
|
+
- Real-time search is critical
|
|
198
|
+
- **Most common choice for production**
|
|
199
|
+
|
|
200
|
+
**Choose IVF if:**
|
|
201
|
+
- Dataset > 100M vectors
|
|
202
|
+
- Memory is limited
|
|
203
|
+
- Batch processing is acceptable
|
|
204
|
+
- 85-95% accuracy is sufficient
|
|
205
|
+
- Distributed system is available
|
|
206
|
+
|
|
207
|
+
**Choose Flat if:**
|
|
208
|
+
- Dataset < 10k vectors
|
|
209
|
+
- 100% accuracy is required
|
|
210
|
+
- Development/testing phase
|
|
211
|
+
- Benchmarking other indexes
|
|
212
|
+
|
|
213
|
+
**Choose LSH if:**
|
|
214
|
+
- Very high dimensions (>2000)
|
|
215
|
+
- Extreme speed is critical
|
|
216
|
+
- 70-85% accuracy is acceptable
|
|
217
|
+
- Streaming updates are needed
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## Index Parameters
|
|
222
|
+
|
|
223
|
+
### HNSW Parameters
|
|
224
|
+
|
|
225
|
+
**M (Number of Connections)**
|
|
226
|
+
- **Definition**: Number of bi-directional links per node in the graph
|
|
227
|
+
- **Range**: 4-64 (typical: 16-32)
|
|
228
|
+
- **Impact**:
|
|
229
|
+
- Higher M → Better accuracy, slower search, more memory
|
|
230
|
+
- Lower M → Faster search, less memory, lower accuracy
|
|
231
|
+
- **Recommendation**: 16 (balanced), 32 (high accuracy), 8 (low memory)
|
|
232
|
+
|
|
233
|
+
```python
|
|
234
|
+
# Pinecone
|
|
235
|
+
index = pinecone.Index("my-index")
|
|
236
|
+
index.configure_index(
|
|
237
|
+
pod_type="p1.x1",
|
|
238
|
+
replicas=1,
|
|
239
|
+
metadata_config={"indexed": ["category"]},
|
|
240
|
+
# M is set by pod type (typically 16)
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
# Qdrant
|
|
244
|
+
from qdrant_client import QdrantClient
|
|
245
|
+
from qdrant_client.models import VectorParams, Distance, HnswConfigDiff
|
|
246
|
+
|
|
247
|
+
client = QdrantClient("localhost", port=6333)
|
|
248
|
+
client.create_collection(
|
|
249
|
+
collection_name="my_collection",
|
|
250
|
+
vectors_config=VectorParams(size=1536, distance=Distance.COSINE),
|
|
251
|
+
hnsw_config=HnswConfigDiff(m=16) # Set M parameter
|
|
252
|
+
)
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
**ef_construction (Build-time Search Depth)**
|
|
256
|
+
- **Definition**: Size of dynamic candidate list during index construction
|
|
257
|
+
- **Range**: 100-500 (typical: 200)
|
|
258
|
+
- **Impact**:
|
|
259
|
+
- Higher ef_construction → Better index quality, slower building
|
|
260
|
+
- Lower ef_construction → Faster building, lower quality
|
|
261
|
+
- **Recommendation**: 200 (balanced), 400 (high quality), 100 (fast build)
|
|
262
|
+
|
|
263
|
+
```python
|
|
264
|
+
# Qdrant
|
|
265
|
+
client.create_collection(
|
|
266
|
+
collection_name="my_collection",
|
|
267
|
+
vectors_config=VectorParams(size=1536, distance=Distance.COSINE),
|
|
268
|
+
hnsw_config=HnswConfigDiff(
|
|
269
|
+
m=16,
|
|
270
|
+
ef_construct=200 # Build-time parameter
|
|
271
|
+
)
|
|
272
|
+
)
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
**ef_search (Query-time Search Depth)**
|
|
276
|
+
- **Definition**: Size of dynamic candidate list during search
|
|
277
|
+
- **Range**: 50-500 (typical: 100)
|
|
278
|
+
- **Impact**:
|
|
279
|
+
- Higher ef_search → Better accuracy, slower queries
|
|
280
|
+
- Lower ef_search → Faster queries, lower accuracy
|
|
281
|
+
- **Recommendation**: 100 (balanced), 200 (high accuracy), 50 (fast queries)
|
|
282
|
+
|
|
283
|
+
```python
|
|
284
|
+
# Qdrant
|
|
285
|
+
from qdrant_client.models import SearchParams
|
|
286
|
+
|
|
287
|
+
results = client.search(
|
|
288
|
+
collection_name="my_collection",
|
|
289
|
+
query_vector=[0.1, 0.2, ...],
|
|
290
|
+
limit=10,
|
|
291
|
+
search_params=SearchParams(hnsw_ef=100) # Query-time parameter
|
|
292
|
+
)
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### IVF Parameters
|
|
296
|
+
|
|
297
|
+
**nlist (Number of Clusters)**
|
|
298
|
+
- **Definition**: Number of clusters to partition vectors into
|
|
299
|
+
- **Range**: sqrt(n) to 4*sqrt(n) where n = number of vectors
|
|
300
|
+
- **Impact**:
|
|
301
|
+
- Higher nlist → More granular partitioning, slower search
|
|
302
|
+
- Lower nlist → Coarser partitioning, faster search
|
|
303
|
+
- **Recommendation**: sqrt(n) for small datasets, 4*sqrt(n) for large datasets
|
|
304
|
+
|
|
305
|
+
```python
|
|
306
|
+
# Faiss (used by Milvus)
|
|
307
|
+
import faiss
|
|
308
|
+
|
|
309
|
+
# For 1M vectors: nlist = sqrt(1,000,000) = 1000
|
|
310
|
+
nlist = 1000
|
|
311
|
+
quantizer = faiss.IndexFlatL2(dimension)
|
|
312
|
+
index = faiss.IndexIVFFlat(quantizer, dimension, nlist)
|
|
313
|
+
|
|
314
|
+
# Train index (required for IVF)
|
|
315
|
+
index.train(training_vectors)
|
|
316
|
+
index.add(vectors)
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
**nprobe (Number of Clusters to Search)**
|
|
320
|
+
- **Definition**: Number of nearest clusters to search during query
|
|
321
|
+
- **Range**: 1 to nlist (typical: 10-100)
|
|
322
|
+
- **Impact**:
|
|
323
|
+
- Higher nprobe → Better accuracy, slower search
|
|
324
|
+
- Lower nprobe → Faster search, lower accuracy
|
|
325
|
+
- **Recommendation**: 10 (fast), 50 (balanced), 100 (high accuracy)
|
|
326
|
+
|
|
327
|
+
```python
|
|
328
|
+
# Faiss
|
|
329
|
+
index.nprobe = 10 # Search 10 nearest clusters
|
|
330
|
+
|
|
331
|
+
# Search
|
|
332
|
+
distances, indices = index.search(query_vectors, k=10)
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### LSH Parameters
|
|
336
|
+
|
|
337
|
+
**num_tables (Number of Hash Tables)**
|
|
338
|
+
- **Definition**: Number of independent hash tables
|
|
339
|
+
- **Range**: 10-50 (typical: 20)
|
|
340
|
+
- **Impact**:
|
|
341
|
+
- More tables → Better accuracy, more memory
|
|
342
|
+
- Fewer tables → Less memory, lower accuracy
|
|
343
|
+
|
|
344
|
+
**num_bits (Hash Size)**
|
|
345
|
+
- **Definition**: Number of bits in hash code
|
|
346
|
+
- **Range**: 8-32 (typical: 16)
|
|
347
|
+
- **Impact**:
|
|
348
|
+
- More bits → More buckets, better precision
|
|
349
|
+
- Fewer bits → Fewer buckets, faster search
|
|
350
|
+
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
## Index Building Strategies
|
|
354
|
+
|
|
355
|
+
### Strategy 1: Batch Building
|
|
356
|
+
|
|
357
|
+
**When to use:**
|
|
358
|
+
- Initial index creation
|
|
359
|
+
- Full reindex
|
|
360
|
+
- Offline processing
|
|
361
|
+
|
|
362
|
+
**Process:**
|
|
363
|
+
```python
|
|
364
|
+
def batch_build_index(vectors, batch_size=10000):
|
|
365
|
+
"""Build index in batches"""
|
|
366
|
+
index = create_index()
|
|
367
|
+
|
|
368
|
+
for i in range(0, len(vectors), batch_size):
|
|
369
|
+
batch = vectors[i:i + batch_size]
|
|
370
|
+
index.add(batch)
|
|
371
|
+
|
|
372
|
+
return index
|
|
373
|
+
|
|
374
|
+
# Example with Pinecone
|
|
375
|
+
import pinecone
|
|
376
|
+
|
|
377
|
+
index = pinecone.Index("my-index")
|
|
378
|
+
|
|
379
|
+
# Batch upsert
|
|
380
|
+
batch_size = 100
|
|
381
|
+
for i in range(0, len(vectors), batch_size):
|
|
382
|
+
batch = vectors[i:i + batch_size]
|
|
383
|
+
index.upsert(vectors=batch)
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
**Pros:**
|
|
387
|
+
- Efficient for large datasets
|
|
388
|
+
- Better resource utilization
|
|
389
|
+
- Can parallelize batches
|
|
390
|
+
|
|
391
|
+
**Cons:**
|
|
392
|
+
- Requires all data upfront
|
|
393
|
+
- Longer initial build time
|
|
394
|
+
|
|
395
|
+
### Strategy 2: Incremental Building
|
|
396
|
+
|
|
397
|
+
**When to use:**
|
|
398
|
+
- Streaming data
|
|
399
|
+
- Real-time updates
|
|
400
|
+
- Continuous ingestion
|
|
401
|
+
|
|
402
|
+
**Process:**
|
|
403
|
+
```python
|
|
404
|
+
def incremental_add(index, new_vectors):
|
|
405
|
+
"""Add vectors incrementally"""
|
|
406
|
+
for vector in new_vectors:
|
|
407
|
+
index.add([vector])
|
|
408
|
+
return index
|
|
409
|
+
|
|
410
|
+
# Example with Qdrant
|
|
411
|
+
from qdrant_client import QdrantClient
|
|
412
|
+
from qdrant_client.models import PointStruct
|
|
413
|
+
|
|
414
|
+
client = QdrantClient("localhost", port=6333)
|
|
415
|
+
|
|
416
|
+
# Add vectors one at a time or in small batches
|
|
417
|
+
client.upsert(
|
|
418
|
+
collection_name="my_collection",
|
|
419
|
+
points=[
|
|
420
|
+
PointStruct(
|
|
421
|
+
id=1,
|
|
422
|
+
vector=[0.1, 0.2, ...],
|
|
423
|
+
payload={"text": "Document 1"}
|
|
424
|
+
)
|
|
425
|
+
]
|
|
426
|
+
)
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
**Pros:**
|
|
430
|
+
- No downtime
|
|
431
|
+
- Immediate availability
|
|
432
|
+
- Handles streaming data
|
|
433
|
+
|
|
434
|
+
**Cons:**
|
|
435
|
+
- Slower than batch building
|
|
436
|
+
- May degrade index quality over time
|
|
437
|
+
- Requires periodic optimization
|
|
438
|
+
|
|
439
|
+
### Strategy 3: Parallel Building
|
|
440
|
+
|
|
441
|
+
**When to use:**
|
|
442
|
+
- Very large datasets (>10M vectors)
|
|
443
|
+
- Distributed systems
|
|
444
|
+
- Time-critical builds
|
|
445
|
+
|
|
446
|
+
**Process:**
|
|
447
|
+
```python
|
|
448
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
449
|
+
|
|
450
|
+
def parallel_build_index(vectors, num_workers=4):
|
|
451
|
+
"""Build index in parallel"""
|
|
452
|
+
chunk_size = len(vectors) // num_workers
|
|
453
|
+
chunks = [vectors[i:i + chunk_size] for i in range(0, len(vectors), chunk_size)]
|
|
454
|
+
|
|
455
|
+
with ThreadPoolExecutor(max_workers=num_workers) as executor:
|
|
456
|
+
futures = [executor.submit(build_partial_index, chunk) for chunk in chunks]
|
|
457
|
+
partial_indexes = [f.result() for f in futures]
|
|
458
|
+
|
|
459
|
+
# Merge partial indexes
|
|
460
|
+
final_index = merge_indexes(partial_indexes)
|
|
461
|
+
return final_index
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
**Pros:**
|
|
465
|
+
- Fastest for large datasets
|
|
466
|
+
- Utilizes multiple cores/machines
|
|
467
|
+
- Scalable
|
|
468
|
+
|
|
469
|
+
**Cons:**
|
|
470
|
+
- More complex implementation
|
|
471
|
+
- Requires merge step
|
|
472
|
+
- Higher resource usage
|
|
473
|
+
|
|
474
|
+
---
|
|
475
|
+
|
|
476
|
+
## Index Maintenance
|
|
477
|
+
|
|
478
|
+
### When to Maintain Indexes
|
|
479
|
+
|
|
480
|
+
**Triggers for maintenance:**
|
|
481
|
+
- ✅ After large batch of updates (>10% of index size)
|
|
482
|
+
- ✅ Degraded query performance
|
|
483
|
+
- ✅ High memory usage
|
|
484
|
+
- ✅ Scheduled maintenance windows
|
|
485
|
+
- ✅ After deleting many vectors
|
|
486
|
+
|
|
487
|
+
### Maintenance Operations
|
|
488
|
+
|
|
489
|
+
**1. Index Optimization**
|
|
490
|
+
```python
|
|
491
|
+
# Qdrant
|
|
492
|
+
client.optimize(collection_name="my_collection")
|
|
493
|
+
|
|
494
|
+
# Weaviate (automatic, but can trigger manually)
|
|
495
|
+
client.schema.update_config(
|
|
496
|
+
class_name="Document",
|
|
497
|
+
config={"vectorIndexConfig": {"cleanupIntervalSeconds": 300}}
|
|
498
|
+
)
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
**2. Index Rebuilding**
|
|
502
|
+
```python
|
|
503
|
+
def rebuild_index(old_index, vectors):
|
|
504
|
+
"""Rebuild index from scratch"""
|
|
505
|
+
# Create new index
|
|
506
|
+
new_index = create_index()
|
|
507
|
+
|
|
508
|
+
# Add all vectors
|
|
509
|
+
new_index.add(vectors)
|
|
510
|
+
|
|
511
|
+
# Swap indexes (zero downtime)
|
|
512
|
+
swap_indexes(old_index, new_index)
|
|
513
|
+
|
|
514
|
+
# Delete old index
|
|
515
|
+
delete_index(old_index)
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
**3. Compaction**
|
|
519
|
+
```python
|
|
520
|
+
# Remove deleted vectors and optimize storage
|
|
521
|
+
# Qdrant
|
|
522
|
+
client.update_collection(
|
|
523
|
+
collection_name="my_collection",
|
|
524
|
+
optimizer_config={"deleted_threshold": 0.2} # Compact when 20% deleted
|
|
525
|
+
)
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
**4. Vacuuming**
|
|
529
|
+
```python
|
|
530
|
+
# Reclaim space from deleted vectors
|
|
531
|
+
# Similar to database VACUUM operation
|
|
532
|
+
def vacuum_index(index):
|
|
533
|
+
"""Remove deleted vectors and reclaim space"""
|
|
534
|
+
# Implementation depends on vector database
|
|
535
|
+
index.vacuum()
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
### Maintenance Best Practices
|
|
539
|
+
|
|
540
|
+
✅ **DO:**
|
|
541
|
+
- Schedule maintenance during low-traffic periods
|
|
542
|
+
- Monitor index health metrics
|
|
543
|
+
- Automate routine maintenance
|
|
544
|
+
- Test maintenance procedures
|
|
545
|
+
- Keep backups before major operations
|
|
546
|
+
|
|
547
|
+
❌ **DON'T:**
|
|
548
|
+
- Maintain during peak traffic
|
|
549
|
+
- Skip monitoring
|
|
550
|
+
- Manually trigger without testing
|
|
551
|
+
- Forget to backup
|
|
552
|
+
- Ignore performance degradation
|
|
553
|
+
|
|
554
|
+
---
|
|
555
|
+
|
|
556
|
+
## Performance Tuning
|
|
557
|
+
|
|
558
|
+
### Tuning for Accuracy
|
|
559
|
+
|
|
560
|
+
**Goal**: Maximize recall (find most similar vectors)
|
|
561
|
+
|
|
562
|
+
**HNSW Tuning:**
|
|
563
|
+
```python
|
|
564
|
+
# High accuracy configuration
|
|
565
|
+
hnsw_config = {
|
|
566
|
+
"m": 32, # More connections
|
|
567
|
+
"ef_construct": 400, # Better index quality
|
|
568
|
+
"ef_search": 200 # Deeper search
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
# Expected: 98-99% recall, ~50ms query latency
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
**IVF Tuning:**
|
|
575
|
+
```python
|
|
576
|
+
# High accuracy configuration
|
|
577
|
+
ivf_config = {
|
|
578
|
+
"nlist": 4 * sqrt(n), # More clusters
|
|
579
|
+
"nprobe": 100 # Search more clusters
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
# Expected: 90-95% recall, ~30ms query latency
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
### Tuning for Speed
|
|
586
|
+
|
|
587
|
+
**Goal**: Minimize query latency
|
|
588
|
+
|
|
589
|
+
**HNSW Tuning:**
|
|
590
|
+
```python
|
|
591
|
+
# High speed configuration
|
|
592
|
+
hnsw_config = {
|
|
593
|
+
"m": 8, # Fewer connections
|
|
594
|
+
"ef_construct": 100, # Faster building
|
|
595
|
+
"ef_search": 50 # Shallow search
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
# Expected: 90-95% recall, ~5ms query latency
|
|
599
|
+
```
|
|
600
|
+
|
|
601
|
+
**IVF Tuning:**
|
|
602
|
+
```python
|
|
603
|
+
# High speed configuration
|
|
604
|
+
ivf_config = {
|
|
605
|
+
"nlist": sqrt(n), # Fewer clusters
|
|
606
|
+
"nprobe": 10 # Search fewer clusters
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
# Expected: 80-85% recall, ~5ms query latency
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
### Tuning for Memory
|
|
613
|
+
|
|
614
|
+
**Goal**: Minimize memory usage
|
|
615
|
+
|
|
616
|
+
**Strategies:**
|
|
617
|
+
1. **Use IVF instead of HNSW** (lower memory footprint)
|
|
618
|
+
2. **Reduce M parameter** (fewer connections = less memory)
|
|
619
|
+
3. **Use quantization** (compress vectors)
|
|
620
|
+
4. **Use product quantization** (PQ) for very large datasets
|
|
621
|
+
|
|
622
|
+
```python
|
|
623
|
+
# Faiss with Product Quantization
|
|
624
|
+
import faiss
|
|
625
|
+
|
|
626
|
+
# Original: 1536 dimensions * 4 bytes = 6KB per vector
|
|
627
|
+
# PQ: 1536 dimensions → 64 bytes per vector (96x compression!)
|
|
628
|
+
|
|
629
|
+
dimension = 1536
|
|
630
|
+
m = 8 # Number of sub-quantizers
|
|
631
|
+
nbits = 8 # Bits per sub-quantizer
|
|
632
|
+
|
|
633
|
+
quantizer = faiss.IndexFlatL2(dimension)
|
|
634
|
+
index = faiss.IndexIVFPQ(quantizer, dimension, nlist=1000, m=m, nbits=nbits)
|
|
635
|
+
|
|
636
|
+
# Train and add vectors
|
|
637
|
+
index.train(training_vectors)
|
|
638
|
+
index.add(vectors)
|
|
639
|
+
```
|
|
640
|
+
|
|
641
|
+
### Tuning for Scale
|
|
642
|
+
|
|
643
|
+
**Goal**: Handle billions of vectors
|
|
644
|
+
|
|
645
|
+
**Strategies:**
|
|
646
|
+
1. **Use IVF with PQ** (memory efficient)
|
|
647
|
+
2. **Distribute across multiple nodes** (horizontal scaling)
|
|
648
|
+
3. **Use GPU acceleration** (faster search)
|
|
649
|
+
4. **Implement sharding** (partition data)
|
|
650
|
+
|
|
651
|
+
```python
|
|
652
|
+
# Distributed Milvus example
|
|
653
|
+
from pymilvus import connections, Collection
|
|
654
|
+
|
|
655
|
+
# Connect to Milvus cluster
|
|
656
|
+
connections.connect(host="milvus-cluster", port=19530)
|
|
657
|
+
|
|
658
|
+
# Create collection with sharding
|
|
659
|
+
collection = Collection(
|
|
660
|
+
name="large_collection",
|
|
661
|
+
schema=schema,
|
|
662
|
+
shards_num=4 # Distribute across 4 shards
|
|
663
|
+
)
|
|
664
|
+
```
|
|
665
|
+
|
|
666
|
+
---
|
|
667
|
+
|
|
668
|
+
## Accuracy vs Speed Tradeoffs
|
|
669
|
+
|
|
670
|
+
### Understanding the Tradeoff
|
|
671
|
+
|
|
672
|
+
**Key Insight**: You can't have perfect accuracy AND maximum speed
|
|
673
|
+
|
|
674
|
+
**Tradeoff Spectrum:**
|
|
675
|
+
```
|
|
676
|
+
Flat Index HNSW (high params) HNSW (low params) IVF (low nprobe)
|
|
677
|
+
| | | |
|
|
678
|
+
100% accuracy 98% accuracy 92% accuracy 80% accuracy
|
|
679
|
+
Slowest Slow Fast Fastest
|
|
680
|
+
```
|
|
681
|
+
|
|
682
|
+
### Measuring Accuracy
|
|
683
|
+
|
|
684
|
+
**Recall**: Percentage of true nearest neighbors found
|
|
685
|
+
|
|
686
|
+
```python
|
|
687
|
+
def measure_recall(index, query_vectors, ground_truth, k=10):
|
|
688
|
+
"""Measure index recall"""
|
|
689
|
+
total_recall = 0
|
|
690
|
+
|
|
691
|
+
for i, query in enumerate(query_vectors):
|
|
692
|
+
# Get results from index
|
|
693
|
+
results = index.search(query, k=k)
|
|
694
|
+
result_ids = set([r.id for r in results])
|
|
695
|
+
|
|
696
|
+
# Compare to ground truth
|
|
697
|
+
true_ids = set(ground_truth[i][:k])
|
|
698
|
+
|
|
699
|
+
# Calculate recall
|
|
700
|
+
recall = len(result_ids & true_ids) / k
|
|
701
|
+
total_recall += recall
|
|
702
|
+
|
|
703
|
+
return total_recall / len(query_vectors)
|
|
704
|
+
|
|
705
|
+
# Example
|
|
706
|
+
recall = measure_recall(index, test_queries, ground_truth, k=10)
|
|
707
|
+
print(f"Recall@10: {recall:.2%}") # e.g., "Recall@10: 95.50%"
|
|
708
|
+
```
|
|
709
|
+
|
|
710
|
+
### Measuring Speed
|
|
711
|
+
|
|
712
|
+
**Query Latency**: Time to execute a single query
|
|
713
|
+
|
|
714
|
+
```python
|
|
715
|
+
import time
|
|
716
|
+
|
|
717
|
+
def measure_latency(index, query_vectors, k=10):
|
|
718
|
+
"""Measure average query latency"""
|
|
719
|
+
latencies = []
|
|
720
|
+
|
|
721
|
+
for query in query_vectors:
|
|
722
|
+
start = time.time()
|
|
723
|
+
results = index.search(query, k=k)
|
|
724
|
+
latency = (time.time() - start) * 1000 # Convert to ms
|
|
725
|
+
latencies.append(latency)
|
|
726
|
+
|
|
727
|
+
return {
|
|
728
|
+
"mean": sum(latencies) / len(latencies),
|
|
729
|
+
"p50": sorted(latencies)[len(latencies) // 2],
|
|
730
|
+
"p95": sorted(latencies)[int(len(latencies) * 0.95)],
|
|
731
|
+
"p99": sorted(latencies)[int(len(latencies) * 0.99)]
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
# Example
|
|
735
|
+
latency = measure_latency(index, test_queries, k=10)
|
|
736
|
+
print(f"Mean latency: {latency['mean']:.2f}ms")
|
|
737
|
+
print(f"P95 latency: {latency['p95']:.2f}ms")
|
|
738
|
+
```
|
|
739
|
+
|
|
740
|
+
### Choosing the Right Balance
|
|
741
|
+
|
|
742
|
+
**Use Case: Semantic Search (User-Facing)**
|
|
743
|
+
- **Target**: 95%+ recall, <50ms latency
|
|
744
|
+
- **Index**: HNSW with M=16, ef_search=100
|
|
745
|
+
- **Rationale**: Users expect accurate results, 50ms is acceptable
|
|
746
|
+
|
|
747
|
+
**Use Case: RAG (LLM Context Retrieval)**
|
|
748
|
+
- **Target**: 90%+ recall, <20ms latency
|
|
749
|
+
- **Index**: HNSW with M=16, ef_search=50
|
|
750
|
+
- **Rationale**: LLM can handle slightly less accurate context, speed matters
|
|
751
|
+
|
|
752
|
+
**Use Case: Recommendation Engine (Batch)**
|
|
753
|
+
- **Target**: 85%+ recall, <100ms latency
|
|
754
|
+
- **Index**: IVF with nprobe=50
|
|
755
|
+
- **Rationale**: Batch processing, accuracy less critical, cost optimization
|
|
756
|
+
|
|
757
|
+
**Use Case: Real-Time Anomaly Detection**
|
|
758
|
+
- **Target**: 80%+ recall, <5ms latency
|
|
759
|
+
- **Index**: IVF with nprobe=10 or LSH
|
|
760
|
+
- **Rationale**: Speed is critical, false negatives acceptable
|
|
761
|
+
|
|
762
|
+
### Benchmarking Example
|
|
763
|
+
|
|
764
|
+
```python
|
|
765
|
+
def benchmark_index_configs(vectors, queries, ground_truth):
|
|
766
|
+
"""Benchmark different index configurations"""
|
|
767
|
+
configs = [
|
|
768
|
+
{"name": "High Accuracy", "m": 32, "ef_search": 200},
|
|
769
|
+
{"name": "Balanced", "m": 16, "ef_search": 100},
|
|
770
|
+
{"name": "High Speed", "m": 8, "ef_search": 50}
|
|
771
|
+
]
|
|
772
|
+
|
|
773
|
+
results = []
|
|
774
|
+
|
|
775
|
+
for config in configs:
|
|
776
|
+
# Build index
|
|
777
|
+
index = build_hnsw_index(vectors, m=config["m"])
|
|
778
|
+
|
|
779
|
+
# Measure recall
|
|
780
|
+
recall = measure_recall(index, queries, ground_truth, k=10)
|
|
781
|
+
|
|
782
|
+
# Measure latency
|
|
783
|
+
latency = measure_latency(index, queries, k=10)
|
|
784
|
+
|
|
785
|
+
results.append({
|
|
786
|
+
"config": config["name"],
|
|
787
|
+
"recall": recall,
|
|
788
|
+
"latency_p95": latency["p95"]
|
|
789
|
+
})
|
|
790
|
+
|
|
791
|
+
return results
|
|
792
|
+
|
|
793
|
+
# Example output:
|
|
794
|
+
# [
|
|
795
|
+
# {"config": "High Accuracy", "recall": 0.98, "latency_p95": 45.2},
|
|
796
|
+
# {"config": "Balanced", "recall": 0.95, "latency_p95": 12.5},
|
|
797
|
+
# {"config": "High Speed", "recall": 0.90, "latency_p95": 5.1}
|
|
798
|
+
# ]
|
|
799
|
+
```
|
|
800
|
+
|
|
801
|
+
---
|
|
802
|
+
|
|
803
|
+
## Best Practices
|
|
804
|
+
|
|
805
|
+
### 1. Index Selection
|
|
806
|
+
|
|
807
|
+
✅ **DO:**
|
|
808
|
+
- Use HNSW for most production use cases
|
|
809
|
+
- Use IVF for very large datasets (>100M vectors)
|
|
810
|
+
- Use Flat for small datasets (<10k vectors)
|
|
811
|
+
- Benchmark on your data before choosing
|
|
812
|
+
|
|
813
|
+
❌ **DON'T:**
|
|
814
|
+
- Use Flat for large datasets
|
|
815
|
+
- Choose index based on popularity alone
|
|
816
|
+
- Skip benchmarking
|
|
817
|
+
- Ignore memory constraints
|
|
818
|
+
|
|
819
|
+
### 2. Parameter Tuning
|
|
820
|
+
|
|
821
|
+
✅ **DO:**
|
|
822
|
+
- Start with recommended defaults
|
|
823
|
+
- Tune based on accuracy/speed requirements
|
|
824
|
+
- Measure recall and latency
|
|
825
|
+
- Document parameter choices
|
|
826
|
+
|
|
827
|
+
❌ **DON'T:**
|
|
828
|
+
- Use random parameters
|
|
829
|
+
- Tune without measuring
|
|
830
|
+
- Ignore tradeoffs
|
|
831
|
+
- Skip documentation
|
|
832
|
+
|
|
833
|
+
### 3. Index Building
|
|
834
|
+
|
|
835
|
+
✅ **DO:**
|
|
836
|
+
- Batch build for initial index
|
|
837
|
+
- Use incremental updates for streaming data
|
|
838
|
+
- Parallelize for large datasets
|
|
839
|
+
- Monitor build progress
|
|
840
|
+
|
|
841
|
+
❌ **DON'T:**
|
|
842
|
+
- Build one vector at a time
|
|
843
|
+
- Skip batching
|
|
844
|
+
- Ignore build time
|
|
845
|
+
- Forget to monitor
|
|
846
|
+
|
|
847
|
+
### 4. Index Maintenance
|
|
848
|
+
|
|
849
|
+
✅ **DO:**
|
|
850
|
+
- Schedule regular maintenance
|
|
851
|
+
- Monitor index health
|
|
852
|
+
- Rebuild when performance degrades
|
|
853
|
+
- Keep backups
|
|
854
|
+
|
|
855
|
+
❌ **DON'T:**
|
|
856
|
+
- Skip maintenance
|
|
857
|
+
- Ignore performance degradation
|
|
858
|
+
- Maintain during peak traffic
|
|
859
|
+
- Forget backups
|
|
860
|
+
|
|
861
|
+
### 5. Performance Optimization
|
|
862
|
+
|
|
863
|
+
✅ **DO:**
|
|
864
|
+
- Measure before optimizing
|
|
865
|
+
- Tune for your use case
|
|
866
|
+
- Balance accuracy and speed
|
|
867
|
+
- Monitor production metrics
|
|
868
|
+
|
|
869
|
+
❌ **DON'T:**
|
|
870
|
+
- Optimize prematurely
|
|
871
|
+
- Tune without measuring
|
|
872
|
+
- Ignore use case requirements
|
|
873
|
+
- Skip production monitoring
|
|
874
|
+
|
|
875
|
+
---
|
|
876
|
+
|
|
877
|
+
## Common Pitfalls
|
|
878
|
+
|
|
879
|
+
### 1. Wrong Index Type
|
|
880
|
+
|
|
881
|
+
**Problem**: Using Flat index for 1M vectors (very slow)
|
|
882
|
+
|
|
883
|
+
**Solution**: Use HNSW or IVF for large datasets
|
|
884
|
+
|
|
885
|
+
### 2. Poor Parameter Tuning
|
|
886
|
+
|
|
887
|
+
**Problem**: Using default parameters without tuning
|
|
888
|
+
|
|
889
|
+
**Solution**: Benchmark and tune for your use case
|
|
890
|
+
|
|
891
|
+
### 3. No Index Maintenance
|
|
892
|
+
|
|
893
|
+
**Problem**: Index performance degrades over time
|
|
894
|
+
|
|
895
|
+
**Solution**: Schedule regular maintenance and rebuilds
|
|
896
|
+
|
|
897
|
+
### 4. Ignoring Accuracy
|
|
898
|
+
|
|
899
|
+
**Problem**: Optimizing only for speed, poor results
|
|
900
|
+
|
|
901
|
+
**Solution**: Measure recall, balance accuracy and speed
|
|
902
|
+
|
|
903
|
+
### 5. Not Benchmarking
|
|
904
|
+
|
|
905
|
+
**Problem**: Choosing index/parameters without testing
|
|
906
|
+
|
|
907
|
+
**Solution**: Benchmark on representative data before production
|
|
908
|
+
|
|
909
|
+
---
|
|
910
|
+
|
|
911
|
+
## Summary
|
|
912
|
+
|
|
913
|
+
**Key Takeaways:**
|
|
914
|
+
1. HNSW is best for most production use cases (high accuracy, good speed)
|
|
915
|
+
2. IVF is best for very large datasets (>100M vectors, lower memory)
|
|
916
|
+
3. Tune parameters based on accuracy/speed requirements
|
|
917
|
+
4. Measure recall and latency to validate configuration
|
|
918
|
+
5. Maintain indexes regularly for optimal performance
|
|
919
|
+
6. Balance accuracy and speed based on use case
|
|
920
|
+
|
|
921
|
+
**Parameter Recommendations:**
|
|
922
|
+
- **HNSW (balanced)**: M=16, ef_construct=200, ef_search=100
|
|
923
|
+
- **HNSW (high accuracy)**: M=32, ef_construct=400, ef_search=200
|
|
924
|
+
- **HNSW (high speed)**: M=8, ef_construct=100, ef_search=50
|
|
925
|
+
- **IVF (balanced)**: nlist=sqrt(n), nprobe=50
|
|
926
|
+
- **IVF (high accuracy)**: nlist=4*sqrt(n), nprobe=100
|
|
927
|
+
- **IVF (high speed)**: nlist=sqrt(n), nprobe=10
|
|
928
|
+
|
|
929
|
+
**Next Steps:**
|
|
930
|
+
- See `vector-databases.md` for vector database fundamentals
|
|
931
|
+
- See `vector-embeddings.md` for embedding generation
|
|
932
|
+
- See `examples/vector-database-example.md` for complete implementation
|
|
933
|
+
|
|
934
|
+
|