<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Apache HugeGraph Blog</title>
        <link>https://hugegraph.apache.org/cn/blog/</link>
        <description>Apache HugeGraph Blog</description>
        <lastBuildDate>Wed, 29 Oct 2025 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Agentic GraphRAG]]></title>
            <link>https://hugegraph.apache.org/cn/blog/2025/10/29/agentic-graphrag/</link>
            <guid>https://hugegraph.apache.org/cn/blog/2025/10/29/agentic-graphrag/</guid>
            <pubDate>Wed, 29 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[为了应对模型训练数据和现实生活中实际数据之间存在的时效性差异问题，RAG技术应运而生。RAG，顾名思义就是通过向外部数据源获取对应的数据（Retrieval），用于增强（Argument）大模型生成（Generation）回答质量的技术。]]></description>
            <content:encoded><![CDATA[<p>为了应对模型训练数据和现实生活中实际数据之间存在的时效性差异问题，RAG技术应运而生。RAG，顾名思义就是通过向外部数据源获取对应的数据（Retrieval），用于增强（Argument）大模型生成（Generation）回答质量的技术。</p>
<p>最早的RAG采用简单的Retrieval - Generation架构，我们拿到用户给出的问题，进行一定的预处理（关键词提取等等），得到预处理之后的问题，接着通过Embedding Model从海量资料中抓取相关的资料作为Prompt交给大模型用于增强模型回答的质量。</p>
<p>但是基于语义相似性匹配进行相关语料的抓取未必能够处理所有情况，因为能够用于增强回答质量的语料不一定和问题本身存在语义相似性。一个常见的例子就是：**告诉我“提出水是万物的本源”的哲学家的徒弟提出的本体论观点。**而我们的语料中并不直接存在这个问题的答案，语料库中可能提到：</p>
<ol>
<li class="">泰勒斯提出水是万物的本源</li>
<li class="">泰勒斯的弟子有阿纳克西曼德</li>
<li class="">阿纳克西曼德将没有任何形式规定性的阿派朗认定为万物的本源</li>
</ol>
<p>如果单纯从语义相似度匹配出发，我们大概率只能retrieval到第一个句子用于增强大模型的回答。但是缺失语料2和语料3的情况下，如果我们所使用的大模型训练语料中没有哲学相关知识，在缺失这些关键信息的情况下，大模型将无法正确回答这些问题，甚至会出现“幻觉”。</p>
<p>因此GraphRAG技术诞生了，常见的GraphRAG包含两个步骤：</p>
<ol>
<li class="">Offline: 我们需要离线对语料库进行图索引的构建（将非结构化语料转化为结构化数据存储到图数据库中）</li>
<li class="">Online: 当GraphRAG系统接收到用户问题时，根据图数据库捕捉到的语料库中不同实体之间的关联关系，我们可以从图数据库中抓取到上面的三句话（具体图数据库索引可能如下图所示）</li>
</ol>
<div style="text-align:center">
  <img decoding="async" loading="lazy" src="https://hugegraph.apache.org/blog/images/images-server/agentic-background.png" alt="image" width="400" class="img_ev3q">
</div>
<p>但是GraphRAG本身也存在几个问题：</p>
<ol>
<li class="">如何构建Graph Index是一门学问，Graph Index会影响到模型回答质量。</li>
<li class="">GraphRAG索引构建过程Token消耗巨大</li>
<li class="">GraphRAG中存在各种各样的图算法，如何Retrieval效果最好呢？（配置空间过大）</li>
</ol>
<p>本次项目主要针对第三个问题展开。我们希望借助大模型的泛化能力使其自动识别用户问题中的意图，然后选择合适配置（比如选择最合适的图算法）从图数据库中读取对应的数据用于增强大模型回答质量——也就是本次项目Agentic GraphRAG的目的所在。</p>
<h1><strong>现有 Workflow：优雅的解耦，未竟的并行</strong></h1>
<p>现在的HugeGraph-AI项目中存在两个核心抽象：</p>
<ol>
<li class="">Operator：表示「原子式的操作单元」，负责完成一个明确的子任务，如向量索引构建、向量相似度查询、图数据相关操作等等</li>
<li class="">Workflow：由Operator作为节点构成的<strong>链状</strong>执行流。项目中预定义好的Workflow和项目Demo用例一一对应（如GraphRAG， Vector-Similarity-Based RAG）</li>
</ol>
<p>由于Operator的实现需要遵循下面的接口:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">Operator</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token decorator annotation punctuation" style="color:rgb(199, 146, 234)">@abstractmethod</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">run</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">dict</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token builtin" style="color:rgb(130, 170, 255)">str</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> Any</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">dict</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token builtin" style="color:rgb(130, 170, 255)">str</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain">Any</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<p>Operator在实际运行时接受字典类型的context对象作为输入，返回的对象也是一个字典，可以用来作为下一个Operator的输入，这样的设计有一个很高明的地方——他将不同的Operator之间的依赖关系和Operator本身的具体实现解耦了，每个Operator是一个相对独立的存在，如果Operator A需要依赖Operator B的输出，那么只需要检查context对象中是否存有Operator B的输出即可。这是一种低耦合的设计。好处是我们能很方便地将不同的Operator自由组合。根据不同的用户输入组装（配置）合适Workflow Serving用户请求，那不正是我们在项目背景中提到的Agentic GraphRAG的目的所在吗？</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">👉🏼 理论上现有设计已经可以正常过渡到Agentic GraphRAG，但是现有设计存在诸多悬而未决的问题：</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    1. 现有调度器仅仅支持链状Workflow，缺失了可能存在的并行空间</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    2. 现有调度器无法复用被反复使用到的Workflow</span><br></div></code></pre></div></div>
<h1>打破链式束缚，拥抱全新架构</h1>
<p>之前的调度器给我们的启发是Operator粒度的解耦是一个不错的设计理念，但是调度器本身能力有限，限制了Workflow的能力。因此我们计划替换项目中的调度器！经过对几种不同的Workflow编排框架进行简单的调研之后，我们认为下面几个特性是我们筛选调度器的标准。（下面我们统一将框架编排对象称为Workflow，Workflow由一系列Task组成）</p>
<ol>
<li class="">并行性：Workflow中没有数据依赖关系的不同Task能否支持自动并行</li>
<li class="">低耦合：Task的具体实现应该和Workflow本身解耦（用人话：一种Task可以作为多种不同的Workflow的节点，同时Task的实现是否需要包含与其他Task依赖关系约束？）</li>
<li class="">数据共享：由于我们希望不同的Task之间的依赖关系解耦，那我们就需要Workflow粒度的数据共享机制用来在不同的Task共享数据（用于参数传递）</li>
<li class="">提供Python接口</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai框架大乱斗">AI框架大乱斗<a href="https://hugegraph.apache.org/cn/blog/2025/10/29/agentic-graphrag/#ai%E6%A1%86%E6%9E%B6%E5%A4%A7%E4%B9%B1%E6%96%97" class="hash-link" aria-label="Direct link to AI框架大乱斗" title="Direct link to AI框架大乱斗" translate="no">​</a></h2>
<p>我们首先将目光放到了现在炙手可热的AI Workflow调度框架。围绕前面提到的几个维度，我们分别调研了下面几种不同的Workflow编排框架——LlamaIndex，Agno，Pydantic-Ai，LangGraph。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="llamaindex">LlamaIndex<a href="https://hugegraph.apache.org/cn/blog/2025/10/29/agentic-graphrag/#llamaindex" class="hash-link" aria-label="Direct link to LlamaIndex" title="Direct link to LlamaIndex" translate="no">​</a></h3>
<p>对于LlamaIndex，我们用一个常见的例子说明LlamaIndex这个框架的设计理念。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">from</span><span class="token plain"> workflows </span><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> Workflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> Context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> step</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">from</span><span class="token plain"> workflows</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">events </span><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> StartEvent</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> StopEvent</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> Event</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">StepEvent</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">Event</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    message</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">str</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">MyWorkflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">Workflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token decorator annotation punctuation" style="color:rgb(199, 146, 234)">@step</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">step_one</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> ev</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> StartEvent</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"> StepEvent</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">       current_count </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">await</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">store</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"count"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> default</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">       current_count </span><span class="token operator" style="color:rgb(137, 221, 255)">+=</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">       </span><span class="token keyword" style="font-style:italic">await</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">store</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token builtin" style="color:rgb(130, 170, 255)">set</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"count"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> current_count</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">       </span><span class="token keyword" style="font-style:italic">print</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"step one called once"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">       </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> StepEvent</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"launch step two"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">       </span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token decorator annotation punctuation" style="color:rgb(199, 146, 234)">@step</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">step_two</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> ev</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> StepEvent</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"> StopEvent</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">       </span><span class="token keyword" style="font-style:italic">print</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"step two called once"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">       </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> StopEvent</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><br></div></code></pre></div></div>
<p>从上面这个简单的例子我们可以看到很多问题。首先明确一个观念：Workflow由两个元素构成：Task，Task之间的依赖关系。只要这两个元素确定之后一个Workflow就确定下来了。我们可以看到LlamaIndex中每个Task(对应代码中用@step注解的函数)的实现和Workflow存在依赖关系。因为每个Task的实现都需要传入Event对象作为参数，但是Event参数其实就是对Task之间依赖关系的一种限定。所以LlamaIndex不具备低耦合的特点。同时我们也发现Task作为Workflow类成员函数本身就违背了我们前面提到的Task需要能够在多种不同Workflow中使用的诉求。但是经过调研，LlamaIndex的数据共享和并行特性支持还算不错。只不过从基于事件驱动模型构建的编程接口在保证了接口易用性的同时也牺牲了编程的灵活性。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="agno">Agno<a href="https://hugegraph.apache.org/cn/blog/2025/10/29/agentic-graphrag/#agno" class="hash-link" aria-label="Direct link to Agno" title="Direct link to Agno" translate="no">​</a></h3>
<p>同样还是从例子入手</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">from</span><span class="token plain"> agno</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">workflow </span><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> Router</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> Step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> Workflow</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">route_by_topic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">step_input</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"> List</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">Step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    topic </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> step_input</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token builtin" style="color:rgb(130, 170, 255)">input</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">lower</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"tech"</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">in</span><span class="token plain"> topic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">Step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">"Tech Research"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> agent</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">tech_expert</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">elif</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"business"</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">in</span><span class="token plain"> topic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">Step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">"Business Research"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> agent</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">biz_expert</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">else</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">Step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">"General Research"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> agent</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">generalist</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">workflow </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> Workflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">"Expert Routing"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    steps</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        Router</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">"Topic Router"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            selector</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">route_by_topic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            choices</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">tech_step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> business_step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> general_step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        Step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">"Synthesis"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> agent</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">synthesizer</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">workflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">print_response</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"Latest developments in artificial intelligence and machine learning"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> markdown</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token boolean" style="color:rgb(255, 88, 116)">True</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><br></div></code></pre></div></div>
<p>从这个例子我们可以看到Workflow本身和Task之间的绑定关系是通过指定steps参数确定的。理论上来说定义好一种Task之后我们可以将其用于不同的Workflow中，Agno的设计符合我们的低耦合标准。</p>
<p>但是数据共享和任务并行方面的支持就存在一定的限制。</p>
<p>首先是任务并行，例子如下：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">workflow </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> Workflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">"Parallel Research Pipeline"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    steps</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        Parallel</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            Step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">"HackerNews Research"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> agent</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">hn_researcher</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            Step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">"Web Research"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> agent</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">web_researcher</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            Step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">"Academic Research"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> agent</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">academic_researcher</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">"Research Step"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        Step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">"Synthesis"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> agent</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">synthesizer</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Combines the results and produces a report</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><br></div></code></pre></div></div>
<p>Agno专门设计了并行接口，我们需要在静态编译时（Python哪有编译时？应该叫写代码的时候哈哈😀）明确哪些任务可以并行。但是Agentic GraphRAG最终构造的Workflow有可能是在运行时由模型规划出来的，是动态运行时明确的，出于这样的考量，我们认为Agno的并行特性并不符合我们的要求</p>
<p>接下来是数据共享，Agno框架中支持三种不同的Task：</p>
<ol>
<li class="">Agent</li>
<li class="">由多个Agent构成的Team</li>
<li class="">Pure Function</li>
</ol>
<p>我们检查了调研时最新版本的Agno源代码，发现Agno支持的状态共享仅限于Agent和Team。那么对于那些适合用Pure Function实现的Task，我们就需要额外支持数据共享的机制。因此Agno的数据共享机制也不符合我们的要求。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pydantic-ai">Pydantic-Ai<a href="https://hugegraph.apache.org/cn/blog/2025/10/29/agentic-graphrag/#pydantic-ai" class="hash-link" aria-label="Direct link to Pydantic-Ai" title="Direct link to Pydantic-Ai" translate="no">​</a></h3>
<p>我们从官方文档中就看到</p>
<div style="text-align:center">
  <img decoding="async" loading="lazy" src="https://hugegraph.apache.org/blog/images/images-server/agentic-pydantic.png" alt="image" width="800" class="img_ev3q">
</div>
<p>Pydantic-Ai框架竟然不支持Task粒度的自动并行。</p>
<p>和LlamaIndex框架类似采用事件驱动的编程模型，因此Workflow和Task之间不算是完全解耦，但是值得注意的时Pydantic-Ai的Task是可以用到多个不同的Workflow的。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="langgraph">LangGraph<a href="https://hugegraph.apache.org/cn/blog/2025/10/29/agentic-graphrag/#langgraph" class="hash-link" aria-label="Direct link to LangGraph" title="Direct link to LangGraph" translate="no">​</a></h3>
<p>最后的最后，终于还是遇到了LangGraph，之前一直没有调研LangGraph的原因是因为由团队伙伴认为LangGraph本身太重了。在上一个版本中，即使只是使用LangGraph的部分功能（调度），也需要引入LangGraph的完整依赖，引入LangGraph可能会让项目变“重”。时不时在其他开源项目中看到“xxx比LangGraph快xxx倍”诸如此类的字眼也确实影响到我们的决策判断。所以直到此时此刻才把它提上调研日程。</p>
<p>我们还是来看看LangGraph的例子</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">State</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">TypedDict</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    topic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">str</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    joke</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">str</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    improved_joke</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">str</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Nodes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">generate_joke</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">state</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> State</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">"""First LLM call to generate initial joke"""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    msg </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> llm</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">invoke</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string-interpolation string" style="color:rgb(195, 232, 141)">f"Write a short joke about </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token string-interpolation interpolation">state</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string-interpolation interpolation string" style="color:rgb(195, 232, 141)">'topic'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token string-interpolation string" style="color:rgb(195, 232, 141)">"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token string" style="color:rgb(195, 232, 141)">"joke"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> msg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">content</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">check_punchline</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">state</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> State</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">"""Gate function to check if the joke has a punchline"""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Simple check - does the joke contain "?" or "!"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"?"</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">in</span><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">"joke"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">or</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"!"</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">in</span><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">"joke"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"Pass"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"Fail"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">improve_joke</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">state</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> State</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">"""Second LLM call to improve the joke"""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    msg </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> llm</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">invoke</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string-interpolation string" style="color:rgb(195, 232, 141)">f"Make this joke funnier by adding wordplay: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token string-interpolation interpolation">state</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string-interpolation interpolation string" style="color:rgb(195, 232, 141)">'joke'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token string-interpolation string" style="color:rgb(195, 232, 141)">"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token string" style="color:rgb(195, 232, 141)">"improved_joke"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> msg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">content</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Build workflow</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">workflow </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> StateGraph</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">State</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Add nodes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">workflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">add_node</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"generate_joke"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> generate_joke</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">workflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">add_node</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"improve_joke"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> improve_joke</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Add edges to connect nodes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">workflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">add_edge</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">START</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"generate_joke"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">workflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">add_conditional_edges</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">"generate_joke"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> check_punchline</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token string" style="color:rgb(195, 232, 141)">"Fail"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"improve_joke"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"Pass"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> END</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">workflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">add_edge</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"improve_joke"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> END</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Compile</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">chain </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> workflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token builtin" style="color:rgb(130, 170, 255)">compile</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Invoke</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">state </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> chain</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">invoke</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token string" style="color:rgb(195, 232, 141)">"topic"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"cats"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<p>这是一个我简化后的官方文档中的例子，我们可以看到基于GraphAPI的LangGraph通过调用workflow.add_edge指定Workflow的依赖关系，将Workflow和Task解耦。同时支持全局State作为Workflow的状态进行Task之间的数据共享。根据官方文档的说法，LangGraph是支持Task自动并行执行的。我们总算是找到了符合所有要求的Workflow编排框架了！</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="总结">总结<a href="https://hugegraph.apache.org/cn/blog/2025/10/29/agentic-graphrag/#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="Direct link to 总结" title="Direct link to 总结" translate="no">​</a></h3>








































<table><thead><tr><th></th><th>并行性</th><th>低耦合</th><th>数据共享</th><th>Python Interface</th></tr></thead><tbody><tr><td>LlamaIndex</td><td>支持</td><td>不支持</td><td>支持</td><td>支持</td></tr><tr><td>Agno</td><td>支持但不符合要求</td><td>支持</td><td>支持但不符合要求</td><td>支持</td></tr><tr><td>Pydantic-Ai</td><td>不支持</td><td>不支持</td><td>支持</td><td>支持</td></tr><tr><td>LangGraph</td><td>支持</td><td>支持</td><td>支持</td><td>支持</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cgraph--graph-with-python-interaface-implement-in-c">CGraph —— Graph with Python Interaface Implement in C++<a href="https://hugegraph.apache.org/cn/blog/2025/10/29/agentic-graphrag/#cgraph--graph-with-python-interaface-implement-in-c" class="hash-link" aria-label="Direct link to CGraph —— Graph with Python Interaface Implement in C++" title="Direct link to CGraph —— Graph with Python Interaface Implement in C++" translate="no">​</a></h2>
<p>正当我们将目光聚焦于 LangGraph 时，团队伙伴提到了一个新的方案——CGraph，这是由开源创作者Chunel使用C++开发的图调度框架，对标SOTA任务调度框架——taskflow。CGraph，学名Color Graph，虽然是C++项目，但是它很贴心地提供了Python接口。深入了解后，我们发现 CGraph 的设计理念与我们不谋而合：和LangGraph一样，CGraph基于图的声明式 API，完美支持我们所需的并行化、低耦合和数据共享需求。</p>
<p>如果说“C++ 站在编程语言鄙视链顶端”是个有趣的玩笑，那它背后反映的其实是程序员对底层性能的极致追求。除去这个“先天”优势， CGraph 相比 LangGraph 最大的不同，在于它的<strong>纯粹</strong>——它不构建庞大的生态，只专注于将“任务调度”这一件事做到极致。</p>
<p>然而，真正让我们下定决心的，是这个项目的“心跳”。我们联系上了作者 Chunel，感受到了 CGraph 作为一个项目旺盛的生命力。在开源世界里，<strong>活力即未来</strong>。一个持续进化、积极响应的社区，远比一个功能冻结的庞然大物更值得信赖。</p>
<p>我们相信，优秀的技术选型，不仅是功能的匹配，更是对项目未来潜力的认同。（欢迎一同见证它的成长：<a href="https://github.com/ChunelFeng/CGraph%EF%BC%89" target="_blank" rel="noopener noreferrer" class="">https://github.com/ChunelFeng/CGraph）</a></p>
<div style="text-align:center">
  <img decoding="async" loading="lazy" src="https://hugegraph.apache.org/blog/images/images-server/agentic-frame.png" alt="image" width="800" class="img_ev3q">
</div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="架构设计">架构设计<a href="https://hugegraph.apache.org/cn/blog/2025/10/29/agentic-graphrag/#%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1" class="hash-link" aria-label="Direct link to 架构设计" title="Direct link to 架构设计" translate="no">​</a></h2>
<p>起初，我们的目标很纯粹：基于CGraph，打造一个属于我们自己的调度器。然而深入思考之后，我们发现：一个好的调度器，<strong>源于对调度对象的深刻理解</strong>（是时候拷问自己了🤣）。就像CPU调度器和GPU调度器由于其调度对象以及生态定位的不同也会采取不同调度策略。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="抽象设计是否合理">抽象设计是否合理？<a href="https://hugegraph.apache.org/cn/blog/2025/10/29/agentic-graphrag/#%E6%8A%BD%E8%B1%A1%E8%AE%BE%E8%AE%A1%E6%98%AF%E5%90%A6%E5%90%88%E7%90%86" class="hash-link" aria-label="Direct link to 抽象设计是否合理？" title="Direct link to 抽象设计是否合理？" translate="no">​</a></h3>
<p>所以我们开始考察那个被我们称之为Workflow的抽象，在上一个设计中，它是由一系列Operator组成的链表。这样的设计否定了并行的可能，那么如果我们说Workflow是一系列Operator组成的DAG图是否合理呢？</p>
<p>直观来说这样的定义很合理，但是实际实践下来，我们发现Workflow中的每个节点（后面我们称之为Node）和Operator一一对应却不是一个好的设计，因为我们需要在不同的请求之间复用Workflow（这样可以节省Workflow构造过程中不可避免的资源创建以及一些DAG图校验带来的性能开销）。</p>
<p>举个例子，向量相似度查询是一个很常见的RAG流程，但是根据不同底层向量数据库暴露的接口不同，我们可能需要提供FaissVectorSearch、VectraVectorSearch等多种目的相同但是具体实现不同的Operator。如果我们将Operator和Workflow中的Node等同，那么我们对于Workflow的复用机会将大大减少，因为使用Faiss进行搜索和使用Vectra进行搜索的Workflow将会是不同的Workflow，但是如果我们将功能类似的向量索引Operator都封装到VectorSearchNode中，那么我们是不是能够有更多的Workflow复用机会呢？在VectorSearchNode的具体实现中我们只需要根据需要调用对应的Operator即可。通过在Workflow和Operator中间加一层的方式，有下面三个好处：</p>
<ol>
<li class="">新增新的Operator，我们只需要修改对应Node的具体实现即可，不需要修改上层Workflow的逻辑。Operator对Node负责，Node对Workflow负责，很好地实现了职能分离。</li>
<li class="">拥有更多的Workflow复用的机会。</li>
<li class="">通过引入新的Node抽象，我们在重构的过程中不需要修改底层Operator的实现，减轻了重构过程中的心智负担。</li>
</ol>
<div style="text-align:center">
  <img decoding="async" loading="lazy" src="https://hugegraph.apache.org/blog/images/images-server/agentic-abstract.png" alt="image" width="800" class="img_ev3q">
</div>
<p>既然我们希望跨请求复用同类Workflow，那么我们就需要保证Workflow本身是无状态的，因为如果复用的Workflow还带着上一个请求的状态，用户就可能得到发生意料之外的结果。而Workflow的状态可以分为两种：</p>
<ol>
<li class="">用户输入的状态（我们称之为WorkflowInput）：这部分由用户的请求构成</li>
<li class="">Workflow的中间状态（我们称之为WorkflowState）：由Workflow中各节点（Node）在执行过程中产生的临时数据、计算结果等。</li>
</ol>
<p>我们需要保证Workflow执行的过程中这两部分状态是干净的。但是这两种不同的状态使用时机又不同，这也就决定了他们截然不同的生命周期：</p>
<ul>
<li class="">WorkflowInput在Workflow执行<strong>前</strong>被构建和注入，在Workflow执行<strong>结束后</strong>其使命便已完成，应被销毁。</li>
<li class="">WorkflowState在Workflow执行<strong>前</strong>必须为空或处于初始状态（pristine），在执行<strong>过程</strong>中被动态读写。</li>
</ul>
<p>我们利用 CGraph 框架提供的 <code>GParam</code>（全局参数）抽象来实现精细化的状态隔离：</p>
<ol>
<li class=""><strong>分离上下文</strong>: 我们为WorkflowInput和WorkflowState定义两个独立的&nbsp;<code>GParam</code>&nbsp;上下文。</li>
<li class=""><strong>注入生命周期钩子</strong>: 我们在工作流的执行逻辑外层进行封装，实现以下自动化清理机制：
<ul>
<li class=""><strong>执行前 (Pre-execution Hook)</strong>: 自动重置（reset）WorkflowState上下文，确保每次执行都在一个“干净的画布”上开始。</li>
<li class=""><strong>执行后 (Post-execution Hook)</strong>: 自动清理（clear）WorkflowInput上下文，防止其数据泄露到下一次调用。</li>
</ul>
</li>
</ol>
<p>这样我们可以保证每次Workflow执行时这两种状态中都只包含本次请求的状态。由于WorkflowInput状态在Workflow执行结束就被重置了，我们只能从WorkflowState中有选择性地选择部分数据返回给用户。因此我们得到了一个Flow抽象应该实现的接口。</p>
<div style="text-align:center">
  <img decoding="async" loading="lazy" src="https://hugegraph.apache.org/blog/images/images-server/agentic-lifeline.svg" alt="image" width="1000" class="img_ev3q">
</div>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">BaseFlow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">ABC</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">"""</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">    Base class for flows, defines three interface methods: prepare, build_flow, and post_deal.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">    """</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token decorator annotation punctuation" style="color:rgb(199, 146, 234)">@abstractmethod</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">prepare</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> prepared_input</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> WkFlowInput</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">**</span><span class="token plain">kwargs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">"""</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        根据用户请求初始化Workflow输入状态（WkFlowInput）</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        """</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token decorator annotation punctuation" style="color:rgb(199, 146, 234)">@abstractmethod</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">build_flow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">**</span><span class="token plain">kwargs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"> GPipeline</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">"""</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        用来构建可以运行在CGraph之上的Workflow对象</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        """</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token decorator annotation punctuation" style="color:rgb(199, 146, 234)">@abstractmethod</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">post_deal</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">**</span><span class="token plain">kwargs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">"""</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        从中间状态（WkFlowState）中组装返回给用户的Response</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        """</span><br></div></code></pre></div></div>
<p>那么回到Node抽象本身，Node本身是对某个功能的抽象，其底层可能对应着多种不同的抽象。我们大致需要考虑下面几个问题：</p>
<ol>
<li class="">如何将Node层和Operator层尽可能解耦</li>
<li class="">Node本身是可以并行的，而Workflow内部存在共享数据，那么如何解决可能存在的并发问题</li>
</ol>
<p>我们知道Operator的run方法输入输出都是字典（见上面现有Workflow架构的介绍），为了使得Node层和Operator层尽可能地解耦，我们希望Node层也按照相同的方式调用Operator，因此我们需要为WorkflowState实现一个json序列化方法，在调用Operator前将当前Workflow中间状态转化为字典格式然后交给Operator，然后将Operator执行结果重新反序列化为WorkflowState。为了解决并发访问带来的数据竞争问题，我们可以采用MVCC的并发控制方法，保证Operator操作的是多个不同的副本，得到Operator的返回结果之后，在有并发安全的锁保护的情况下将返回的结果同步到WorkflowState中。因此我们可以得到Node的抽象大致如下：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">BaseNode</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">GNode</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token operator" style="color:rgb(137, 221, 255)">//</span><span class="token plain"> Workflow中间状态</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Optional</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">WkFlowState</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">None</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token operator" style="color:rgb(137, 221, 255)">//</span><span class="token plain"> Workflow输入状态</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    wk_input</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Optional</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">WkFlowInput</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">None</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">init</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		    </span><span class="token operator" style="color:rgb(137, 221, 255)">//</span><span class="token plain"> 从Pipeline中获取对应状态</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> init_context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">node_init</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">"""</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        重写这个方法定制化Node初始化逻辑</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        """</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> CStatus</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">run</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">"""</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        Main logic for node execution, can be overridden by subclasses.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        Returns a CStatus object indicating whether execution succeeded.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        """</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        sts </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">node_init</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> sts</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">isErr</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> sts</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">context </span><span class="token keyword" style="font-style:italic">is</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">None</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> CStatus</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"Context not initialized"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	      </span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">lock</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">try</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            data_json </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">to_json</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">finally</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">unlock</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        res </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">operator_schedule</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">data_json</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">       </span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">lock</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">try</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> res </span><span class="token keyword" style="font-style:italic">is</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">not</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">None</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">and</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">isinstance</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">res</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">dict</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">                self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">assign_from_json</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">res</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><span class="token keyword" style="font-style:italic">elif</span><span class="token plain"> res </span><span class="token keyword" style="font-style:italic">is</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">not</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">None</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">                log</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">warning</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"operator_schedule returned non-dict type: %s"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">res</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">finally</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">unlock</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> CStatus</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">operator_schedule</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> data_json</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"> Optional</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">Dict</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">"""</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        根据用户请求或者Workflow状态决定调用哪些Operator</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        """</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">raise</span><span class="token plain"> NotImplementedError</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"Subclasses must implement operator_schedule"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<p>至此，我们完成了调度对象Workflow的抽象设计。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="调度器设计">调度器设计<a href="https://hugegraph.apache.org/cn/blog/2025/10/29/agentic-graphrag/#%E8%B0%83%E5%BA%A6%E5%99%A8%E8%AE%BE%E8%AE%A1" class="hash-link" aria-label="Direct link to 调度器设计" title="Direct link to 调度器设计" translate="no">​</a></h3>
<p>在新的调度器体系中，Workflow 对象的实例化与销毁是一项不可忽视的资源开销。为了最大限度地降低延迟、减少内存抖动，我们引入了 Workflow Pool 机制，旨在实现 Workflow 实例的高效复用。
我们充分利用了 CGraph 框架底层提供的 Pool 抽象，并将其应用于 Workflow 的生命周期管理。其核心机制如下：</p>
<ul>
<li class=""><strong>分类池化</strong>: 系统为<strong>每种类型</strong>的 Workflow 维护一个专属的、独立的 Workflow Pool。这确保了请求只会被分发给结构完全相同的 Workflow 实例。</li>
<li class=""><strong>按需获取与动态扩容</strong>: 当一个新请求到达时，调度器的执行逻辑遵循以下策略：
<ol>
<li class=""><strong>查询（Pool Hit）</strong>: 首先，调度器会尝试从对应类型的&nbsp;Workflow Pool&nbsp;中获取一个空闲的&nbsp;Workflow&nbsp;实例。如果成功，则立即使用该实例处理请求，实现了零开销复用。</li>
<li class=""><strong>创建（Pool Miss）</strong>: 如果池中无可用实例，调度器将动态创建一个新的&nbsp;Workflow。这个新实例会立即用于服务当前请求。这种策略保证了系统在高负载下依然具备良好的弹性。</li>
</ol>
</li>
<li class=""><strong>自动归还</strong>: 无论是从池中获取的实例还是新创建的实例，在完成请求处理后，都将被<strong>自动归还</strong>到其所属的 Workflow Pool 中，等待下一次调度。</li>
</ul>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">🤔 当前版本的 Scheduler 实现了其最核心的职责，为整个系统提供了一个稳定且高效的调度基座。其主要特性包括：</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    1. 能够根据请求类型，准确地调度对应的&nbsp;Workflow&nbsp;实例进行处理。</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    2. 内置了基于&nbsp;Workflow&nbsp;类型的池化（Pooling）机制，通过复用已有实例，显著降低了高并发场景下的对象创建与销毁开销。</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    但是在未来，Scheduler值得优化的地方还有很多，比如：</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    1. 工作负载感知的资源隔离：并非所有&nbsp;Workflow&nbsp;的资源消耗都是均等的。我们将利用 CGraph 提供的线程池绑定功能，为不同类型的&nbsp;Workflow Pool&nbsp;分配专属的计算资源。</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    2. 生产级容量管理与稳定性：为每个&nbsp;Workflow Pool&nbsp;引入可配置的容量上限。在生产环境中，无限制的资源池是潜在的风险点。通过设置池大小的上限，我们可以防止系统在极端负载下耗尽内存，确保服务的稳定性。</span><br></div></code></pre></div></div>
<p>现在我们可以得到整个项目的整体架构图</p>
<div style="text-align:center">
  <img decoding="async" loading="lazy" src="https://hugegraph.apache.org/blog/images/images-server/agentic-scheduler.png" alt="image" width="600" class="img_ev3q">
</div>
<ol>
<li class="">Scheduler收到请求后，首先向PipelinePool查询是否存在对应类型的空闲Pipeline
<ol>
<li class="">当用户请求到来时，Http Router根据请求的类型将任务委托给核心的Scheduler，请求一个能够处理该类型任务的Pipeline实例。</li>
</ol>
<ul>
<li class="">若PipelinePool中存在空闲Pipeline，则Scheduler直接返回该Pipeline</li>
<li class="">若PipelinePool中不存在空闲Pipeline，则调用对应类型的WorkflowBuilder构建该类型的Pipeline并返回</li>
</ul>
</li>
<li class="">无论Pipeline是从池中获取的还是新创建的，它都会立即执行请求处理，并将Response返回给用户。处理完成后，该Pipeline实例并<strong>不会被销毁</strong>。相反，它会被<strong>自动释放</strong>并归还到PipelinePool中，状态重置后等待下一次被调度。</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="agentic-graphrag-理想与现实的碰撞">Agentic GraphRAG: 理想与现实的碰撞<a href="https://hugegraph.apache.org/cn/blog/2025/10/29/agentic-graphrag/#agentic-graphrag-%E7%90%86%E6%83%B3%E4%B8%8E%E7%8E%B0%E5%AE%9E%E7%9A%84%E7%A2%B0%E6%92%9E" class="hash-link" aria-label="Direct link to Agentic GraphRAG: 理想与现实的碰撞" title="Direct link to Agentic GraphRAG: 理想与现实的碰撞" translate="no">​</a></h3>
<p>项目之初，我们畅想一个完全“Agentic”的 GraphRAG。你只需告诉它你的问题，一个强大的 LLM 就能像一位资深架构师，从一堆工具（Nodes/Operators）中为你量身定制一套最高效的执行流程（Workflow）。
但理想与现实之间总有距离。我们深入调研了 chat2graph 等类似项目，并实际动手检验效果。结果发现，让 LLM 凭空“创造”一个完美的、无懈可击的执行计划，比我们想象的要难得多。即使是使用 Gemini 2.5 Flash 这样的模型，它在理解复杂指令并将其精确映射到一系列操作时，也时常力不从心。一方面，因为chat2graph的调用链可能会很长，即便大模型推理单步准确率高达95%，但随着调用链路的延长，误差会逐级累积，导致整体任务的成功率急剧下降。另一方面，即使调用链的问题不存在，通过prompt的方式让模型自动规划的准确度目前仍然不能使人满意。完全依赖大模型进行零样本工作流规划的时代，或许还未完全到来。
“一口吃不成胖子”，于是我们做出了一个关键决策：让大模型从零开始构建工作流存在阻碍，但是如果让大模型基于Workflow模板“实例化”具体的Workflow或许是一种可行的方案。我们构建了一个功能强大、高度模块化的 GraphRAG 工作流，而 LLM 的任务，就是根据观众用户请求的特点，为Workflow选择最优配置。这是我们在Agentic GraphRAG和GraphRAG之间找到的一个平衡点。
这让我们的核心问题发生了转变，不再是“如何从零构建”，而是：</p>
<blockquote>
<p>我们如何从用户的寥寥数语中，让大模型知道什么是GraphRAG的最优配置？</p>
</blockquote>
<p>举个具体的例子：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">👉🏼 给定一个用户请求，我们怎么通过用户的请求推断出最优配置呢？</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    具体例子：用户的请求是：告诉我“提出水是万物的本源”的哲学家的徒弟提出的本体论观点。那么采用什么图算法进行知识图谱检索会使得结果更精确呢？</span><br></div></code></pre></div></div>
<p>综上所述，LLM需要站在自然语言处理和图数据库这两座大山上才能真正窥见问题全貌，而他现在还处于山脚🤣。而这，就是我们下一座亟待翻越的高山。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="反思">反思<a href="https://hugegraph.apache.org/cn/blog/2025/10/29/agentic-graphrag/#%E5%8F%8D%E6%80%9D" class="hash-link" aria-label="Direct link to 反思" title="Direct link to 反思" translate="no">​</a></h2>
<p>在本项目中，我们采用了 CGraph 作为底层的图调度框架。其基于 Graph API 的设计，成功地将 Workflow 的定义与各个 Node 的具体实现解耦，赋予了系统良好的扩展性。</p>
<p>然而，我们也注意到，这种声明式 API 在带来灵活性的同时，也引入了新的编程复杂度。随着我们越来越多地使用 Condition、Region 等 CGraph 的高级特性，用于构建 Workflow 的代码可读性和可维护性开始面临挑战。这引发了我们的一个核心思考：<strong>是否存在一种更为直观和用户友好的接口，既能保持框架的灵活性，又能降低定义复杂流程时的认知负担？</strong></p>
<p>举一个具体的例子：当我们需要定义一个主 Workflow 和一个作为其子集的子 Workflow 时，目前的实现方式倾向于将子 Workflow 封装为 GRegion，并利用 Condition 节点来控制其执行。这种“合并”式的定义方式虽然功能上可行，但无疑增加了 Workflow 的内在复杂度和理解难度。我们设想，如果 CGraph 框架能原生提供<strong>子图组合 (Subgraph Composition)</strong> 的能力，允许开发者将一个 Workflow 显式声明为另一个 Workflow 的一部分，或许能从根本上简化这类场景的实现。</p>
<p>尽管存在上述挑战，CGraph 框架在项目中依然发挥了重要作用，显著提升了我们的工程效率：</p>
<ol>
<li class=""><strong>性能诊断简化</strong>：框架自带的 Perf 工具使性能瓶颈定位更为便捷，即使大部分耗时最终集中在 LLM 调用上，该工具依然为我们提供了清晰的性能视图。</li>
<li class=""><strong>调度逻辑下沉</strong>：底层的 Pooling 抽象机制，使我们能够将部分调度逻辑无缝下沉至 C++ 侧，而上层业务代码无需关心其具体实现。</li>
</ol>
<p>最后，我想说，技术上的探索固然重要，但这段旅程中最宝贵的财富，是与优秀的同行者共事的经历以及从中获得的成长与感悟。这才是推动我们不断前行的真正动力。</p>
<h1>结语</h1>
<p>在 HugeGraph-AI 的重构与革新过程中，AI工具的引入大大提升了开发效率，但最终的决策和取舍，仍然需要严谨的思考，Talk is not cheap, thinking is necessary。每当遇到新的技术难题，我们总能提出多种解决方案，而真正的考验在于如何在它们之间进行权衡 (trade-off)。技术世界并非非黑即白，不同的架构选择、方案取舍，往往对应着不同的目标用户与应用场景。我们对 CGraph 的选择，正是这一理念的最佳实践。它并非业界首个图调度框架，但在性能、灵活性与开发成本等诸多维度的考量中，它为我们提供了最契合当前需求的平衡点——在这条充满权衡的道路上，它离我们最近。</p>
<p>这也让我们更加坚信：一个产品或技术最终被选择，往往不只因其理念的先进，更在于它能否在复杂的现实约束下，为特定问题提供最务实的解法。</p>
<p>项目暂告一段落，由衷感谢每一位并肩作战的伙伴！这段经历因你们而精彩。</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ToplingDB Quick Start]]></title>
            <link>https://hugegraph.apache.org/cn/blog/2025/10/09/toplingdb-quick-start/</link>
            <guid>https://hugegraph.apache.org/cn/blog/2025/10/09/toplingdb-quick-start/</guid>
            <pubDate>Thu, 09 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[前置条件]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="前置条件">前置条件<a href="https://hugegraph.apache.org/cn/blog/2025/10/09/toplingdb-quick-start/#%E5%89%8D%E7%BD%AE%E6%9D%A1%E4%BB%B6" class="hash-link" aria-label="Direct link to 前置条件" title="Direct link to 前置条件" translate="no">​</a></h2>
<ul>
<li class="">HugeGraph 版本: &gt; 1.5.0</li>
<li class="">Java 版本: &gt;= 11</li>
<li class="">确保已下载 <a href="https://github.com/topling/toplingdb?tab=readme-ov-file#compile--run-db_bench" target="_blank" rel="noopener noreferrer" class="">ToplingDB 相关依赖</a></li>
<li class="">操作系统: Linux</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="启动和配置">启动和配置<a href="https://hugegraph.apache.org/cn/blog/2025/10/09/toplingdb-quick-start/#%E5%90%AF%E5%8A%A8%E5%92%8C%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="Direct link to 启动和配置" title="Direct link to 启动和配置" translate="no">​</a></h2>
<blockquote>
<p><a href="https://github.com/topling/toplingdb" target="_blank" rel="noopener noreferrer" class="">ToplingDB</a>是对 RocksDB 的可配置、可观测扩展，支持通过 YAML 文件进行动态调优，并通过内置 Web Server 实现实时监控</p>
</blockquote>
<p>修改 <code>hugegraph.properties</code></p>
<div class="language-properties codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-properties codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">backend=rocksdb</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">serializer=binary</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">rocksdb.data_path=.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">rocksdb.wal_path=.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># 配置文件路径</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># 出于安全性考虑, HG中仅允许 yaml 文件位于conf/graphs目录下</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">rocksdb.option_path=./conf/graphs/rocksdb_plus.yaml</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># 是否开启Web Server</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">rocksdb.open_http=true</span><br></div></code></pre></div></div>
<p>初始化数据库（第一次启动时或在 <code>conf/graphs/</code> 下手动添加了新配置时需要进行初始化）</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token builtin class-name" style="color:rgb(255, 203, 107)">cd</span><span class="token plain"> *hugegraph-</span><span class="token variable" style="color:rgb(191, 199, 213)">${version}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">bin/init-store.sh</span><br></div></code></pre></div></div>
<p>启动 server</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">bin/start-hugegraph.sh</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Starting HugeGraphServer</span><span class="token punctuation" style="color:rgb(199, 146, 234)">..</span><span class="token plain">.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Connecting to HugeGraphServer </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">http://127.0.0.1:8080/graphs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">..</span><span class="token punctuation" style="color:rgb(199, 146, 234)">..</span><span class="token plain">OK</span><br></div></code></pre></div></div>
<p>提示的 url 与 <code>rest-server.properties</code> 中配置的 <code>restserver.url</code> 一致</p>
<p>Web Server 的监听端口在 YAML 文件中通过 <code>http.listening_ports</code> 字段进行配置</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="验证toplingdb是否正常工作">验证ToplingDB是否正常工作<a href="https://hugegraph.apache.org/cn/blog/2025/10/09/toplingdb-quick-start/#%E9%AA%8C%E8%AF%81toplingdb%E6%98%AF%E5%90%A6%E6%AD%A3%E5%B8%B8%E5%B7%A5%E4%BD%9C" class="hash-link" aria-label="Direct link to 验证ToplingDB是否正常工作" title="Direct link to 验证ToplingDB是否正常工作" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="前提-确保核心参数配置正确">前提: 确保核心参数配置正确<a href="https://hugegraph.apache.org/cn/blog/2025/10/09/toplingdb-quick-start/#%E5%89%8D%E6%8F%90-%E7%A1%AE%E4%BF%9D%E6%A0%B8%E5%BF%83%E5%8F%82%E6%95%B0%E9%85%8D%E7%BD%AE%E6%AD%A3%E7%A1%AE" class="hash-link" aria-label="Direct link to 前提: 确保核心参数配置正确" title="Direct link to 前提: 确保核心参数配置正确" translate="no">​</a></h3>
<p>检查 <code>hugegraph.properties</code> 中包含:</p>
<div class="language-properties codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-properties codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain"># 配置文件路径</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">rocksdb.option_path=./conf/graphs/rocksdb_plus.yaml</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># 是否开启Web Server</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">rocksdb.open_http=true</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="方式一-访问web监控界面">方式一: 访问Web监控界面<a href="https://hugegraph.apache.org/cn/blog/2025/10/09/toplingdb-quick-start/#%E6%96%B9%E5%BC%8F%E4%B8%80-%E8%AE%BF%E9%97%AEweb%E7%9B%91%E6%8E%A7%E7%95%8C%E9%9D%A2" class="hash-link" aria-label="Direct link to 方式一: 访问Web监控界面" title="Direct link to 方式一: 访问Web监控界面" translate="no">​</a></h3>
<p>可视化访问Web监控页面，页面示例如下图所示:</p>
<div style="text-align:center">
  <img decoding="async" loading="lazy" src="https://hugegraph.apache.org/blog/images/images-server/toplingdb-web-server.png" alt="image" width="400" class="img_ev3q">
</div>
<p>通过终端验证:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 访问 http://localhost:2011 (端口号取决于 YAML 配置中的 listening_ports)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">curl</span><span class="token plain"> http://localhost:2011 </span><span class="token operator" style="color:rgb(137, 221, 255)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">grep</span><span class="token plain"> topling</span><br></div></code></pre></div></div>
<p>得到以下输出说明页面正常:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;</span><span class="token tag" style="color:rgb(255, 85, 114)">p</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;</span><span class="token tag" style="color:rgb(255, 85, 114)">a</span><span class="token tag" style="color:rgb(255, 85, 114)"> </span><span class="token tag attr-name" style="color:rgb(255, 203, 107)">href</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(199, 146, 234)">=</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">"</span><span class="token tag attr-value" style="color:rgb(255, 85, 114)">https://topling.cn</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">"</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain">Topling Inc.</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;/</span><span class="token tag" style="color:rgb(255, 85, 114)">a</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain">This is </span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;</span><span class="token tag" style="color:rgb(255, 85, 114)">strong</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain">Engine Inspector</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;/</span><span class="token tag" style="color:rgb(255, 85, 114)">strong</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain">, for metrics, see </span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;</span><span class="token tag" style="color:rgb(255, 85, 114)">a</span><span class="token tag" style="color:rgb(255, 85, 114)"> </span><span class="token tag attr-name" style="color:rgb(255, 203, 107)">href</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(199, 146, 234)">=</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">'</span><span class="token tag attr-value" style="color:rgb(255, 85, 114)">javascript:grafana()</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">'</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain">Grafana</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;/</span><span class="token tag" style="color:rgb(255, 85, 114)">a</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain">!</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;/</span><span class="token tag" style="color:rgb(255, 85, 114)">p</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="方式二-检查日志中的-toplingdb-初始化信息">方式二: 检查日志中的 ToplingDB 初始化信息<a href="https://hugegraph.apache.org/cn/blog/2025/10/09/toplingdb-quick-start/#%E6%96%B9%E5%BC%8F%E4%BA%8C-%E6%A3%80%E6%9F%A5%E6%97%A5%E5%BF%97%E4%B8%AD%E7%9A%84-toplingdb-%E5%88%9D%E5%A7%8B%E5%8C%96%E4%BF%A1%E6%81%AF" class="hash-link" aria-label="Direct link to 方式二: 检查日志中的 ToplingDB 初始化信息" title="Direct link to 方式二: 检查日志中的 ToplingDB 初始化信息" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token function" style="color:rgb(130, 170, 255)">tail</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-f</span><span class="token plain"> logs/hugegraph-server.log </span><span class="token operator" style="color:rgb(137, 221, 255)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">grep</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-i</span><span class="token plain"> topling</span><br></div></code></pre></div></div>
<p>类似输出说明存储引擎启动为ToplingDB:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token number" style="color:rgb(247, 140, 108)">2025</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">14</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">08</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">56</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">25</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">db</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token keyword" style="font-style:italic">open</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token constant" style="color:rgb(130, 170, 255)">INFO</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">o</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">a</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">h</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">b</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">s</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">r</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)">RocksDBStdSessions</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">SidePluginRepo</span><span class="token plain"> </span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">found</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)"> Will</span><span class="token plain"> attempt </span><span class="token keyword" style="font-style:italic">to</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">open</span><span class="token plain"> </span><span class="token namespace" style="color:rgb(178, 204, 214)">multi</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">CFs</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">RocksDB</span><span class="token plain"> using </span><span class="token class-name" style="color:rgb(255, 203, 107)">Topling</span><span class="token plain"> plugin</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token number" style="color:rgb(247, 140, 108)">2025</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">14</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">08</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">56</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">25</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">db</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token keyword" style="font-style:italic">open</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token constant" style="color:rgb(130, 170, 255)">INFO</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">o</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">a</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">h</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">b</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">s</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">r</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)">RocksDBStdSessions</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">Topling</span><span class="token plain"> </span><span class="token constant" style="color:rgb(130, 170, 255)">HTTP</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">Server</span><span class="token plain"> has been started according </span><span class="token keyword" style="font-style:italic">to</span><span class="token plain"> </span><span class="token namespace" style="color:rgb(178, 204, 214)">the</span><span class="token plain"> listening_ports specified in </span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">/conf</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">graphs</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">rocksdb_plus</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">yaml</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="常见问题排查">常见问题排查<a href="https://hugegraph.apache.org/cn/blog/2025/10/09/toplingdb-quick-start/#%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E6%8E%92%E6%9F%A5" class="hash-link" aria-label="Direct link to 常见问题排查" title="Direct link to 常见问题排查" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="问题-1-启动失败提示-yaml-格式错误">问题 1: 启动失败，提示 YAML 格式错误<a href="https://hugegraph.apache.org/cn/blog/2025/10/09/toplingdb-quick-start/#%E9%97%AE%E9%A2%98-1-%E5%90%AF%E5%8A%A8%E5%A4%B1%E8%B4%A5%E6%8F%90%E7%A4%BA-yaml-%E6%A0%BC%E5%BC%8F%E9%94%99%E8%AF%AF" class="hash-link" aria-label="Direct link to 问题 1: 启动失败，提示 YAML 格式错误" title="Direct link to 问题 1: 启动失败，提示 YAML 格式错误" translate="no">​</a></h3>
<p>启动时有类似日志：</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token number" style="color:rgb(247, 140, 108)">2025</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">15</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">01</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">55</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">50</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">db</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token keyword" style="font-style:italic">open</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token constant" style="color:rgb(130, 170, 255)">INFO</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">o</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">a</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">h</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">b</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">s</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">r</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)">RocksDBStdSessions</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">SidePluginRepo</span><span class="token plain"> </span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">found</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)"> Will</span><span class="token plain"> attempt </span><span class="token keyword" style="font-style:italic">to</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">open</span><span class="token plain"> </span><span class="token namespace" style="color:rgb(178, 204, 214)">multi</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">CFs</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">RocksDB</span><span class="token plain"> using </span><span class="token class-name" style="color:rgb(255, 203, 107)">Topling</span><span class="token plain"> plugin</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token number" style="color:rgb(247, 140, 108)">21</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token number" style="color:rgb(247, 140, 108)">891</span><span class="token plain">B</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token constant" style="color:rgb(130, 170, 255)">ERROR</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">sideplugin</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">rockside</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token number" style="color:rgb(247, 140, 108)">3</span><span class="token plain">rdparty</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">rapidyaml</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">src</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">c4</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">yml</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">parse</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">cpp</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">3310</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token constant" style="color:rgb(130, 170, 255)">ERROR</span><span class="token plain"> parsing yml</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> parse error</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> incorrect indentation</span><span class="token operator" style="color:rgb(137, 221, 255)">?</span><br></div></code></pre></div></div>
<p><strong>解决方案</strong>:</p>
<ol>
<li class="">检查 YAML 文件缩进是否正确（必须使用空格，不能使用 Tab）</li>
<li class="">验证 YAML 语法: <code>python -c "import yaml; yaml.safe_load(open('conf/graphs/rocksdb_plus.yaml'))"</code></li>
<li class="">检查日志中的具体错误信息</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="问题-2-web-server-端口冲突">问题 2: Web Server 端口冲突<a href="https://hugegraph.apache.org/cn/blog/2025/10/09/toplingdb-quick-start/#%E9%97%AE%E9%A2%98-2-web-server-%E7%AB%AF%E5%8F%A3%E5%86%B2%E7%AA%81" class="hash-link" aria-label="Direct link to 问题 2: Web Server 端口冲突" title="Direct link to 问题 2: Web Server 端口冲突" translate="no">​</a></h3>
<p>启动时有类似日志：</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token number" style="color:rgb(247, 140, 108)">2025</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">15</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">01</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">57</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">34</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">db</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token keyword" style="font-style:italic">open</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token constant" style="color:rgb(130, 170, 255)">INFO</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">o</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">a</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">h</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">b</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">s</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">r</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)">RocksDBStdSessions</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">SidePluginRepo</span><span class="token plain"> </span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">found</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)"> Will</span><span class="token plain"> attempt </span><span class="token keyword" style="font-style:italic">to</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">open</span><span class="token plain"> </span><span class="token namespace" style="color:rgb(178, 204, 214)">multi</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">CFs</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">RocksDB</span><span class="token plain"> using </span><span class="token class-name" style="color:rgb(255, 203, 107)">Topling</span><span class="token plain"> plugin</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token number" style="color:rgb(247, 140, 108)">2025</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">15</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">01</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">57</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">34</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">db</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token keyword" style="font-style:italic">open</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token constant" style="color:rgb(130, 170, 255)">ERROR</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">o</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">a</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">h</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">b</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">s</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">r</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)">RocksDBStore</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">Failed</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">to</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">open</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">RocksDB</span><span class="token plain"> 'rocksdb</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token plain">data</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">data</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">g'</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">org</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">rocksdb</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)">RocksDBException</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> rocksdb</span><span class="token operator" style="color:rgb(137, 221, 255)">::</span><span class="token class-name" style="color:rgb(255, 203, 107)">Status</span><span class="token plain"> rocksdb</span><span class="token operator" style="color:rgb(137, 221, 255)">::</span><span class="token class-name" style="color:rgb(255, 203, 107)">SidePluginRepo</span><span class="token operator" style="color:rgb(137, 221, 255)">::</span><span class="token class-name" style="color:rgb(255, 203, 107)">StartHttpServer</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">null</span><span class="token plain"> context when constructing </span><span class="token class-name" style="color:rgb(255, 203, 107)">CivetServer</span><span class="token class-name punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)"> Possible</span><span class="token plain"> problem binding </span><span class="token keyword" style="font-style:italic">to</span><span class="token plain"> </span><span class="token namespace" style="color:rgb(178, 204, 214)">port</span><span class="token namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  at </span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">org</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">rocksdb</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)">SidePluginRepo</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">startHttpServer</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token class-name" style="color:rgb(255, 203, 107)">Native</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">Method</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">~</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">rocksdbjni</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">8.10</span><span class="token number" style="color:rgb(247, 140, 108)">.2</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">20250804.074027</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">4.</span><span class="token plain">jar</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token operator" style="color:rgb(137, 221, 255)">?</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><br></div></code></pre></div></div>
<p><strong>解决方案</strong>:</p>
<ol>
<li class="">检查端口是否被占用: <code>lsof -i :2011</code></li>
<li class="">修改 YAML 文件中的 <code>listening_ports</code> 配置</li>
<li class="">重启 HugeGraph Server</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="问题-3-初始化数据库失败">问题 3: 初始化数据库失败<a href="https://hugegraph.apache.org/cn/blog/2025/10/09/toplingdb-quick-start/#%E9%97%AE%E9%A2%98-3-%E5%88%9D%E5%A7%8B%E5%8C%96%E6%95%B0%E6%8D%AE%E5%BA%93%E5%A4%B1%E8%B4%A5" class="hash-link" aria-label="Direct link to 问题 3: 初始化数据库失败" title="Direct link to 问题 3: 初始化数据库失败" translate="no">​</a></h3>
<p>类似输出说明无法获取数据库锁，可能缺乏写权限，也可能是被数据库被另外一个进程锁定:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token class-name" style="color:rgb(255, 203, 107)">Caused</span><span class="token plain"> by</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">org</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">rocksdb</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)">RocksDBException</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">While</span><span class="token plain"> lock file</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> rocksdb</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token plain">data</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">data</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">m</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token constant" style="color:rgb(130, 170, 255)">LOCK</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">Resource</span><span class="token plain"> temporarily unavailable</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        at </span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">org</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">rocksdb</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)">SidePluginRepo</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">nativeOpenDBMultiCF</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token class-name" style="color:rgb(255, 203, 107)">Native</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">Method</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        at </span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">org</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">rocksdb</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)">SidePluginRepo</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">openDB</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token class-name" style="color:rgb(255, 203, 107)">SidePluginRepo</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">java</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">22</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><br></div></code></pre></div></div>
<p><strong>解决方案</strong>:</p>
<ol>
<li class="">确认配置文件路径正确: <code>rocksdb.option_path=./conf/graphs/rocksdb_plus.yaml</code></li>
<li class="">检查数据目录权限: 确保运行用户有读写权限</li>
<li class="">查看详细日志: <code>bin/init-store.sh 2&gt;&amp;1 | tee init.log</code></li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="相关文档">相关文档<a href="https://hugegraph.apache.org/cn/blog/2025/10/09/toplingdb-quick-start/#%E7%9B%B8%E5%85%B3%E6%96%87%E6%A1%A3" class="hash-link" aria-label="Direct link to 相关文档" title="Direct link to 相关文档" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://hugegraph.apache.org/cn/blog/2025/09/30/toplingdb-yaml-configuration-file/">ToplingDB YAML 配置详解</a> - 了解配置文件中各参数的含义</li>
<li class=""><a class="" href="https://hugegraph.apache.org/docs/config/config-option/">HugeGraph 配置说明</a> - HugeGraph 核心配置参考</li>
<li class=""><a href="https://github.com/topling/toplingdb" target="_blank" rel="noopener noreferrer" class="">ToplingDB GitHub 仓库</a> - 官方文档和最新更新</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ToplingDB YAML configuration file]]></title>
            <link>https://hugegraph.apache.org/cn/blog/2025/09/30/toplingdb-yaml-configuration-file/</link>
            <guid>https://hugegraph.apache.org/cn/blog/2025/09/30/toplingdb-yaml-configuration-file/</guid>
            <pubDate>Tue, 30 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[RocksDB 提供了丰富的参数配置，但大多数情况下，这些配置需要通过硬编码完成。]]></description>
            <content:encoded><![CDATA[<p>RocksDB 提供了丰富的参数配置，但大多数情况下，这些配置需要通过硬编码完成。</p>
<p><a href="https://github.com/topling/toplingdb" target="_blank" rel="noopener noreferrer" class="">ToplingDB</a> 在此基础上引入了 <strong>SidePlugin + YAML</strong> 的方式，使得配置更加模块化和可组合。</p>
<p>本文重点介绍 <strong>ToplingDB 扩展参数</strong> 的部分，帮助读者理解这些配置的意义。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="术语说明">术语说明<a href="https://hugegraph.apache.org/cn/blog/2025/09/30/toplingdb-yaml-configuration-file/#%E6%9C%AF%E8%AF%AD%E8%AF%B4%E6%98%8E" class="hash-link" aria-label="Direct link to 术语说明" title="Direct link to 术语说明" translate="no">​</a></h2>
<ul>
<li class=""><strong>MemTable</strong>: LSM-Tree 在内存中的可写数据结构，接收新写入的数据</li>
<li class=""><strong>SST (Sorted String Table)</strong>: Memtable 持久化到磁盘后生成的有序键值对文件</li>
<li class=""><strong>Flush</strong>: 将 MemTable 数据写入磁盘生成 SST 的过程</li>
<li class=""><strong>Compaction</strong>: 合并多个 SST 文件以优化存储和查询性能的过程</li>
<li class=""><strong>L0, L1, ... L6</strong>: LSM-Tree 的不同层级，数字越大层级越深</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-hugegraph-中提供的rocksdb_plusyaml">0. HugeGraph 中提供的rocksdb_plus.yaml<a href="https://hugegraph.apache.org/cn/blog/2025/09/30/toplingdb-yaml-configuration-file/#0-hugegraph-%E4%B8%AD%E6%8F%90%E4%BE%9B%E7%9A%84rocksdb_plusyaml" class="hash-link" aria-label="Direct link to 0. HugeGraph 中提供的rocksdb_plus.yaml" title="Direct link to 0. HugeGraph 中提供的rocksdb_plus.yaml" translate="no">​</a></h2>
<p>下文只包括HugeGraph中所使用的配置参数，ToplingDB支持的完整配置请参考：<a href="https://github.com/topling/sideplugin-wiki-en/wiki" target="_blank" rel="noopener noreferrer" class="">SidePlugin Wiki</a></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">http</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Web Server 相关配置</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># normally parent path of db path</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">document_root</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> /dev/shm/rocksdb_resource </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 静态资源目录, HugeGraph中通过`preload_topling.sh`进行静态资源提取</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">listening_ports</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">'127.0.0.1:2011'</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Web Server监听端口，用于管理/监控 如端口被占用，请改为其他端口，例如 2012 或 2013</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">setenv</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 环境变量设置</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">StrSimpleEnvNameNotOverwrite</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> StringValue</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">IntSimpleEnvNameNotOverwrite</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">16384</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">OverwriteThisEnv</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">#comment: overwrite is default to false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">overwrite</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">value</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> force overwrite this env by overwrite true</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">Cache</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Cache 相关配置</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">lru_cache</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 定义一个 LRU 缓存实例</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">class</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> LRUCache</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">params</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">capacity</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 8G </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 缓存容量 8GB</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">num_shard_bits</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">-1</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 分片数量，-1 表示自动</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">strict_capacity_limit</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">high_pri_pool_ratio</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0.5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">use_adaptive_mutex</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">metadata_charge_policy</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> kFullChargeCacheMetadata </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 元数据也计入缓存容量</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">Statistics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 数据采样配置</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">stat</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">class</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> default</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">params</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">discard_tickers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 丢弃的统计计数器，减少开销</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.block.cache</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.block.cachecompressed</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.block</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.memtable.payload.bytes.at.flush</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.memtable.garbage.bytes.at.flush</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.txn</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.blobdb</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.row.cache</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.number.block</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.bloom.filter</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.persistent</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.sim.block.cache</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">discard_histograms</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 丢弃的直方图统计项</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># comment: ....</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.blobdb</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.bytes.compressed</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.bytes.decompressed</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.num.index.and.filter.blocks.read.per.level</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.num.data.blocks.read.per.level</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.compression.times.nanos</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.decompression.times.nanos</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.read.block.get.micros</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.write.raw.block.micros</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># comment end of array</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">#stats_level: kAll</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">stats_level</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> kDisableAll  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 禁用所有统计</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">MemTableRepFactory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 内存中 memtable 的实现</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">cspp</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># ToplingDB 独有的高并发内存结构</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">class</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> cspp</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">params</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">mem_cap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 16G </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 预分配足够的单块内存地址空间，这些内存可以只是保留地址空间，但并未实际分配 对物理内存并无要求，只是为CSPP保留虚拟内存空间</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">use_vm</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">token_use_idle</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">chunk_size</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 16K </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 内部分配粒度</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">convert_to_sst</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> kFileMmap </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 直接将 MemTable 转化为 SST，省去 Flush，可选值：{kDontConvert, kDumpMem, kFileMmap}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">sync_sst_file</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">false</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># convert_to_sst 为 kFileMmap 时，SST 转化完成后是否执行 fsync</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">skiplist</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># RocksDB 默认的跳表结构</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">class</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> SkipList</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">params</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">lookahead</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">TableFactory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">cspp_memtab_sst</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">class</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> CSPPMemTabTable </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 与 cspp 配套的 TableFactory</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">params</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># empty params</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">bb</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">class</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> BlockBasedTable </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># RocksDB 默认的块表</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">params</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">checksum</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> kCRC32c</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">block_size</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 4K</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">block_restart_interval</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">16</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">index_block_restart_interval</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">metadata_block_size</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 4K</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">enable_index_compression</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">block_cache</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"${lru_cache}"</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 使用上面定义的 LRU 缓存</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">block_cache_compressed</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">persistent_cache</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">filter_policy</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">dispatch</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">class</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> DispatcherTable</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">params</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">default</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> bb </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 默认使用 BlockBasedTable</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">readers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">BlockBasedTable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> bb</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">CSPPMemTabTable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> cspp_memtab_sst</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">level_writers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain"> bb</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> bb</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> bb</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> bb</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> bb</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> bb </span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 支持自定义各层写入策略</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">CFOptions</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">default</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">max_write_buffer_number</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">6</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">memtable_factory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"${cspp}"</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 引用上方定义的cspp，使用 cspp 作为 MemTable</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">write_buffer_size</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 128M</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># set target_file_size_base as small as 512K is to make many SST files,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># thus key prefix cache can present efficiency</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">target_file_size_base</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 64M</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">target_file_size_multiplier</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">table_factory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dispatch </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 引用上方定义的 dispatch, 使用 DispatcherTable Class</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">max_bytes_for_level_base</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 512M</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">max_bytes_for_level_multiplier</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">level_compaction_dynamic_level_bytes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">level0_slowdown_writes_trigger</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">20</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">level0_stop_writes_trigger</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">36</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">level0_file_num_compaction_trigger</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">merge_operator</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> uint64add </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># support merge</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">level_compaction_dynamic_file_size</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">optimize_filters_for_hits</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">allow_merge_memtables</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">min_write_buffer_number_to_merge</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">compression_per_level</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> kNoCompression</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> kNoCompression</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> kSnappyCompression</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> kSnappyCompression</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> kSnappyCompression</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> kSnappyCompression</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> kSnappyCompression</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">DBOptions</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">dbo</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">create_if_missing</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">create_missing_column_families</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">false</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># this is important, must be false to hugegraph</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">max_background_compactions</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">-1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">max_subcompactions</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">4</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">max_level1_subcompactions</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">inplace_update_support</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">WAL_size_limit_MB</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">statistics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"${stat}"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 使用上面定义的统计配置</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">max_manifest_file_size</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 100M</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">max_background_jobs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">8</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 设置flush和compaction线程总数 建议设置为 (cpu核数 / 2)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">compaction_readahead_size</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">memtable_as_log_index</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># 此配置结合 convert_to_sst: kFileMmap 可实现[omit L0 Flush](https://github.com/topling/toplingdb/wiki/Omit-L0-Flush)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<p><strong>关键要点</strong>:</p>
<ul>
<li class=""><code>listening_ports: '127.0.0.1:2011'</code> 指定Web Server监听端口为2011，并且仅允许本地访问</li>
<li class=""><code>memtable_as_log_index: true</code> 与 <code>convert_to_sst: kFileMmap</code> 结合实现<a href="https://github.com/topling/toplingdb/wiki/Omit-L0-Flush" target="_blank" rel="noopener noreferrer" class="">omit L0 Flush</a></li>
<li class=""><code>memtable_factory: "${cspp}"</code> 指定了内存结构采用<code>CSPP Memtable</code></li>
<li class=""><code>table_factory: dispatch</code> 指定了TableFactory使用YAML中自定义的<code>DispatcherTable</code>结构</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-插件化配置与引用机制">1. 插件化配置与引用机制<a href="https://hugegraph.apache.org/cn/blog/2025/09/30/toplingdb-yaml-configuration-file/#1-%E6%8F%92%E4%BB%B6%E5%8C%96%E9%85%8D%E7%BD%AE%E4%B8%8E%E5%BC%95%E7%94%A8%E6%9C%BA%E5%88%B6" class="hash-link" aria-label="Direct link to 1. 插件化配置与引用机制" title="Direct link to 1. 插件化配置与引用机制" translate="no">​</a></h2>
<ul>
<li class=""><strong>YAML 插件化</strong>：配置文件以对象形式组织，每个对象可以单独定义并在其他地方引用。</li>
<li class=""><strong>引用语法</strong>：通过 <code>${lru_cache}</code>、<code>${cspp}</code> 等方式在不同段落复用对象。</li>
<li class=""><strong>DispatcherTable</strong>：允许在不同层级或场景下选择不同的 TableFactory。RocksDB 原生只能指定单一 TableFactory。</li>
</ul>
<p>ToplingDB YAML 引用与复用图示:</p>
<div style="text-align:center">
  <img decoding="async" loading="lazy" src="https://hugegraph.apache.org/blog/images/images-server/toplingdb-yaml-ref.png" alt="image" width="800" class="img_ev3q">
</div>
<p>这种机制使得配置更灵活，便于在复杂场景下组合不同组件。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-新的-memtable-实现cspp">2. 新的 MemTable 实现：CSPP<a href="https://hugegraph.apache.org/cn/blog/2025/09/30/toplingdb-yaml-configuration-file/#2-%E6%96%B0%E7%9A%84-memtable-%E5%AE%9E%E7%8E%B0cspp" class="hash-link" aria-label="Direct link to 2. 新的 MemTable 实现：CSPP" title="Direct link to 2. 新的 MemTable 实现：CSPP" translate="no">​</a></h2>
<p>ToplingDB 提供了一个 RocksDB 原生没有的 MemTable 类型，通过以下参数配置：</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="mem_cap">mem_cap<a href="https://hugegraph.apache.org/cn/blog/2025/09/30/toplingdb-yaml-configuration-file/#mem_cap" class="hash-link" aria-label="Direct link to mem_cap" title="Direct link to mem_cap" translate="no">​</a></h3>
<p><code>mem_cap</code> 是指在内存地址空间中，为 CSPP 预留的空间大小，这些内存可以只是<strong>保留地址空间，并未实际分配的</strong>。
<code>mem_cap</code> 真正占用的内存大小约为 <code>write_buffer_size</code> 。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="mem_cap-设计背景">mem_cap 设计背景<a href="https://hugegraph.apache.org/cn/blog/2025/09/30/toplingdb-yaml-configuration-file/#mem_cap-%E8%AE%BE%E8%AE%A1%E8%83%8C%E6%99%AF" class="hash-link" aria-label="Direct link to mem_cap 设计背景" title="Direct link to mem_cap 设计背景" translate="no">​</a></h4>
<p>CSPP 的底层算法为了支持高并发写入，采用了预分配内存的策略。
当预分配的内存被写满时，新的写入操作将无法继续。
然而，RocksDB 本身缺乏一种机制，使得 memtable 能够主动反馈 '预分配内存已满，需要切换到新的 memtable' 。
由于其函数调用链路复杂，难以通过重构来实现这一机制，因此 <code>CSPP</code> 只能通过参数设计来适配 RocksDB 的行为。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="mem_cap-核心思路">mem_cap 核心思路<a href="https://hugegraph.apache.org/cn/blog/2025/09/30/toplingdb-yaml-configuration-file/#mem_cap-%E6%A0%B8%E5%BF%83%E6%80%9D%E8%B7%AF" class="hash-link" aria-label="Direct link to mem_cap 核心思路" title="Direct link to mem_cap 核心思路" translate="no">​</a></h4>
<p>ToplingDB 将 <code>mem_cap</code> 设置为远大于 <code>write_buffer_size</code>，从而避免 RocksDB 在向 Memtable 写入时过早触发“内存已满”的错误。
在 CSPP 初始化（New）时，会再次检查，如果发现 <code>mem_cap</code> 设置过小，则会自动调整为 <code>2 * write_buffer_size</code>，以确保写入过程的稳定性。</p>
<p><code>mem_cap</code> 默认值为 2G，有效最大值为 16G。</p>
<ul>
<li class="">小型部署（&lt; 16GB 内存）: 建议设置为系统内存的 20-30%</li>
<li class="">中型部署（16-64GB 内存）: 建议设置为 8-16G</li>
<li class="">大型部署（&gt; 64GB 内存）: 建议设置为 16G</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="use_vm">use_vm<a href="https://hugegraph.apache.org/cn/blog/2025/09/30/toplingdb-yaml-configuration-file/#use_vm" class="hash-link" aria-label="Direct link to use_vm" title="Direct link to use_vm" translate="no">​</a></h3>
<p>在使用 malloc/posix_memalign 分配内存时，地址空间可能是已经实际分配的（位于堆空间中，已有对应的物理页面），而 CSPP 在分配时只需要获得保留的地址空间。
<code>use_vm</code> 选项为 <code>true</code> 时会强制使用 <code>mmap</code> 分配内存，从而保证分配的一定时是保留地址空间，但并不实际占用物理页面。
<code>use_vm</code> 默认值为 <code>true</code>。如果用户物理内存空间充足，建议关闭此选项，<code>mmap</code> 分配的虚拟内存空间在建立对物理地址的映射时会触发大量minor page fault，可能会影响性能。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="convert_to_sst">convert_to_sst<a href="https://hugegraph.apache.org/cn/blog/2025/09/30/toplingdb-yaml-configuration-file/#convert_to_sst" class="hash-link" aria-label="Direct link to convert_to_sst" title="Direct link to convert_to_sst" translate="no">​</a></h3>
<p><code>convert_to_sst</code> 支持以下三种枚举值:</p>
<ul>
<li class=""><code>kDontConvert</code>: 禁用该功能，为默认值。使用传统的 Flush 流程，兼容性最好，适合对稳定性要求高的场景</li>
<li class=""><code>kDumpMem</code>: 转化时将 MemTable 的整块内存写入 SST 文件，避免 CPU 消耗，但未降低内存消耗</li>
<li class=""><code>kFileMmap</code>: 将 MemTable 内容 mmap 到文件，这是关键功能，同时降低 CPU 和内存消耗，可同时将 DBOptions.memtable_as_log_index 设为 true 从本质上消除 MemTable Flush</li>
</ul>
<p>这些参数为数据写入路径提供了更多可调节空间，用户可按需选择。</p>
<p>更多设计细节请参考 ToplingDB 作者的撰写的相关博客：<a href="https://github.com/topling/cspp-memtable/blob/memtable_as_log_index/README_EN.md" target="_blank" rel="noopener noreferrer" class="">cspp-memtable</a>, <a href="https://zhuanlan.zhihu.com/p/649435555" target="_blank" rel="noopener noreferrer" class="">ToplingDB CSPP MemTable Design Essentials</a>, <a href="https://zhuanlan.zhihu.com/p/499138254" target="_blank" rel="noopener noreferrer" class="">CSPP Trie Design Analysis</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-tablefactory-扩展">3. TableFactory 扩展<a href="https://hugegraph.apache.org/cn/blog/2025/09/30/toplingdb-yaml-configuration-file/#3-tablefactory-%E6%89%A9%E5%B1%95" class="hash-link" aria-label="Direct link to 3. TableFactory 扩展" title="Direct link to 3. TableFactory 扩展" translate="no">​</a></h2>
<ul>
<li class=""><strong>CSPPMemTabTable</strong>：与 <code>cspp</code> MemTable 配套的 TableFactory。</li>
<li class=""><strong>DispatcherTable</strong>：支持为不同层级指定不同的 TableFactory，例如：
<ul>
<li class="">默认使用 BlockBasedTable。</li>
<li class="">特定层级可以使用 CSPPMemTabTable。</li>
</ul>
</li>
</ul>
<p>这类灵活性在 RocksDB 原生配置中并不存在。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-统计与观测控制">4. 统计与观测控制<a href="https://hugegraph.apache.org/cn/blog/2025/09/30/toplingdb-yaml-configuration-file/#4-%E7%BB%9F%E8%AE%A1%E4%B8%8E%E8%A7%82%E6%B5%8B%E6%8E%A7%E5%88%B6" class="hash-link" aria-label="Direct link to 4. 统计与观测控制" title="Direct link to 4. 统计与观测控制" translate="no">​</a></h2>
<ul>
<li class=""><strong>discard_tickers / discard_histograms</strong>：可以精确指定哪些统计项需要丢弃。</li>
<li class=""><strong>stats_level: kDisableAll</strong>：结合上述配置，可以灵活控制统计开销。</li>
</ul>
<p>相比 RocksDB 的粗粒度控制，ToplingDB 提供了更细的调节方式。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-dboptions-新增参数">5. DBOptions 新增参数<a href="https://hugegraph.apache.org/cn/blog/2025/09/30/toplingdb-yaml-configuration-file/#5-dboptions-%E6%96%B0%E5%A2%9E%E5%8F%82%E6%95%B0" class="hash-link" aria-label="Direct link to 5. DBOptions 新增参数" title="Direct link to 5. DBOptions 新增参数" translate="no">​</a></h2>
<ul>
<li class=""><strong>memtable_as_log_index: true</strong>：允许使用 MemTable 作为日志索引，加快恢复速度。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-安全注意事项">6. 安全注意事项<a href="https://hugegraph.apache.org/cn/blog/2025/09/30/toplingdb-yaml-configuration-file/#6-%E5%AE%89%E5%85%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9" class="hash-link" aria-label="Direct link to 6. 安全注意事项" title="Direct link to 6. 安全注意事项" translate="no">​</a></h2>
<p><strong>Web Server 安全配置</strong>:</p>
<ul>
<li class="">Web Server 页面由ToplingDB提供，不包含权限认证功能</li>
<li class="">默认设置 <code>listening_ports: '127.0.0.1:2011'</code> 仅限本地访问</li>
<li class="">生产环境建议配置防火墙规则，仅允许内网访问</li>
<li class="">如需禁用 Web Server，在 <code>hugegraph.properties</code> 中设置 <code>rocksdb.open_http=false</code></li>
</ul>
<p><strong>共享内存安全</strong>:</p>
<ul>
<li class=""><code>document_root: /dev/shm/rocksdb_resource</code> 使用共享内存目录</li>
<li class="">多用户环境需要注意文件权限设置，避免未授权访问</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-总结">7. 总结<a href="https://hugegraph.apache.org/cn/blog/2025/09/30/toplingdb-yaml-configuration-file/#7-%E6%80%BB%E7%BB%93" class="hash-link" aria-label="Direct link to 7. 总结" title="Direct link to 7. 总结" translate="no">​</a></h2>
<p>ToplingDB 在 RocksDB 的基础上增加了以下能力：</p>
<ul>
<li class="">插件化配置与对象复用</li>
<li class="">新的 MemTable 类型（cspp）及配套 TableFactory</li>
<li class="">DispatcherTable 支持多工厂调度</li>
<li class="">内置 Web Server</li>
<li class="">更灵活的统计与观测控制</li>
<li class="">特殊 DBOptions（如 memtable_as_log_index）</li>
</ul>
<p>这些扩展为用户提供了更多的可调节空间，尤其适合需要高写入性能和灵活运维的场景。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="相关文档">相关文档<a href="https://hugegraph.apache.org/cn/blog/2025/09/30/toplingdb-yaml-configuration-file/#%E7%9B%B8%E5%85%B3%E6%96%87%E6%A1%A3" class="hash-link" aria-label="Direct link to 相关文档" title="Direct link to 相关文档" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://hugegraph.apache.org/cn/blog/2025/10/09/toplingdb-quick-start/">ToplingDB 快速开始</a> – 如何在 HugeGraph 中启用 ToplingDB</li>
<li class=""><a href="https://github.com/facebook/rocksdb/wiki/Setup-Options-and-Basic-Tuning" target="_blank" rel="noopener noreferrer" class="">RocksDB 官方配置文档</a> – 了解基础配置项</li>
<li class=""><a href="https://github.com/topling/sideplugin-wiki-en/wiki" target="_blank" rel="noopener noreferrer" class="">SidePlugin Wiki</a> – ToplingDB 完整配置参考</li>
</ul>]]></content:encoded>
        </item>
    </channel>
</rss>