管线只负责一次运行:文档索引系统不该默认共享跨 Run 节点
一次 RAG 与知识图谱独立运行模式的架构讨论,让我重新分清了 Pipeline、Run、动态 Target 和跨请求 Singleflight。我的结论是:文档索引系统更适合让每次 Run 独立拥有状态和节点,同一文件只保留一个活动 Run,并通过持久化产物复用结果,而不是共享正在执行的节点任务。
一次 RAG 与知识图谱独立运行模式的架构讨论,让我重新分清了 Pipeline、Run、动态 Target 和跨请求 Singleflight。我的结论是:文档索引系统更适合让每次 Run 独立拥有状态和节点,同一文件只保留一个活动 Run,并通过持久化产物复用结果,而不是共享正在执行的节点任务。
函数命名不是取名字:它是在描述系统边界 副标题: 好的函数名不只是“好听”。它应该让读者看出:这个函数在做读取、 解析、校验、筛选、创建,还是修改状态。 适读人群: 正在写 Python service、runner、pipeline、SDK 或业务模块的开发者 阅读时间: 8 min 背景:为什么 get_dependencies 不是总比 resolve_graph 直观? 看一个小型 graph pipeline runner: def trigger(self, mode, context): dependencies = self._resolve_graph(mode) self._validate_graph(dependencies) record = self._create_graph_record(mode, dependencies, context) while True: ready_nodes = self._ready_nodes(record) if not ready_nodes: break for node_name in ready_nodes: ... 刚开始可能会问: 为什么不叫 get_dependencies? 为什么不叫 get_handler? 为什么 ready_nodes 没有动词? 为什么 skip_dependents 一看就像会改状态? 这些不是风格洁癖。函数命名背后其实是在表达系统边界: mode 是外部语言,graph 是内部执行结构。 handler name 是配置语言,handler 是可调用对象。 ready node 是运行时状态,不是普通列表。 skip dependents 是副作用,不是查询。 这篇文章用一个 pipeline runner 作为例子,讲清楚函数命名应该如何暴露设计意图。 ...
本文是最小 Pipeline Runner 系列的 v1 后续章节:从 v0 的顺序 workflow list 出发,推导 dependency graph、ready wave、graph validation、node record 和 failed dependency blocking。
本文保留 nano-pipeline-runner v0 的完整推导链条:先证明普通函数调用什么时候足够,再通过工程接入、运行观察、失败记录、重复执行策略和共享 context 的压力,构建一个最小顺序 Pipeline Runner。