ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

崩溃重启接着跑:LLM Wiki摄入队列生命周期与失败重试源码解析

崩溃重启接着跑:LLM Wiki摄入队列生命周期与失败重试源码解析 崩溃重启接着跑LLM Wiki摄入队列生命周期与失败重试源码解析【免费下载链接】llm_wikiLLM Wiki is a cross-platform desktop application that turns your documents into an organized, interlinked knowledge base — automatically. Instead of traditional RAG (retrieve-and-answer from scratch every time), the LLM incrementally builds and maintains a persistent wiki from your sources。项目地址: https://gitcode.com/GitHub_Trending/ll/llm_wikiLLM Wiki 是一款跨平台桌面应用能把你的文档自动变成结构化、互联的知识库。其中**摄入队列Ingest Queue**是整个自动化流水线的心脏任务持久化到磁盘、崩溃重启接着跑、失败自动重试 3 次、遇限流 15 分钟自愈。本文带你读懂这套「断点续传 失败重试」机制的完整生命周期。为什么摄入需要断点续传批量摄入几十篇论文 PDF 时一次摄入可能要跑几十分钟。期间随时可能发生应用崩溃、电脑合盖、LLM 接口限流、手动切项目……如果队列只存在内存里一切前功尽弃。LLM Wiki 的解法很简单也很关键队列状态实时落盘。每个项目在.llm-wiki/ingest-queue.json里维护一份任务清单所有状态变更入队、开始、失败、取消都会触发一次持久化。 相关源码src/lib/ingest-queue.ts约 1100 行队列核心、src/lib/ingest.ts单任务的两步摄入执行任务的一生5 种状态如何流转每个队列任务是一个IngestTask对象定义见 src/lib/ingest-queue.ts#L11-L25核心字段一目了然字段含义statuspending/processing/done/failed/cancelledretryCount已自动重试次数error最近一次失败的原因autoStart定时导入任务项目打开时自动开跑projectId稳定 UUID项目挪盘也不会丢任务状态机如下入队与去重enqueueIngest/enqueueBatchsrc/lib/ingest-queue.ts#L277-L320按「项目 归一化源路径」去重——同一文件重复入队只会把旧任务重置为pending并清空错误不会产生重复摄入。定时导入对未打开的项目写入队列时使用enqueueInactiveProjectBatch并标记autoStart: true等该项目下次打开才真正开跑避免在后台偷跑 LLM 调用。持久化一份 JSON 就是断点saveQueuesrc/lib/ingest-queue.ts#L106-L138有两个值得注意的设计只存未完成的任务——status done的任务不入盘文件不会无限膨胀写入串行化——磁盘写请求进入一个 FIFO 队列逐个执行保证旧的异步写永远不会覆盖新的队列状态从根源上消灭写乱序。崩溃重启processing 变回 pending接着跑应用启动或打开项目时src/App.tsx#L494-L495 会调用restoreQueuesrc/lib/ingest-queue.ts#L836-L896做三件事中断任务复位磁盘上任何停留在processing的任务上次崩溃时正在跑的统一改回pending稍后从头再跑过滤跨项目污染只恢复属于当前项目projectId的任务防止损坏的队列文件串台⏸️背压保护恢复出来的普通pending任务进入暂停待命集合不会自动开跑——因为你可能不想一打开应用就悄悄烧掉一大笔 token。用户只需在活动面板点一下恢复新入队的实时任务则照常自动执行。也就是说崩溃重启后队列一个任务都不丢恢复即待命一键继续。失败重试自动 3 次 手动一键任务执行抛错时src/lib/ingest-queue.ts#L1025-L1034队列会retryCount并记录错误信息retryCount 3任务退回pending调度器下一轮自动重跑——网络抖动、偶发超时会被悄悄消化掉达到MAX_RETRIES 3任务标记failed留在队列里等你处理。手动恢复提供三个粒度的入口src/lib/ingest-queue.ts#L395-L466函数场景retryTask(id)单个失败任务点重试retryTasks(ids)多选批量重试retryAllStoppedTasks()重试全部一键清空失败/取消重试会把status重置为pending、清空error、归零retryCount等于给任务第二次生命。限流自愈429 错误暂停 15 分钟再战如果错误信息匹配429 / rate limit / quota / too many requestssrc/lib/ingest-queue.ts#L911-L924队列不会傻乎乎地重试到限流上限而是把当前任务和所有兄弟任务退回pending全局暂停安排一个15 分钟定时器到点自动processNext继续跑。对 LLM 配额受限的用户来说这是一条无人值守也能跑完的关键路径。⚡项目切换握手不写错项目、不丢进度切换/关闭项目时必须先走pauseQueuesrc/lib/ingest-queue.ts#L769-L824握手中止所有在跑的 LLM 调用AbortController.abort但等待正在落盘的页面写入完成避免半截写入把processing任务全部复位为pending并连续落盘两次兜底调度器可能又写了一次processing快照用queueEpoch纪元号做守卫任何切项目前已经通过检查的过期调度器看到纪元变了就自动放弃写入——保证永远不会把新项目的进度写进旧项目的队列文件。页面写入的提交顺序则由 src/lib/ingest-commit-coordinator.ts 中的IngestCommitCoordinator保证多个任务的 LLM 分析可以并发但写 Wiki 页面的提交回合严格按任务启动顺序串行防止并发改同一页时互相覆盖。活动面板暂停、恢复、批量重试这些队列能力在界面里全部有对应入口src/components/layout/activity-panel.tsx面板每秒轮询一次getQueue()实时展示排队/处理中/失败计数并提供⏸️暂停 / ▶️ 恢复暂停会立刻中止在跑任务并退回pendingtoken 消耗即刻停止src/lib/ingest-queue.ts#L648-L677重试 / 重试全部对应retryTask/retryAllStoppedTasks✂️取消 / 取消全部取消的任务保留在队列中可一键重启且已合并写入的页面不会被回滚删除防止误删用户内容。关键源码地图想看的主题文件队列核心状态机/持久化/重试src/lib/ingest-queue.ts单任务两步摄入执行src/lib/ingest.ts提交回合串行协调器src/lib/ingest-commit-coordinator.ts队列耗尽后的审核清扫src/lib/sweep-reviews.ts活动面板 UIsrc/components/layout/activity-panel.tsx队列行为的测试用例src/lib/ingest-queue.test.ts定时导入写入非活跃项目队列src/lib/scheduled-import.ts小结LLM Wiki 摄入队列的生命周期可以浓缩成四个词持久化每步落盘、可恢复崩溃/切项目都不丢进度、能自愈3 次自动重试 限流 15 分钟自动续跑、可干预暂停/取消/批量重试全在手。正是这套机制让扔进几百篇文档然后关掉电脑成为可能——下次打开时它接着跑。【免费下载链接】llm_wikiLLM Wiki is a cross-platform desktop application that turns your documents into an organized, interlinked knowledge base — automatically. Instead of traditional RAG (retrieve-and-answer from scratch every time), the LLM incrementally builds and maintains a persistent wiki from your sources。项目地址: https://gitcode.com/GitHub_Trending/ll/llm_wiki创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表