[{"data":1,"prerenderedAt":1141},["ShallowReactive",2],{"post-\u002Fposts\u002Fdeepscientist-tech-stack":3,"all-posts-nav":858},{"id":4,"title":5,"body":6,"categories":845,"date":846,"description":12,"draft":847,"extension":848,"hidden":847,"meta":849,"navigation":850,"path":851,"published":847,"seo":852,"stem":853,"tags":854,"__hash__":857},"posts\u002Fposts\u002Fdeepscientist-tech-stack.md","DeepScientist 技术栈全解析：一个 AI 科研平台的架构设计",{"type":7,"value":8,"toc":818},"minimark",[9,13,17,28,31,34,38,94,97,101,136,139,142,148,159,165,173,176,182,196,199,219,222,236,239,242,279,282,286,300,303,306,312,323,329,337,340,420,478,484,489,531,534,540,543,549,552,555,581,585,605,608,652,655,665,668,672,741,748,751,771,774,779,782,787,790,795,798,803,806,811,814],[10,11,12],"p",{},"DeepScientist 是一个 AI 驱动的科研管理平台，用户 5000+。这篇文章梳理整个项目的技术选型和架构设计，作为面试准备的参考。",[14,15,16],"h2",{"id":16},"整体架构",[18,19,24],"pre",{"className":20,"code":22,"language":23},[21],"language-text","┌─────────────────────────────────────────┐\n│           Next.js 前端 (port 1288)       │\n│   React 18 + TypeScript + Tailwind CSS  │\n└──────────────────┬──────────────────────┘\n                   │ HTTP \u002F WebSocket\n┌──────────────────▼──────────────────────┐\n│          FastAPI 后端 (port 18080)       │\n│        Python 3.11 + Uvicorn\u002FGunicorn   │\n└──────┬───────────┬────────────┬─────────┘\n       │           │            │\n┌──────▼──┐  ┌─────▼────┐  ┌───▼──────────┐\n│PostgreSQL│  │  MinIO   │  │  Sandbox     │\n│  (数据库) │  │ (对象存储) │  │ (AI 沙箱容器) │\n└─────────┘  └──────────┘  └─────────────┘\n","text",[25,26,22],"code",{"__ignoreMap":27},"",[10,29,30],{},"Monorepo 结构，前后端分离，全部通过 Docker Compose 编排。",[14,32,33],{"id":33},"前端技术栈",[35,36,37],"h3",{"id":37},"核心框架",[39,40,41,57],"table",{},[42,43,44],"thead",{},[45,46,47,51,54],"tr",{},[48,49,50],"th",{},"技术",[48,52,53],{},"版本",[48,55,56],{},"用途",[58,59,60,72,83],"tbody",{},[45,61,62,66,69],{},[63,64,65],"td",{},"Next.js",[63,67,68],{},"15.0",[63,70,71],{},"SSR\u002FSSG 框架，App Router",[45,73,74,77,80],{},[63,75,76],{},"React",[63,78,79],{},"18.3",[63,81,82],{},"UI 框架",[45,84,85,88,91],{},[63,86,87],{},"TypeScript",[63,89,90],{},"5.3",[63,92,93],{},"类型安全",[10,95,96],{},"Next.js 15 使用 App Router，支持 Server Components，减少客户端 JS 体积。",[35,98,100],{"id":99},"ui-与样式","UI 与样式",[102,103,104,112,118,124,130],"ul",{},[105,106,107,111],"li",{},[108,109,110],"strong",{},"Tailwind CSS"," — 原子化 CSS，快速构建响应式布局",[105,113,114,117],{},[108,115,116],{},"Radix UI"," — 无样式的无障碍组件库（Dialog、Dropdown、Tooltip 等）",[105,119,120,123],{},[108,121,122],{},"shadcn\u002Fui"," — 基于 Radix UI 的组件集合，可直接复制到项目里修改",[105,125,126,129],{},[108,127,128],{},"Framer Motion"," — 动画库，处理页面过渡和交互动效",[105,131,132,135],{},[108,133,134],{},"GSAP"," — 复杂时间轴动画",[35,137,138],{"id":138},"编辑器",[10,140,141],{},"这是项目的核心功能之一，用了两套编辑器：",[10,143,144,147],{},[108,145,146],{},"Tiptap 2"," — 富文本编辑器",[102,149,150,153,156],{},[105,151,152],{},"基于 ProseMirror，支持协作编辑",[105,154,155],{},"扩展：表格、代码块、数学公式（KaTeX）、图片上传",[105,157,158],{},"配合 Yjs 实现多人实时协同",[10,160,161,164],{},[108,162,163],{},"Monaco Editor"," — 代码编辑器",[102,166,167,170],{},[105,168,169],{},"VS Code 同款编辑器内核",[105,171,172],{},"支持语法高亮、代码补全、多语言",[35,174,175],{"id":175},"实时协作",[18,177,180],{"className":178,"code":179,"language":23},[21],"用户 A ──┐\n         ├── Yjs CRDT ── Socket.IO ── 后端广播 ── 用户 B\n用户 C ──┘\n",[25,181,179],{"__ignoreMap":27},[102,183,184,190],{},[105,185,186,189],{},[108,187,188],{},"Yjs"," — CRDT（无冲突复制数据类型）算法，多人同时编辑不冲突",[105,191,192,195],{},[108,193,194],{},"Socket.IO Client"," — WebSocket 封装，处理断线重连",[35,197,198],{"id":198},"数据可视化",[102,200,201,207,213],{},[105,202,203,206],{},[108,204,205],{},"Recharts"," — 基于 D3 的 React 图表库（折线图、柱状图、饼图）",[105,208,209,212],{},[108,210,211],{},"React Flow"," — 节点图\u002F流程图，用于知识图谱展示",[105,214,215,218],{},[108,216,217],{},"Dagre"," — 有向图自动布局算法",[35,220,221],{"id":221},"终端与远程桌面",[102,223,224,230],{},[105,225,226,229],{},[108,227,228],{},"XTerm.js"," — 浏览器内终端模拟器，支持 WebGL 渲染加速",[105,231,232,235],{},[108,233,234],{},"noVNC"," — 纯 JS 的 VNC 客户端，可在浏览器里操作远程桌面",[10,237,238],{},"这两个组件支撑了 AI 沙箱的交互界面——用户可以直接在网页里操作 AI 运行的容器环境。",[35,240,241],{"id":241},"状态管理",[39,243,244,253],{},[42,245,246],{},[45,247,248,251],{},[48,249,250],{},"库",[48,252,56],{},[58,254,255,263,271],{},[45,256,257,260],{},[63,258,259],{},"Zustand",[63,261,262],{},"全局客户端状态（用户信息、UI 状态）",[45,264,265,268],{},[63,266,267],{},"Jotai",[63,269,270],{},"原子化状态，细粒度订阅",[45,272,273,276],{},[63,274,275],{},"TanStack Query",[63,277,278],{},"服务端状态，缓存 + 自动重新请求",[10,280,281],{},"三者分工明确：Zustand 管全局，Jotai 管局部，TanStack Query 管异步数据。",[35,283,285],{"id":284},"pdf-处理","PDF 处理",[102,287,288,294],{},[105,289,290,293],{},[108,291,292],{},"PDF.js"," — Mozilla 出品，浏览器内渲染 PDF",[105,295,296,299],{},[108,297,298],{},"UnPDF"," — PDF 文本提取，供 AI 分析",[14,301,302],{"id":302},"后端技术栈",[35,304,37],{"id":305},"核心框架-1",[10,307,308,311],{},[108,309,310],{},"FastAPI"," — Python 异步 Web 框架",[102,313,314,317,320],{},[105,315,316],{},"基于 Pydantic 的自动参数校验",[105,318,319],{},"自动生成 OpenAPI 文档（\u002Fdocs）",[105,321,322],{},"原生支持 async\u002Fawait",[10,324,325,328],{},[108,326,327],{},"Uvicorn + Gunicorn"," — 生产部署组合",[102,330,331,334],{},[105,332,333],{},"Uvicorn：ASGI 服务器，处理异步请求",[105,335,336],{},"Gunicorn：进程管理，多 worker 提升并发",[35,338,339],{"id":339},"数据库层",[18,341,345],{"className":342,"code":343,"language":344,"meta":27,"style":27},"language-python shiki shiki-themes github-dark-dimmed github-light","# SQLAlchemy 2.0 async 写法示例\nasync with AsyncSession(engine) as session:\n    result = await session.execute(\n        select(User).where(User.id == user_id)\n    )\n    user = result.scalar_one_or_none()\n","python",[25,346,347,356,376,391,403,409],{"__ignoreMap":27},[348,349,352],"span",{"class":350,"line":351},"line",1,[348,353,355],{"class":354},"sgHix","# SQLAlchemy 2.0 async 写法示例\n",[348,357,359,363,366,370,373],{"class":350,"line":358},2,[348,360,362],{"class":361},"s6PUj","async",[348,364,365],{"class":361}," with",[348,367,369],{"class":368},"ssh_m"," AsyncSession(engine) ",[348,371,372],{"class":361},"as",[348,374,375],{"class":368}," session:\n",[348,377,379,382,385,388],{"class":350,"line":378},3,[348,380,381],{"class":368},"    result ",[348,383,384],{"class":361},"=",[348,386,387],{"class":361}," await",[348,389,390],{"class":368}," session.execute(\n",[348,392,394,397,400],{"class":350,"line":393},4,[348,395,396],{"class":368},"        select(User).where(User.id ",[348,398,399],{"class":361},"==",[348,401,402],{"class":368}," user_id)\n",[348,404,406],{"class":350,"line":405},5,[348,407,408],{"class":368},"    )\n",[348,410,412,415,417],{"class":350,"line":411},6,[348,413,414],{"class":368},"    user ",[348,416,384],{"class":361},[348,418,419],{"class":368}," result.scalar_one_or_none()\n",[39,421,422,432],{},[42,423,424],{},[45,425,426,428,430],{},[48,427,50],{},[48,429,53],{},[48,431,56],{},[58,433,434,445,456,467],{},[45,435,436,439,442],{},[63,437,438],{},"PostgreSQL",[63,440,441],{},"16",[63,443,444],{},"主数据库",[45,446,447,450,453],{},[63,448,449],{},"SQLAlchemy",[63,451,452],{},"2.0",[63,454,455],{},"ORM，async 模式",[45,457,458,461,464],{},[63,459,460],{},"AsyncPG",[63,462,463],{},"0.29",[63,465,466],{},"异步 PostgreSQL 驱动",[45,468,469,472,475],{},[63,470,471],{},"Alembic",[63,473,474],{},"1.13",[63,476,477],{},"数据库迁移",[10,479,480,483],{},[108,481,482],{},"为什么用 async？","\nFastAPI 是 ASGI 框架，同步数据库驱动会阻塞事件循环。AsyncPG 是纯异步驱动，数据库 I\u002FO 不阻塞，高并发下吞吐量显著提升。",[10,485,486],{},[108,487,488],{},"Alembic 迁移流程：",[18,490,494],{"className":491,"code":492,"language":493,"meta":27,"style":27},"language-bash shiki shiki-themes github-dark-dimmed github-light","# 修改 SQLAlchemy Model 后\nalembic revision --autogenerate -m \"add paper table\"\nalembic upgrade head\n","bash",[25,495,496,501,521],{"__ignoreMap":27},[348,497,498],{"class":350,"line":351},[348,499,500],{"class":354},"# 修改 SQLAlchemy Model 后\n",[348,502,503,507,511,515,518],{"class":350,"line":358},[348,504,506],{"class":505},"sqRhv","alembic",[348,508,510],{"class":509},"sXfbr"," revision",[348,512,514],{"class":513},"swcJU"," --autogenerate",[348,516,517],{"class":513}," -m",[348,519,520],{"class":509}," \"add paper table\"\n",[348,522,523,525,528],{"class":350,"line":378},[348,524,506],{"class":505},[348,526,527],{"class":509}," upgrade",[348,529,530],{"class":509}," head\n",[35,532,533],{"id":533},"文件存储",[10,535,536,539],{},[108,537,538],{},"MinIO"," — S3 兼容的自托管对象存储",[10,541,542],{},"架构原则：数据库只存元数据（文件名、路径、大小），二进制文件（PDF、图片、PPT）全部存 MinIO。",[18,544,547],{"className":545,"code":546,"language":23},[21],"上传文件 → FastAPI → MinIO（存文件）\n                  → PostgreSQL（存路径）\n\n下载文件 → FastAPI → PostgreSQL（查路径）\n                  → MinIO（取文件）→ 返回客户端\n",[25,548,546],{"__ignoreMap":27},[10,550,551],{},"同时接入了 Boto3（AWS S3 SDK），可以无缝切换到 AWS S3。",[35,553,554],{"id":554},"认证与安全",[102,556,557,563,569,575],{},[105,558,559,562],{},[108,560,561],{},"JWT（python-jose）"," — 无状态 Token，适合前后端分离",[105,564,565,568],{},[108,566,567],{},"BCrypt"," — 密码哈希，不可逆",[105,570,571,574],{},[108,572,573],{},"Google OAuth 2.0"," — 第三方登录",[105,576,577,580],{},[108,578,579],{},"Pydantic"," — 所有入参自动校验，防止非法数据进入业务层",[35,582,584],{"id":583},"ai-集成","AI 集成",[102,586,587,593,599],{},[105,588,589,592],{},[108,590,591],{},"Google Gemini API"," — 文献分析、内容生成",[105,594,595,598],{},[108,596,597],{},"TikToken"," — Token 计数，控制 LLM 请求成本",[105,600,601,604],{},[108,602,603],{},"Docker SDK"," — 动态创建\u002F销毁 AI 沙箱容器",[35,606,607],{"id":607},"文档处理",[39,609,610,618],{},[42,611,612],{},[45,613,614,616],{},[48,615,250],{},[48,617,56],{},[58,619,620,628,636,644],{},[45,621,622,625],{},[63,623,624],{},"PyMuPDF",[63,626,627],{},"PDF 解析、文本提取、页面渲染",[45,629,630,633],{},[63,631,632],{},"python-pptx",[63,634,635],{},"生成 PowerPoint 导出",[45,637,638,641],{},[63,639,640],{},"CairoSVG",[63,642,643],{},"SVG 转 PNG\u002FPDF",[45,645,646,649],{},[63,647,648],{},"markdown-it-py",[63,650,651],{},"Markdown 渲染",[35,653,654],{"id":654},"监控",[10,656,657,660,661,664],{},[108,658,659],{},"Prometheus Client"," — 暴露 ",[25,662,663],{},"\u002Fmetrics"," 端点，记录请求数、延迟、错误率等指标，配合 Grafana 可视化。",[14,666,667],{"id":667},"基础设施",[35,669,671],{"id":670},"docker-compose-服务编排","Docker Compose 服务编排",[18,673,677],{"className":674,"code":675,"language":676,"meta":27,"style":27},"language-yaml shiki shiki-themes github-dark-dimmed github-light","services:\n  frontend:   # Next.js，port 1288\n  backend:    # FastAPI，port 18080\n  postgres:   # PostgreSQL 16，port 5432\n  minio:      # 对象存储，port 9000\u002F9001\n  sandbox:    # AI 沙箱，port 15900-15901（VNC）\n","yaml",[25,678,679,688,699,710,720,731],{"__ignoreMap":27},[348,680,681,685],{"class":350,"line":351},[348,682,684],{"class":683},"shb1k","services",[348,686,687],{"class":368},":\n",[348,689,690,693,696],{"class":350,"line":358},[348,691,692],{"class":683},"  frontend",[348,694,695],{"class":368},":   ",[348,697,698],{"class":354},"# Next.js，port 1288\n",[348,700,701,704,707],{"class":350,"line":378},[348,702,703],{"class":683},"  backend",[348,705,706],{"class":368},":    ",[348,708,709],{"class":354},"# FastAPI，port 18080\n",[348,711,712,715,717],{"class":350,"line":393},[348,713,714],{"class":683},"  postgres",[348,716,695],{"class":368},[348,718,719],{"class":354},"# PostgreSQL 16，port 5432\n",[348,721,722,725,728],{"class":350,"line":405},[348,723,724],{"class":683},"  minio",[348,726,727],{"class":368},":      ",[348,729,730],{"class":354},"# 对象存储，port 9000\u002F9001\n",[348,732,733,736,738],{"class":350,"line":411},[348,734,735],{"class":683},"  sandbox",[348,737,706],{"class":368},[348,739,740],{"class":354},"# AI 沙箱，port 15900-15901（VNC）\n",[10,742,743,744,747],{},"所有服务在同一个 ",[25,745,746],{},"deepscientist-network"," bridge 网络内，服务间通过容器名互相访问。",[35,749,750],{"id":750},"测试",[102,752,753,759,765],{},[105,754,755,758],{},[108,756,757],{},"Jest + Testing Library"," — 前端单元测试 \u002F 组件测试",[105,760,761,764],{},[108,762,763],{},"Playwright"," — 端到端测试，模拟真实用户操作",[105,766,767,770],{},[108,768,769],{},"Pytest"," — 后端单元测试 \u002F 集成测试",[14,772,773],{"id":773},"面试常见问题",[10,775,776],{},[108,777,778],{},"Q：为什么选 FastAPI 而不是 Django\u002FFlask？",[10,780,781],{},"FastAPI 原生 async，性能接近 Node.js。自动生成 OpenAPI 文档省去大量手写工作。Pydantic 的类型校验比 Django REST Framework 的 Serializer 更简洁。适合 I\u002FO 密集型的 API 服务。",[10,783,784],{},[108,785,786],{},"Q：Yjs 的 CRDT 是什么原理？",[10,788,789],{},"CRDT（Conflict-free Replicated Data Type）是一种数据结构，多个节点可以独立修改，合并时保证最终一致性，不需要锁或中心协调。Yjs 用 CRDT 实现文档协同，即使网络断开离线编辑，重连后也能自动合并，不会丢失任何人的修改。",[10,791,792],{},[108,793,794],{},"Q：MinIO 和直接用数据库存文件有什么区别？",[10,796,797],{},"数据库存二进制文件会导致：表体积膨胀、备份困难、无法利用 CDN 加速。对象存储专门为大文件设计，支持分片上传、断点续传、直接生成预签名 URL 让客户端直传，绕过后端减少带宽压力。",[10,799,800],{},[108,801,802],{},"Q：JWT 和 Session 的区别？",[10,804,805],{},"Session 把状态存服务端（内存或 Redis），JWT 把状态编码在 Token 里由客户端持有。JWT 无状态，适合分布式部署，不需要共享 Session 存储。缺点是 Token 签发后无法主动失效，需要配合短过期时间 + Refresh Token 机制。",[10,807,808],{},[108,809,810],{},"Q：SQLAlchemy async 和同步有什么区别？",[10,812,813],{},"同步模式下每次数据库查询都会阻塞当前线程，FastAPI 的事件循环被占用，无法处理其他请求。async 模式下查询变成协程，等待数据库响应时事件循环可以去处理其他请求，相同硬件下并发能力大幅提升。",[815,816,817],"style",{},"html pre.shiki code .sgHix, html code.shiki .sgHix{--shiki-default:#768390;--shiki-light:#6A737D}html pre.shiki code .s6PUj, html code.shiki .s6PUj{--shiki-default:#F47067;--shiki-light:#D73A49}html pre.shiki code .ssh_m, html code.shiki .ssh_m{--shiki-default:#ADBAC7;--shiki-light:#24292E}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sqRhv, html code.shiki .sqRhv{--shiki-default:#F69D50;--shiki-light:#6F42C1}html pre.shiki code .sXfbr, html code.shiki .sXfbr{--shiki-default:#96D0FF;--shiki-light:#032F62}html pre.shiki code .swcJU, html code.shiki .swcJU{--shiki-default:#6CB6FF;--shiki-light:#005CC5}html pre.shiki code .shb1k, html code.shiki .shb1k{--shiki-default:#8DDB8C;--shiki-light:#22863A}",{"title":27,"searchDepth":358,"depth":378,"links":819},[820,821,831,840,844],{"id":16,"depth":358,"text":16},{"id":33,"depth":358,"text":33,"children":822},[823,824,825,826,827,828,829,830],{"id":37,"depth":378,"text":37},{"id":99,"depth":378,"text":100},{"id":138,"depth":378,"text":138},{"id":175,"depth":378,"text":175},{"id":198,"depth":378,"text":198},{"id":221,"depth":378,"text":221},{"id":241,"depth":378,"text":241},{"id":284,"depth":378,"text":285},{"id":302,"depth":358,"text":302,"children":832},[833,834,835,836,837,838,839],{"id":305,"depth":378,"text":37},{"id":339,"depth":378,"text":339},{"id":533,"depth":378,"text":533},{"id":554,"depth":378,"text":554},{"id":583,"depth":378,"text":584},{"id":607,"depth":378,"text":607},{"id":654,"depth":378,"text":654},{"id":667,"depth":358,"text":667,"children":841},[842,843],{"id":670,"depth":378,"text":671},{"id":750,"depth":378,"text":750},{"id":773,"depth":358,"text":773},[50],"2026-04-06",false,"md",{},true,"\u002Fposts\u002Fdeepscientist-tech-stack",{"title":5,"description":12},"posts\u002Fdeepscientist-tech-stack",[855,310,65,438,856],"全栈","面试","T_mYrNjzxTIq5W8so8MlBGFLjzxfrfC4YArheVQe0Mg",[859,873,886,893,905,915,925,935,946,955,965,977,990,1002,1010,1020,1033,1044,1054,1062,1073,1079,1085,1091,1099,1107,1110,1116,1124,1132],{"slug":860,"path":861,"title":862,"date":863,"tags":864,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":872},"multimodal-rag-from-scratch","\u002Fposts\u002Fmultimodal-rag-from-scratch","从零实现多模态 RAG：BM25、Dense 检索、RRF 融合、MMR 重排全部手写","2026-06-30 18:00:00",[865,866,867,868,869,870,871],"RAG","多模态","AI Infra","BM25","向量检索","混合检索","实习求职",9,{"slug":874,"path":875,"title":876,"date":877,"tags":878,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":885},"mini-llm-engine-deep-dive","\u002Fposts\u002Fmini-llm-engine-deep-dive","讲透 mini-llm-engine：从显存碎片到六大推理优化","2026-06-30 14:00:00",[879,867,880,881,882,883,884,871],"LLM","vLLM","PagedAttention","KV Cache","推理优化","投机解码",11,{"slug":887,"path":888,"title":889,"date":890,"tags":891,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":892},"mini-llm-engine-from-scratch","\u002Fposts\u002Fmini-llm-engine-from-scratch","从零实现 LLM 推理引擎：深挖 vLLM 的六大核心优化","2026-06-30 10:00:00",[879,867,880,881,883,884,871],10,{"slug":894,"path":895,"title":896,"date":897,"tags":898,"description":903,"draft":847,"hidden":847,"published":850,"readingTime":904},"bytedance-recommendation-architecture-intern-interview","\u002Fposts\u002Fbytedance-recommendation-architecture-intern-interview","字节推荐架构实习生 Data 面试准备：推荐系统、实时特征与高并发八股","2026-06-09",[856,899,900,901,902],"推荐系统","后端架构","实时计算","字节跳动","面向字节跳动推荐架构团队实习岗位的八股准备清单，覆盖推荐系统链路、实时数据、特征服务、高并发后端、分布式系统与项目包装。",18,{"slug":906,"path":907,"title":908,"date":897,"tags":909,"description":913,"draft":847,"hidden":847,"published":850,"readingTime":914},"high-concurrency-rate-limiting-algorithms","\u002Fposts\u002Fhigh-concurrency-rate-limiting-algorithms","高并发限流算法：固定窗口、滑动窗口、漏桶与令牌桶",[910,911,900,912,856],"高并发","限流","系统设计","面试和工程都常见的限流算法总结，讲清楚固定窗口、滑动窗口、漏桶、令牌桶、并发数限制以及分布式限流如何落地。",12,{"slug":916,"path":917,"title":918,"date":897,"tags":919,"description":923,"draft":847,"hidden":847,"published":850,"readingTime":924},"kafka-producer-broker-consumer","\u002Fposts\u002Fkafka-producer-broker-consumer","Kafka 入门：生产者、Broker、消费者和“消费”到底是什么意思",[920,921,922,856,899],"Kafka","消息队列","后端","用推荐系统里的用户行为日志为例，讲清楚 Kafka 的作用、Producer、Broker、Consumer、Topic、Partition、Offset 和消费语义。",8,{"slug":926,"path":927,"title":928,"date":897,"tags":929,"description":934,"draft":847,"hidden":847,"published":850,"readingTime":411},"leetcode-lru-merge-k-reverse-list","\u002Fposts\u002Fleetcode-lru-merge-k-reverse-list","链表与缓存高频题：LRU Cache、合并 K 个有序链表、反转链表",[930,931,932,933,856],"算法","链表","LRU","LeetCode","面试高频算法题速记，整理 LRU Cache、合并 K 个有序链表、反转链表的核心思路、复杂度和 C++ 代码。",{"slug":936,"path":937,"title":938,"date":939,"tags":940,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":945},"meddococr-interpreter-source-analysis","\u002Fposts\u002Fmeddococr-interpreter-source-analysis","MedDocOCR-Interpreter 源码导读：医疗文档 OCR、结构化抽取与报告解读原型","2026-05-22 10:30:00",[941,866,942,865,943,944],"OCR","医疗 AI","Python","源码分析",16,{"slug":947,"path":948,"title":949,"date":950,"tags":951,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":892},"cet6-writing-model-essays","\u002Fposts\u002Fcet6-writing-model-essays","六级写作范文背诵包：10 个高频话题","2026-05-20 09:00:00",[952,953,954],"English","CET6","Writing",{"slug":956,"path":957,"title":958,"date":959,"tags":960,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":964},"claude-code-context-management","\u002Fposts\u002Fclaude-code-context-management","Claude Code 上下文管理机制：从 Microcompact 到 Auto Compact","2026-05-19 10:00:00",[961,962,879,867,963],"Claude Code","Agent","上下文工程",27,{"slug":966,"path":967,"title":968,"date":969,"tags":970,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":976},"nanotron-llm-pretraining-framework-analysis","\u002Fposts\u002Fnanotron-llm-pretraining-framework-analysis","Nanotron 项目详解：Hugging Face 的大模型预训练框架怎么做分布式训练","2026-05-10 12:10:00",[879,971,972,973,974,867,975],"大模型训练","分布式训练","Nanotron","Hugging Face","PyTorch",19,{"slug":978,"path":979,"title":980,"date":981,"tags":982,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":989},"gofoundry-go-backend-foundation-framework","\u002Fposts\u002Fgofoundry-go-backend-foundation-framework","GoFoundry 项目详解：基于 Go 的后端基础框架套件设计","2026-05-10 11:20:00",[983,984,985,986,987,921,988],"Go","后端框架","ORM","分布式缓存","分布式锁","项目架构",25,{"slug":991,"path":992,"title":993,"date":994,"tags":995,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":964},"cloudvault-go-cloud-storage-system","\u002Fposts\u002Fcloudvault-go-cloud-storage-system","CloudVault 项目详解：基于 Go 的云端存储与网盘系统架构设计","2026-05-10 10:30:00",[983,996,997,998,988,999,1000,1001],"云存储","网盘系统","分布式系统","Redis","RabbitMQ","Elasticsearch",{"slug":1003,"path":1004,"title":1005,"date":1006,"tags":1007,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":1009},"openclaw-source-code-analysis","\u002Fposts\u002Fopenclaw-source-code-analysis","OpenClaw 源码导读：个人 AI 助手的网关、通道、插件与运行时架构","2026-05-08 16:30:00",[1008,962,867,87,944],"OpenClaw",20,{"slug":1011,"path":1012,"title":1013,"date":1014,"tags":1015,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":892},"flow-matching-generative-models","\u002Fposts\u002Fflow-matching-generative-models","Flow Matching：从噪声到数据的连续流生成模型","2026-05-07 00:00:00",[1016,1017,1018,1019],"生成模型","Diffusion","Flow Matching","深度学习",{"slug":1021,"path":1022,"title":1023,"date":1024,"tags":1025,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":1032},"database-ai-week4","\u002Fposts\u002Fdatabase-ai-week4","Week 4：数据库速成——从 Storage、Index、Query Optimization 到 Vector DB 与 RAG","2026-05-05 12:00:00",[1026,1027,1028,865,1029,1030,1031],"数据库","CMU 15-445","Vector DB","LLM Memory","Query Optimization","Caching",15,{"slug":1034,"path":1035,"title":1036,"date":1037,"tags":1038,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":945},"distributed-systems-week3","\u002Fposts\u002Fdistributed-systems-week3","Week 3：分布式系统速成——MapReduce、Raft、容错与 Distributed KV Store","2026-05-05 11:00:00",[998,1039,1040,1041,1042,1043,962],"MIT 6.824","MapReduce","Raft","KV Store","Ray",{"slug":1045,"path":1046,"title":1047,"date":1048,"tags":1049,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":1032},"gpu-inference-acceleration-week2","\u002Fposts\u002Fgpu-inference-acceleration-week2","Week 2：GPU 与推理加速——从 Kernel、算子融合到 LLM Serving","2026-05-05 10:00:00",[1019,1050,1051,879,1052,880,1053],"GPU","推理加速","CMU 10-414","TensorRT",{"slug":1055,"path":1056,"title":1057,"date":1058,"tags":1059,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":904},"dl-framework-autograd-mini","\u002Fposts\u002Fdl-framework-autograd-mini","Week 1：DL 框架与 Autograd——从计算图、反向传播到 Mini Autograd 实现","2026-05-05 09:00:00",[1019,1060,975,1052,1061],"Autograd","Mini Framework",{"slug":1063,"path":1064,"title":1065,"date":1066,"tags":1067,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":914},"lock-free-concurrency-notes","\u002Fposts\u002Flock-free-concurrency-notes","无锁并发入门：从 CAS 到 Atomic Ring Buffer","2026-04-25",[1068,1069,1070,1071,1072],"C++","并发","无锁编程","性能优化","量化开发",{"slug":1074,"path":1075,"title":1076,"date":1077,"tags":1078,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":405},"agent-memory","\u002Fposts\u002Fagent-memory","Agent 对话记忆化：从原理到实现","2026-04-24",[879,962,865,856],{"slug":1080,"path":1081,"title":1082,"date":1077,"tags":1083,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":411},"llm-context-compression","\u002Fposts\u002Fllm-context-compression","LLM 上下文五层压缩机制详解",[879,962,1084,856],"上下文压缩",{"slug":1086,"path":1087,"title":1088,"date":1089,"tags":1090,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":872},"cpp-concurrency-basics","\u002Fposts\u002Fcpp-concurrency-basics","C++ 并发编程入门：从数据竞争到线程池","2026-04-15",[1068,1069,856,1072],{"slug":1092,"path":1093,"title":1094,"date":1095,"tags":1096,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":351},"travel-in-shenzhen","\u002Fposts\u002Ftravel-in-shenzhen","XCPC 深圳游记","2026-04-13",[1097,1068,1098],"XCPC","比赛",{"slug":1100,"path":1101,"title":1102,"date":1103,"tags":1104,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":1106},"backend-stack-deep-dive","\u002Fposts\u002Fbackend-stack-deep-dive","后端五件套：FastAPI \u002F Node.js \u002F SQLAlchemy async \u002F PostgreSQL \u002F Docker 面试速通","2026-04-07",[922,310,438,1105,856],"Docker",7,{"slug":1108,"path":851,"title":5,"date":846,"tags":1109,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":411},"deepscientist-tech-stack",[855,310,65,438,856],{"slug":1111,"path":1112,"title":1113,"date":846,"tags":1114,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":924},"minicode-source-analysis","\u002Fposts\u002Fminicode-source-analysis","MiniCode 源码解析：用 5000 行 TypeScript 实现一个 AI 编程助手",[87,1115,879,944,856],"CLI",{"slug":1117,"path":1118,"title":1119,"date":846,"tags":1120,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":405},"nova-theme-implementation","\u002Fposts\u002Fnova-theme-implementation","我是怎么从零实现 Nova 主题的",[1121,1122,1123],"Hexo","前端","开源",{"slug":1125,"path":1126,"title":1127,"date":1128,"tags":1129,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":358},"git-cheatsheet","\u002Fposts\u002Fgit-cheatsheet","Git 常用操作备忘","2026-04-05 14:00:00",[1130,1131],"Git","工具",{"slug":1133,"path":1134,"title":1135,"date":1136,"tags":1137,"description":27,"draft":847,"hidden":847,"published":850,"readingTime":378},"github-actions-intro","\u002Fposts\u002Fgithub-actions-intro","GitHub Actions 入门：自动化你的工作流","2026-04-04 09:00:00",[1138,1139,1140],"GitHub Actions","CI\u002FCD","自动化",1782796012079]