RAGSpine
指南

Pipeline

静态引擎 PipelineGraph 导出,以及它与仅用于展示的工作流预览 v1 协议的区别。

pipeline 领域(src/ragspine/pipeline/)是 RAGSpine 对一个问题的代码优先回答:图框架 (Dify、LangGraph)能给你、而纯 Python 引擎给不了的那样东西—— 管线的可视化图示。RAGSpine 不采用先编写、再祈祷与现实一致的图 DSL, 而是从真实的组装关系中_推导出_一个静态的 PipelineGraph,并 以 Mermaid、DOT 或 JSON 导出。

它小巧、位于叶子层级、严格只读:它不从编排器 import 任何东西 (所有内省都是 getattr 鸭子类型),因此永远不可能扰动它所 描述的系统。

这个引擎拓扑模型不同于工作流预览 v1PipelineGraph 描述已组装的 RAGSpine 组件并导出 Mermaid/DOT/JSON。工作流预览描述一个 Dify 兼容工作流, 含脱敏后的节点、边与几何信息。两者都是只读的;都不是执行格式。

目录结构

graph.py
topology.py

graph.py 是零依赖的值层(frozen dataclass + 导出器); topology.py 持有读取实时组装关系的三个构建器。公共 API 重新导出六个名字:NodeEdgePipelineGraphagent_topologyretriever_topologyservice_topology

值模型

graph.py 定义三个 frozen dataclass:

属性

类型

PipelineGraph 携带三个导出器和一个合并器:

方法返回输出
to_mermaid(*, direction="TD")str一个 flowchart——节点形状由 kind 决定(gate {}、store [(...)]、channel ([...]),其余为矩形)。
to_dot()str一个 Graphviz digraphrankdir=TB)。
to_dict()dict可 JSON 往返的 {title, nodes[...], edges[...]}
merge(other, *, group=None)PipelineGraph按 id 去重节点(先到者胜),保留所有边;可选地给新增节点打上 domain=group 标记。

导出在多次运行间确定且逐字节一致(稳定的声明顺序)。domain 分组可经 to_dict 往返,但在 v1 中 to_mermaid / to_dot 不输出 subgraph/cluster 块。

三个构建器

topology.py 从实时的、鸭子类型的组装关系推导图——只有当组件 确实被接入时,其节点才会出现。

agent_topology(*, narrative_retriever=None)

完整的请求流:parse_intent → clarify_scope(经一条 data 边咨询 SecurityGate)→ 路由菱形 → structured / narrative / composite 分支。叙事节点仅在注入了 narrative_retriever 时出现。

retriever_topology(retriever)

HybridRetriever 子管线:prefilter → BM25 [+vector] [+multi-query] → RRF → top_k。vector 节点当且仅当 retriever.embedding_backend 已设置时出现;multi-query 节点当且仅当 query_rewriter 已设置时出现。重排刻意不在此子图中。

service_topology(app)

服务拓扑:位于 agent 上游的 FAQ 短路,加上异步摄取路径(routes → queue → jobs)。基于 app.state.faq_cache 与 app.state.queue 做鸭子类型判断。

HybridRetriever.topology()(位于检索领域)是对 retriever_topology 的薄委托——因此一个已配置的检索器可以自行渲染,而 pipeline 包无需 import 编排器。

CLI — scripts/topology.py

scripts/topology.py 离线且确定性地渲染三种拓扑中的任意一种(它 构建默认/mock 组装——不需要 Redis、不需要 API key)。从项目根目录运行:

python scripts/topology.py                                  # agent → Mermaid → stdout
python scripts/topology.py --which retriever --of dot
python scripts/topology.py --of json --out docs/generated/topology.json

参数:

  • --of {mermaid,dot,json} — 输出格式(默认 mermaid)。
  • --which {agent,retriever,service} — 哪个拓扑(默认 agent)。
  • --out PATH — 写入文件(自动创建父目录);省略则打印到 stdout。写入 被 git 忽略的 docs/generated/ 可让重新生成的图示保持干净的 diff。

在底层,CLI 从默认/离线组装构建各拓扑:retrieverretriever_topology(HybridRetriever([]))(空语料上的纯 BM25 骨架); service → 用 MockProvider / FakeQueue / 空 FAQCache 调用 create_app(...),再 service_topology(app)agentagent_topology(narrative_retriever=object())(一个 哨兵值,使 narrative/composite 分支得以显示)。

Python API

from ragspine.pipeline import agent_topology

graph = agent_topology(narrative_retriever=object())
print(graph.to_mermaid())   # Mermaid flowchart string
print(graph.to_dot())       # Graphviz digraph string

import json
print(json.dumps(graph.to_dict(), ensure_ascii=False, indent=2))

相关阅读

本页目录