一个 .deepcell 的剖析

八个由纯 XML 构成的部分。在任意编辑器中打开一个,像读散文一样读它。

8 分钟阅读DeepCell 团队

一个谨慎的人面对一种新文件格式时,问出的第一个问题往往是对的那一个:里面有什么,我又能不能脱身?

黑箱式的格式对厂商而言是护城河,对用户而言是陷阱。你无法审计自己读不懂的东西,也无法导出自己解析不了的东西。而「相信我们,它是结构化的」这句话,从任何商业模式以留存为生的人口中说出,都不值得接受。

所以 .deepcell 恰恰相反。在任意文本编辑器中打开一个,它是 XML,它是 UTF-8,它能在 git 中做差异比较,cat 也能用。它有八个部分,每个部分各司其职,你可以从头到尾像读散文一样读完。

铺陈你正在阅读的这篇文章的那张矩阵,本身就是一个 .deepcell。十六篇博客文章作为条目(Items),六种财务角色加三个客户细分作为上下文(Contexts),受众契合度作为单元格的值。没有公式,没有推理图——schema 极简,因为这个具体用例只需要这么多。我们会一个部分一个部分地走一遍。

八个部分#

Header → StatusDefs → ContextDefs → ItemDefs →
CalcDefs → PresentationDefs → Values → Reasoning

CalcDefsReasoning 都是可选的。矩阵文件省略了它们。一个三表模型则会用到每一个部分。

1. Header#

谁、什么、何时。自由文本,不在 schema 上耍花样。

<Header>
  <Title>DeepCell Blog Content Plan — Role x Segment Coverage Matrix</Title>
  <Description>16 planned blog posts mapped against finance role and customer segment...</Description>
  <Author>DeepCell content planning</Author>
  <CreatedDate>2026-05-13</CreatedDate>
</Header>

如果别的什么都不记得,请记住这一点:标题和描述就是放在普通元素里的纯文本。没有专有编码,没有厂商的黑魔法。

2. StatusDefs#

每个值都带有一个状态。在财务模型里,这就是 actual(已报告)、projected(预测)、forecast(一条备选的前瞻路径)以及你的团队需要的任何自定义标签之间的区别。计算引擎用状态来决定哪些值对哪个情景可见——实际值会覆盖预测值,依此类推。

矩阵文件只需要一个:

<StatusDefinitions>
  <Status statusId="fit">
    <Label>Audience fit</Label>
  </Status>
</StatusDefinitions>

一条意义的轴线。这份文档要做的就只有这些。

3. ContextDefs#

时间与情景的轴线。在一个现金流折现(DCF)模型里,Q1_2027Q2_2027base_casebear_case 就活在这里。而在矩阵中,「上下文」这条轴线不是时间——而是受众:

<ContextDefinitions>
  <Context contextId="SS" level="0" statusRef="fit">
    <Label>Sell-side analyst</Label>
  </Context>
  <Context contextId="BS" level="0" statusRef="fit">
    <Label>Buy-side analyst (public markets)</Label>
  </Context>
  <Context contextId="PV" level="0" statusRef="fit">
    <Label>PE / VC analyst</Label>
  </Context>
  <!-- FPA, CF, IB, Individual, Team, Enterprise ... -->
</ContextDefinitions>

财务模型把它的各个时间段铺在这同一条轴线上。形态是一样的,变的只是标签。

4. ItemDefs#

行的轴线。行项目。在模型里它们是 RevenueCOGSGross_Margin——带类型、分层(level 0 到 3),并带有父级引用,引擎用这些引用来校验汇总。在矩阵里,它们是博客文章:

<Item itemId="post_03" order="30" level="0">
  <Label>[T1] Anatomy of a .deepcell</Label>
  <Description>What's inside the file? Am I locked in?</Description>
  <DataType>category</DataType>
</Item>

level="0" 表示顶层。一张合并损益表会把 Revenue 放在 level 0,把 Product_RevenueService_Revenue 放在 level 1,再把 SKU 级别的明细行放在它们之下。这种层级是被强制执行的——如果一个父级下面还有子级在干活,你就不能把值直接记到这个父级上。

5. CalcDefs#

矩阵一个都没有。它是一张实打实的表格,每个单元格都是直接写入的。所以 <CalculationDefinitions/> 空在那里:

<CalculationDefinitions/>

而在一个三表模型里,正是这个部分让这份文档名副其实。一条计算大致长这样(仅作示意——你的模型会有成百上千条):

<Calculation itemRef="Gross_Margin"
             formula="Revenue - COGS"
             scenarioRef="base_case"/>

引擎自带 NPV、IRR、SUMIF、IF 以及大约另外三十个函数,会解算依赖有向无环图(DAG)、检测环路,并在编辑时重新计算。重点不在于函数库——Excel 的更多。重点在于公式活在它们自己的部分里,与它们产出的值可以分开寻址。这正是它们可审计的原因。

6. PresentationDefs#

数据如何为渲染而布局。本例中是一个工作表、一个区块:

<PresentationDefinitions>
  <Sheet sheetId="matrix" name="Coverage Matrix">
    <Block blockId="matrix_block"
           name="Audience fit by post"
           blockType="table"
           xAxis="timecontext"
           yAxis="item"
           itemOrders="10-160"
           contextRefs="SS,BS,PV,FPA,CF,IB,Individual,Team,Enterprise" />
  </Sheet>
</PresentationDefinitions>

正是它告诉渲染器(Web 网格、Excel 插件、导出器——同一份中间表示同时驱动这三者):条目向下排列,上下文横向排列,区块从序号 10 一直跑到 160。呈现与数据是分开的。重新透视是一次呈现编辑,而不是一次模型编辑。

7. Values#

单元格本身。按条目和状态分组:

<ItemGroup itemRef="post_01" statusRef="fit">
  <Value contextRef="SS">primary</Value>
  <Value contextRef="BS">primary</Value>
  <Value contextRef="PV">primary</Value>
  <Value contextRef="FPA">secondary</Value>
  <Value contextRef="CF">primary</Value>
  <Value contextRef="IB">secondary</Value>
  <Value contextRef="Individual">primary</Value>
  <Value contextRef="Team">primary</Value>
  <Value contextRef="Enterprise">primary</Value>
</ItemGroup>

把这个区块大声读出来,你就得到了矩阵中一行的规格。「第 1 篇文章对卖方、买方、PE/VC、财务总监、个人、团队和企业而言是主要目标;对财务规划与分析(FP&A)和交易分析师而言是次要目标。」文件准确地告诉你的就是这些,而且就是这个顺序。

一个 .deepcell 里的每一个事实,都是这些 <Value> 元素之一,由条目 × 时间 × 情景 × 状态寻址。四个维度。没有隐藏状态。

8. Reasoning#

矩阵不携带推理图。一个真正的模型则会——用带类型的节点表示主张(Claims)假设(Assumptions)证据(Evidence)论证(Arguments),把一个数字与它背后的信念连接起来。折现率背后的缘由。增长曲线的来源。那张说着这个催化剂支撑那个论点,而这里就是它所引用的申报文件的论证图。

这是一个足够大的题目,值得拥有它自己的文章。展示你的推演过程讲的就是它。

我会被锁死吗?#

不会。deepcell to-excel 随时都能写出一个 xlsx——想要公式就保留公式,不想要就只导出值。推理图和版本历史无法在往返转换中存活(Excel 没地方放它们),但模型本身能干干净净地导出来。你想走,随时可以走。

这就是文件格式和平台之间的区别。我们是有意选了文件格式。完整的论证在为什么要一种新的文件格式里。


亲眼看看吧——在在线演练场中打开一个示例 .deepcell。改一个值,看着它的下游重新计算,检视任何一个数字背后的推理。