diff --git a/package.json b/package.json index 8927fc13..7dfddaf2 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,8 @@ "@types/node": "^22.9.0", "prettier": "^3.4.2", "sharp": "^0.33.5", - "simple-git-hooks": "^2.11.1" + "simple-git-hooks": "^2.11.1", + "markdown-it-mathjax3": "^4.3.2" }, "simple-git-hooks": { "pre-commit": "pnpm run fmt" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 621f7aed..4e2bd1db 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,7 +31,7 @@ importers: version: 0.21.1(vite@5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(terser@5.39.0))(workbox-build@7.1.1)(workbox-window@7.3.0) vitepress: specifier: ^1.6.3 - version: 1.6.3(@algolia/client-search@5.20.0)(@types/node@22.13.10)(lightningcss@1.29.2)(postcss@8.4.49)(search-insights@2.15.0)(terser@5.39.0)(typescript@5.5.3) + version: 1.6.3(@algolia/client-search@5.20.0)(@types/node@22.13.10)(lightningcss@1.29.2)(markdown-it-mathjax3@4.3.2)(postcss@8.4.49)(search-insights@2.15.0)(terser@5.39.0)(typescript@5.5.3) vue: specifier: ^3.5.12 version: 3.5.13(typescript@5.5.3) @@ -48,6 +48,9 @@ importers: '@types/node': specifier: ^22.9.0 version: 22.13.10 + markdown-it-mathjax3: + specifier: ^4.3.2 + version: 4.3.2 prettier: specifier: ^3.4.2 version: 3.5.3 @@ -1681,6 +1684,10 @@ packages: resolution: {integrity: sha512-groO71Fvi5SWpxjI9Ia+chy0QBwT61mg6yxJV27f5YFf+Mw+STT75K6SHySpP8Co5LsCrtsbCH5dJZSRtkSKaQ==} engines: {node: '>= 14.0.0'} + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1857,6 +1864,13 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + cheerio-select@1.6.0: + resolution: {integrity: sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==} + + cheerio@1.0.0-rc.10: + resolution: {integrity: sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==} + engines: {node: '>= 6'} + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -1885,10 +1899,18 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} + commander@9.2.0: + resolution: {integrity: sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==} + engines: {node: ^12.20.0 || >=14} + commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} @@ -1918,6 +1940,13 @@ packages: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -2017,16 +2046,30 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + domhandler@3.3.0: + resolution: {integrity: sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==} + engines: {node: '>= 4'} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + domhandler@5.0.3: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + domutils@3.1.0: resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} @@ -2049,6 +2092,9 @@ packages: resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -2121,6 +2167,10 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-goat@3.0.0: + resolution: {integrity: sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==} + engines: {node: '>=10'} + escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -2288,6 +2338,10 @@ packages: engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + esm@3.2.25: + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} + espree@10.3.0: resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2571,6 +2625,12 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + htmlparser2@5.0.1: + resolution: {integrity: sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==} + + htmlparser2@6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + htmlparser2@8.0.2: resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} @@ -2912,6 +2972,11 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} + juice@8.1.0: + resolution: {integrity: sha512-FLzurJrx5Iv1e7CfBSZH68dC04EEvXvvVvPYB7Vx1WAuhCp1ZPIMtqxc+WTWxVkpTIC2Ach/GAv0rQbtGf6YMA==} + engines: {node: '>=10.0.0'} + hasBin: true + katex@0.16.11: resolution: {integrity: sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ==} hasBin: true @@ -3043,6 +3108,9 @@ packages: mark.js@8.11.1: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + markdown-it-mathjax3@4.3.2: + resolution: {integrity: sha512-TX3GW5NjmupgFtMJGRauioMbbkGsOXAAt1DZ/rzzYmTHqzkO1rNAdiMD4NiruurToPApn2kYy76x02QN26qr2w==} + markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} @@ -3050,6 +3118,9 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mathjax-full@3.2.2: + resolution: {integrity: sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w==} + mdast-util-directive@2.2.4: resolution: {integrity: sha512-sK3ojFP+jpj1n7Zo5ZKvoxP1MvLyzVG63+gm40Z/qI00avzdPCYxt7RBMgofwAva9gBjbDBWVRB/i+UD+fUCzQ==} @@ -3101,10 +3172,16 @@ packages: mdast-util-to-string@3.2.0: resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + mensch@0.3.4: + resolution: {integrity: sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + mhchemparser@4.2.1: + resolution: {integrity: sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==} + micromark-core-commonmark@1.1.0: resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} @@ -3220,6 +3297,11 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -3240,6 +3322,9 @@ packages: mitt@3.0.1: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + mj-context-menu@0.6.1: + resolution: {integrity: sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==} + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -3265,6 +3350,15 @@ packages: node-addon-api@3.2.1: resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + node-gyp-build@4.8.2: resolution: {integrity: sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==} hasBin: true @@ -3369,6 +3463,12 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parse5-htmlparser2-tree-adapter@6.0.1: + resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} + + parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -3708,6 +3808,9 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + slick@1.12.2: + resolution: {integrity: sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==} + smob@1.5.0: resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} @@ -3749,6 +3852,10 @@ packages: resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} engines: {node: '>=0.10.0'} + speech-rule-engine@4.0.7: + resolution: {integrity: sha512-sJrL3/wHzNwJRLBdf6CjJWIlxC04iYKkyXvYSVsWVOiC2DSkHmxsqOhEeMsBA9XK+CHuNcsdkbFDnoUfAsmp9g==} + hasBin: true + string.prototype.matchall@4.0.11: resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} engines: {node: '>= 0.4'} @@ -3856,6 +3963,9 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} @@ -4030,6 +4140,10 @@ packages: engines: {node: '>=8'} hasBin: true + valid-data-url@3.0.1: + resolution: {integrity: sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==} + engines: {node: '>=10'} + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -4114,9 +4228,19 @@ packages: typescript: optional: true + web-resource-inliner@6.0.1: + resolution: {integrity: sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A==} + engines: {node: '>=10.0.0'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} @@ -4152,6 +4276,9 @@ packages: engines: {node: '>= 8'} hasBin: true + wicked-good-xpath@1.3.0: + resolution: {integrity: sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==} + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -4222,6 +4349,10 @@ packages: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} + xmldom-sre@0.1.31: + resolution: {integrity: sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw==} + engines: {node: '>=0.1'} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -5975,6 +6106,8 @@ snapshots: '@algolia/requester-fetch': 5.20.0 '@algolia/requester-node-http': 5.20.0 + ansi-colors@4.1.3: {} + ansi-regex@5.0.1: {} ansi-styles@4.3.0: @@ -6187,6 +6320,24 @@ snapshots: character-reference-invalid@2.0.1: {} + cheerio-select@1.6.0: + dependencies: + css-select: 4.3.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + + cheerio@1.0.0-rc.10: + dependencies: + cheerio-select: 1.6.0 + dom-serializer: 1.4.1 + domhandler: 4.3.1 + htmlparser2: 6.1.0 + parse5: 6.0.1 + parse5-htmlparser2-tree-adapter: 6.0.1 + tslib: 2.8.1 + ci-info@3.9.0: {} clean-regexp@1.0.0: @@ -6213,8 +6364,12 @@ snapshots: commander@2.20.3: {} + commander@6.2.1: {} + commander@8.3.0: {} + commander@9.2.0: {} + commander@9.5.0: {} common-tags@1.8.2: {} @@ -6239,6 +6394,16 @@ snapshots: crypto-random-string@2.0.0: {} + css-select@4.3.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + css-what@6.1.0: {} + cssesc@3.0.0: {} csstype@3.1.3: {} @@ -6329,6 +6494,12 @@ snapshots: dependencies: esutils: 2.0.3 + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -6337,10 +6508,24 @@ snapshots: domelementtype@2.3.0: {} + domhandler@3.3.0: + dependencies: + domelementtype: 2.3.0 + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + domhandler@5.0.3: dependencies: domelementtype: 2.3.0 + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils@3.1.0: dependencies: dom-serializer: 2.0.0 @@ -6366,6 +6551,8 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.1 + entities@2.2.0: {} + entities@4.5.0: {} error-ex@1.3.2: @@ -6594,6 +6781,8 @@ snapshots: escalade@3.2.0: {} + escape-goat@3.0.0: {} + escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} @@ -6850,6 +7039,8 @@ snapshots: transitivePeerDependencies: - supports-color + esm@3.2.25: {} + espree@10.3.0: dependencies: acorn: 8.14.1 @@ -7160,6 +7351,20 @@ snapshots: html-void-elements@3.0.0: {} + htmlparser2@5.0.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 3.3.0 + domutils: 2.8.0 + entities: 2.2.0 + + htmlparser2@6.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 2.2.0 + htmlparser2@8.0.2: dependencies: domelementtype: 2.3.0 @@ -7490,6 +7695,16 @@ snapshots: object.assign: 4.1.5 object.values: 1.2.0 + juice@8.1.0: + dependencies: + cheerio: 1.0.0-rc.10 + commander: 6.2.1 + mensch: 0.3.4 + slick: 1.12.2 + web-resource-inliner: 6.0.1 + transitivePeerDependencies: + - encoding + katex@0.16.11: dependencies: commander: 8.3.0 @@ -7594,10 +7809,24 @@ snapshots: mark.js@8.11.1: {} + markdown-it-mathjax3@4.3.2: + dependencies: + juice: 8.1.0 + mathjax-full: 3.2.2 + transitivePeerDependencies: + - encoding + markdown-table@3.0.4: {} math-intrinsics@1.1.0: {} + mathjax-full@3.2.2: + dependencies: + esm: 3.2.25 + mhchemparser: 4.2.1 + mj-context-menu: 0.6.1 + speech-rule-engine: 4.0.7 + mdast-util-directive@2.2.4: dependencies: '@types/mdast': 3.0.15 @@ -7734,8 +7963,12 @@ snapshots: dependencies: '@types/mdast': 3.0.15 + mensch@0.3.4: {} + merge2@1.4.1: {} + mhchemparser@4.2.1: {} + micromark-core-commonmark@1.1.0: dependencies: decode-named-character-reference: 1.0.2 @@ -7983,6 +8216,8 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + mime@2.6.0: {} + min-indent@1.0.1: {} minimatch@3.1.2: @@ -7999,6 +8234,8 @@ snapshots: mitt@3.0.1: {} + mj-context-menu@0.6.1: {} + mri@1.2.0: {} ms@2.1.3: {} @@ -8018,6 +8255,10 @@ snapshots: node-addon-api@3.2.1: optional: true + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + node-gyp-build@4.8.2: optional: true @@ -8159,6 +8400,12 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parse5-htmlparser2-tree-adapter@6.0.1: + dependencies: + parse5: 6.0.1 + + parse5@6.0.1: {} + path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -8606,6 +8853,8 @@ snapshots: slash@3.0.0: {} + slick@1.12.2: {} + smob@1.5.0: {} source-map-js@1.2.1: {} @@ -8641,6 +8890,12 @@ snapshots: speakingurl@14.0.1: {} + speech-rule-engine@4.0.7: + dependencies: + commander: 9.2.0 + wicked-good-xpath: 1.3.0 + xmldom-sre: 0.1.31 + string.prototype.matchall@4.0.11: dependencies: call-bind: 1.0.7 @@ -8785,6 +9040,8 @@ snapshots: dependencies: is-number: 7.0.0 + tr46@0.0.3: {} + tr46@1.0.1: dependencies: punycode: 2.3.1 @@ -9005,6 +9262,8 @@ snapshots: kleur: 4.1.5 sade: 1.8.1 + valid-data-url@3.0.1: {} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 @@ -9054,7 +9313,7 @@ snapshots: lightningcss: 1.29.2 terser: 5.39.0 - vitepress@1.6.3(@algolia/client-search@5.20.0)(@types/node@22.13.10)(lightningcss@1.29.2)(postcss@8.4.49)(search-insights@2.15.0)(terser@5.39.0)(typescript@5.5.3): + vitepress@1.6.3(@algolia/client-search@5.20.0)(@types/node@22.13.10)(lightningcss@1.29.2)(markdown-it-mathjax3@4.3.2)(postcss@8.4.49)(search-insights@2.15.0)(terser@5.39.0)(typescript@5.5.3): dependencies: '@docsearch/css': 3.8.2 '@docsearch/js': 3.8.2(@algolia/client-search@5.20.0)(search-insights@2.15.0) @@ -9075,6 +9334,7 @@ snapshots: vite: 5.4.14(@types/node@22.13.10)(lightningcss@1.29.2)(terser@5.39.0) vue: 3.5.13(typescript@5.5.3) optionalDependencies: + markdown-it-mathjax3: 4.3.2 postcss: 8.4.49 transitivePeerDependencies: - '@algolia/client-search' @@ -9126,8 +9386,26 @@ snapshots: optionalDependencies: typescript: 5.5.3 + web-resource-inliner@6.0.1: + dependencies: + ansi-colors: 4.1.3 + escape-goat: 3.0.0 + htmlparser2: 5.0.1 + mime: 2.6.0 + node-fetch: 2.7.0 + valid-data-url: 3.0.1 + transitivePeerDependencies: + - encoding + + webidl-conversions@3.0.1: {} + webidl-conversions@4.0.2: {} + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 @@ -9210,6 +9488,8 @@ snapshots: dependencies: isexe: 2.0.0 + wicked-good-xpath@1.3.0: {} + word-wrap@1.2.5: {} workbox-background-sync@7.1.0: @@ -9340,6 +9620,8 @@ snapshots: xml-name-validator@4.0.0: {} + xmldom-sre@0.1.31: {} + yallist@3.1.1: {} yaml-eslint-parser@1.2.3: diff --git a/src/.vitepress/config.ts b/src/.vitepress/config.ts index 674edf6f..e6578d43 100644 --- a/src/.vitepress/config.ts +++ b/src/.vitepress/config.ts @@ -2,6 +2,7 @@ import { defineConfigWithTheme } from 'vitepress' import { withPwa } from '@vite-pwa/vitepress' import tailwindcss from '@tailwindcss/vite' import { genFeed } from './genFeed.js' +import mathjax3 from 'markdown-it-mathjax3' interface ThemeConfig { postsPerPage?: number @@ -23,6 +24,12 @@ export default withPwa( description: metaInfo.description, lang: 'zh-CN', cleanUrls: true, + markdown: { + math: true, + config: (md) => { + md.use(mathjax3) + }, + }, head: [ [ 'link', diff --git a/src/.vitepress/theme/index.ts b/src/.vitepress/theme/index.ts index 5babe1a4..abec8919 100644 --- a/src/.vitepress/theme/index.ts +++ b/src/.vitepress/theme/index.ts @@ -1,4 +1,5 @@ import './style.css' +import './mathjax3.css' import { h } from 'vue' import Layout from './Layout.vue' diff --git a/src/.vitepress/theme/mathjax3.css b/src/.vitepress/theme/mathjax3.css new file mode 100644 index 00000000..d69f5d73 --- /dev/null +++ b/src/.vitepress/theme/mathjax3.css @@ -0,0 +1,8 @@ +mjx-container { + display: inline-block; + margin: auto 2px -2px; +} +mjx-container > svg { + margin: auto; + display: inline-block; +} diff --git a/src/images/swagger-deepseek-r1/PPO.png b/src/images/swagger-deepseek-r1/PPO.png new file mode 100644 index 00000000..4e00dc67 Binary files /dev/null and b/src/images/swagger-deepseek-r1/PPO.png differ diff --git a/src/images/swagger-deepseek-r1/advantage.png b/src/images/swagger-deepseek-r1/advantage.png new file mode 100644 index 00000000..324892cd Binary files /dev/null and b/src/images/swagger-deepseek-r1/advantage.png differ diff --git a/src/images/swagger-deepseek-r1/deepseek-r1-zero.png b/src/images/swagger-deepseek-r1/deepseek-r1-zero.png new file mode 100644 index 00000000..e550072c Binary files /dev/null and b/src/images/swagger-deepseek-r1/deepseek-r1-zero.png differ diff --git a/src/images/swagger-deepseek-r1/deepseek-r1.png b/src/images/swagger-deepseek-r1/deepseek-r1.png new file mode 100644 index 00000000..1b84c2a2 Binary files /dev/null and b/src/images/swagger-deepseek-r1/deepseek-r1.png differ diff --git a/src/images/swagger-deepseek-r1/distillation.png b/src/images/swagger-deepseek-r1/distillation.png new file mode 100644 index 00000000..cd133e25 Binary files /dev/null and b/src/images/swagger-deepseek-r1/distillation.png differ diff --git a/src/images/swagger-deepseek-r1/ex3.png b/src/images/swagger-deepseek-r1/ex3.png new file mode 100644 index 00000000..969ae909 Binary files /dev/null and b/src/images/swagger-deepseek-r1/ex3.png differ diff --git a/src/images/swagger-deepseek-r1/exp1.png b/src/images/swagger-deepseek-r1/exp1.png new file mode 100644 index 00000000..da514e8f Binary files /dev/null and b/src/images/swagger-deepseek-r1/exp1.png differ diff --git a/src/images/swagger-deepseek-r1/exp2.png b/src/images/swagger-deepseek-r1/exp2.png new file mode 100644 index 00000000..20cfdd24 Binary files /dev/null and b/src/images/swagger-deepseek-r1/exp2.png differ diff --git a/src/images/swagger-deepseek-r1/grpo.png b/src/images/swagger-deepseek-r1/grpo.png new file mode 100644 index 00000000..7cdc4a6b Binary files /dev/null and b/src/images/swagger-deepseek-r1/grpo.png differ diff --git a/src/images/swagger-deepseek-r1/grpo_formula.png b/src/images/swagger-deepseek-r1/grpo_formula.png new file mode 100644 index 00000000..0f0dbd03 Binary files /dev/null and b/src/images/swagger-deepseek-r1/grpo_formula.png differ diff --git a/src/images/swagger-deepseek-r1/opm.png b/src/images/swagger-deepseek-r1/opm.png new file mode 100644 index 00000000..66a5dff6 Binary files /dev/null and b/src/images/swagger-deepseek-r1/opm.png differ diff --git a/src/images/swagger-deepseek-r1/ppo_clip.png b/src/images/swagger-deepseek-r1/ppo_clip.png new file mode 100644 index 00000000..a6cdb705 Binary files /dev/null and b/src/images/swagger-deepseek-r1/ppo_clip.png differ diff --git a/src/images/swagger-deepseek-r1/r1-zero_exp1.png b/src/images/swagger-deepseek-r1/r1-zero_exp1.png new file mode 100644 index 00000000..378b27fb Binary files /dev/null and b/src/images/swagger-deepseek-r1/r1-zero_exp1.png differ diff --git a/src/images/swagger-deepseek-r1/r1-zero_exp2.png b/src/images/swagger-deepseek-r1/r1-zero_exp2.png new file mode 100644 index 00000000..16250b7c Binary files /dev/null and b/src/images/swagger-deepseek-r1/r1-zero_exp2.png differ diff --git a/src/images/swagger-deepseek-r1/r1-zero_exp3.png b/src/images/swagger-deepseek-r1/r1-zero_exp3.png new file mode 100644 index 00000000..d7b33d4a Binary files /dev/null and b/src/images/swagger-deepseek-r1/r1-zero_exp3.png differ diff --git a/src/images/swagger-deepseek-r1/r1-zero_exp4.png b/src/images/swagger-deepseek-r1/r1-zero_exp4.png new file mode 100644 index 00000000..8b901e21 Binary files /dev/null and b/src/images/swagger-deepseek-r1/r1-zero_exp4.png differ diff --git a/src/images/swagger-deepseek-r1/training_template.png b/src/images/swagger-deepseek-r1/training_template.png new file mode 100644 index 00000000..b063608e Binary files /dev/null and b/src/images/swagger-deepseek-r1/training_template.png differ diff --git a/src/posts/swagger-deepseek-r1.md b/src/posts/swagger-deepseek-r1.md new file mode 100644 index 00000000..4a5502f8 --- /dev/null +++ b/src/posts/swagger-deepseek-r1.md @@ -0,0 +1,370 @@ +--- +title: DeepSeek-R1 论文解读及相关技术杂谈 +date: 2025-03-16 +author: + name: swagger + github: swagger-coder +--- + +本篇博客旨在讲解论文 **《DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning》** ,如有错误,欢迎指正。 + + + + + +## 1. 引入 + +近年来,大型语言模型(LLMs)正在经历快速迭代和演进,逐渐缩小了通往通用人工智能(AGI)的差距。OpenAI 的 o1 系列发布是一个里程碑事件,o1 系列强大的推理能力让人们看到了预训练(Pre-Training)和微调(Supervised Fine-Tuning)以外的模型优化方式。先前很多工作探索了强化学习以及蒙特卡洛树搜索和束搜索等搜索算法等,但是都没有达到 OpenAI 的 o1 系列模型相当的一般推理性能。 + +> OpenAI 的 o1 系列的技术要点主要包括**策略初始化、奖赏设计、搜索和学习**,具体可以查阅参考资料[1] + +《DeepSeek-R1》成功探索出用纯强化学习(RL)提高语言模型推理能力的路径。具体而言,《DeepSeek-R1》研究的重点是在没有任何监督数据的情况下发展推理能力的潜力,重点关注它们通过纯 RL 过程的自我演化。 + +由此《DeepSeek-R1》使用 **DeepSeek-V3-Base** 作为基础模型,并采用 GRPO 作为强化学习框架,以提高模型在推理方面的性能,通过这单阶段的强化学习过程得到了 **DeepSeek-R1-Zero** 模型,DeepSeek-R1-Zero 在训练过程中涌现了"Aha moment"现象,并有强大的推理能力,但是存在着可读性差和语言混合等挑战。为了解决这些问题并进一步提高推理性能,《DeepSeek-R1》使用了少量冷启动数据和多阶段训练阶段,得到最终性能和 OpenAI-o1-1217 相当的 **DeepSeek-R1** 模型。同时《DeepSeek-R1》探索了提升小模型推理能力的方式,发现在小模型上使用 **蒸馏(Distillation)** 效果优于直接使用强化学习。 + +> 为了更好地理解自我演化(self-evolution),可以参考 InstructGPT[2] 中提出的 RLHF(Reinforcement Learning from Human Feedback)。RLHF 通过利用人类反馈进行强化学习训练,帮助模型不断优化和提升推理能力。 + +下面是《DeepSeek-R1》的贡献&工作总结表: + +| 模型 | 贡献重点 | 区别与优势 | +| :------------------: | :---------------------------------------------------- | :--------------------------------------------- | +| **DeepSeek-R1-Zero** | 直接应用强化学习(RL)于基础模型,无需监督微调(SFT) | 展示自我验证、反思和长链式思维(CoT)能力 | +| **DeepSeek-R1** | 包含两个强化学习阶段和两个监督微调阶段 | 改进推理模式并与人类偏好保持一致 | +| **Distilled Model** | 大型模型的推理模式成功蒸馏至小型模型 | 发现在小模型上使用蒸馏效果优于直接使用强化学习 | + +## 2. 研究方法 + +在接下来的部分中,将介绍:**2.1** DeepSeek-R1-Zero,它直接将强化学习应用于基础模型,而没有任何 SFT 数据;**2.2** DeepSeek-R1,它从一个经过数千个长链思维(Long CoT)示例微调的 checkpoint 开始应用强化学习;**2.3** 从 DeepSeek-R1 中蒸馏推理能力到小型密集模型 + +### 2.1 DeepSeek-R1-Zero + +DeepSeek-R1-Zero 探索了大型语言模型在没有任何监督数据的情况下发展推理能力的潜力,重点关注通过纯粹的强化学习过程进行自我演化。如图 1,在训练流程上,DeepSeek-R1-Zero 很简单,使用基于规则的 Reasoning Data 进行纯强化学习,这里面涉及到三个重点:**强化学习范式**、**Reasoning Data 构造**和**有趣的实验发现**。 + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+