<?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>RAGFlow Blog</title>
        <link>https://ragflow.io/en/blog</link>
        <description>RAGFlow Blog</description>
        <lastBuildDate>Thu, 23 Apr 2026 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[RAGFlow 0.25 — Ingestion pipeline, agent sandbox, and user-level memory]]></title>
            <link>https://ragflow.io/en/blog/ragflow-0.25-ingestion-pipeline-agent-sandbox-and-user-level-memory</link>
            <guid>https://ragflow.io/en/blog/ragflow-0.25-ingestion-pipeline-agent-sandbox-and-user-level-memory</guid>
            <pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[As RAG applications move toward large-scale deployment, the developer's challenge has shifted from "how to build" to "how to govern":]]></description>
            <content:encoded><![CDATA[<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/025highlights-98346e135f1e27638673cd6fe5f438d9.png" width="1280" height="546"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>As RAG applications move toward large-scale deployment, the developer's challenge has shifted from "how to build" to "how to govern":</p>
<ol>
<li class="">How can complex document parsing be flexibly customized?</li>
<li class="">How can online agents be iterated without disrupting business continuity?</li>
<li class="">How can AI truly understand and remember each user's unique context?</li>
<li class="">How can all of this be seamlessly integrated into existing corporate digital ecosystems?</li>
</ol>
<p>v0.25 addresses these by focusing on Ingestion Pipeline orchestration and Agent engineering, providing full-stack maturity for enterprise RAG applications—from document parsing to agent delivery.</p>
<h2 id="ingestion-pipeline-enhancement" class="anchor anchorTargetStickyNavbar_Vzrq">Ingestion pipeline enhancement<a href="https://ragflow.io/en/blog/ragflow-0.25-ingestion-pipeline-agent-sandbox-and-user-level-memory#ingestion-pipeline-enhancement" class="hash-link" aria-label="Direct link to Ingestion pipeline enhancement" title="Direct link to Ingestion pipeline enhancement" translate="no"></a></h2>
<p>Document parsing and chunking are core to RAG. Previously, RAGFlow's built-in methods (General, Paper, Laws, etc.) covered major scenarios but struggled with specific business needs, such as maintaining table structures in financial reports or hierarchical slicing in legal contracts.</p>
<p>The Ingestion Pipeline, introduced in version 0.21, was created to solve this flexibility issue.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/021ip-145d54db76e8c23fa45a14b7d8c6cc30.png" width="1280" height="627"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>In 0.25, RAGFlow takes this further by adding 7 out-of-the-box pipeline templates that align with built-in strategies. Developers no longer have to choose between ease of use and flexibility: they can replicate official best practices with one click or adjust processing nodes like LEGO blocks.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/ip_templates-a3e5922cdf848519bb3490d044952aed.png" width="1280" height="300"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>These templates allow developers to see the logic behind built-in data processing and modify it to meet business requirements. The image below shows a Paper template pipeline, which now offers multi-column detection in the Parser node compared to version 0.21.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/multi_column_detect-41fb4c571a10e3117a04c1aefad20b85.png" width="1280" height="1171"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>The Title Chunker has also been enhanced to support both Group and Hierarchy chunking methods.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/title_chunker_hierarchy_group-48aef9adb126931d6f311d06c443ef3c.png" width="1280" height="841"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Solid data processing foundations enable more imaginative Agents. A comparison of resume parsing illustrates the difference: built-in parsing may result in incomplete segmentation.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/builtin_resume_parser-fee3b90ced6bc0159aa98f8ff0edb6a4.png" width="1280" height="648"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>During chat, because the built-in method summarizes info rather than retaining the original text, specific details like GPA might be missed, leading to retrieval failure.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/builtin_resume_chat-4d0654c689b6e47d43f7745aa2886aa4.png" width="1280" height="685"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Even with a candidate's name, the lack of original text in the built-in method prevents the retrieval of detailed experiences.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/spartank-55bee6af68b1c666864cc514a53a5f5a.png" width="1280" height="591"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>In contrast, pipeline-based resume parsing slices content by section while preserving key information.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/pipeline_resume_parser-523ab010acb0f7de7d440ed8346a5696.png" width="1280" height="648"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Since the pipeline defines metadata extraction, it automatically segments key attributes.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/pipeline_resume_meta-d98afd7aa9923fe0988546b6762a007c.png" width="1233" height="1280"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>During chat, this metadata allows for accurate candidate positioning and retrieval of detailed experiences.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/pipeline_resume_chat-202692345ba5b5a7e947d599e5b9c193.png" width="1280" height="373"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span>
<span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/spartank_correct-cf1d47442a238fe87a7c7af94c88f0eb.png" width="1280" height="602"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="agent-enhancement" class="anchor anchorTargetStickyNavbar_Vzrq">Agent enhancement<a href="https://ragflow.io/en/blog/ragflow-0.25-ingestion-pipeline-agent-sandbox-and-user-level-memory#agent-enhancement" class="hash-link" aria-label="Direct link to Agent enhancement" title="Direct link to Agent enhancement" translate="no"></a></h2>
<h3 id="agent-publishing-support" class="anchor anchorTargetStickyNavbar_Vzrq">Agent publishing support<a href="https://ragflow.io/en/blog/ragflow-0.25-ingestion-pipeline-agent-sandbox-and-user-level-memory#agent-publishing-support" class="hash-link" aria-label="Direct link to Agent publishing support" title="Direct link to Agent publishing support" translate="no"></a></h3>
<p>Iterating on Agents usually involves risk: will a prompt change cause regression? Will a new tool break the flow? Previously, developers had to manually copy and switch agents to avoid downtime.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/translationa-0f85688b9fe9263fe4ec26f3aa2d1b22.png" width="1216" height="1216"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Now, after orchestrating an agent, you can click the <strong>Publish</strong> button.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/translationb-524c8dedf9045996628f40ae8362ae86.png" width="1025" height="775"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Once published, the current version is locked as the "online version." Subsequent experiments on the canvas (e.g., changing a translation target from English to Spanish) will not affect the live agent's behavior. To access the published version via API, set the <code>release</code> parameter to <code>True</code>.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/translationc-c2e559c59f55289d88860b28d89cc299.png" width="998" height="244"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>For embedded pages, simply toggle the <strong>Published</strong> switch.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/translationd-0b75191571a2a5e93142583a1bcad87d.png" width="621" height="972"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>As shown below, while the developer changes the canvas to Spanish, the embedded chat remains locked to the published English version until the developer chooses to publish the update.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/translation1-e8f199d62364f01f5b113b135b2fee46.png" width="1010" height="587"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span>
<span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/translation2-04bfef698f1858b37af897496b203c93.png" width="1280" height="725"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span>
<span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/translation3-bd5f4a16a614fa561096cb3033d3fdde.png" width="1013" height="604"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span>
<span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/translation4-b483a1b29185ff1d4f15a40ed2b7b9f8.png" width="683" height="470"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span>
<span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/translation5-8c2eaaa330004bd9da541d81e615de47.png" width="1007" height="605"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>This "gray-friendly" design aligns agent iteration with business release cycles, allowing for bold experimentation and careful deployment.</p>
<h3 id="agent-sandbox-execution-and-charting" class="anchor anchorTargetStickyNavbar_Vzrq">Agent sandbox execution and charting<a href="https://ragflow.io/en/blog/ragflow-0.25-ingestion-pipeline-agent-sandbox-and-user-level-memory#agent-sandbox-execution-and-charting" class="hash-link" aria-label="Direct link to Agent sandbox execution and charting" title="Direct link to Agent sandbox execution and charting" translate="no"></a></h3>
<p>LLMs excel at qualitative analysis but often struggle with quantitative tasks. When asked for sales trends, LLMs can make calculation errors and cannot generate downloadable charts.</p>
<p>Agents can now generate and execute Python code within a sandbox. A new "Data Analytics" template is available to demonstrate this.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/beginner_data_analytics_template-4dc84c027b2467637d4757ce9b80fe0e.png" width="1280" height="371"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>The <strong>CodeExec</strong> tool is mounted under the Agent node.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/codeexec-134ab01ba5b748ef36c68dde897d76ed.png" width="1079" height="444"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>For example, when asked to analyze a 12-month sales dataset, calculate growth, and perform linear regression, the agent doesn't just calculate the numbers—it uses matplotlib to generate a business-style chart and provides a downloadable PNG.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/yoy-cef175a8837e50321e5ec9dea29e1ca8.png" width="1280" height="995"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span>
<span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/matplotlib-94bfb7e8f591f77af6295d41dcaa5f3b.png" width="1280" height="805"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span>
<span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/yoy_diagram-1bad79587e2b0388b769742b084d5b76.png" width="1280" height="724"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>This allows RAGFlow Agents to produce ready-to-use business assets.</p>
<h3 id="memory-orchestration-with-user-level-isolation" class="anchor anchorTargetStickyNavbar_Vzrq">Memory orchestration with user-level isolation<a href="https://ragflow.io/en/blog/ragflow-0.25-ingestion-pipeline-agent-sandbox-and-user-level-memory#memory-orchestration-with-user-level-isolation" class="hash-link" aria-label="Direct link to Memory orchestration with user-level isolation" title="Direct link to Memory orchestration with user-level isolation" translate="no"></a></h3>
<p>Version 0.25 introduces a User ID dimension to the Memory mechanism, enabling user-level isolation. This can be configured in the Message node on the Agent canvas.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/memory_message_uid-c961103090cf910c3729ce8e948682d6.png" width="1280" height="986"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Retrieval nodes can be set to only access memory associated with a specific User ID.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/memory_retrieval_uid-c1fafcc3f8f8f664969f5b01fe2ae26f.png" width="1280" height="930"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Developers can use the <code>sys.user_id</code> system variable to capture unique identifiers from external systems, turning the Agent into a personalized consultant for every user.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/memory_uid_variable-06e52db7e21b53941b241ff689f58c39.png" width="1121" height="1230"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="openclaw-integration" class="anchor anchorTargetStickyNavbar_Vzrq">OpenClaw integration<a href="https://ragflow.io/en/blog/ragflow-0.25-ingestion-pipeline-agent-sandbox-and-user-level-memory#openclaw-integration" class="hash-link" aria-label="Direct link to OpenClaw integration" title="Direct link to OpenClaw integration" translate="no"></a></h2>
<p>Version 0.25 integrates with OpenClaw. This allows enterprise users to manage files, parsing, and knowledge base retrieval directly within the Feishu (Lark) environment. Documents in Feishu can automatically sync to RAGFlow for deep parsing, and the Feishu chat window can directly call RAGFlow knowledge bases.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/openclaw-79d089d3bbfa25e9fb35b9d1700fb6ef.png" width="1128" height="372"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>For more information on configuration, refer to: <a href="https://ragflow.io/blog/ragflow-x-openclaw-the-enterprise-aware-claw" target="_blank" rel="noopener noreferrer" class=""><span>RAGFlow x OpenClaw - The Enterprise-aware Claw</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></p>
<h2 id="conclusion" class="anchor anchorTargetStickyNavbar_Vzrq">Conclusion<a href="https://ragflow.io/en/blog/ragflow-0.25-ingestion-pipeline-agent-sandbox-and-user-level-memory#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no"></a></h2>
<p>RAGFlow 0.25 includes 558 new Pull Requests and contributions from 65 developers. Beyond bug fixes, this version marks a steady step forward in data governance and Agent engineering. Moving forward, RAGFlow will explore the boundaries of context engines to build smarter, more reliable enterprise data infrastructure.</p>]]></content:encoded>
            <category>Product News</category>
        </item>
        <item>
            <title><![CDATA[Data foundation in the era of agent harness - why RAGFlow is changing]]></title>
            <link>https://ragflow.io/en/blog/data-foundation-in-the-era-of-agent-harness-why-ragflow-is-changing</link>
            <guid>https://ragflow.io/en/blog/data-foundation-in-the-era-of-agent-harness-why-ragflow-is-changing</guid>
            <pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[In our 2025 year-end review, we clearly defined RAGFlow’s product evolution direction as a context engine and explained the technical necessity of this path from the technical underlying layer. Several months have passed, and the evolution speed of the AI ecosystem is restructuring industry perceptions almost on a monthly basis. Whether the vision proposed at that time is still valid today? This article attempts to conduct a phased review and use it to respond to community concerns regarding RAGFlow's subsequent positioning.]]></description>
            <content:encoded><![CDATA[<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/agent-harness-52f557639ed76c7ae09c2c0a51603376.PNG" width="1280" height="546"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>In our 2025 year-end review, we clearly defined RAGFlow’s product evolution direction as a context engine and explained the technical necessity of this path from the technical underlying layer. Several months have passed, and the evolution speed of the AI ecosystem is restructuring industry perceptions almost on a monthly basis. Whether the vision proposed at that time is still valid today? This article attempts to conduct a phased review and use it to respond to community concerns regarding RAGFlow's subsequent positioning.</p>
<p>Agent harness has undergone extremely dense practical iterations over the past few months. From the modular tools and large-scale application of skills in OpenClaw, to the engineering breakthroughs of Hermes Agent in context management and skills evolution, and the indirect open-sourcing of claw-code which allowed the community to truly touch the engineering core of an agent harness—answering the core proposition of "what a reliable general agent harness should actually look like"—harness design paradigms are being redefined at an unprecedented speed. These iterations together point to a clear trend: the harness is gradually converging from independent solutions into infrastructure.</p>
<p>Recently, with the release of Claude Managed Agents, agent harness has entered a productized and enterprise-level stage. Currently, the components included in an agent harness, such as task orchestration, context engineering, skills systems, and memory operations, are simultaneously presenting two trends. On one hand, their definitions and usage methods are accelerating towards standardization and engineering; on the other hand, some capabilities originally undertaken by the harness are being natively absorbed by LLMs. Anthropic, therefore, abstracts the LLM and harness together as a "Brain"—a stateless decision core responsible for task planning and distribution. The actual capability boundary of an agent is determined by the tools it can call, which are started and executed in code form within a sandbox. This is a crucial architectural abstraction: the Brain remains stateless and can be started or stopped at will, while all persistent states are stored externally (e.g., in session data). The entire ecosystem is thus irreversibly moving toward a clear separation between the state layer and the stateless layer.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/1-f45a02f284fef13c9b67ddfc14ee9f79.PNG" width="1280" height="717"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>This separation trend coincides perfectly with RAGFlow's positioning—supplying data for agents and serving as the agent's data foundation. For enterprise scenarios, an open-source data foundation located at the state layer is particularly critical. It not only provides high-quality, strong-semantic context data for various stateless Brains, but more importantly, it allows enterprises to avoid being bound to a specific vendor's Brain implementation, thereby establishing a unified and independently controllable data infrastructure.</p>
<h2 id="why-the-data-foundation-must-and-can-only-be-built-with-retrieval-capability-as-its-core" class="anchor anchorTargetStickyNavbar_Vzrq">Why the data foundation must, and can only, be built with retrieval capability as its core<a href="https://ragflow.io/en/blog/data-foundation-in-the-era-of-agent-harness-why-ragflow-is-changing#why-the-data-foundation-must-and-can-only-be-built-with-retrieval-capability-as-its-core" class="hash-link" aria-label="Direct link to Why the data foundation must, and can only, be built with retrieval capability as its core" title="Direct link to Why the data foundation must, and can only, be built with retrieval capability as its core" translate="no"></a></h2>
<p>Intuitively, there are two technical paths for building an agent data foundation. One is to expand based on various existing databases—this line of thought directly inherits existing experience from big data platforms. Supplementing vector retrieval capabilities on the basis of data lakes and data warehouses seems to logically form the prototype of an "all-powerful foundation". However, this idea precisely ignores the following key facts:</p>
<ul>
<li class=""><strong>The processing of unstructured documents goes far beyond storage and retrieval.</strong> An agent's demand for unstructured data like documents is not just "storing it and finding it." It involves a complex pipeline centered on heterogenous data source access, governance, cleaning, and semantic enhancement. At the same time, there are diverse deep demands in the retrieval process—such as what indexing strategy to use, whether real-time completion and navigation are needed during retrieval, and expanding semantic associations. These logics are highly complex and dynamic, making them difficult to complete elegantly in a closed manner within a database.</li>
<li class=""><strong>The structured data system does not need to be rebuilt.</strong> Existing enterprise data platforms and business systems already carry a large amount of structured assets; re-covering them with a new database is neither realistic nor necessary. What an agent truly needs is access interfaces to these systems, along with supporting documentation—including API reference manuals, calling examples, and related skills best practices. Providing rich search capabilities for these document-like metadata is sufficient to help agents efficiently filter out the vast majority of tool options that do not match current intentions during execution, thereby initiating calls with the correct parameters and forms.</li>
<li class=""><strong>The value of conversational memory data is reflected in two dimensions.</strong> Conversation data generated during agent operation serves as the source of truth for the harness session history—a complete execution log whose primary demand is reliable storage and governance. On the other hand, it needs to provide memory supply for subsequent agent behavior, where the core demand is efficient retrieval. However, retrieval here is not a simple search of raw session content, but a whole set of control logic decided by the harness regarding "when to read, when to write, what to write, how to compress, how to replay, and how to maintain consistency across sessions." This layer of memory harness orchestration and control, along with the data management pipeline supporting it—processing, abstracting, and indexing raw session data—is essentially no different from the cleaning and semantic enhancement pipeline experienced by document-type data.</li>
</ul>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/3-23c11bbfca9f7ddb9cf8a0f2badf1abb.PNG" width="1280" height="766"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>In summary, retrieval capability constitutes the capability core of the agent data foundation, but it is not a simple "database with search functions." Instead, it is a whole set of data control planes built around retrieval. From the perspective of harness usage, a simple <code>search</code> command-line interface seems to meet most needs, but supporting this interface is a whole set of data engineering systems far beyond the scope of vector retrieval—from the access and understanding of multimodal data to the selection and tuning of indexing strategies, to intention perception and context enhancement during the retrieval process.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/5-839b385da3db08f06db77f00d62d60c5.png" width="4500" height="2464"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="what-kind-of-retrieval-does-agent-harness-actually-need" class="anchor anchorTargetStickyNavbar_Vzrq">What kind of retrieval does agent harness actually need?<a href="https://ragflow.io/en/blog/data-foundation-in-the-era-of-agent-harness-why-ragflow-is-changing#what-kind-of-retrieval-does-agent-harness-actually-need" class="hash-link" aria-label="Direct link to What kind of retrieval does agent harness actually need?" title="Direct link to What kind of retrieval does agent harness actually need?" translate="no"></a></h2>
<p>If the original design point of RAG was to provide precise answers for human users, then the agentic era requires the retrieval system to redesign its service paradigm for intelligent agents.</p>
<p>In a sense, RAG itself can be understood as a built-in, simplified version of an agent: humans propose query intentions, the system goes through built-in decision logic—such as deep research, intention recognition, content navigation, etc.—assembles the complete context, and finally hands it over to the LLM to generate an answer. In a typical daily knowledge base task, this type of behavioral interaction usually converges and completes within ten-odd times. However, as RAG technology further sinks, its role is shifting from a human-oriented "Q&amp;A engine" to a "context supply layer" serving the agent framework. Humans no longer directly initiate queries to the knowledge base but entrust the requirement as a whole to the intelligent agent, which independently completes the acquisition and assembly of answers. Under this shift, retrieval behavior will present characteristics completely different from information retrieval research over the past few decades:</p>
<ul>
<li class=""><strong>Fundamental migration of behavioral patterns:</strong>
<ul>
<li class="">The volume of search requests initiated by agents will far exceed that of human users, possibly even spanning two orders of magnitude. Simultaneously, the agent's query trajectory will significantly lengthen, forming continuous, exploratory retrieval sequences.</li>
<li class="">Therefore, the focus of system optimization should shift from traditional "query expansion and rewriting" to "execution efficiency optimization" and "diversity assurance with session awareness."</li>
</ul>
</li>
<li class=""><strong>Re-examination of retrieval infrastructure:</strong>
<ul>
<li class="">Probability ranking principles, user models, benchmark testing systems, and even the concept of "relevance" itself may need to be redefined and calibrated in agentic scenarios.</li>
<li class="">How to robustly deal with the impact of mixed distributions of organic and synthetic queries will become a key technical challenge in the next stage.</li>
</ul>
</li>
</ul>
<table><thead><tr><th style="text-align:left"></th><th style="text-align:left">Traditional IR (human user)</th><th style="text-align:left">Intelligent agent IR (AI user)</th></tr></thead><tbody><tr><td style="text-align:left"><strong>User profile</strong></td><td style="text-align:left">Unskilled searcher, needs help</td><td style="text-align:left">Skilled researcher, but might "get stuck in a rut"</td></tr><tr><td style="text-align:left"><strong>Core challenge</strong></td><td style="text-align:left">User intention is unclear → system must "guess"</td><td style="text-align:left">User can search too much → system must "block"</td></tr><tr><td style="text-align:left"><strong>Key capability</strong></td><td style="text-align:left">Understanding vague intentions</td><td style="text-align:left">Predicting behavioral patterns, preventing resource exhaustion</td></tr></tbody></table>
<ul>
<li class=""><strong>New opportunities for semantic caching and truncation strategies:</strong>
<ul>
<li class="">Queries within the same task trajectory are highly similar at the semantic level but have extremely low exact text matching rates, which brings huge room for semantic caching, while traditional caching strategies based on exact hits are almost completely invalid.</li>
<li class="">Intelligent agents will not naturally give up when encountering difficulties like humans do; therefore, new truncation and stop strategies need to be designed to prevent the infinite spread of invalid retrieval.</li>
</ul>
</li>
</ul>
<p>Facing these emerging propositions, RAGFlow's evolution direction also corresponds to them one by one:</p>
<ul>
<li class=""><strong>Refactor the online API service layer with the Go language.</strong> RAGFlow's early use of Python for rapid verification and iteration played an irreplaceable role in the project's success, but its performance bottlenecks have become increasingly prominent with the expansion of call scale. The core service rewritten in Go can calmly handle the two orders of magnitude increase in access for agentic retrieval and fully release the performance potential of the underlying database.</li>
<li class=""><strong>Provide a unified ContextEngine CLI access entry.</strong> Intelligent agents only need to use a single <code>search</code> command to seamlessly retrieve all information across heterogenous data sources, greatly reducing the complexity of access and usage on the harness side.</li>
<li class=""><strong>Build-in richer data processing pipelines.</strong> The upper limit of retrieval capability essentially depends on the depth and breadth of semantic enhancement during the data writing process. Continuous maintenance and diversified expansion of data pipelines are always the most critical and complex factors determining retrieval quality.</li>
</ul>
<p>After completing the above evolution, RAGFlow will formally release version 1.0 in a more complete posture. But 1.0 is definitely not an end point. On the contrary, when retrieval users change from humans to intelligent agents, a whole new problem domain has just surfaced: How to define "relevance" from an agent's perspective? How to evaluate the cumulative utility of the retrieval system in hundreds of continuous calls? At what granularity and with what strategy should semantic caching be embedded into the retrieval pipeline? How should truncation and retry mechanisms be designed in coordination with the agent's task planning? These questions cannot find ready-made answers in traditional information retrieval papers; they together point to a fact—agentic retrieval will become one of the core battlefields for industry innovation in the next stage.</p>
<p>RAGFlow is closely monitoring and actively following this frontier. From selecting more efficient index structures to building a retrieval evaluation system oriented toward agent trajectories, to exploring deep integration with open-source harness frameworks, RAGFlow’s evolution direction is always in sync with the data demands of the agentic era. We believe that a true data foundation for intelligent agents will not be a finished product achieved in one go, but an organic system that continuously resonates with the ecosystem and constantly reshapes itself.</p>
<h2 id="bibliography" class="anchor anchorTargetStickyNavbar_Vzrq">Bibliography<a href="https://ragflow.io/en/blog/data-foundation-in-the-era-of-agent-harness-why-ragflow-is-changing#bibliography" class="hash-link" aria-label="Direct link to Bibliography" title="Direct link to Bibliography" translate="no"></a></h2>
<ul>
<li class=""><a href="https://blog.langchain.com/your-harness-your-memory/" target="_blank" rel="noopener noreferrer" class=""><span>https://blog.langchain.com/your-harness-your-memory/</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class=""><a href="https://x.com/sarahwooders/status/2040121230473457921" target="_blank" rel="noopener noreferrer" class=""><span>https://x.com/sarahwooders/status/2040121230473457921</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
</ul>]]></content:encoded>
            <category>Insights</category>
        </item>
        <item>
            <title><![CDATA[RAGFlow x OpenClaw - The Enterprise-aware Claw]]></title>
            <link>https://ragflow.io/en/blog/ragflow-x-openclaw-the-enterprise-aware-claw</link>
            <guid>https://ragflow.io/en/blog/ragflow-x-openclaw-the-enterprise-aware-claw</guid>
            <pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[As agent technology races forward, OpenClaw has quickly become a favorite among developers, celebrated for its powerful execution framework and versatile action capabilities. It lets agents take on tasks, use tools, and even navigate complex business operations—almost as naturally as a human would.]]></description>
            <content:encoded><![CDATA[<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/ragflow_openclaw-345dbc473e44304d1fe5eebb48b61367.PNG" width="1280" height="638"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>As agent technology races forward, OpenClaw has quickly become a favorite among developers, celebrated for its powerful execution framework and versatile action capabilities. It lets agents take on tasks, use tools, and even navigate complex business operations—almost as naturally as a human would.
However, when applied to enterprise settings, a key limitation emerges: OpenClaw cannot directly access or process internal private data. This data—often buried across vast numbers of documents, databases, and knowledge repositories—is essential for building truly specialised, expert-level agents.</p>
<p>This is where RAGFlow comes in. As a leading enterprise RAG engine, RAGFlow specialises in deep document understanding and precise information retrieval, transforming scattered proprietary knowledge into agent-ready datasets.</p>
<p>Now that RAGFlow has completed its foundational Skill integration with OpenClaw, any RAGFlow user can easily connect their dataset to the OpenClaw ecosystem. Whether on Feishu, Discord, or other platforms, OpenClaw agents can tap into company-specific knowledge in real time during conversations—making the leap from a general-purpose assistant to a true business expert.</p>
<h2 id="feature-overview" class="anchor anchorTargetStickyNavbar_Vzrq">Feature Overview<a href="https://ragflow.io/en/blog/ragflow-x-openclaw-the-enterprise-aware-claw#feature-overview" class="hash-link" aria-label="Direct link to Feature Overview" title="Direct link to Feature Overview" translate="no"></a></h2>
<p>The currently released version of the RAGFlow skill is a foundational release, focusing on integrating core dataset capabilities. Once this skill is connected, RAGFlow's core services can be invoked directly through OpenClaw. The following features are demonstrated using the Feishu platform.</p>
<h3 id="dataset-operations" class="anchor anchorTargetStickyNavbar_Vzrq">Dataset operations<a href="https://ragflow.io/en/blog/ragflow-x-openclaw-the-enterprise-aware-claw#dataset-operations" class="hash-link" aria-label="Direct link to Dataset operations" title="Direct link to Dataset operations" translate="no"></a></h3>
<p>Full CRUD (Create, Read, Update, Delete) control over RAGFlow datasets, directly via Feishu:</p>
<ul>
<li class="">Basic operations: Create datasets, view details, and retrieve overviews.</li>
<li class="">Attribute management: Update existing dataset names, parsing methods, and descriptions.</li>
</ul>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/list_datasets-6a143f800cf9ddb728bef5d65e72f396.PNG" width="1280" height="1141"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/create_dataset-47dda845a6861a4129e980e56155f7bb.png" width="1280" height="530"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="automated-document-processing" class="anchor anchorTargetStickyNavbar_Vzrq">Automated document processing<a href="https://ragflow.io/en/blog/ragflow-x-openclaw-the-enterprise-aware-claw#automated-document-processing" class="hash-link" aria-label="Direct link to Automated document processing" title="Direct link to Automated document processing" translate="no"></a></h3>
<p>Upload, parse, and manage RAGFlow documents directly via Feishu:</p>
<ul>
<li class="">Multi-file management: Upload and parse single or multiple files in mainstream formats such as PDF, TXT, and DOCX.</li>
<li class="">Status control: Enable or disable documents, change chunking methods, and rename files.</li>
</ul>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/upload-f52afcbfb310334cf1faea568e3f857f.png" width="1280" height="1149"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/disable-23dd5b0e8f3bd90adbc486c241585983.png" width="1280" height="1149"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="semantic-search-and-scope-control" class="anchor anchorTargetStickyNavbar_Vzrq">Semantic search and scope control<a href="https://ragflow.io/en/blog/ragflow-x-openclaw-the-enterprise-aware-claw#semantic-search-and-scope-control" class="hash-link" aria-label="Direct link to Semantic search and scope control" title="Direct link to Semantic search and scope control" translate="no"></a></h3>
<p>Search RAGFlow dataset content directly during conversations with the OpenClaw bot on Feishu:</p>
<ul>
<li class="">Multi-dimensional search: Supports cross-dataset search, targeted dataset search, and fine-grained search within specific documents.</li>
</ul>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/author-06d75ff96a5e0ba8c953a8b7a406d892.png" width="1280" height="1013"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/mi-ba752977ec87c636b51598de9ff84cf7.png" width="1280" height="542"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>The examples above cover the core atomic capabilities of RAGFlow—dataset management, parsing, and retrieval.</p>
<p>The upper limit of an agent's expertise ultimately depends on the quality of the knowledge its developer has cultivated within its dataset. The value of the RAGFlow skill lies in ensuring that this private knowledge can be called upon by the OpenClaw framework with precision and efficiency—giving agents the ability to ground their responses in solid information and operate with genuine business insights.</p>
<p>To help developers quickly build this knowledge-driven architecture, the skill is now available via ClawHub—enabling OpenClaw to acquire a specialised brain in just a few steps.</p>
<h2 id="a-quickstart-guide" class="anchor anchorTargetStickyNavbar_Vzrq">A quickstart guide<a href="https://ragflow.io/en/blog/ragflow-x-openclaw-the-enterprise-aware-claw#a-quickstart-guide" class="hash-link" aria-label="Direct link to A quickstart guide" title="Direct link to A quickstart guide" translate="no"></a></h2>
<ol>
<li class="">Download the RAGFlow Skill from ClawHub <a href="https://clawhub.ai/yingfeng/ragflow-skill" target="_blank" rel="noopener noreferrer" class=""><span>https://clawhub.ai/yingfeng/ragflow-skill</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a>.</li>
<li class="">Obtain your RAGFlow API key and URL:<br>
<!-- -->Go to your RAGFlow personal homepage and click on API.</li>
</ol>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/api-1e4e12ba794fc4c47cd4c857372610dd.png" width="1280" height="661"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<ol start="3">
<li class="">Configure API Key and URL:<br>
<!-- -->Locate the .env file in the skill root directory and enter the credentials obtained in the previous step:</li>
</ol>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain"># RAGFlow service base url</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">RAGFLOW_API_URL=http://your-ragflow-ip</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain"># RAGFlow personal API Key</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">RAGFLOW_API_KEY=ragflow-your-api-key-here </span><br></span></code></pre></div></div>
<ol start="4">
<li class="">Restart Gateway to take effect</li>
</ol>
<p>After modifying the configuration, restart the OpenClaw Gateway service to complete the initialisation and loading of the skill.</p>
<p>Once the above configuration is complete, RAGFlow's dataset management and retrieval capabilities can be called directly within the OpenClaw framework.</p>
<h2 id="finale" class="anchor anchorTargetStickyNavbar_Vzrq">Finale<a href="https://ragflow.io/en/blog/ragflow-x-openclaw-the-enterprise-aware-claw#finale" class="hash-link" aria-label="Direct link to Finale" title="Direct link to Finale" translate="no"></a></h2>
<p>The foundational integration between OpenClaw and RAGFlow marks a shift for enterprise AI assistants—from general‑purpose conversation to business‑focused operation. OpenClaw handles the execution layer and user interaction, while RAGFlow provides a continuously evolving knowledge foundation.</p>
<p>The current release focuses on standardising integration with core dataset capabilities. Future iterations of the RAGFlow Skills will not only introduce further enhancements but also launch a dedicated ContextEngine. This can be injected into OpenClaw as a System Prompt or directly interface with OpenClaw's ContextEngine API, delivering a robust context layer and data infrastructure for a wide range of agents.</p>
<p>We invite you to follow and star our project as we continue to grow RAGFlow.
GitHub: <a href="https://github.com/infiniflow/ragflow" target="_blank" rel="noopener noreferrer" class=""><span>https://github.com/infiniflow/ragflow</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></p>]]></content:encoded>
            <category>Tutorials</category>
        </item>
        <item>
            <title><![CDATA[RAGFlow online service domain switch]]></title>
            <link>https://ragflow.io/en/blog/ragflow-online-service-domain-switch</link>
            <guid>https://ragflow.io/en/blog/ragflow-online-service-domain-switch</guid>
            <pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[We are excited to announce an important update regarding the RAGFlow online service!]]></description>
            <content:encoded><![CDATA[<p>We are excited to announce an important update regarding the RAGFlow online service!</p>
<p>Since the open-source launch of RAGFlow, we have provided a public playground at <strong><a href="https://demo.ragflow.io/" target="_blank" rel="noopener noreferrer" class=""><span>https://demo.ragflow.io</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></strong> for everyone to experience the power of retrieval-augmented generation. Over the past two years, the platform has gained tremendous traction, and we are deeply grateful for the continuous support and feedback from our community.</p>
<p>As we look toward the future, we are transitioning our online service to a new domain: <strong><a href="https://cloud.ragflow.io/" target="_blank" rel="noopener noreferrer" class=""><span>https://cloud.ragflow.io</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></strong>. This change marks the first step toward our upcoming commercial SaaS offering, which will bring enhanced features, better scalability, and dedicated support.</p>
<h3 id="what-does-this-mean-for-existing-users" class="anchor anchorTargetStickyNavbar_Vzrq">What Does This Mean for Existing Users?<a href="https://ragflow.io/en/blog/ragflow-online-service-domain-switch#what-does-this-mean-for-existing-users" class="hash-link" aria-label="Direct link to What Does This Mean for Existing Users?" title="Direct link to What Does This Mean for Existing Users?" translate="no"></a></h3>
<p>All user data from <code>demo.ragflow.io</code> has been securely migrated to the new platform. This includes accounts registered via both <strong>GitHub SSO</strong> and <strong>email</strong>. However, due to technical constraints during the migration process, <strong>users who registered with an email and password will need to reset their passwords</strong> before they can log in to the new <code>cloud.ragflow.io</code> site.</p>
<p>We sincerely apologize for this inconvenience. Please rest assured that your data—including documents, conversation histories, and settings—remains intact and will be available once you log in after resetting your password.</p>
<h3 id="how-to-access-your-account" class="anchor anchorTargetStickyNavbar_Vzrq">How to Access Your Account?<a href="https://ragflow.io/en/blog/ragflow-online-service-domain-switch#how-to-access-your-account" class="hash-link" aria-label="Direct link to How to Access Your Account?" title="Direct link to How to Access Your Account?" translate="no"></a></h3>
<ol>
<li class="">Visit <strong><a href="https://cloud.ragflow.io/" target="_blank" rel="noopener noreferrer" class=""><span>https://cloud.ragflow.io</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></strong>.</li>
<li class="">Click on “Sign In” and choose the appropriate method:<!-- -->
<ul>
<li class="">If you originally used <strong>GitHub SSO</strong>, simply log in with GitHub—your account should work seamlessly.</li>
<li class="">If you registered with an <strong>email and password</strong>, click “Forgot Password” to initiate a password reset. Follow the instructions sent to your email to set a new password.</li>
</ul>
</li>
</ol>
<h3 id="looking-ahead" class="anchor anchorTargetStickyNavbar_Vzrq">Looking Ahead<a href="https://ragflow.io/en/blog/ragflow-online-service-domain-switch#looking-ahead" class="hash-link" aria-label="Direct link to Looking Ahead" title="Direct link to Looking Ahead" translate="no"></a></h3>
<p>The move to <code>cloud.ragflow.io</code> lays the groundwork for our upcoming <strong>commercial SaaS version</strong>, which will offer advanced capabilities, higher reliability, and priority support. We are working hard to bring you a polished, production-ready service, and we can’t wait to share more details soon.</p>
<p>Thank you for being part of the RAGFlow journey. Your trust and patience mean the world to us. If you encounter any issues during the transition, please reach out to our support team—we’re here to help.</p>
<p>Stay tuned for more updates!</p>
<p><strong>The RAGFlow Team</strong></p>]]></content:encoded>
            <category>Product News</category>
        </item>
        <item>
            <title><![CDATA[RAGFlow 0.24.0 — Memory API, knowledge base governance and Agent chat history]]></title>
            <link>https://ragflow.io/en/blog/ragflow-0.24.0-memory-api-knowledge-base-governance-and-agent-chat-history</link>
            <guid>https://ragflow.io/en/blog/ragflow-0.24.0-memory-api-knowledge-base-governance-and-agent-chat-history</guid>
            <pubDate>Sun, 15 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[RAGFlow 0.24 introduces a series of features addressing core challenges developers face in real-world deployments: how to integrate and maintain Memory, how to ensure continuous Agent usability, and how to govern knowledge base data effectively.]]></description>
            <content:encoded><![CDATA[<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/2026-3130acc73f0bc478882987b2744f9fe1.PNG" width="1280" height="546"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>RAGFlow 0.24 introduces a series of features addressing core challenges developers face in real-world deployments: how to integrate and maintain Memory, how to ensure continuous Agent usability, and how to govern knowledge base data effectively.</p>
<ul>
<li class=""><strong>Observable Memory</strong>: The console now features Memory extraction status and logs, making every step of asynchronous tasks clear and traceable. Additionally, HTTP APIs and a Python API are provided, enabling engineered integration for CRUD operations and intelligent retrieval of Memories.</li>
<li class=""><strong>Agent Chat Management</strong>: A new <strong>Launch</strong> button allows users to enter a chat interface consistent with the Chat design, where all conversation histories are preserved.</li>
<li class=""><strong>Manageable Knowledge Base Metadata</strong>: Supports batch management of metadata for multiple files, enhancing the user experience when configuring application metadata.</li>
</ul>
<p>We will now delve into each of these features and improvements.</p>
<h2 id="memory-management" class="anchor anchorTargetStickyNavbar_Vzrq">Memory management<a href="https://ragflow.io/en/blog/ragflow-0.24.0-memory-api-knowledge-base-governance-and-agent-chat-history#memory-management" class="hash-link" aria-label="Direct link to Memory management" title="Direct link to Memory management" translate="no"></a></h2>
<h3 id="output-memory-extraction-log" class="anchor anchorTargetStickyNavbar_Vzrq">Output memory extraction log<a href="https://ragflow.io/en/blog/ragflow-0.24.0-memory-api-knowledge-base-governance-and-agent-chat-history#output-memory-extraction-log" class="hash-link" aria-label="Direct link to Output memory extraction log" title="Direct link to Output memory extraction log" translate="no"></a></h3>
<p>We have added extraction status and comprehensive log display to the Memory console.</p>
<p>Each Memory extraction, embedding, and storage operation is no longer a black-box process. It is now transparently shown to developers: when it started, the processing steps involved, whether it succeeded, and when it was written to storage.</p>
<p>This feature significantly enhances the system's observability, allowing developers to clearly understand how Memories are generated.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/memory_extraction_log-8ff96d4985d00beb917001d8291ac10b.PNG" width="1280" height="574"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="manage-management-api" class="anchor anchorTargetStickyNavbar_Vzrq">Manage management API<a href="https://ragflow.io/en/blog/ragflow-0.24.0-memory-api-knowledge-base-governance-and-agent-chat-history#manage-management-api" class="hash-link" aria-label="Direct link to Manage management API" title="Direct link to Manage management API" translate="no"></a></h3>
<p>To facilitate developer integration, Memory now supports two invocation methods: RESTful API and Python SDK. These interfaces enable comprehensive management of Memories and their entries, including:</p>
<ul>
<li class=""><strong>CRUD Operations</strong>: Create, query, update, or delete Memories; add memory entries; modify the enabled/disabled status of entries within a Memory; or manage the forgetting of entries no longer needed.</li>
<li class=""><strong>Session Management</strong>: Organise and retrieve relevant memories by session.</li>
<li class=""><strong>Intelligent Retrieval</strong>: Quickly locate memories using keyword and semantic similarity searches.</li>
</ul>
<p>Whether you are building a conversational chatbot or a complex application requiring state persistence, you can seamlessly integrate Memory through straightforward API calls. For detailed usage and parameter descriptions, please refer to the <a href="https://ragflow.io/docs/http_api_reference#memory-management" target="_blank" rel="noopener noreferrer" class=""><span>HTTP API</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a> and <a href="https://ragflow.io/docs/python_api_reference#memory-management" target="_blank" rel="noopener noreferrer" class=""><span>Python API</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a>.</p>
<h2 id="new-agent-chat-management-interface" class="anchor anchorTargetStickyNavbar_Vzrq">New Agent chat management interface<a href="https://ragflow.io/en/blog/ragflow-0.24.0-memory-api-knowledge-base-governance-and-agent-chat-history#new-agent-chat-management-interface" class="hash-link" aria-label="Direct link to New Agent chat management interface" title="Direct link to New Agent chat management interface" translate="no"></a></h2>
<p>Previously, developers primarily used RAGFlow's Agent in two ways:</p>
<ul>
<li class="">Building a custom frontend application to interface with the API</li>
<li class="">Publishing it for external use via an embedded page</li>
</ul>
<p>The first approach offers flexibility but requires frontend development effort. The second has a lower barrier to entry, yet it presents a drawback for users wishing to use the Agent continuously: it does not retain historical chat records, nor does it allow users to resume previous conversations.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/agent1-bbd7b5ef0907fe001cbe2df95a765898.PNG" width="1280" height="825"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>This release addresses the issue. Clicking the <strong>Launch</strong> button at the top of the Agent page now opens a chat interface similar to that of a Chat assistant application.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/agent2-fde6598c986c15df755b5299a62c1a5e.png" width="945" height="819"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Within this interface, multiple conversations and their chat histories are preserved.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/agent3-019a591efe04377940988fbcee0fc9d5.png" width="1233" height="580"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="batch-metadata-management" class="anchor anchorTargetStickyNavbar_Vzrq">Batch metadata management<a href="https://ragflow.io/en/blog/ragflow-0.24.0-memory-api-knowledge-base-governance-and-agent-chat-history#batch-metadata-management" class="hash-link" aria-label="Direct link to Batch metadata management" title="Direct link to Batch metadata management" translate="no"></a></h2>
<p>In previous versions of RAGFlow, maintaining metadata was a rather cumbersome process for developers. The platform now supports batch metadata management, allowing multiple files to be selected and their metadata managed simultaneously.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/meta1-1b8539274764125cafc12fed58e19a9a.png" width="1329" height="256"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/meta2-e7acbd73df8015c1fc4818c83775a8f2.png" width="1280" height="630"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Additionally, batch deletion of metadata for a single file is now supported directly from the interface.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/meta3-4f7358b3f17dcd3578344985c859b205.jpg" width="1280" height="588"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Previously, configuring metadata filtering logic within a chat application required manually entering filter values. With this update, RAGFlow has replaced this with a dropdown selection box, streamlining the configuration process for developers.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/meta4-e2793af572d349d3ea379baa48886c59.png" width="442" height="882"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="chats-thinking-mode" class="anchor anchorTargetStickyNavbar_Vzrq">Chat's Thinking mode<a href="https://ragflow.io/en/blog/ragflow-0.24.0-memory-api-knowledge-base-governance-and-agent-chat-history#chats-thinking-mode" class="hash-link" aria-label="Direct link to Chat's Thinking mode" title="Direct link to Chat's Thinking mode" translate="no"></a></h2>
<p>The chat application has introduced a thinking mode to replace the previous reasoning toggle in the configuration. The underlying algorithmic strategy has been optimised for deep research scenarios, further improving retrieval precision.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/thinking-8dd637bf3841eb9a18c4fe752e4737d5.png" width="1280" height="934"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="support-for-multiple-admin-users" class="anchor anchorTargetStickyNavbar_Vzrq">Support for multiple admin users<a href="https://ragflow.io/en/blog/ragflow-0.24.0-memory-api-knowledge-base-governance-and-agent-chat-history#support-for-multiple-admin-users" class="hash-link" aria-label="Direct link to Support for multiple admin users" title="Direct link to Support for multiple admin users" translate="no"></a></h2>
<p>In previous versions, superuser privileges were concentrated by default in the <a href="mailto:admin@ragflow.io" target="_blank" rel="noopener noreferrer" class=""><span>admin@ragflow.io</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a> account. While this is acceptable for personal use, in an enterprise environment a single superuser often creates a bottleneck and concentrates authority.</p>
<p>With this update, RAGFlow now supports assigning superuser privileges to multiple users, moving beyond the limitation of a single admin account.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/multi-admin-eaa862078ed6063600075dcdccd58f5b.png" width="1243" height="398"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="finale" class="anchor anchorTargetStickyNavbar_Vzrq">Finale<a href="https://ragflow.io/en/blog/ragflow-0.24.0-memory-api-knowledge-base-governance-and-agent-chat-history#finale" class="hash-link" aria-label="Direct link to Finale" title="Direct link to Finale" translate="no"></a></h2>
<p>This update to RAGFlow 0.24 aims to further assist developers in utilising and consolidating data assets within the platform:</p>
<ul>
<li class="">Memory, as a long-term system for accumulating agent data assets, needs to provide developers with more convenient access and debugging capabilities.</li>
<li class="">A knowledge base should be more than just storage for files; it should be a governable data asset, requiring low-cost metadata management capabilities.</li>
</ul>
<p>At the ecosystem level, this release adds support for OceanBase as the primary database, which can replace MySQL in deployments. It also introduces support for PaddleOCR-VL, further enhancing document and visual text processing capabilities.</p>
<p>In upcoming versions, RAGFlow will begin integrating agent skills, helping developers build agent systems with higher execution accuracy and greater stability.</p>
<h2 id="reference" class="anchor anchorTargetStickyNavbar_Vzrq">Reference<a href="https://ragflow.io/en/blog/ragflow-0.24.0-memory-api-knowledge-base-governance-and-agent-chat-history#reference" class="hash-link" aria-label="Direct link to Reference" title="Direct link to Reference" translate="no"></a></h2>
<ol>
<li class=""><a href="https://www.ragflow.io/docs/v0.24.0/http_api_reference#memory-management" target="_blank" rel="noopener noreferrer" class=""><span>https://www.ragflow.io/docs/v0.24.0/http_api_reference#memory-management</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class=""><a href="https://www.ragflow.io/docs/v0.24.0/python_api_reference#memory-management" target="_blank" rel="noopener noreferrer" class=""><span>https://www.ragflow.io/docs/v0.24.0/python_api_reference#memory-management</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
</ol>]]></content:encoded>
            <category>Product News</category>
        </item>
        <item>
            <title><![CDATA[RAGFlow 0.23.0 — Advancing Memory, RAG, and Agent Performance]]></title>
            <link>https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance</link>
            <guid>https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance</guid>
            <pubDate>Wed, 31 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[The hallmark of this release is the introduction of a new Memory module, empowering AI Agents with lasting memory. This core advancement not only enables real‑time retrieval of the most task‑relevant historical experiences, but also supports the continuous, structured accumulation and optimization of knowledge assets—laying the foundation for an intelligent core capable of autonomous evolution.]]></description>
            <content:encoded><![CDATA[<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/memory_0.23.0-112458d6149de4a142e07be242cb64c0.PNG" width="1280" height="546"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>The hallmark of this release is the introduction of a new Memory module, empowering AI Agents with lasting memory. This core advancement not only enables real‑time retrieval of the most task‑relevant historical experiences, but also supports the continuous, structured accumulation and optimization of knowledge assets—laying the foundation for an intelligent core capable of autonomous evolution.
This version also brings significant enhancements across multiple fronts:</p>
<ul>
<li class="">Enhanced Agent Capabilities:<br>
<!-- -->Refactored underlying architecture for faster performance; added support for Webhook‑triggered automation; and opened voice input/output interfaces.</li>
<li class="">Upgraded RAG Performance:<br>
<!-- -->Introduced batch metadata generation during document parsing; added contextual text around extracted images and tables within slices for richer semantics; and implemented a new Parent‑Child slicing strategy.</li>
<li class="">Improved APIs:<br>
<!-- -->The Agent API now returns detailed execution logs, enabling developers to display reasoning processes on the front end. The Chat API offers enhanced metadata filtering for more precise answer control.</li>
</ul>
<p>We will now delve into each of these features and improvements.</p>
<h2 id="memory-management-and-usage" class="anchor anchorTargetStickyNavbar_Vzrq">Memory management and usage<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#memory-management-and-usage" class="hash-link" aria-label="Direct link to Memory management and usage" title="Direct link to Memory management and usage" translate="no"></a></h2>
<p>Memory is designed to preserve dynamically generated interaction logs and derived data during Agent operation (such as user inputs, LLM outputs, potential interaction states, and summaries or reflections generated by the LLM). Its purpose is to maintain conversational continuity, enable personalization, and facilitate learning from historical experience.</p>
<p>Beyond simply storing raw interaction data, this module is capable of extracting semantic memory, episodic memory, and working memory. Once stored, users can effortlessly reintroduce this information as part of the context in subsequent conversations, thereby enhancing both dialogue coherence and reasoning accuracy.</p>
<h3 id="manage-memory" class="anchor anchorTargetStickyNavbar_Vzrq">Manage memory<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#manage-memory" class="hash-link" aria-label="Direct link to Manage memory" title="Direct link to Manage memory" translate="no"></a></h3>
<p>The Memory module supports convenient centralized management. Users can specify the types of memories to extract when creating a Memory and perform operations such as renaming and team sharing on the navigation page at Overview &gt;&gt; Memory. The image below illustrates the process of creating a Memory:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/memory_overview-1f7670c37ad0c0e55b0fd4f31c02d721.PNG" width="1280" height="698"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Within an individual Memory page, you can manage saved memory entries by enabling or disabling them during Agent calls, or by forgetting memory entries that are no longer needed.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/memory_list-f63fa6697768d18ed960a945369df68e.PNG" width="1280" height="703"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Memory entries that have been actively forgotten will no longer appear in the results of Agent calls. When the storage capacity of the Memory reaches its limit and triggers the forgetting policy, those manually forgotten entries will also be prioritized for removal.</p>
<h3 id="enhanced-agent-context" class="anchor anchorTargetStickyNavbar_Vzrq">Enhanced Agent context<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#enhanced-agent-context" class="hash-link" aria-label="Direct link to Enhanced Agent context" title="Direct link to Enhanced Agent context" translate="no"></a></h3>
<p>Under Agent &gt;&gt; Retrieval and Agent &gt;&gt; Message components, a new Memory invocation feature has been added. Users can configure the Message component to store data into a specified Memory and set up the Retrieval component to query from Memory. The diagram below illustrates how a simple Q&amp;A bot Agent can utilize Memory.</p>
<p>In Agent components where Memory is configured, a Retrieval component must be included to recall information from Memory.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/retrieve_from_memory-60331e9d86b6536d5dcd5d737f0aa90e.png" width="1280" height="672"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Select the corresponding Memory in the Message component under Save to Memory.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/message_save_to_memory-14b823328ccdfc29ef53ce38c616a096.png" width="1280" height="672"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>The Agent component must be configured with a User prompt to enable the Agent component to access information from the Retrieval component.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/agent_user_prompt-a8b4a9923533912c385064f095c6dc9d.png" width="1280" height="1020"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="memory-lets-agent-know-you-better" class="anchor anchorTargetStickyNavbar_Vzrq">Memory lets Agent know you better<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#memory-lets-agent-know-you-better" class="hash-link" aria-label="Direct link to Memory lets Agent know you better" title="Direct link to Memory lets Agent know you better" translate="no"></a></h3>
<p>When a concept exists across multiple fields, the Agent may sometimes deviate from the user's actual intent and provide a response that is out of context.</p>
<p>For example, if a user asks, "What is Reflexion?" the Agent might default to explaining it from the perspective of cognitive science or neuropsychology, rather than addressing the Reflexion concept within the Agent/LLM reasoning framework that the user is actually interested in.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/1-3cd78cf0d17a3dec1bcdf5c1813f958c.png" width="1280" height="891"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>In such cases, the user can clarify and correct the Agent's understanding by explicitly indicating that this is a term from the field of Agent systems. This clarification will be recorded in the Memory as part of the user's long-term preferences and semantic context.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/2-84453520bc873437985c8c32a9ad499e.png" width="1280" height="911"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Afterward, when the user inquires about the same concept again, the Agent will automatically align with the user’s domain preference based on past interaction history, providing the definition and explanation of Reflexion directly from the Agent perspective—without requiring repeated clarification.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/3-cee603970d12fe6ab4de3395cf74404c.png" width="1280" height="884"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>This example illustrates how Memory transforms the Agent from a one-time answering tool into an intelligent assistant that continuously calibrates its understanding and evolves alongside the user's interactions.</p>
<h2 id="enhanced-agent" class="anchor anchorTargetStickyNavbar_Vzrq">Enhanced Agent<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#enhanced-agent" class="hash-link" aria-label="Direct link to Enhanced Agent" title="Direct link to Enhanced Agent" translate="no"></a></h2>
<h3 id="enhanced-agent-performance" class="anchor anchorTargetStickyNavbar_Vzrq">Enhanced Agent performance<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#enhanced-agent-performance" class="hash-link" aria-label="Direct link to Enhanced Agent performance" title="Direct link to Enhanced Agent performance" translate="no"></a></h3>
<p>In previous versions, community feedback highlighted that while RAGFlow’s Agent demonstrated strong execution accuracy and generalization capabilities for complex tasks when configured with tools, its processing speed was slower and token consumption was higher for routine, less complex business scenarios.</p>
<p>This is because, in earlier versions, the Agent's underlying architecture was designed with a layered structure for handling more complex tasks, incorporating LLM-based planning and reflection.</p>
<p>In version 0.23.0, the Agent has been further optimized for simpler tasks, reducing the processing time by approximately 50% compared to the initially released Agent in version 0.20.0. These optimizations were primarily implemented at the architectural level, refining the execution flow of Agent components and the LLM invocation pipeline.</p>
<p>The following example demonstrates the construction of an Agent designed to search academic content.<br>
<!-- -->In versions prior to 0.23.0, answering a conceptual question such as "What is Reflexion in the Agent domain?" took about 50 seconds:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/4-8ee8c818eb891e97f3d50cc066aefb7f.png" width="1280" height="784"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>In version 0.23.0, the time required to generate a response of similar length has been reduced to 27 seconds:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/5-a7f2733e66d696e448dbdfe05318cc47.png" width="1280" height="889"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Developers can also customize the Agent's workflow according to their specific business processes, such as strictly defining the sequence of tool calls, as shown in the diagram below.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/6-6edc28f087e25e5aafed973a58364ab5.png" width="1280" height="892"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>The logs confirm that ArXiv was indeed invoked first:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/7-83dfe660575a27fe54fe0ee57286dbf0.png" width="1204" height="802"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Then followed by Tavily Search:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/8-89c5f2cd4aa0b0f11f7b67c360c06a71.png" width="1265" height="1001"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>The total runtime of the Agent remains within the range of 30 seconds.</p>
<h3 id="workflows-triggered-using-webhook" class="anchor anchorTargetStickyNavbar_Vzrq">Workflows triggered using Webhook<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#workflows-triggered-using-webhook" class="hash-link" aria-label="Direct link to Workflows triggered using Webhook" title="Direct link to Workflows triggered using Webhook" translate="no"></a></h3>
<p>In real‑world business scenarios and development needs, it is common to rely on external systems triggering operations via HTTP requests—typical use cases include user form submissions, chatbot message pushes, and similar events.</p>
<p>In version 0.23.0, RAGFlow’s Agent now supports receiving external HTTP requests through Webhooks, enabling automated triggering and the initiation of workflows. This enhancement significantly improves the system's flexibility and extensibility.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/webhook_mode-a15a4505c7badfebe8206bfc9cfca462.png" width="1188" height="809"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>As shown below, the system automatically generates a unique Webhook URL for each workflow. Users can simply use this URL to seamlessly integrate external systems and achieve automated connectivity.</p>
<p>On the Webhook configuration page, users can directly copy the generated Webhook URL to configure third‑party systems or API calls, and select the desired HTTP request method to receive the trigger.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/webhook_get-1f390e9afad62da70c729fe7cf9afc58.png" width="850" height="554"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h4 id="security-configuration" class="anchor anchorTargetStickyNavbar_Vzrq">Security configuration<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#security-configuration" class="hash-link" aria-label="Direct link to Security configuration" title="Direct link to Security configuration" translate="no"></a></h4>
<p>Webhook provides multi‑level security authentication and traffic control mechanisms to ensure data transmission security and system stability.</p>
<p>It supports three authentication methods to meet different security requirements: Token-based authentication, Basic auth, and JWT authentication.<br>
<!-- -->Additionally, it includes request rate limiting, maximum request body size restrictions, and IP whitelist configuration, effectively preventing malicious access and traffic overload to maintain reliable and stable service operation.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/security-75102501fdbe496f566089e06517bd5b.png" width="1118" height="807"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h4 id="schema-configuration" class="anchor anchorTargetStickyNavbar_Vzrq">Schema configuration<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#schema-configuration" class="hash-link" aria-label="Direct link to Schema configuration" title="Direct link to Schema configuration" translate="no"></a></h4>
<p>Schema is used to specify the data format of the HTTP requests that the Webhook will receive, allowing RAGFlow to parse the requests accordingly. Schema configuration includes the Content types and query parameters of the HTTP request. Currently supported content types are as follows:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/begin_query_parameters-139305ede9fd4d7ae8a2a654b7b2030a.png" width="850" height="294"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h4 id="response-configuration" class="anchor anchorTargetStickyNavbar_Vzrq">Response configuration<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#response-configuration" class="hash-link" aria-label="Direct link to Response configuration" title="Direct link to Response configuration" translate="no"></a></h4>
<p>Two execution models are provided: Accepted response and Final response:</p>
<ul>
<li class="">Accepted response: Once the request passes validation, a success acknowledgment is returned immediately, and the workflow executes asynchronously in the background.</li>
<li class="">Final response: The system returns the final processing result only after the workflow execution is completed.</li>
</ul>
<p>Accepted response is configured via the Begin component: users can customize the success response status code (within the range of 200–399) and the response body content.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/begin_response-234c3b66558681cded18f66a5110af42.png" width="1026" height="327"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Final response is configured through the Message component, allowing users to customize the success response status code within the 200–399 range.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/begin_response_2-47322aa39bad03de72ddd824fb98d2f3.png" width="1021" height="278"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/messages-6492a2f4d598f488966b78c0a36c4cfe.png" width="1073" height="669"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h4 id="test-run-and-check-the-log" class="anchor anchorTargetStickyNavbar_Vzrq">Test run and check the log<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#test-run-and-check-the-log" class="hash-link" aria-label="Direct link to Test run and check the log" title="Direct link to Test run and check the log" translate="no"></a></h4>
<p>During the test run phase, the system uses a dedicated test URL for triggering.<br>
<!-- -->Users can monitor the real‑time execution status of the entire workflow and overview the overall inputs and outputs on the Test run page.<br>
<!-- -->Simultaneously, the Logs module records detailed execution processes and log information for each component, facilitating troubleshooting and debugging.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/test1-885a2d45b1583e465e3877a4dd3418a3.jpg" width="893" height="1280"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/test2-d4bb11ee54d5e4c2b91e32c9a3ab0e24.jpg" width="906" height="1280"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="global-conversation-variables" class="anchor anchorTargetStickyNavbar_Vzrq">Global conversation variables<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#global-conversation-variables" class="hash-link" aria-label="Direct link to Global conversation variables" title="Direct link to Global conversation variables" translate="no"></a></h3>
<p>In real development scenarios, there is often a need to reuse intermediate variables within an Agent process. For example, during a conversation, determining whether the user’s current question has already appeared in a previous round requires saving the result of the earlier query into a variable and reusing or comparing it later in the workflow.</p>
<p>In RAGFlow, a Conversation variable can be defined as a global variable to store an Agent’s intermediate output, making it available for reuse throughout the conversation.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/conversation_variable-7668d105e6dd827f02e9cc2f6f8d80de.png" width="1280" height="698"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>For example, you can define a global variable named his_query to store the user's previous question.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/his_query-9840a04c6d82474517e6dd602f71cf86.png" width="1280" height="440"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>And assign a value to the global variable using the Variable assigner component.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/variable_assigner-27e8b45679d7db29bf582664f510a0b5.png" width="1280" height="479"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="structured-agent-component-output" class="anchor anchorTargetStickyNavbar_Vzrq">Structured Agent component output<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#structured-agent-component-output" class="hash-link" aria-label="Direct link to Structured Agent component output" title="Direct link to Structured Agent component output" translate="no"></a></h3>
<p>In earlier versions of RAGFlow, component outputs were limited to simple text or unstructured data, which constrained the precise parsing and utilization of information by subsequent components.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/structured_output-6a131f4acc7c8cf37acd9e6c149f56bf.png" width="1280" height="707"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>RAGFlow 0.23.0 introduces support for structured component output, enabling data to be passed in a standardized, formatted manner (such as JSON objects) that can be read and processed as variables by subsequent components.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/structured_output_2-a21a5a8d8b526d86394106a6796c6fae.png" width="1280" height="701"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/structured_output_3-a10656316b1ebf83aed594c0e015ffbf.png" width="1280" height="575"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>In the Agent component's structured output configuration, you can add field names, types, and descriptions, and the system will automatically generate the corresponding JSON Schema. For example, after adding an <code>author</code> field, the JSON Schema is as shown above.</p>
<p>When executed, the output will follow this structured format and be passed as a variable to downstream components, ensuring accurate reading and processing. A sample result is shown below:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/structured_output_4-1e707f9f4c62e6f7ca3fd1b03ac64b08.png" width="1280" height="705"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="voice-input-and-output" class="anchor anchorTargetStickyNavbar_Vzrq">Voice input and output<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#voice-input-and-output" class="hash-link" aria-label="Direct link to Voice input and output" title="Direct link to Voice input and output" translate="no"></a></h3>
<p>RAGFlow version 0.23.0 supports end-to-end voice input and output, enabling the development of voice-enabled Agent applications such as digital humans. Voice functionality is available in both the Chat and Agent modules.</p>
<p>The voice input and output operation entry points in the Chat module are as follows:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/voice_input_output-50b5e8f6c1b9080f9ab83a6189822e5d.png" width="969" height="1053"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>The operation entry points for voice input and output in the Agent module are as follows:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/agent_voice_input-254165bbab7cd03cdacb694c97981af1.png" width="1253" height="1246"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="enhanced-rag" class="anchor anchorTargetStickyNavbar_Vzrq">Enhanced RAG<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#enhanced-rag" class="hash-link" aria-label="Direct link to Enhanced RAG" title="Direct link to Enhanced RAG" translate="no"></a></h2>
<h3 id="auto-metadata" class="anchor anchorTargetStickyNavbar_Vzrq">Auto-metadata<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#auto-metadata" class="hash-link" aria-label="Direct link to Auto-metadata" title="Direct link to Auto-metadata" translate="no"></a></h3>
<p>In the past, RAGFlow’s support for metadata was relatively limited, offering only manual editing of metadata at the individual file level.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/set_metadata-bb4591f08d75b72ea252eb88c4c796f6.png" width="462" height="308"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Therefore, RAGFlow has introduced the Auto-metadata feature. Compared to the previous method of manually adding metadata to each file, users can now leverage large language models to automatically extract and generate metadata for documents.</p>
<p>By utilizing metadata effectively, it plays a dual role in the RAG workflow:</p>
<ul>
<li class="">During retrieval: It filters out irrelevant files, narrowing the search scope to improve recall accuracy.</li>
<li class="">During generation: If a chunk is recalled, its associated metadata is passed to the LLM along with the text, providing richer contextual information about the document and enabling more informed responses.</li>
</ul>
<h4 id="configuring-auto-metadata-generation-rules" class="anchor anchorTargetStickyNavbar_Vzrq">Configuring auto-metadata generation rules<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#configuring-auto-metadata-generation-rules" class="hash-link" aria-label="Direct link to Configuring auto-metadata generation rules" title="Direct link to Configuring auto-metadata generation rules" translate="no"></a></h4>
<p>On the Knowledge Base Configuration page, start by selecting the Indexing model. This model will be used to generate the current knowledge base’s Knowledge Graph, RAPTOR, Auto-Metadata, Auto-Keyword, and Auto-Question.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/indexing_model-84a4ec996939ebce934d1603c025055e.png" width="1263" height="1280"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Click Auto-metadata → Settings to enter the rule configuration page for automatic metadata generation.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/audo_metadata_enable-b46df79979a4708f478bf0949a092204.png" width="1280" height="912"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Click + to add new field to enter the configuration page for that field.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/field_settings-84e405976aa34f2e81828bf0fc728e2e.png" width="1280" height="913"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Enter the field name, such as Author, and provide a description and example in the Description field to guide the large language model in accurately extracting values for this field. If this field is left blank, the model will generate values based solely on the field name.
If you need to restrict metadata generation to a predefined set of values, you can enable Restrict to defined values mode and manually specify the allowed values, as shown in the image. In this case, the model will only output results within the preset range.
Once configured, turn on the Auto-metadata toggle on the Configuration page. All newly uploaded files will have metadata automatically generated according to this rule during parsing. For files that have already been parsed, you can trigger metadata generation by reprocessing them. Users can then use the filtering function to check the metadata generation status of each file.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/audo_metadata_enable-b46df79979a4708f478bf0949a092204.png" width="1280" height="912"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h4 id="manage-metadata" class="anchor anchorTargetStickyNavbar_Vzrq">Manage metadata<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#manage-metadata" class="hash-link" aria-label="Direct link to Manage metadata" title="Direct link to Manage metadata" translate="no"></a></h4>
<p>The system supports metadata management at both the overall knowledge base level and the individual file level.</p>
<p>To access the metadata management interface, click Metadata within the knowledge base and enter the Manage Metadata page.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/manage_metadata-2bd1fee11580f956a45c578444fa986b.png" width="1280" height="291"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Here, you can centrally manage all generated metadata. You can modify existing values, and if you change two values to the same name, they will be automatically merged. You can also delete specific values or entire fields—all such operations will affect all associated files.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/manage_metadata_example-aa4e4091c7e81e5bd64339b52808f699.png" width="1280" height="670"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>More refined management features will be rolled out in the future, such as setting specific generation rules for selected files, or manually adding metadata to files in batches.</p>
<p>For individual file management, as shown in the figure below, first click the parsing method of the file (e.g., "General"), then enter Set Metadata to view and edit its metadata. Users can add, remove, or edit metadata fields for that specific file. Any edits made here will be reflected in the global statistics of the knowledge base metadata.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/set_metadata_example-6818a0aeb0788decd744be8b27b56027.png" width="1280" height="296"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/edit_metadata-5804e91a0871c926d8b967feb8924330.png" width="1262" height="662"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h4 id="filter-metadata" class="anchor anchorTargetStickyNavbar_Vzrq">Filter metadata<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#filter-metadata" class="hash-link" aria-label="Direct link to Filter metadata" title="Direct link to Filter metadata" translate="no"></a></h4>
<p>The filtering functionality is divided into two types: filtering at the knowledge base management level and filtering during the retrieval phase.
By clicking the filter button within a knowledge base, you can view the number of files associated with each existing metadata field value. Checking a specific value will then display all the corresponding linked files.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/filter_metadata-82b30336fb688e4a68bff031613ddc1d.png" width="1280" height="315"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>You can also use “No metadata” to filter out files that have not yet generated metadata, allowing you to trigger bulk re-parsing for automatic metadata generation.</p>
<p>Similarly, metadata filtering is supported during the retrieval phase. Taking Chat as an example, after configuring a knowledge base, you can set metadata filtering rules as follows:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/filtering_metadata-db32119dca4365d6cb1d1affa278151c.png" width="1280" height="661"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<ul>
<li class="">Automatic mode filters results based on the user’s query and the existing metadata in the knowledge base.</li>
<li class="">Semi-automatic mode allows users to first define the filtering scope at the field level (e.g., “Author”) before automatic filtering is applied within that range.</li>
<li class="">Manual mode gives users full control to set precise, value-level filtering conditions and supports various operators such as: Equals, Not equals, In, Not in, and more.</li>
</ul>
<h3 id="add-context-to-images-and-tables" class="anchor anchorTargetStickyNavbar_Vzrq">Add context to images and tables<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#add-context-to-images-and-tables" class="hash-link" aria-label="Direct link to Add context to images and tables" title="Direct link to Add context to images and tables" translate="no"></a></h3>
<p>RAGFlow utilizes built-in DeepDoc and external document models such as MinerU and Docling to parse document layouts.</p>
<p>In previous versions, images and tables identified via document layout analysis existed as independent Chunks. If retrieval did not match the content of the image or table itself, these elements would not be recalled. However, in real documents, charts and surrounding text are often arranged together, with the text providing descriptions or explanations of the chart content. Therefore, the ability to recall charts based on this contextual text is essential.</p>
<p>To address this, RAGFlow 0.23.0 introduces the Image &amp; Table Context Window feature. Drawing inspiration from the research-oriented open-source project RAG-Anything, which specializes in multimodal RAG, this function allows text and its associated chart to be placed within the same Chunk—based on a user-configurable context window size—so they can be retrieved together. This enhancement significantly improves the accuracy of chart retrieval in practice.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/context_window-e60b63358ce86d8ce9abbcc396c16822.png" width="1280" height="1249"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>As illustrated above, the value in the red box indicates that approximately N tokens of text above and below the chart will be extracted and inserted into the Chunk of type image/table as contextual supplementation for the chart.<br>
<!-- -->During extraction, boundaries are optimized based on punctuation to preserve semantic coherence.<br>
<!-- -->Users can adjust the number of contextual tokens according to their needs.</p>
<h3 id="child-chunking" class="anchor anchorTargetStickyNavbar_Vzrq">Child chunking<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#child-chunking" class="hash-link" aria-label="Direct link to Child chunking" title="Direct link to Child chunking" translate="no"></a></h3>
<p>In practical applications of RAG, a long-standing challenge has been the structural contradiction in the traditional “chunk-embed-retrieve” pipeline: a single text chunk is tasked with both semantic matching (recall) and contextual understanding (utilization), two inherently conflicting objectives—recall demands fine-grained, precise positioning, while answer generation requires coherent and complete contextual information.</p>
<p>To resolve this tension, RAGFlow previously introduced the Table of Contents (TOC) enhancement, which leverages a large language model to generate a document's table of contents. During retrieval, the TOC helps automatically supplement missing context caused by chunk segmentation.</p>
<p>In version 0.23.0, this capability has been systematically integrated into the ingestion pipeline. Additionally, the release introduces a Parent-Child Chunking mechanism, which also addresses this contradiction in part: under this mechanism, a document is first divided into larger parent chunks, each preserving a relatively complete semantic unit to ensure logical and contextual integrity. Each parent chunk can then be further subdivided into multiple child chunks, designed for precise recall.</p>
<p>During retrieval, the system first locates the most relevant text segment based on child chunks, while automatically associating and retrieving its corresponding parent chunk. This approach maintains high recall relevance while providing sufficient semantic context for the generation phase.</p>
<p>For example, when processing a <em>Compliance Handbook</em>, if a user asks about "liability for breach of contract," the system might accurately retrieve a child chunk stating "the penalty for breach is 20% of the total contract value," but lack the context to clarify whether this applies to "general breach" or "material breach."</p>
<p>With the parent-child chunk mechanism, while returning that child chunk, the system also brings back the parent chunk containing the complete section of that clause, enabling the LLM to make accurate judgments based on fuller context and avoid misinterpretation.</p>
<p>Through this dual-layer structure of “precise positioning + contextual supplementation,” RAGFlow significantly enhances the reliability and completeness of generated answers while ensuring retrieval accuracy.</p>
<p>To use parent-child chunking, enable the “Child chunks are used for retrieval” toggle on the Knowledge Base Configuration page and set the delimiter for child chunks.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/child_chunking-ad8dc69a3eb1d20febfc3e922f67b531.png" width="1280" height="1105"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>When child chunking is enabled, the logic for Recommended chunk size switches to the size of the parent chunk. You may appropriately increase this setting (e.g., to 1000–2000 tokens) to allow the LLM to retrieve more context when generating responses.
The same applies to configurations within the ingestion pipeline.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/enable_child_chunking_strategy-aa5fd723508634edd1c9fbf7180dbdad.png" width="1280" height="661"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Please note that the parent-child chunking feature and the TOC enhancement address the structural tension between “recall accuracy” and “context completeness” in RAG—from the perspectives of rule-based and model-based approaches, respectively. Both are transitional solutions designed to provide developers with ready-to-use optimization tools.<br>
<!-- -->In future versions, RAGFlow will continue to advance its underlying capabilities, striving to resolve this challenge in a more systematic and fundamental manner at the architectural level.</p>
<h2 id="api-updates" class="anchor anchorTargetStickyNavbar_Vzrq">API updates<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#api-updates" class="hash-link" aria-label="Direct link to API updates" title="Direct link to API updates" translate="no"></a></h2>
<h3 id="agent-api-returns-trace-logs" class="anchor anchorTargetStickyNavbar_Vzrq">Agent API returns trace logs<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#agent-api-returns-trace-logs" class="hash-link" aria-label="Direct link to Agent API returns trace logs" title="Direct link to Agent API returns trace logs" translate="no"></a></h3>
<p>The RAGFlow Agent API now supports returning detailed execution trace logs, helping developers debug and analyze the execution flow of Agents.</p>
<h4 id="supported-api" class="anchor anchorTargetStickyNavbar_Vzrq">Supported API<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#supported-api" class="hash-link" aria-label="Direct link to Supported API" title="Direct link to Supported API" translate="no"></a></h4>
<p><code>POST /api/v1/agents/{agent_id}/completions</code></p>
<h4 id="considerations" class="anchor anchorTargetStickyNavbar_Vzrq">Considerations<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#considerations" class="hash-link" aria-label="Direct link to Considerations" title="Direct link to Considerations" translate="no"></a></h4>
<ol>
<li class="">Enable trace logs by setting <code>return_trace: true</code>.</li>
<li class="">Trace logs include the execution time, inputs and outputs, and error messages for each component.</li>
<li class="">In streaming responses, trace information is returned via the <code>component_finished</code> event.</li>
<li class="">In non‑streaming responses, trace information is available in <code>data.data.trace</code>.</li>
</ol>
<h4 id="curl-example" class="anchor anchorTargetStickyNavbar_Vzrq">Curl example<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#curl-example" class="hash-link" aria-label="Direct link to Curl example" title="Direct link to Curl example" translate="no"></a></h4>
<p>Converse with Agent (with Trace logs)</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">curl --request POST \</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">     --url http://{address}/api/v1/agents/{agent_id}/completions \</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">     --header 'Content-Type: application/json' \</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">     --header 'Authorization: Bearer &lt;YOUR_API_KEY&gt;' \</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">     --data '{</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "question": "How to install neovim?",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "stream": true,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "session_id": "cb2f385cb86211efa36e0242ac120005",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "return_trace": true</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">     }'</span><br></span></code></pre></div></div>
<h3 id="chat-api-supports-metadata-filtering" class="anchor anchorTargetStickyNavbar_Vzrq">Chat API supports metadata filtering<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#chat-api-supports-metadata-filtering" class="hash-link" aria-label="Direct link to Chat API supports metadata filtering" title="Direct link to Chat API supports metadata filtering" translate="no"></a></h3>
<h4 id="supported-apis" class="anchor anchorTargetStickyNavbar_Vzrq">Supported APIs<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#supported-apis" class="hash-link" aria-label="Direct link to Supported APIs" title="Direct link to Supported APIs" translate="no"></a></h4>
<ul>
<li class=""><code>POST /api/v1/chats/{chat_id}/completions</code></li>
<li class=""><code>POST /api/v1/chats_openai/{chat_id}/chat/completions</code></li>
</ul>
<h4 id="curl-example-1" class="anchor anchorTargetStickyNavbar_Vzrq">Curl example<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#curl-example-1" class="hash-link" aria-label="Direct link to Curl example" title="Direct link to Curl example" translate="no"></a></h4>
<p>Chat with a chat assisant (with metadata filtering):</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">curl --request POST \</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">     --url http://{address}/api/v1/chats/{chat_id}/completions \</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">     --header 'Content-Type: application/json' \</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">     --header 'Authorization: Bearer &lt;YOUR_API_KEY&gt;' \</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">     --data '{</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">          "question": "Who are you",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">          "stream": true,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">          "session_id":"9fa7691cb85c11ef9c5f0242ac120005",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">          "metadata_condition": {</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            "logic": "and",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            "conditions": [</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">              {</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">                "name": "author",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">                "comparison_operator": "is",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">                "value": "bob"</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">              }</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            ]</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">          }</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">     }'</span><br></span></code></pre></div></div>
<p>OpenAI-compatible API (with metadata filtering)</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">curl --request POST \</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">     --url http://{address}/api/v1/chats_openai/{chat_id}/chat/completions \</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">     --header 'Content-Type: application/json' \</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">     --header 'Authorization: Bearer &lt;YOUR_API_KEY&gt;' \</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">     --data '{</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "model": "model",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "messages": [{"role": "user", "content": "Say this is a test!"}],</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "stream": true,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "extra_body": {</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">          "reference": true,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">          "metadata_condition": {</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            "logic": "and",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            "conditions": [</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">              {</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">                "name": "author",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">                "comparison_operator": "is",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">                "value": "bob"</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">              }</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            ]</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">          }</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">      }'</span><br></span></code></pre></div></div>
<p>See the corresponding API reference for details.</p>
<h2 id="finale" class="anchor anchorTargetStickyNavbar_Vzrq">Finale<a href="https://ragflow.io/en/blog/ragflow-0.23.0-advanding-memory-rag-and-agent-performance#finale" class="hash-link" aria-label="Direct link to Finale" title="Direct link to Finale" translate="no"></a></h2>
<p>As the final update of RAGFlow in 2025, version 0.23.0 stands as a significant milestone that bridges past accomplishments with future ambitions. It marks the evolution of RAGFlow from a RAG engine focused primarily on knowledge-base scenarios into a contextual engine designed to support the construction of diverse AI Agents.</p>
<p>This release not only continues to strengthen core RAG capabilities but also introduces the all-new Memory module—designed to store and retrieve data generated during Agent interactions, seamlessly integrating it into ongoing contexts. The data preserved in Memory enables conversational systems to accumulate experience, gradually forming a self-reinforcing cycle of continuous improvement.</p>
<p>In the Agent architecture, if models are responsible for reasoning, and RAG and tools represent action, then Memory serves as the soul—carrying personalization and historical continuity. Our exploration of Memory is just beginning. Moving forward, we will advance towards more granular memory management and build effective mechanisms for Skills and Guidelines centered around tool usage.</p>
<p>As the foundational data platform for large language models, RAGFlow remains committed to its original vision: not only providing a complete no-code platform for Agent development but also striving to become the essential data cornerstone for all Agent systems—regardless of the tools used to build them.</p>
<p>We invite you to continue following our progress and to star our project, as we grow and evolve together. <a href="https://github.com/infiniflow/ragflow" target="_blank" rel="noopener noreferrer" class=""><span>https://github.com/infiniflow/ragflow</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></p>]]></content:encoded>
            <category>Product News</category>
        </item>
        <item>
            <title><![CDATA[From RAG to Context - A 2025 year-end review of RAG]]></title>
            <link>https://ragflow.io/en/blog/rag-review-2025-from-rag-to-context</link>
            <guid>https://ragflow.io/en/blog/rag-review-2025-from-rag-to-context</guid>
            <pubDate>Mon, 22 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[As 2025 draws to a close, the field of Retrieval-Augmented Generation (RAG) has undergone profound reflection, vigorous debate, and marked evolution. Far from fading into obsolescence as some bold predictions foresaw—amid lingering scepticism over its supposedly transient role—RAG has solidified its indispensability as a cornerstone of data infrastructure in the demanding arena of enterprise AI adoption.]]></description>
            <content:encoded><![CDATA[<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/2025racap-5215bb012cb35bcba2948e9a38d334b2.PNG" width="1280" height="546"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>As 2025 draws to a close, the field of Retrieval-Augmented Generation (RAG) has undergone profound reflection, vigorous debate, and marked evolution. Far from fading into obsolescence as some bold predictions foresaw—amid lingering scepticism over its supposedly transient role—RAG has solidified its indispensability as a cornerstone of data infrastructure in the demanding arena of enterprise AI adoption.</p>
<p>Looking back, RAG's trajectory this year has been complex. On one hand, its practical effectiveness faced significant skepticism, partly due to the "easy to use, hard to master" tuning challenges inherent to RAG systems. On the other hand, its share of public attention seemed to be overshadowed by the undisputed focus of 2025's LLM applications: AI Agents.</p>
<p>However, an intriguing trend emerged. Despite the controversies and not being in the spotlight, enterprises genuinely committed to building core AI competencies—especially mid-to-large-sized organizations—deepened and systematized their investments in RAG. Rather than being marginalized, RAG has solidified its core role in enterprise AI architecture. Its position as critical infrastructure remains unshaken, forming the robust foundation for enterprise intelligence.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/1-f4082244d08298c8b69bb72e87420723.PNG" width="1280" height="607"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Therefore, we must first move beyond surface-level debates to examine the intrinsic vitality of RAG technology. Is it merely a transitional "band-aid" to patch LLM knowledge gaps, or is it an architecture capable of continuous evolution into a cornerstone for next-generation AI applications? To answer this, we must systematically review its technical improvements, architectural evolution, and new role in the age of Agents.</p>
<h2 id="can-rag-still-be-improved" class="anchor anchorTargetStickyNavbar_Vzrq">Can RAG still be improved?<a href="https://ragflow.io/en/blog/rag-review-2025-from-rag-to-context#can-rag-still-be-improved" class="hash-link" aria-label="Direct link to Can RAG still be improved?" title="Direct link to Can RAG still be improved?" translate="no"></a></h2>
<h3 id="the-debate-about-long-context-and-rag" class="anchor anchorTargetStickyNavbar_Vzrq">The debate about long context and RAG<a href="https://ragflow.io/en/blog/rag-review-2025-from-rag-to-context#the-debate-about-long-context-and-rag" class="hash-link" aria-label="Direct link to The debate about long context and RAG" title="Direct link to The debate about long context and RAG" translate="no"></a></h3>
<p>In 2025, the core of many RAG debates stems from a widely acknowledged contradiction: enterprises feel they "cannot live without RAG, yet remain unsatisfied." RAG lowers the barrier to accessing private knowledge, but achieving stable and accurate results—especially for complex queries—often requires extensive, fine-tuned optimization, complicating total cost of ownership assessments.</p>
<p>Consequently, the theoretical question heatedly discussed in 2024—"Can Long Context replace RAG?"—rapidly entered practical testing in 2025. Some scenarios less sensitive to latency and cost, with relatively fixed query patterns (e.g., certain contract reviews, fixed-format report analysis), began experimenting with directly using long-context windows. They feed entire or large batches of relevant documents into the model at once, hoping to bypass potential information loss or noise from RAG retrieval and directly address inconsistent conversational quality.</p>
<p>However, research since 2024 offers a clearer picture of the technical comparison. Mechanically stuffing lengthy text into an LLM's context window is essentially a "brute-force" strategy. It inevitably scatters the model's attention, significantly degrading answer quality through the "Lost in the Middle" or "information flooding" effect. More importantly, this approach incurs high costs—computational overhead for processing long context grows non-linearly.</p>
<p>Thus, for enterprises, the practical question is not engaging in simplistic debates like "RAG is dead," but returning to the core challenge: how to incorporate the most relevant and effective information into the model's context processing system with the best cost-performance ratio. This is precisely the original design goal of RAG technology.</p>
<p>Improved long-context capabilities have not signaled RAG's demise. Instead, they prompt deeper thinking about how the two can collaborate. For example, RAG systems can use long-context windows to hold more complete, semantically coherent retrieved chunks or to aggregate intermediate results for multi-step retrieval and reflection. This "retrieval-first, long-context containment" synergy is a key driver behind the emerging field of "Context Engineering." It marks a shift from optimizing single "retrieval algorithms" to the systematic design of the end-to-end "retrieval-context assembly-model reasoning" pipeline.</p>
<p>Currently, paradigms for providing external knowledge to LLMs mainly fall into four categories:</p>
<ol>
<li class="">Relying solely on LLM's long-context capability.</li>
<li class="">Utilizing KV Cache.</li>
<li class="">Using simple search methods like Grep.</li>
<li class="">Employing a full RAG architecture.</li>
</ol>
<p>Cost-wise, there is roughly a two-order-of-magnitude gap between option 1 and option 4. Option 2 involves processing all document data through an LLM's forward pass into tensors stored in a dedicated KV Cache system. Its cost remains at least an order of magnitude higher than RAG. Even upgrading KV Cache to an integrated database-and-inference engine (as advocated by AlayaDB [Ref 1]) still faces fundamental technical limitations:</p>
<ol>
<li class=""><strong>The data volume vs. retrieval performance dilemma</strong>: If preprocessed tensor data exceeds GPU memory capacity, the system must introduce secondary storage and corresponding retrieval mechanisms for on-demand loading. This turns inference into a "generate-while-search" process, imposing extremely stringent I/O latency and retrieval speed requirements. To meet ultra-low latency, the entire dataset and LLM inference service often must be tightly co-located on the same physical machine or within a high-performance computing cluster's close network domain. This greatly sacrifices architectural flexibility and scalability, limiting deployment options.</li>
<li class=""><strong>Scenario limitations</strong>: This method primarily suits relatively static, fact-based text libraries. It struggles to flexibly and cost-effectively incorporate complex, evolving business rules, real-time knowledge updates, and diverse composite queries common in enterprises.</li>
<li class=""><strong>Technology convergence trend</strong>: This method does not conflict with RAG. Even if it becomes practical, it will likely be absorbed into the RAG architecture as an optimized component.</li>
</ol>
<p>Option 3 (index-free RAG) gained some attention after Claude Code introduced it for its coding assistant Agent. A simple question arises: in specific domains, can basic string matching (Grep) replace complex retrieval-based RAG architecture? For well-organized, pure-format, fixed-terminology codebases or highly structured text data (e.g., log files), rule-based Grep or keyword search might deliver decent results at very low cost, saving index construction and maintenance overhead.</p>
<p>However, for the vast majority of enterprise multi-modal, unstructured, or semi-structured data (e.g., product manuals, meeting notes, design drawings, reports with tables and images), this method fails completely. In fact, even for seemingly regular code search, leading products like Augment Code avoid simple Grep. Instead, they fine-tune specialized Embedding models for code semantics. The reason is that providing effective context for a coding assistant requires not just exact string matching (finding function names) but also semantically similar code snippets (different implementations of similar functions), related API documentation, and code block dependencies.</p>
<p>Furthermore, diverse natural language queries, high concurrency, low-latency responses, and filtering/sorting with business metadata—all essential for enterprise applications—are far beyond Grep's scope. Therefore, RAG and its predecessor—enterprise search engines—remain comprehensive technical and architectural solutions for complex enterprise needs. Their value lies in providing systematic, scalable, and governable knowledge access and management capabilities.</p>
<h3 id="optimizations-for-rag-conversational-quality" class="anchor anchorTargetStickyNavbar_Vzrq">Optimizations for RAG conversational quality<a href="https://ragflow.io/en/blog/rag-review-2025-from-rag-to-context#optimizations-for-rag-conversational-quality" class="hash-link" aria-label="Direct link to Optimizations for RAG conversational quality" title="Direct link to Optimizations for RAG conversational quality" translate="no"></a></h3>
<p>Returning to RAG's core, a common source of inaccurate or unstable answers lies in a structural conflict within the traditional "chunk-embed-retrieve" pipeline: using a single-granularity, fixed-size text chunk to perform two inherently conflicting tasks:</p>
<ul>
<li class=""><strong>Semantic matching (recall)</strong>: For high-precision recall in semantic similarity search, smaller chunks (e.g., 100-256 tokens) are needed. This provides clear semantic focus and reduces irrelevant information.</li>
<li class=""><strong>Context understanding (utilization)</strong>: To provide sufficiently complete and coherent context for the LLM to generate high-quality answers, larger chunks (e.g., 1024+ tokens) are needed to ensure logical completeness and sufficient background.</li>
</ul>
<p>This forces system designers into a difficult trade-off between "precise but fragmented" and "complete but vague," often sacrificing one for the other. Small chunks may retrieve fragmented information, preventing the LLM from grasping the full picture. Large chunks may introduce noise, reduce retrieval precision, and lose internal detail differentiation because the vector representation summarizes the entire chunk.</p>
<p>A fundamental improvement is to decouple the RAG process into two logical stages—"Search" and "Retrieve"—allowing different text granularities for each:</p>
<ul>
<li class="">**Search: Analogous to "scanning" or "locating," its core goal is to quickly and precisely identify all potentially relevant "clues" from massive data. This stage should use smaller, semantically pure text units for high recall and precision.</li>
<li class=""><strong>Retrieve</strong>: Analogous to "reading" or "understanding," its core goal is to assemble "reading material" for the LLM to generate answers. Based on clues from the Search stage, this stage should dynamically aggregate, stitch, or expand into larger, more complete, and coherent context fragments.</li>
</ul>
<p>RAGFlow's TreeRAG technology embodies this idea. It uses an LLM in an offline phase to automatically analyze documents, constructing a hierarchical tree-like directory summary structure. This cleverly bridges the gap between "fine-grained search" and "coarse-grained reading." Its core workflow reflects the wisdom of "locate precisely first, then expand to read":</p>
<ul>
<li class=""><strong>Offline processing (knowledge structuring)</strong>: After document splitting, chunks are sent to an LLM for analysis, generating a multi-level tree directory summary (e.g., Chapter -&gt; Section -&gt; Subsection -&gt; Key Paragraph Summary). Simultaneously, each node or original chunk can be enriched with semantic enhancements like summaries, keywords, entities, potential questions, metadata, and associated image context descriptions. Research [Ref 3] shows that during offline processing, fine-grained chunking requirements can be relaxed. Overly complex splitting can disrupt semantic units; simple, overlapping chunking is often more effective and robust in practice.</li>
<li class=""><strong>Online retrieval (dynamic context assembly)</strong>: Upon receiving a user query, similarity search is first performed using the finest-grained "small fragments" (original chunks or their summaries) for fast, precise initial recall. Then, leveraging the offline-built "tree directory" as a navigation map, the system quickly locates parent, sibling, and neighboring nodes of the recalled chunk nodes. It automatically combines these semantically related fragments into a logically complete "large fragment" for the LLM. This effectively mitigates context fragmentation caused by fixed-size chunks, ensuring the material provided to the model contains both precisely matched core information and the surrounding context needed to understand it.</li>
</ul>
<p>Similar work includes PageIndex [Ref 2], which focuses more on parsing and leveraging a document's inherent physical or logical table of contents (e.g., in PDFs). This method is efficient when document structure is clear and format is standard. Its limitation is heavy reliance on source document quality; its auto-location capability diminishes when documents lack clear or accurate TOCs.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/long_context_rag-ce3571325c14059bc00471b9e86cebca.PNG" width="1280" height="700"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>TreeRAG and similar technologies effectively address the "Lost in the Middle" pain point caused by poor chunking. However, for more complex queries—where answers are scattered across dozens of non-adjacent chunks or require synthesizing information from multiple independent documents for reasoning—tree structures alone may not capture all relevant associations. The industry naturally turned to another technical path: GraphRAG.</p>
<p>GraphRAG extracts entities and relationships from documents to build a knowledge graph, using graph queries and reasoning to discover indirectly related information fragments. Yet, GraphRAG has also left many practitioners with mixed feelings since its inception, due to key challenges:</p>
<ol>
<li class=""><strong>Massive token consumption</strong>: Entity extraction, deduplication, and community summarization can consume several to dozens of times more tokens than the original text.</li>
<li class=""><strong>Gap between expected and actual entity extraction quality</strong>: Traditional knowledge graphs, meticulously designed and validated by domain experts, offer high quality for direct visual analysis and interaction. In contrast, GraphRAG's automatically extracted entities and relations often contain significant noise, redundancy, or errors. Judging them by visual knowledge graph standards leads to disappointment—"visually appealing but impractical."</li>
<li class=""><strong>Knowledge fragmentation</strong>: Even after graph algorithms discover related communities and generate summaries, the output remains a collection of "knowledge fragments" around specific topics. Generating final answers from these discrete fragments places high demands on the LLM's integration and coherent narration abilities, often resulting in answers lacking a logical thread or missing crucial aspects.</li>
</ol>
<p>Therefore, combining the strengths of TreeRAG and GraphRAG holds promise for further alleviating RAG's pain points. TreeRAG excels at resolving local semantic breaks caused by physical chunking, providing coherent context. GraphRAG, based on entity-relationship networks, can use graph traversal algorithms (e.g., Personalized PageRank) to help discover content fragments semantically highly related but physically distant in the original documents, even across documents.</p>
<p>Thus, whether TreeRAG, GraphRAG, or their hybrid architecture (collectively termed "Long-Context RAG"), the core paradigm introduces an additional semantic enhancement and structure-building layer atop the traditional RAG pipeline. During the data ingestion stage, beyond chunking, LLMs are leveraged for deep semantic understanding, summary generation, and structure extraction. During the retrieval stage, it moves beyond mere search, incorporating navigation, relational queries, and dynamic assembly based on predefined structures (tree, graph).</p>
<p>RAG technology is far from stagnant. Its improvement direction is increasingly clear: leverage LLMs' own capabilities to bridge the semantic gap between raw data and final Q&amp;A early in the data lifecycle. During ingestion, use prompts with different instructions to request LLMs to analyze text from multiple angles and rounds, extracting rich, multi-layered semantic information (metadata). During retrieval, use this enhanced semantics as a "navigation map" to intelligently filter, aggregate, and fill context, going beyond simple vector similarity search. This is the more reliable path for tackling complex, open-domain Q&amp;A challenges.</p>
<p>Products like RAGFlow are deeply exploring this direction, with future evolution centered on these core points. In short, modern RAG system design philosophy is to fully coordinate "powerful retrieval and reasoning capabilities" with the "limited yet precious LLM context window." Through intelligent preprocessing and dynamic assembly, it seeks the optimal balance between effectiveness, performance, and cost.</p>
<h3 id="from-knowledge-base-to-data-foundation" class="anchor anchorTargetStickyNavbar_Vzrq">From knowledge base to data foundation<a href="https://ragflow.io/en/blog/rag-review-2025-from-rag-to-context#from-knowledge-base-to-data-foundation" class="hash-link" aria-label="Direct link to From knowledge base to data foundation" title="Direct link to From knowledge base to data foundation" translate="no"></a></h3>
<p>We often emphasize that RAG is an architectural paradigm, not a specific application. Yet, knowledge bases are undoubtedly RAG's most intuitive and successful application form. With the rapid rise of AI Agent development, a clear trend is emerging: Agents' complex task execution increasingly relies on real-time access and understanding of massive, diverse enterprise data.</p>
<p>Consequently, enterprise-grade RAG products are evolving beyond the singular "Q&amp;A knowledge base" role towards a more foundational, general-purpose Agent data foundation. They need to serve as the unified, efficient, and secure access service for unstructured data for all types of Agents.</p>
<p>To achieve this, a robust, scalable, and configurable Ingestion Pipeline has become an indispensable core component of modern RAG engines. It handles the entire process of "taking over" the complex, unstructured data within an enterprise (documents, images, audio/video, code, emails, etc.) and "digesting" it into a standard format indexable and retrievable by the RAG engine.</p>
<p>If ETL/ELT (represented by tools like dbt, Fivetran, Airbyte) is the industrialized standard pipeline for processing structured data in modern data stacks—providing unified, flexible, and reliable data integration for data warehouses and lakes—then the Ingestion Pipeline for unstructured data (or PTI: Parse-Transform-Index) is its equivalent, critical infrastructure for the AI era. They share similar architectural positioning and processing philosophy but differ in technical methods due to data characteristics.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/etl_vs-18ee60c39ef08db644444af995e49e3a.png" width="1280" height="913"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Examining each stage's similarities and differences:</p>
<ul>
<li class=""><strong>Extract vs. parsing</strong>: Traditional ETL/ELT's "Extract" stage primarily pulls data from structured or semi-structured sources like relational databases, APIs, and log files. The Ingestion Pipeline, building on this, emphasizes the "Parsing" stage to tackle the challenge of information extraction from unstructured data. It employs various parsers: format parsers for PDF/Word, specialized document intelligence models like RAGFlow's DeepDoc, and OCR models fine-tuned on Vision-Language Models (VLM). The goal is to convert multi-modal, multi-format raw documents into clean, structured text representations, preserving original logical structure (headings, lists, tables) and metadata (author, date) as much as possible.</li>
<li class=""><strong>Transform</strong>: This stage shows the greatest divergence. Traditional ETL/ELT "Transform" focuses on data cleaning, format standardization, and business logic computation (aggregation, joins) using SQL or code. The Ingestion Pipeline's "Transform" stage is a series of semantic understanding and enhancement components centered around the LLM. They convert the raw text stream from the Parser into the advanced "materials" needed for retrieval. Beyond basic text chunking, all processes aimed at improving retrieval effectiveness and precision—like tree structure generation, knowledge graph (entity-relation) extraction, summary generation, question generation, and keyword extraction—occur here. This stage is key to injecting "intelligence," determining the depth of data "understanding."</li>
<li class=""><strong>Load vs. indexing</strong>: Traditional ETL/ELT loads (Load) processed clean data into target data warehouse/lake tables. The RAG engine, via its "Indexing" component, builds efficient indexes from the rich content produced in the Transform stage (original text chunks, summaries, vectors, metadata, graph relations). This supports various retrieval methods. The RAG engine is essentially a high-concurrency, low-latency serving layer. It must support hybrid retrieval (vector + keyword + metadata filtering) and may integrate advanced capabilities like tree-based or graph-based queries mentioned earlier.</li>
</ul>
<p>Whether ETL for structured data or PTI for unstructured data, the intermediate "Transform" step is the core value-creation stage. For ETL, engineers design transformation logic (SQL) based on specific business analysis needs. For PTI, because the Ingestion Pipeline must be co-designed end-to-end with final retrieval requirements, decisions on chunk granularity, types of enhanced semantics to generate, and index structure complexity in the Transform stage depend on the precision, speed, and cost requirements of the upper application (e.g., Q&amp;A, summarization, analysis).</p>
<p>Therefore, building an excellent RAG system is not merely about choosing the most advanced Parser model or the highest-performance vector database. It hinges on the collaborative design and continuous tuning of the entire "Data Ingestion -&gt; Semantic Enhancement -&gt; Index Building -&gt; Retrieval Service" pipeline.</p>
<p>Equipped with such a powerful, flexible, and intelligent Ingestion Pipeline, a RAG system truly evolves from a "Q&amp;A system" into a unified processing and access platform for enterprise unstructured data. It can standardize and automate the digestion of scattered internal knowledge assets, transforming them into readily available "fuel" for AI Agents.</p>
<p>This explains why, today, when enterprises commit to building a unified AI capability platform, its core and foundation must be such a RAG-engine-centric data foundation with robust data processing capabilities. It provides the single source of truth and real-time updated knowledge for all enterprise AI applications.</p>
<h2 id="from-rag-to-context" class="anchor anchorTargetStickyNavbar_Vzrq">From RAG to context<a href="https://ragflow.io/en/blog/rag-review-2025-from-rag-to-context#from-rag-to-context" class="hash-link" aria-label="Direct link to From RAG to context" title="Direct link to From RAG to context" translate="no"></a></h2>
<p>In 2025, the most dynamic and attention-grabbing aspect of LLM applications has undoubtedly been various AI Agents. From an Agent framework perspective, RAG can be seen as a tool providing external knowledge access—similar to tools for calling a calculator, querying a weather API, or operating a database.</p>
<p>This tool-centric view, coupled with the rise of "Agentic RAG" (using Agent planning, reflection, etc., to enhance the RAG process itself), fueled narratives in 2025 suggesting "RAG will be replaced by more general Agents" or "RAG is just another ordinary Agent tool."</p>
<p>However, this view oversimplifies and potentially misunderstands RAG's fundamental value and position within the Agent ecosystem. It overlooks the essence of RAG architecture—its core capability and value foundation lies in Retrieval, not merely "Augmented Generation."</p>
<p>It is precisely this core ability to "efficiently, accurately, and scalably retrieve relevant information from vast private data" that enables RAG to become, and is becoming, the most indispensable, foundational data foundation for Agents. Because no matter how intelligent an Agent is, the quality of its decisions and actions fundamentally depends on the quality and relevance of the Context it receives.</p>
<p>How to dynamically and intelligently assemble the most effective context for different tasks at different moments became the hottest technical exploration and guiding principle in the latter half of 2025, giving rise to Context Engineering.</p>
<p>Let's analyze the main data types and technologies involved in Context Engineering to understand why "retrieval" is at its absolute core:</p>
<p>Context Engineering has emerged as a distinct field because practice repeatedly proves: bluntly cramming all potentially relevant data into the LLM's context window is not only prohibitively costly but also severely impairs the LLM's understanding, reasoning, and tool-calling abilities due to information overload. Therefore, intelligent filtering, sorting, and stitching of context are essential.</p>
<p>A typical Agent context usually needs to carefully assemble three types of data:</p>
<ol>
<li class="">Domain knowledge data: For the knowledge base serving as a core tool (i.e., the RAG system), retrieval result quality directly determines answer success. Returning too many irrelevant fragments introduces noise, disrupting answer generation. Missing key fragments inevitably leads to factual errors or incomplete answers. Thus, RAG itself can be seen as the earliest Context Engineering 1.0 practice for domain knowledge.</li>
<li class="">Tool Data: For other functional tools, especially the many tools packaged via standards like the Model Context Protocol (MCP), their description information (name, function, parameter specs) is itself part of the context. When only a few tools are available, their descriptions can be hardcoded in prompts. But in enterprise scenarios, internal services, APIs, and functions packaged via MCP can number in the hundreds or thousands. Manually or statically specifying which tools to call for each conversation is impractical. This "tool selection" problem was only deeply felt by some users by late 2025, even sparking clickbait articles like "MCP is Dead After Just One Year" [Ref 9]. In reality, the author misplaces the blame—the core issue is indiscriminately dumping all tool descriptions into the context, overwhelming the LLM with "choice paralysis," not the MCP protocol itself. MCP is an extremely important protocol aiming to standardize tool-calling interfaces, but it does not and cannot solve the decision problem of "which tool to choose in a specific situation." So, who should bear this decision responsibility? This is a missing key piece in most current Agent frameworks. The answer is again Retrieval. We need semantic search over all tool descriptions, combined with retrieval of "Skills," "Playbooks," or "Guidelines" formed from historical tool usage. This dynamically and precisely filters the most relevant, most likely-to-be-correctly-used tool subset and parameters for the current Agent's current task into the context. This far exceeds what current features like Anthropic Skills cover. How to close the loop on generating, retrieving, and using Skills/Playbooks/Guidelines and productize it is a core problem Context Engineering must solve. This is fundamentally a data infrastructure (Infra) problem, not merely a model capability issue.</li>
<li class="">Conversation and state data: Beyond static knowledge and tools, context needs to include dynamic data related to the current interaction: conversation history, user personalization/preferences, and some Agent internal state (e.g., human input in Human-in-the-loop). Managing and accessing this data is often termed "Memory," which became a standalone hot topic in early to mid-2025. But technically, the core capability of memory systems—storing, indexing, and retrieving historical interaction information—is not fundamentally different from RAG. It can be seen as a specialized retrieval system for a specific data source (conversation logs) and usage pattern (emphasizing temporal and conversational relevance).</li>
</ol>
<p>Deconstructing context composition clearly shows that Context Engineering's core task is still retrieval based on the three major data sources Agents need:</p>
<ol>
<li class="">Retrieval of enterprise-private, unstructured domain document data—i.e., RAG.</li>
<li class="">Retrieval of conversation history and state data generated during Agent interactions, especially LLM-generated content—i.e., Memory.</li>
<li class="">Retrieval of tool description and usage guide data from encapsulated enterprise services and APIs—termed Tool Retrieval. This data can also reside in a dedicated area like Memory.</li>
</ol>
<p>Thus, in the AI Agent era, RAG technology will undeniably evolve. It is no longer just a step in "Retrieval-Augmented Generation." With "retrieval" as its core capability, expanding its data scope, it evolves into a Context Engine supporting all context assembly needs, becoming the unified Context Layer and data foundation serving LLM applications.</p>
<h3 id="how-is-retrieval-for-agents-different-from-the-search-era" class="anchor anchorTargetStickyNavbar_Vzrq">How is retrieval for Agents different from the search era?<a href="https://ragflow.io/en/blog/rag-review-2025-from-rag-to-context#how-is-retrieval-for-agents-different-from-the-search-era" class="hash-link" aria-label="Direct link to How is retrieval for Agents different from the search era?" title="Direct link to How is retrieval for Agents different from the search era?" translate="no"></a></h3>
<p>Understanding this evolution requires contrasting the fundamental differences between retrieval paradigms in the traditional search era and the Agent era.</p>
<p>In the traditional search era (e.g., using Google or enterprise search), the initiator, executor, and consumer of retrieval were humans. The user poses a question, the search engine returns a list of relevant document links, and the user must open multiple links, read, compare, and synthesize information to form an answer or decision. This is a "human-computer synergy, human-led" loop.</p>
<p>In the Agent era, the initiator and primary consumer of retrieval is the Agent (LLM-driven). A typical workflow: the LLM first comprehends and decomposes a user's complex question (hypothesizing/planning), then automatically initiates one or multiple retrieval requests on the user's behalf. Next, it comprehends, verifies, and refines the raw retrieval results (reflection), finally stitching the processed information into the context for generating the final answer. The content of retrieval expands from single web pages/documents to include tool usage, memory segments, etc. The entire closed loop of "question understanding -&gt; retrieval -&gt; result processing -&gt; context assembly" is automated by the Agent.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/agent_retrieval-048b662c8cf3f98e78dbb9eaa64ab29e.png" width="1280" height="579"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Therefore, retrieval systems for Agents face unprecedented new demands: extremely high request frequency (potentially one to two orders of magnitude higher than human requests in the traditional search era), diverse query types (semantic queries on documents, keyword matching for tools, parameter matching for tool usage guides, associative queries on memory), stringent latency requirements (directly impacting Agent response speed), and the need for tight coupling with the Agent's reasoning flow.</p>
<p>A standalone search engine or vector database is far from sufficient. It requires building an intelligent intermediate service layer atop storage and indexing. This layer understands Agent intent, dynamically coordinates retrieval requests to different underlying data sources (document stores, memory stores, tool libraries) based on context assembly strategies, and performs necessary fusion, deduplication, ranking, and formatting of results, finally packaging them into LLM-ready context.</p>
<p>This usage pattern means the most intricate and specialized "Context Engineering" part of Agent development—currently highly manual and hardcoded in prompts—has the potential to move towards declarative configuration or even automation. This could significantly reduce Agent development and maintenance complexity while improving consistency and reusability.</p>
<h3 id="tools-also-need-searching" class="anchor anchorTargetStickyNavbar_Vzrq">Tools also need searching<a href="https://ragflow.io/en/blog/rag-review-2025-from-rag-to-context#tools-also-need-searching" class="hash-link" aria-label="Direct link to Tools also need searching" title="Direct link to Tools also need searching" translate="no"></a></h3>
<p>Tool diversity directly determines the breadth and depth of problems an Agent can solve. In simple demos or prototypes, a common approach is embedding descriptions of all available tools (usually natural language text) entirely into the Agent's prompt. However, when tool counts grow from a few to dozens or hundreds, the drawbacks become apparent.</p>
<p>First, it consumes massive precious context tokens that could otherwise hold more important task descriptions and intermediate results. Second, too many options burden the LLM's tool selection logic, increasing the probability of "hallucinated" calls or incorrect tool choices.</p>
<p>Especially in enterprise scenarios, tool numbers can reach stunning scale. In principle, nearly all existing internal services, databases, APIs, and workflows can be wrapped into standardized tool interfaces understandable and callable by Agents. This is what protocols like MCP aim to solve—becoming the "TCP/IP" for the Agent era, addressing connectivity.</p>
<p>But we must clearly realize the fact: MCP solves the protocol problem of "how to call," not the decision problem of "which one to call." Advanced models (like some SOTA models under development) might struggle to handle hundreds of tool descriptions in context, but this is hardly a cost-effective solution. Treating the context window as a scarce resource and minimizing the inclusion of ineffective or low-probability-use information is a crucial design principle for controlling costs and improving overall system effectiveness.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/tool_retrieval-32f59e28a638ff81eaf822a67a962607.png" width="1280" height="722"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Consequently, Tool Retrieval began attracting attention from academia and industry by late 2025. The core idea is: establish a specialized index library (vector, keyword, or hybrid) for all tool descriptions. When an Agent needs to call a tool, it first generates a "query" targeting tool functionality based on the current conversation context and task objective. This query performs a quick search against the index library, recalling only the most relevant few (e.g., Top-3) tool descriptions. These are dynamically inserted into the current context for the LLM's final selection and calling.</p>
<p>Research [Ref 10] shows even simple BM25 keyword retrieval serves as a strong baseline for this task. Of course, using fine-tuned, dedicated embedding models yields more precise matches.</p>
<p>Beyond tool descriptions themselves, the Agent development, testing, and usage process naturally accumulate a series of meta-knowledge about "how to correctly use tools." For example: "When handling customer refund requests, sequentially call Tool A to verify the order, Tool B to check inventory, and Tool C to execute the refund, with parameter X from conversation history Y." Such "playbook" or "guide" text is richer and more instructive context material than tool descriptions.</p>
<p>These should also be categorized into the retrievable system: when an Agent faces a complex task, it can first retrieve relevant task guides, including them as part of the context. This allows the LLM to "take an open-book exam," planning actions following best practices.</p>
<p>The volume and data density of such tool usage guide data may far exceed tool descriptions themselves. Efficient utilization undoubtedly relies on retrieval technology. Early explorations like the GEPA optimizer in the Dspy framework [Ref 11] use genetic algorithms to evolve better prompts (possibly containing tool usage logic), but its focus is optimizing the prompt text itself.</p>
<p>More systematic work like the ACE (Agentic Context Engineering) framework [Ref 12] begins to study how to generate, manage, and leverage such instructive contexts in a structured way. While not this article's focus, we must recognize this represents an important direction for Context Engineering's deepening. The outcomes of such work will evitably need to be included into the system covered by Retrieval, providing context alongside tool descriptions.</p>
<h3 id="does-memory-deserve-to-be-a-separate-infra" class="anchor anchorTargetStickyNavbar_Vzrq">Does memory deserve to be a separate infra?<a href="https://ragflow.io/en/blog/rag-review-2025-from-rag-to-context#does-memory-deserve-to-be-a-separate-infra" class="hash-link" aria-label="Direct link to Does memory deserve to be a separate infra?" title="Direct link to Does memory deserve to be a separate infra?" translate="no"></a></h3>
<p>"Memory" received far more attention than RAG in 2025's technical discussions, often listed as a core Agent infrastructure component in articles and product pitches, with even boundary-blurring views like "Memory will replace RAG." So, what exactly is Memory? How do the myriad open-source memory projects differ from and relate to RAG systems at their core?</p>
<p>Simply put, memory systems emerged initially to meet the need for effectively managing and reusing historical Agent interaction information. Its basic usage pattern is identical to RAG: when a new conversation occurs, the system retrieves relevant past conversation fragments (e.g., same user's prior questions, LLM's previous answers, user feedback) from stored history based on the current query. These fragments are then submitted alongside the new question to the LLM, helping the model maintain conversation coherence, remember user preferences, or avoid repetition.</p>
<p>Therefore, from functional interface and core technology (retrieval), Memory and RAG share the same core.</p>
<p>Their core distinction lies in data source and management goals:</p>
<ul>
<li class="">RAG: Processes primarily pre-existing, relatively static enterprise private knowledge assets (documents, manuals, KB articles). Its goal is providing domain facts and background knowledge.</li>
<li class="">Memory: Processes primarily dynamically generated interaction logs and derived data from Agent operation (user input, LLM output, possible interaction state, LLM-generated summaries/reflections). Its goal is maintaining conversational continuity, enabling personalization, and learning from historical experience.</li>
</ul>
<p>As research deepens, finer division of data organization within memory systems has emerged, borrowing ideas and concepts from cognitive science: Working Memory, Episodic Memory, Semantic Memory, Meta Memory, etc. These different "memory regions" can be likened to different tables or collections in a database.</p>
<p>Memory system complexity lies not just in storage and retrieval but more in memory management logic: When and how are newly generated raw conversations written to memory? When to trigger an LLM to summarize a conversation segment and store it in semantic memory? How to establish associations between different memory fragments?</p>
<p>These functions of "memory flow, processing, and lifecycle management" are identical to the Ingestion Pipeline in RAG systems, except they handle dynamically generated streaming data.</p>
<p>If we broaden our view, dedicating a region within the memory system (or establishing a closely linked knowledge base) to store and retrieve the tool usage guides mentioned above, then a blueprint for a complete data foundation supporting AI Agents emerges:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/memory_infra-5464678a3d0c427f263758a408ad8b6f.png" width="1280" height="543"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>This blueprint clearly shows: Memory (handling dynamic interaction data) and RAG (handling static domain knowledge) are technically having the same source (both retrieval-based) and functionally complementary. Together, they constitute the complete data foundation upon which AI Agents depend.</p>
<p>All Agent data access needs—whether existing unstructured documents (via RAG), real-time generated interaction logs (via Memory), or structured service interfaces (packaged via MCP, with their metadata, usage guides, and tutorials retrievable in a dedicated knowledge base)—can be unified, governed, and accessed within an integrated platform.</p>
<p>This platform is precisely the direction systems like RAGFlow are evolving towards: a Context Engine or Context Platform. It is no longer an isolated retrieval tool but an infrastructure providing comprehensive, intelligent context assembly services for AI applications.</p>
<p>The forward-looking term "Context Platform" was likely first systematically elaborated by investment firm Theory Ventures in their series of articles [Ref 13, 14]. In fact, this visionary firm explicitly highlighted the fundamental importance of retrieval for LLM applications as early as 2024 [Ref 15]. Today, how to upgrade the technically-focused Retrieval Engine into a Context Engine is becoming the key determinant for whether AI Agents can achieve scalable, cost-effective enterprise adoption.</p>
<p>As the comprehensive analysis above shows, many so-called "Agent intelligence" problems are still essentially about finding and presenting the right information to the LLM at the right time. If an Agent has a powerful "external brain" (Context Engine) helping it efficiently search, filter, verify, and organize all relevant data, the final user experience and results will far surpass a "bare" model relying solely on vast parameters and complex prompts.</p>
<p>The evolution from Context Engineering to Context Engine/Platform signifies that context creation, management, and delivery are shifting from a highly expert-dependent, manual craft towards a highly automated, productized, and operational platform science.</p>
<p>Currently, developing custom Agents often requires significant engineering and data science effort to manually craft complex prompt templates, meticulously design context stitching logic, and hardcode them into workflow orchestration. This approach is hard to maintain, doesn't scale, and leads to chaotic context ownership and update processes.</p>
<p>Future Context Platforms aim to change this:</p>
<ul>
<li class="">Context creation will be automated through deep integration with data sources, with continuous synchronization and updates.</li>
<li class="">Context delivery will no longer be hardcoded. Instead, based on real-time intent from each conversation, a platform's unified retrieval and orchestration layer will dynamically retrieve and assemble context from various data sources.</li>
<li class="">Context maintenance will shift from vendor-led manual services to automated, customer-managed, visually configurable processes. Context ownership and control will clearly belong to the customer.</li>
</ul>
<p>This paradigm shift is massive. The core value of enterprise AI adoption is shifting from pursuing the "smartest model" and "most clever prompts" back to building the "richest, most accurate, most usable context."</p>
<p>Context quality, real-time nature, dynamic assembly capability, and productization level will directly determine the competitiveness of next-generation enterprise AI applications. Context product will be the final key to unlocking large-scale AI application. It marks the official transition of enterprise AI from the early "handcrafted customization" stage to the "platform, scalable, sustainably operable" industrial era.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/context_engineering-3904e6110c9e7aaffb357bb96cca0b80.png" width="1772" height="618"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="how-far-has-multi-modal-rag-progressed" class="anchor anchorTargetStickyNavbar_Vzrq">How far has multi-modal RAG progressed?<a href="https://ragflow.io/en/blog/rag-review-2025-from-rag-to-context#how-far-has-multi-modal-rag-progressed" class="hash-link" aria-label="Direct link to How far has multi-modal RAG progressed?" title="Direct link to How far has multi-modal RAG progressed?" translate="no"></a></h2>
<p>In our 2024 year-end review, we predicted multimodal RAG based on "late interaction" would be a 2025 technical keyword. However, this prediction didn't fully materialize. Does this mean multimodal RAG lacks practical significance? The answer is clearly no.</p>
<p>Taking test results from M3Retrieve [Ref 4], a benchmark dataset designed for medical literature, as an example, the value and positioning of multimodal RAG are clearly demonstrated:</p>
<ul>
<li class="">Excels in Text-Image Combined Tasks: In scenarios like visual context retrieval or image-based Q&amp;A, multimodal RAG leveraging both text and visual information performs significantly better than text-only solutions.</li>
<li class="">Less Advantage in Text-Dominant Tasks: For tasks like summarization or pure-text patient record retrieval, mature single-modal RAG, with its efficiency and precision, still holds advantage.</li>
</ul>
<p>Thus, production-grade multimodal RAG isn't simply stitching image and text models. Its core demand is achieving truly efficient cross-modal retrieval and understanding. Technologically, multimodal RAG is undoubtedly the inevitable direction for RAG systems to deepen and cover broader data types.</p>
<p>Currently, two main technical paths exist for handling images and other multi-modal documents:</p>
<ol>
<li class="">Modality Conversion Path: Using OCR or VLMs to convert images, tables, etc., into pure text descriptions. This reduces the multimodal problem to a single-modal text retrieval problem. It's compatible with existing text RAG architecture but risks losing crucial raw visual layout, color, and finer characterics.</li>
<li class="">Native Multimodal Path: Directly tokenizing images visually, inputting a unified multimodal encoder alongside text tokens to generate fused multi-vector representations. During retrieval ranking, late interaction models enable fine-grained similarity calculation.</li>
</ol>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/multimodal_path-99f59e049f169d2bb6086454981357ea.png" width="1280" height="717"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>A theoretical guidance article from Google DeepMind in September this year [Ref 5] indicates: retrieval based on a single global vector has inherent semantic loss, while using multi-vectors (high-dimensional tensors) preserves document fine-grained semantic information more completely.</p>
<p>Given such clear theoretical advantages, why haven't mature, productized multimodal RAG solutions emerged in 2025? The fundamental reason is that engineering challenges from prototype to stable product are not fully overcome yet.</p>
<p>A primary challenge for engineering cross-modal retrieval is determining recall units and strategies. Using the document "page" as the recall unit is common. Specific implementation schemes include:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/doc_retrieval-ac362740de513961c064fdafa718c833.png" width="1280" height="875"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<ul>
<li class="">Hybrid Indexing Scheme: Build full-text and single-vector indices for text content, and separate tensor indices for images. During retrieval, perform hybrid search and fuse results from the three indices.</li>
<li class="">Text-First, Tensor Reranking Scheme: Use only text parsed from PDFs to build full-text and single-vector indices for initial recall. Then, use tensor representations generated from the entire page as an image to perform finer reranking of initial results. This scheme can also be used for pure text retrieval to achieve better semantic recall.</li>
<li class="">Pure Tensor Retrieval Scheme: Rely soly on tensor indices. For cross-modal pages, calculate similarity between the query and text tensors, and image tensors separately, taking the maximum as the page's final relevance score.</li>
</ul>
<p>While technically feasible, these schemes share a tricky engineering bottleneck: exploding storage and computational costs from exploding tensor data due to massive token counts.</p>
<p>Assuming a model like ColPali outputs 1024 tokens per page image (each corresponding a feature vector), with vector dimension 128 and float32 precision, the tensor data for a single page occupies ~512KB. For a million-page document base, the index size expands to TB levels—a collossal challenge for storage cost, memory loading, and retrieval latency.</p>
<p>To advance multimodal RAG towards practical engineering, two main technical paths are currently available:</p>
<ul>
<li class="">Tensor Quantization Compression: Binarize or apply low-bit quantization (e.g., 1-bit) to each vector in the tensor, compressing storage to 1/32 or less of the original. The cost is some precision loss. Feasibility depends on training specialized embedding models robust to quantization.</li>
<li class="">Token Pruning: Significantly reduce the number of tokens generated per page image, e.g., from 1024 to 128 or fewer. Specific methods include:<!-- -->
<ul>
<li class="">Random Projection: Project vectors from many tokens into a single high-dimensional vector (e.g., 10k dimensions), as in the MUVERA algorithm [Ref 6]. Computationally efficient but loses significant fine-grained information.</li>
<li class="">Token Clustering: Perform unsupervised clustering on vectors generated tokens, using cluster centers to represent the original set. This doesn't require model changes but also sacrifices precision.</li>
<li class="">Model-Side Token Pruning: Modify the Embedding model (especially its underlying VLM) to actively output fewer but more informative "refined" tokens based on its internal attention mechanism. This is the most fundamental method.</li>
</ul>
</li>
</ul>
<p>Therefore, the maturation of multimodal RAG requires not only that the underlying retrieval engine natively and efficiently supports Tensor Index and Tensor Reranker components, but also relies on the broader AI community producing more next-generation multimodal Embedding models that are quantization-friendly and support adaptive token pruning.</p>
<p>These developments are synergistic: lacking a mature, easy-to-use Retrieval Engine hinders validation and iteration of new models in real scenarios; without efficient models, the Retrieval Engine has nothing to leverage. Fortunately, this topic is gaining widespread attention, and a workshop dedicated to late interaction is scheduled for early 2026 [Ref 7].</p>
<p>Looking ahead to 2026, as AI infrastructure layers improve support for tensor computation and storage, we can expect more superior multimodal models tailored for engineering to emerge, truly unlocking the practical potential of cross-modal RAG.</p>
<p>Its engineering implementation will naturally give rise to widespread demand for multimodal contexts. For example, "multimodal memory" systems capable of simultaneously understanding and remembering text, images, and even video are no longer merely theoretical concepts but are already in the prototyping phase [Ref 16].</p>
<h2 id="looking-ahead-to-2026" class="anchor anchorTargetStickyNavbar_Vzrq">Looking ahead to 2026<a href="https://ragflow.io/en/blog/rag-review-2025-from-rag-to-context#looking-ahead-to-2026" class="hash-link" aria-label="Direct link to Looking ahead to 2026" title="Direct link to Looking ahead to 2026" translate="no"></a></h2>
<p>Entering 2026, the enterprise focus on LLM applications will inevitably shift from proof-of-concept and early experimentation toward pragmatic, large-scale adoption and ROI. In this process, RAG technology, as the foundational data layer for all AI applications, will experience a wave of more robust and systematic construction.</p>
<p>While the ultimate value and form of AI Agents in complex enterprise scenarios remain in broad exploration, the foundational supporting role of RAG for all Agents—and indeed for all LLM applications—has become a consensus among a growing number of technical decision-makers.</p>
<p>A clear trend is that many enterprises have already taken the lead in building capabilities centered around an "AI Middle Platform" or an "Intelligent Data Foundation," whose core is precisely an unstructured data processing and provisioning platform built upon RAG engines. In contrast, the concrete development and deployment of upper-layer Agents can proceed on this stable foundation with greater flexibility and a more incremental pace.</p>
<p>To summarize the evolution trajectory and future outlook of RAG technology from 2025 to 2026 in one sentence: RAG is undergoing its own profound metamorphosis, evolving from the specific pattern of "Retrieval-Augmented Generation" into a "Context Engine" with "intelligent retrieval" as its core capability.</p>
<p>This evolutionary trend is now irreversible. It will move from the technical backend to the strategic forefront, becoming an indispensable core component for enterprises constructing next-generation intelligent infrastructure.</p>
<p>And RAGFlow is built precisely for this grand yet definitive future vision. We are building not just an open-source, high-efficiency RAG system, but the key cornerstone and driving force toward the era of the "Context Engine."</p>
<p>From our deep cultivation in multimodal parsing and semantic enhancement with DeepDoc, to exploring cutting-edge architectures like TreeRAG to bridge semantic gaps, to building a Context Engine that serves Agents—every iteration of RAGFlow aims to transform the technical directions discussed here into stable, user-friendly, high-performance product capabilities, steadily advancing enterprise intelligence from concept to reality.</p>
<p>We firmly believe that a retrieval-centric Context Engine is key to unlocking the full potential of LLMs and Agents.</p>
<p>Stay tuned for RAGFlow's evolution, visit GitHub to give us a star, and join developers worldwide in witnessing and building the next generation of enterprise AI infrastructure.</p>
<h2 id="references" class="anchor anchorTargetStickyNavbar_Vzrq">References<a href="https://ragflow.io/en/blog/rag-review-2025-from-rag-to-context#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References" translate="no"></a></h2>
<ol>
<li class="">AlayaDB: The Data Foundation for Efficient and Effective Long-context LLM Inference <a href="https://arxiv.org/abs/2504.10326" target="_blank" rel="noopener noreferrer" class=""><span>https://arxiv.org/abs/2504.10326</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a>?</li>
<li class=""><a href="https://github.com/VectifyAI/PageIndex" target="_blank" rel="noopener noreferrer" class=""><span>https://github.com/VectifyAI/PageIndex</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class="">A Systematic Framework for Enterprise Knowledge Retrieval: Leveraging LLM-Generated Metadata to Enhance RAG Systems <a href="https://arxiv.org/abs/2512.05411" target="_blank" rel="noopener noreferrer" class=""><span>https://arxiv.org/abs/2512.05411</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class="">M3Retrieve: Benchmarking Multimodal Retrieval for Medicine <a href="https://arxiv.org/abs/2510.06888" target="_blank" rel="noopener noreferrer" class=""><span>https://arxiv.org/abs/2510.06888</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class="">On the Theoretical Limitations of Embedding-Based Retrieval <a href="https://arxiv.org/abs/2508.21038" target="_blank" rel="noopener noreferrer" class=""><span>https://arxiv.org/abs/2508.21038</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class="">MUVERA: Multi-Vector Retrieval via Fixed Dimensional Encodings <a href="https://arxiv.org/abs/2405.19504" target="_blank" rel="noopener noreferrer" class=""><span>https://arxiv.org/abs/2405.19504</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class=""><a href="https://www.lateinteraction.com/" target="_blank" rel="noopener noreferrer" class=""><span>https://www.lateinteraction.com/</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class=""><a href="https://huggingface.co/blog/QuentinJG/introducing-vidore-v3" target="_blank" rel="noopener noreferrer" class=""><span>https://huggingface.co/blog/QuentinJG/introducing-vidore-v3</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class="">诞生才一周年，MCP凉了 <a href="https://mp.weixin.qq.com/s/LskoLb8g6t_PCGNSvlLh6g" target="_blank" rel="noopener noreferrer" class=""><span>https://mp.weixin.qq.com/s/LskoLb8g6t_PCGNSvlLh6g</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class=""><a href="https://huggingface.co/datasets/bowang0911/ToolSearch" target="_blank" rel="noopener noreferrer" class=""><span>https://huggingface.co/datasets/bowang0911/ToolSearch</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class="">Dspy GEPA <a href="https://dspy.ai/api/optimizers/GEPA/overview/" target="_blank" rel="noopener noreferrer" class=""><span>https://dspy.ai/api/optimizers/GEPA/overview/</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class="">Agentic Context Engineering: Evolving Contexts for Self-Improving Language Models <a href="https://arxiv.org/abs/2510.04618" target="_blank" rel="noopener noreferrer" class=""><span>https://arxiv.org/abs/2510.04618</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class="">Why the Business Context Layer Is the Key to Making AI Work in Enterprise <a href="https://theoryvc.com/blog-posts/business-context-layer" target="_blank" rel="noopener noreferrer" class=""><span>https://theoryvc.com/blog-posts/business-context-layer</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class="">From Context Engineering to Context Platforms <a href="https://theoryvc.com/blog-posts/from-context-engineering-to-context-platforms" target="_blank" rel="noopener noreferrer" class=""><span>https://theoryvc.com/blog-posts/from-context-engineering-to-context-platforms</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class=""><a href="https://www.linkedin.com/pulse/every-llm-company-search-hard-future-retrieval-systems-7zigc/" target="_blank" rel="noopener noreferrer" class=""><span>https://www.linkedin.com/pulse/every-llm-company-search-hard-future-retrieval-systems-7zigc/</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class="">MemVerse: Multimodal Memory for Lifelong Learning Agents <a href="https://arxiv.org/abs/2512.03627" target="_blank" rel="noopener noreferrer" class=""><span>https://arxiv.org/abs/2512.03627</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
</ol>]]></content:encoded>
            <category>Insights</category>
        </item>
        <item>
            <title><![CDATA[RAGFlow’s Seamless Upgrade - from 0.21 to 0.22 and Beyond]]></title>
            <link>https://ragflow.io/en/blog/ragflow-seamless-upgrade-from-0.21-to-0.22-and-beyond</link>
            <guid>https://ragflow.io/en/blog/ragflow-seamless-upgrade-from-0.21-to-0.22-and-beyond</guid>
            <pubDate>Wed, 19 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Background]]></description>
            <content:encoded><![CDATA[<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/1-123e8daad6d09339fe6e70cb6e93096d.PNG" width="1280" height="546"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="background" class="anchor anchorTargetStickyNavbar_Vzrq">Background<a href="https://ragflow.io/en/blog/ragflow-seamless-upgrade-from-0.21-to-0.22-and-beyond#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background" translate="no"></a></h2>
<p>From version 0.22.0, RAGFlow no longer ships a full Docker image with built-in embedding models. Previously, some users relied on the bundled embedding models in that image to build their datasets.</p>
<p>After upgrading to 0.22.0, those models are no longer available, which leads to several issues: the embedding model originally used by the dataset is missing; you cannot add new documents; retrieval in the dataset stops working properly; and you cannot switch to a new embedding model because of the old logic constraints. To address these compatibility problems after upgrade, we introduced important improvements in version 0.22.1.</p>
<h2 id="0221-capabilities" class="anchor anchorTargetStickyNavbar_Vzrq">0.22.1 capabilities<a href="https://ragflow.io/en/blog/ragflow-seamless-upgrade-from-0.21-to-0.22-and-beyond#0221-capabilities" class="hash-link" aria-label="Direct link to 0.22.1 capabilities" title="Direct link to 0.22.1 capabilities" translate="no"></a></h2>
<h3 id="datasets-containing-parsed-data-are-allowed-to-switch-embedding-models" class="anchor anchorTargetStickyNavbar_Vzrq">Datasets containing parsed data are allowed to switch embedding models<a href="https://ragflow.io/en/blog/ragflow-seamless-upgrade-from-0.21-to-0.22-and-beyond#datasets-containing-parsed-data-are-allowed-to-switch-embedding-models" class="hash-link" aria-label="Direct link to Datasets containing parsed data are allowed to switch embedding models" title="Direct link to Datasets containing parsed data are allowed to switch embedding models" translate="no"></a></h3>
<p>Starting from RAGFlow 0.22.1, a safer, automated embedding compatibility check is introduced, allowing users to switch embedding models on data-containing datasets. To ensure the new embedding model does not disrupt the original vector space structure, RAGFlow performs the following checks:</p>
<ol>
<li class="">Sample extraction: Randomly selects a few chunks (e.g., 5–10) from the current dataset as representative samples.</li>
<li class="">Re-encoding: Generates new vectors for the sampled chunks using the new embedding model chosen by the user.</li>
<li class="">Similarity calculation: For each chunk, calculates the cosine similarity between new and old vectors.</li>
<li class="">Switch decision: If the average similarity is 0.9 or above, the new and old models are deemed sufficiently consistent in vector space, and the switch is allowed. If below 0.9, the model switch request is denied.</li>
</ol>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/2-32a0b06cd59097a13215f131e44ff2f7.PNG" width="1125" height="480"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="why-use-a-09-threshold" class="anchor anchorTargetStickyNavbar_Vzrq">Why use a 0.9 threshold?<a href="https://ragflow.io/en/blog/ragflow-seamless-upgrade-from-0.21-to-0.22-and-beyond#why-use-a-09-threshold" class="hash-link" aria-label="Direct link to Why use a 0.9 threshold?" title="Direct link to Why use a 0.9 threshold?" translate="no"></a></h3>
<p>The threshold is set to 0.9 because models with the same name from different model providers can have minor version differences, and RAGFlow’s embeddings also vary with strategies and parameters, so a new model cannot perfectly reproduce the old embedding environment. These “small differences” still usually give an average similarity above 0.9, so 0.9 works well as a cut-off for “safe to swap” models. In contrast, embeddings from completely different model families (for example, MiniLM to BGE‑M3) tend to sit around 0.3–0.6 in similarity, so they fall below this threshold and are correctly blocked, preventing a scrambled vector space.</p>
<h2 id="how-to-switch-embedding-model" class="anchor anchorTargetStickyNavbar_Vzrq">How to switch embedding model<a href="https://ragflow.io/en/blog/ragflow-seamless-upgrade-from-0.21-to-0.22-and-beyond#how-to-switch-embedding-model" class="hash-link" aria-label="Direct link to How to switch embedding model" title="Direct link to How to switch embedding model" translate="no"></a></h2>
<ol>
<li class="">Configure a new model in the model settings interface to replace the unusable default model.</li>
</ol>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/3-60c2727e1c27facc93e82ced1de2d2d4.PNG" width="1280" height="630"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span>
<span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/4-3229353e384f83a553a3e145884c9acb.png" width="1280" height="637"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<ol start="2">
<li class="">Navigate to the dataset's <strong>Configuration</strong> page, select the same model name from the new provider, and wait for the model switch to complete.</li>
</ol>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/5-010d5f8e04cfe3c3fc6d60b6e0170b8c.png" width="1280" height="625"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p><em>If switching the embedding model fails, an error message will appear.</em></p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/6-7ced91129e8dc7092a965a20e77398c0.png" width="1280" height="632"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<ol start="3">
<li class="">Enter <strong>Retrieval testing</strong> to self-assess the new embedding model.</li>
</ol>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/7-e4483e573b59e4ab8eccf3ea455b5843.png" width="1280" height="646"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p><em>Functions involving dataset retrieval in chat apps for example are now working properly.</em></p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/8-26d06877b0824d25312a6fa5f32c5ec9.jpg" width="3656" height="1752"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Our future releases will feature more sophisticated upgrade tools and automation, simplifying migration from older versions and reducing the maintenance burden for users.</p>]]></content:encoded>
            <category>Tutorials</category>
        </item>
        <item>
            <title><![CDATA[RAGFlow 0.22.0 Overview — Supported Data Sources, Enhanced Parser, Agent Optimizations, and Admin UI]]></title>
            <link>https://ragflow.io/en/blog/ragflow-0.22.0-data-source-synchronization-enhanced-parser-agent-optimization-and-admin-ui</link>
            <guid>https://ragflow.io/en/blog/ragflow-0.22.0-data-source-synchronization-enhanced-parser-agent-optimization-and-admin-ui</guid>
            <pubDate>Tue, 11 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[0.22 Highlights]]></description>
            <content:encoded><![CDATA[<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/1-00d5d5b95065854c8157823ee6cd4ae4.PNG" width="1280" height="546"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="022-highlights" class="anchor anchorTargetStickyNavbar_Vzrq">0.22 Highlights<a href="https://ragflow.io/en/blog/ragflow-0.22.0-data-source-synchronization-enhanced-parser-agent-optimization-and-admin-ui#022-highlights" class="hash-link" aria-label="Direct link to 0.22 Highlights" title="Direct link to 0.22 Highlights" translate="no"></a></h2>
<p>Building a RAGFlow dataset involves three main steps: file upload, parsing, and chunking. Version 0.21.0 made the parsing and chunking stages more flexible with the Ingestion pipeline.</p>
<p>This 0.22.0 release focuses on the data upload step to help developers build datasets faster.</p>
<p>We also added these key improvements:</p>
<ul>
<li class="">The Parser component in the Ingestion pipeline now offers more model choices for better file parsing.</li>
<li class="">We optimized the Agent's <strong>Retrieval</strong> and <strong>Await response</strong> components.</li>
<li class="">A new Admin UI gives you a clearer and easier way to manage the system.</li>
</ul>
<h2 id="support-for-rich-external-data-sources" class="anchor anchorTargetStickyNavbar_Vzrq">Support for Rich External Data Sources<a href="https://ragflow.io/en/blog/ragflow-0.22.0-data-source-synchronization-enhanced-parser-agent-optimization-and-admin-ui#support-for-rich-external-data-sources" class="hash-link" aria-label="Direct link to Support for Rich External Data Sources" title="Direct link to Support for Rich External Data Sources" translate="no"></a></h2>
<p>The new Data Sources module lets you connect external data to a Dataset. You can now sync files from different places directly into RAGFlow.</p>
<p>Use the "Data Sources" menu in your personal center to add and set up sources like Confluence, AWS S3, Google Drive, Discord, and Notion. This lets you manage all your data in one place and sync it automatically.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/2-338bfa7aa99c22396679f02485dab2ed.PNG" width="1280" height="693"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="example-s3-configuration" class="anchor anchorTargetStickyNavbar_Vzrq">Example: S3 Configuration<a href="https://ragflow.io/en/blog/ragflow-0.22.0-data-source-synchronization-enhanced-parser-agent-optimization-and-admin-ui#example-s3-configuration" class="hash-link" aria-label="Direct link to Example: S3 Configuration" title="Direct link to Example: S3 Configuration" translate="no"></a></h3>
<ol>
<li class="">Make sure you have an S3 storage bucket in your AWS account.</li>
</ol>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/s31-ba42e0bc2104bbccb6ad9314f59aff03.PNG" width="1280" height="699"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<ol start="2">
<li class="">Add your S3 details to the S3 data source form.</li>
</ol>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/s32-4e4f618ecb77677771452c6eb24054e8.PNG" width="1280" height="699"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<ol start="3">
<li class="">After you add it, click the settings icon to see the data source details.</li>
</ol>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/s33-d2e412a61f7ab54f00a5b945713b64eb.PNG" width="1280" height="699"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<ol start="4">
<li class="">If you set "Refresh Freq" to "1", the system will check for new files every minute.</li>
<li class="">RAGFlow watches your specified S3 Bucket (like <code>ragflow-bucket</code>). If it finds new files, it immediately starts syncing them.</li>
<li class="">After syncing, it waits one minute before checking again. Use the "Pause" button to turn this automatic refresh on or off anytime.</li>
</ol>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/s34-42c9bd7aac28990db4a67f4d60a365df.png" width="1280" height="699"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="linking-data-sources-to-a-dataset" class="anchor anchorTargetStickyNavbar_Vzrq">Linking Data Sources to a dataset<a href="https://ragflow.io/en/blog/ragflow-0.22.0-data-source-synchronization-enhanced-parser-agent-optimization-and-admin-ui#linking-data-sources-to-a-dataset" class="hash-link" aria-label="Direct link to Linking Data Sources to a dataset" title="Direct link to Linking Data Sources to a dataset" translate="no"></a></h3>
<ol>
<li class="">Create a new dataset (for example, <code>TEST_S3</code>).</li>
<li class="">Click <code>Configuration</code> and go to the bottom of the page.</li>
<li class="">Click <code>Link Data Source</code> and pick the data source you want (like S3).</li>
</ol>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/s35-96193242d12ca3e9370547240db4b055.png" width="1280" height="699"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span>
<span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/s36-96193242d12ca3e9370547240db4b055.png" width="1280" height="699"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>After you link successfully, you'll see three icons:</p>
<ul>
<li class=""><strong>Rebuild:</strong> Click this to delete all files and logs in the dataset and import everything again.</li>
<li class=""><strong>Settings:</strong> Check the sync logs here.</li>
<li class=""><strong>Unlink:</strong> This disconnects the data source. It keeps all the files already in the dataset but stops new syncs.</li>
</ul>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/s3icons-acfb5fc245bda95a822821222eff9cf2.png" width="895" height="215"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p><strong>Status Messages in Logs:</strong></p>
<ul>
<li class=""><strong>Scheduled:</strong> The task is in line, waiting for its next turn to check for files.</li>
<li class=""><strong>Running:</strong> The system is moving files right now.</li>
<li class=""><strong>Success:</strong> It finished checking for new files.</li>
<li class=""><strong>Failed:</strong> The upload didn't work. Check the error message for details.</li>
<li class=""><strong>Cancel:</strong> You paused the transfer.</li>
</ul>
<p>You can link multiple data sources to one dataset, and one data source can feed into many datasets.</p>
<h2 id="enhanced-parser" class="anchor anchorTargetStickyNavbar_Vzrq">Enhanced Parser<a href="https://ragflow.io/en/blog/ragflow-0.22.0-data-source-synchronization-enhanced-parser-agent-optimization-and-admin-ui#enhanced-parser" class="hash-link" aria-label="Direct link to Enhanced Parser" title="Direct link to Enhanced Parser" translate="no"></a></h2>
<h3 id="mineru" class="anchor anchorTargetStickyNavbar_Vzrq">MinerU<a href="https://ragflow.io/en/blog/ragflow-0.22.0-data-source-synchronization-enhanced-parser-agent-optimization-and-admin-ui#mineru" class="hash-link" aria-label="Direct link to MinerU" title="Direct link to MinerU" translate="no"></a></h3>
<p>RAGFlow now works with MinerU 2.6.3 as another option for parsing PDFs. It supports different backends like <code>pipeline</code>, <code>vlm-transformers</code>, <code>vlm-vlm-engine</code>, and <code>http-client</code>.</p>
<p>The idea is simple: RAGFlow asks MinerU to parse a file, reads the results, and adds them to your dataset.</p>
<p><strong>Key Environment Variables:</strong></p>
<table><thead><tr><th style="text-align:left">Variable</th><th style="text-align:left">Explanation</th><th style="text-align:left">Default</th><th style="text-align:left">Example</th></tr></thead><tbody><tr><td style="text-align:left"><code>MINERU_EXECUTABLE</code></td><td style="text-align:left">Path to MinerU on your computer</td><td style="text-align:left"><code>mineru</code></td><td style="text-align:left"><code>MINERU_EXECUTABLE=/home/ragflow/uv_tools/.venv/bin/mineru</code></td></tr><tr><td style="text-align:left"><code>MINERU_DELETE_OUTPUT</code></td><td style="text-align:left">Keep or delete MinerU's output files?</td><td style="text-align:left"><code>1</code> (delete)</td><td style="text-align:left"><code>MINERU_DELETE_OUTPUT=0</code> (keep)</td></tr><tr><td style="text-align:left"><code>MINERU_OUTPUT_DIR</code></td><td style="text-align:left">Where to put MinerU's output</td><td style="text-align:left">System temp folder</td><td style="text-align:left"><code>MINERU_OUTPUT_DIR=/home/ragflow/mineru/output</code></td></tr><tr><td style="text-align:left"><code>MINERU_BACKEND</code></td><td style="text-align:left">Which MinerU backend to use</td><td style="text-align:left"><code>pipeline</code></td><td style="text-align:left"><code>MINERU_BACKEND=vlm-transformers</code></td></tr></tbody></table>
<p><strong>Starting Up:</strong></p>
<ul>
<li class="">If you use the <code>vlm-http-client</code> backend, set the server address with <code>MINERU_SERVER_URL</code>.</li>
<li class="">To connect to a remote MinerU parser, use <code>MINERU_APISERVER</code> to give its address.</li>
</ul>
<p><strong>How to Start:</strong></p>
<ol>
<li class=""><strong>From Source:</strong> Install MinerU by itself (its dependencies can conflict with RAGFlow's). Then set the environment variables and start the RAGFlow server.</li>
<li class=""><strong>Using Docker:</strong> Set <code>USE_MINERU=true</code> in <code>docker/.env</code> and restart your containers.</li>
</ol>
<h3 id="docling" class="anchor anchorTargetStickyNavbar_Vzrq">Docling<a href="https://ragflow.io/en/blog/ragflow-0.22.0-data-source-synchronization-enhanced-parser-agent-optimization-and-admin-ui#docling" class="hash-link" aria-label="Direct link to Docling" title="Direct link to Docling" translate="no"></a></h3>
<p>RAGFlow also supports Docling as another PDF parser. It works the same way as MinerU.</p>
<p>Docling finds the text, formulas, tables, and images in a document. RAGFlow then uses what Docling finds.</p>
<p><strong>What Docling Can Do:</strong></p>
<ol>
<li class="">Pull out text (paragraphs, headings, lists).</li>
<li class="">Extract math formulas.</li>
<li class="">Identify tables and images (and save them).</li>
<li class="">Mark where everything is located.</li>
</ol>
<p><strong>Starting Up:</strong> Set <code>USE_DOCLING=true</code> in <code>docker/.env</code> and restart your containers.</p>
<h2 id="agent-optimizations" class="anchor anchorTargetStickyNavbar_Vzrq">Agent Optimizations<a href="https://ragflow.io/en/blog/ragflow-0.22.0-data-source-synchronization-enhanced-parser-agent-optimization-and-admin-ui#agent-optimizations" class="hash-link" aria-label="Direct link to Agent Optimizations" title="Direct link to Agent Optimizations" translate="no"></a></h2>
<h3 id="retrieval-now-uses-metadata" class="anchor anchorTargetStickyNavbar_Vzrq">Retrieval Now Uses Metadata<a href="https://ragflow.io/en/blog/ragflow-0.22.0-data-source-synchronization-enhanced-parser-agent-optimization-and-admin-ui#retrieval-now-uses-metadata" class="hash-link" aria-label="Direct link to Retrieval Now Uses Metadata" title="Direct link to Retrieval Now Uses Metadata" translate="no"></a></h3>
<p>You can now add tags (metadata) to files in your dataset. During retrieval, the Agent can use these tags to filter results, so it only looks at specific files instead of the whole library.</p>
<p><strong>Example:</strong>
Imagine a dataset full of AI papers. Some are about AI agents, others are about evaluating AI. If you want a Q&amp;A assistant that only answers evaluation questions, you can add a tag like <code>"Topic": "Evaluation"</code> to the right papers. When the Agent retrieves information, it will filter for just those tagged files.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/setmetadata-28c7e4d509f17b9a3790ee0b3f9c7bc8.png" width="918" height="522"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Before, this only worked in the Chat app. Now the Agent's Retrieval component can do it too.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/retrieval_metadata-24375dadd7d5a527eb83a6f6fb4993df.png" width="1013" height="767"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span>
<span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/retrieval_effect-4afbde80d3b93dc1e46d62d72f4191e8.png" width="1098" height="1229"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="agent-teamwork-gets-better" class="anchor anchorTargetStickyNavbar_Vzrq">Agent Teamwork Gets Better<a href="https://ragflow.io/en/blog/ragflow-0.22.0-data-source-synchronization-enhanced-parser-agent-optimization-and-admin-ui#agent-teamwork-gets-better" class="hash-link" aria-label="Direct link to Agent Teamwork Gets Better" title="Direct link to Agent Teamwork Gets Better" translate="no"></a></h3>
<p>You can now use an upstream Agent's output in the <strong>Await Response</strong> component's message.</p>
<p><strong>The Old Way:</strong> The message in the Await Response component was always static text.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/staticmessage-a5742a2d8dee3699bfcb3b6483842516.png" width="952" height="662"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p><strong>The New Way:</strong> You can insert dynamic content from earlier in the workflow, like a plan from a Planning Agent.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/reference_variable-3b3f6cd1dd9977ba814ff7935c56445b.png" width="1280" height="964"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>This is great for "Deep Research" agents or any time you need a human to check the work before continuing. It's also a key part of future improvements to the Ingestion Pipeline.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/planning-5602287476f43f8efe2ef8ebe52bb712.png" width="1233" height="966"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/feedback0-381b1effba907d3b7fa9034fcdcf4184.png" width="1280" height="721"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/feedback-0dd386b714dc6bde8ddedb67975840b3.png" width="1280" height="733"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>You can find this use case as a ready-to-use template in the agent template library.</p>
<h2 id="admin-ui" class="anchor anchorTargetStickyNavbar_Vzrq">Admin UI<a href="https://ragflow.io/en/blog/ragflow-0.22.0-data-source-synchronization-enhanced-parser-agent-optimization-and-admin-ui#admin-ui" class="hash-link" aria-label="Direct link to Admin UI" title="Direct link to Admin UI" translate="no"></a></h2>
<p>This version adds a new <strong>Admin UI</strong>, a visual dashboard made for system administrators.</p>
<p>It takes jobs you used to do with commands and puts them in a simple interface, making management much easier.</p>
<h3 id="see-system-status-instantly" class="anchor anchorTargetStickyNavbar_Vzrq">See System Status Instantly<a href="https://ragflow.io/en/blog/ragflow-0.22.0-data-source-synchronization-enhanced-parser-agent-optimization-and-admin-ui#see-system-status-instantly" class="hash-link" aria-label="Direct link to See System Status Instantly" title="Direct link to See System Status Instantly" translate="no"></a></h3>
<p>The <strong>Service Status</strong> dashboard shows the health of all core services. It lists their name, type, host, port, and status. If something goes wrong (like Elasticsearch times out), you can find the problem fast and copy the address to test it, without logging into different servers.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/adminui-5bb2efecbb2410b89e511f7c844cb3e9.png" width="1280" height="699"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>The UI also shows service details. You can see detailed logs and connection info (like database passwords) without ever touching a server command line. This makes fixing problems quicker and keeps the system more transparent and secure.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/adminui1-e12addc1938a745c28ec3780ff90eff6.png" width="1280" height="699"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span>
<span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/adminui2-e03046eb873672eeddc12b5b89a96a93.png" width="1280" height="699"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="manage-users-easily" class="anchor anchorTargetStickyNavbar_Vzrq">Manage Users Easily<a href="https://ragflow.io/en/blog/ragflow-0.22.0-data-source-synchronization-enhanced-parser-agent-optimization-and-admin-ui#manage-users-easily" class="hash-link" aria-label="Direct link to Manage Users Easily" title="Direct link to Manage Users Easily" translate="no"></a></h3>
<p>The <strong>User Management</strong> section lets you create, enable, disable, reset passwords for, and delete users. You can quickly find users by email or nickname and see what datasets and agents they own.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/user_management-241a2de27a193abb88fcac55141d6ca0.png" width="1280" height="795"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="finale" class="anchor anchorTargetStickyNavbar_Vzrq">Finale<a href="https://ragflow.io/en/blog/ragflow-0.22.0-data-source-synchronization-enhanced-parser-agent-optimization-and-admin-ui#finale" class="hash-link" aria-label="Direct link to Finale" title="Direct link to Finale" translate="no"></a></h2>
<p>RAGFlow 0.21.0 gave you a powerful Ingestion pipeline for your data. Now, RAGFlow 0.22.0 connects to all the places your data lives. Together, they help you break down "data silos" and gather everything in one spot to power your LLMs.</p>
<p>We also improved how Agents and people work together. Now you can step into the Agent's workflow and guide it, working as a team to get better, more accurate results than full automation alone.</p>
<p>We will keep adding more data sources, better parsers, and smarter pipelines to make RAGFlow the best data foundation for your LLM applications.</p>
<p><strong>GitHub:</strong> <a href="https://github.com/infiniflow/ragflow" target="_blank" rel="noopener noreferrer" class=""><span>https://github.com/infiniflow/ragflow</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></p>
<p><strong>Reference:</strong></p>
<ol>
<li class=""><a href="https://ragflow.io/docs/dev/faq#how-to-use-mineru-to-parse-pdf-documents" target="_blank" rel="noopener noreferrer" class=""><span>https://ragflow.io/docs/dev/faq#how-to-use-mineru-to-parse-pdf-documents</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
</ol>]]></content:encoded>
            <category>Product News</category>
        </item>
        <item>
            <title><![CDATA[RAGFlow in Practice - Building an Agent for Deep-Dive Analysis of Company Research Reports]]></title>
            <link>https://ragflow.io/en/blog/ragflow-in-practice-building-an-agent-for-deep-dive-analysis-of-company-research-reports</link>
            <guid>https://ragflow.io/en/blog/ragflow-in-practice-building-an-agent-for-deep-dive-analysis-of-company-research-reports</guid>
            <pubDate>Thu, 30 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[In the actual work of the investment research department of financial institutions, analysts are exposed to a vast amount of industry and company analysis reports, third-party research data, and real-time market dynamics on a daily basis, with diverse and scattered information sources. The job of financial analysts is to swiftly formulate clear investment recommendations based on the aforementioned information, such as specifically recommending which stocks to buy, how to adjust portfolio allocations, or predicting the next direction of an industry. Therefore, we have developed the "Intelligent Investment Research Assistant" to help financial analysts quickly organize information. It can automatically capture company data, integrate financial indicators, and compile research report viewpoints, enabling analysts to determine within minutes whether a stock is worth buying, eliminating the need to sift through piles of materials and allowing them to focus their time on genuine investment decision-making. To achieve this goal, we have designed a comprehensive technical process.]]></description>
            <content:encoded><![CDATA[<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/toutu-d93c8290a7da8c98342aed9fd592ffbc.jpg" width="2250" height="960"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>In the actual work of the investment research department of financial institutions, analysts are exposed to a vast amount of industry and company analysis reports, third-party research data, and real-time market dynamics on a daily basis, with diverse and scattered information sources. The job of financial analysts is to swiftly formulate clear investment recommendations based on the aforementioned information, such as specifically recommending which stocks to buy, how to adjust portfolio allocations, or predicting the next direction of an industry. Therefore, we have developed the "Intelligent Investment Research Assistant" to help financial analysts quickly organize information. It can automatically capture company data, integrate financial indicators, and compile research report viewpoints, enabling analysts to determine within minutes whether a stock is worth buying, eliminating the need to sift through piles of materials and allowing them to focus their time on genuine investment decision-making. To achieve this goal, we have designed a comprehensive technical process.</p>
<p>The technical solution revolves around a core business process:</p>
<p>When an analyst poses a question, the system identifies the company name or abbreviation from the question and retrieves the corresponding stock code with the assistance of a search engine. If identification fails, a prompt is returned directly with the company code. After successfully obtaining the stock code, the system retrieves the company's core financial indicators from data interfaces, organizes and formats the data, and generates a clear financial table. Building on this, intelligent analysis further integrates research report information: on one hand, it gathers the latest authoritative research reports and market viewpoints, and on the other hand, it retrieves relevant research report content from the internal knowledge base. Ultimately, these organized financial data and research report information are combined into a comprehensive response, facilitating analysts in quickly reviewing key indicators and core viewpoints.</p>
<p>The workflow after orchestration is as follows:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/1-37a76beebb9e1093a954e0e6114382e1.png" width="1280" height="609"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>This case utilizes RAGFlow to implement a complete workflow, ranging from stock code extraction, to the generation of company financial statements, and finally to the integration and output of research report information.</p>
<p>The following sections will provide a detailed introduction to the implementation process of this solution.</p>
<h1>1. Preparing the Dataset</h1>
<h2 id="11-create-a-dataset" class="anchor anchorTargetStickyNavbar_Vzrq">1.1 Create a dataset<a href="https://ragflow.io/en/blog/ragflow-in-practice-building-an-agent-for-deep-dive-analysis-of-company-research-reports#11-create-a-dataset" class="hash-link" aria-label="Direct link to 1.1 Create a dataset" title="Direct link to 1.1 Create a dataset" translate="no"></a></h2>
<p>The dataset required for this example can be downloaded from <em>Hugging Face Datasets</em><a href="https://huggingface.co/datasets/InfiniFlow/company_financial_research_agent" target="_blank" rel="noopener noreferrer" class=""><span>1</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a>.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/2-6ee86d1a874a8147f47f72fef5c315bf.png" width="1160" height="259"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Create an "Internal Stock Research Report" dataset and import the corresponding dataset documents.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/3-f87eb6e7dc315d5724b9dcfebbd1fcfa.PNG" width="773" height="259"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="12-parse-documents" class="anchor anchorTargetStickyNavbar_Vzrq">1.2 Parse documents<a href="https://ragflow.io/en/blog/ragflow-in-practice-building-an-agent-for-deep-dive-analysis-of-company-research-reports#12-parse-documents" class="hash-link" aria-label="Direct link to 1.2 Parse documents" title="Direct link to 1.2 Parse documents" translate="no"></a></h2>
<p>For the documents in the "Internal Stock Research Report" dataset, we have selected the parsing and slicing method called Paper.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/4-4b6c807821067d73ae0401873579143f.png" width="3798" height="684"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Research report documents typically include modules such as abstracts, core viewpoints, thematic analyses, financial forecast tables, and risk warnings. The overall structure follows a more thesis-like logical progression rather than a strictly hierarchical table of contents. If sliced based on the lowest-level headings, it can easily disrupt the coherence between paragraphs and tables.</p>
<p>Therefore, RAGFlow is better suited to adopt the "Paper" slicing approach, using chapters or logical paragraphs as the fundamental units. This approach not only preserves the integrity of the research report's structure but also facilitates the model's quick location of key information during retrieval.</p>
<p>The preview of the sliced financial report is as follows:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/5-f817dc025442e0b9e2f4c42ecd5b4fb6.png" width="3816" height="1932"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h1>2. Building the Intelligent Agent</h1>
<h2 id="21-create-an-application" class="anchor anchorTargetStickyNavbar_Vzrq">2.1 Create an application.<a href="https://ragflow.io/en/blog/ragflow-in-practice-building-an-agent-for-deep-dive-analysis-of-company-research-reports#21-create-an-application" class="hash-link" aria-label="Direct link to 2.1 Create an application." title="Direct link to 2.1 Create an application." translate="no"></a></h2>
<p>After successful creation, the system will automatically generate a "Start" node on the canvas.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjQAAAD3CAIAAACFCllnAAAhsUlEQVR4nOzdCXxTZd4v8Oeck/WcJE26Jym0KWvLJoJswy4yjIAKIrI5XmVGZ9GR0dGZuXdm9J31qq8z6h1f31HHO5vAoMDrK44oiCheVhGVgjrslNJSuiZtlpPknPtpTyaEtNAtyXmS/r4fP7acJuf5t6fNL/+zPEfDMAxRg8PhsNlszc3NtbW1oiiqUkMcQRCKi4uDwWBNTY3H41G7nIihQ4fqdLqampr6+npZlhO+/l6ss6CgIDc31+12X7x40e/3J7ykXjAYDKWlpeFwuLq62u12q11OxKBBg4xGY21tbV1dnSRJapfTJjc3t6CgoKWlpba21ufzqV1OG61WO2TIEEmSa2qqm5qa1C4noqSkxGQy1dXVXbx4MRwOq11OG5vNZrc7fD7vhQsXvF6v2uW0YVl22LBhDMNUV1c3NjYmduWMWuGk1+uNRqPX66UkmQghHMcJgiDLMj3JpESmXq9vbGykJJkIITqdjud5f7uEl9Q7LMsKgsAwDD3JRAjhed5gMDQ1NVGSTMq2MxqNoihSkkzKa5DJZOI4jp5kIoQYjUaDweDxeEKhkNq1RGi1Wp7ng8EgJcmkbDtBELRabcKTCQAAgEas2gUAAADEQzgBAAB1EE4AAEAdhBMAAFAH4QQAANRBOAEAAHUQTgAAQB2EEwAAUAfhBAAA1EE4AQAAdRBOAABAHYQTAABQB+EEAADUQTgBAAB1EE4AAEAdhBMAAFAH4QQAANRBOAEAAHUQTgAAQB2EEwAAUAfhBAAA1EE4AQAAdRBOAABAHYQTAABQB+EEAADUQTgBAAB1EE4AAEAdhBMAAFAH4QQAANRBOAEAAHUQTgAAQB2EEwAAUAfhBAAA1EE4AQAAdRBOAABAHYQTAABQB+EEAADUQTgBAAB1EE4AAEAdhBMAAFAH4QQAANRBOAEAAHUQTgAAQB2EEwAAUAfhBAAA1OHUGjg7O9vhcGg0GlEUJUlSq4xYBoPB6XRmZWUFAoFQKKR2OREOh8Nut4vt1K4lwmq1OhwOnU5Hz7bT6XROp9Nms1G17QoLC+12ezgcpmfbWSwWh8NhNBoDgQAl206j0Tidztzc3EAgEAwG1S4nIj8/3263y7IsiqIsy2qX08ZkMjkcDp4XAoFAOBxWu5w2LMs6nc78/PxkbDvVOidBEEwmM8/zHKdaQMbRaLRZWVmCIOj1erVrucRqtQqCwPM8wzBq1xJhNPJmc9u202g0atcSwXGc8oMyGAxq13KJxZIlCCaqtp3BYLBYLDzPa7VatWuJYFnWarXRtu3MZrPJ1LbtWJaW3Ut6vb79BYrX6XRq1xLBMIzN1rbtjEZjwleuWjDIshwMBpuamvx+v1o1xJFlORwOt7a2ut1uSt4rEUKU9911dXWUvFdq/0FJwWDQ7XZ7vV61a7kkFAp5vd6mpiZ6tp0kSaIoNjTU09PMybIcCoWUbUfPDyocDvt8voaGBnpKkqS2X/KGhgZ6mjll23k8npaWFnp+UOFwOBAI1NXV0VNSXzEMw3EcPe8ooyXR80ZJwbIsPc2lgsJtR+cPisKS8EveTUpJVP2SY9sBAACojK4QBgAAQDgBAACNEE4AAEAdhBMAAFAH4QQAANRBOAEAAHUQTgAAQB2EEwAAUIeCudFKS4jTQbIsBJcZAwCkhiyTllZSc4EcP0momZg4lnrh9JWJZPYMMmE8EXjVagAAgI8/Je9/SP7xDqFmAk9CiBozR02dTFbdToYOJoToKj7XfnFMU1XNNrup+rkAAGQyhpEEIWzPDw4eJI4dKev1pKmZrHuVvPpfalcWkfJwevA+smAeIwb5N7Yad3zA1jemugAAAIjFcb4ZU3zz54acdvLpYfLb50jlObVrSmU4Wczk3/4XGTPSsHuf6a+vso1NqRsaAAC60rrkptYlNxG3hzz2G/LJZ+oWk6pzEDQa8vgvyOgRwvrN5j+vZ6i5hxMAACh0R7/UnK4MTJtEZk0nhz4jF+tULCZV4fTjh8ik8aa1rwmvv5WiEQEAoIc052u0x0/5Z00lY0aSd94l6t1rMSXhNP+rZOVS4/b3Tes2pWI4AADoLe7CRbauUZw9jdisZPc+1cpI/ggc+eVPuVZv1uPPMJKU9OEAAKBvtKfPhh0FodnTySeHyYVaVWpI/gwRtywgOdn85i1MKJT0sQAAIBH4jVvaPixeqFYByQ+nubPZpmbjjl1JHwgAABJEU1Vt2HOATJtC8nJVKSDJ4VTkJEMG6fceTO4oAACQaPq9H7V9mDheldGTHE4jhhNCdEc+T+4oAACQaLqKo20fRpapMnqSw6l4QFt7eKYyuaMAAECiMa0+7kItKR6oyuhJDiebjRDCNWAyCACA9MM2NJFsmzpDJ3f1Oi2RJILz9AAA0hATDBGtVpWhcbNBAACgDsIJAACog3ACAADqIJwAAIA6GoZJ4i2d5OStGgAAMhc6JwAAoA7CCQAAqINwAgAA6iCcAACAOggnAACgjkbtAhJD1ulkoyFpa5dZtydZKwcAgA7SO5zEsmGBaZPEkcPD+XnJHUmWNafO6g99ZnjvQ66uPrljAQD0e+kaTuHcnJav3x6YcG2KxmOYUGlxqLS49daFwuY3hb9vTtG4AAD9UlqGU7BsaPOab0lZFlVGb100P1gyMOup5xjMtg4AkBzpd0JEqMjR9IP71UomhTh2VPOD31GxAACAzJZ+4eS5e6UsGNWugojXjm69daHaVQAAZKY0Cyf/9MnB8mFqVxHRuuQmyZqldhUAABkozcLJN3Oa2iXEYBj/jClqFwEAkIHSKZwkkylYPlTtKi4TGDNS7RIAADJQOoVTaKBT7RLihUoGqF0CAEAGSqdTyWWzSe0S4sk8L3McEw6rXYjKXC7XnDlzCCHbt28/deqU2uUAQCowDJOVlaXRaNxutyiKiV15OoUTSeZ9EXuvz1VNmTLFYrnimfGSJB07dozmV/x58+bdd993srNzCCG33HLT88//55Ytb6pdFAAkHcMwdrtdq9WGw+H+HU6JcHNuwd32AcUG4z530xNnT5zwedWuiHz3u99xuVxXf4wkhS9cuLBt2/a//OWvXq/6Ncf66lfnKslECLHZsq+//nqEE0A/4fP5xHYJX3M6HXPqI45h/n1w2RODyobzJiPLzbTmvD5q/LzsJE/KlyAsy9ntjjvuuONPf3p52jSaTlkEgP5KkqSadq2trQlfeX8JJ6tG+9eyaxbmFBBCjvla116oag4FtQz7zJARDxR10bXQg2GYoqIBDz304OTJk9Su5ZIPPtjl8URmbfd4PB98sEvtigAgRfx+fzKSqb/s1is18i8NG+3UGwgh7zRcfPD40aAsv1x97v+WjR6gN37HWTyMF75//GhAktSulAQC/qqq87J8qRKj0ZiXl6fV6qJL8vLyFi1atGfPXpVqjLd58+bz56uuv342IeTdd3fs27df7YoAIO1lfjhNybI9N3Qkz3KEkBfOn32q8qSyvDLgW1xx8KVho8eYLNfbctePGHvvl4drk7DntEfcbs/vfvf0wYMHYxeOHDnivvu+O2rUaKb95AuGYYYNGzZu3Li4h6lo3779yCQASKAM3613R6HzpeGjeZYLE/mHJ76IJpPCHQqtPHronYaLhJBy3vxfI8eXC9SdrU4Iqag48vjjT1ZVnYsuEQQhLy89jpYBAPRCxnZOHMP8wjX01jw7IcQrhb/15eF97qaODwvK8v3Hjjw8sPQb9oE5Wt36Edd+/9jRdxvr1Cj5ak6dOnX69Jmiosg1v1qtxuGwd/rIiRMnrFixory8nOd5pdOSpHBjY9OePbvXrfv71U9Jnzdv3m23LRk0qFSn07ffYVFubGzYtm37iy++9JWvTPne975nNEam3H3rrbeeeuq3yud33vn15cuXaTRaQkgoFFy3bv2f//wX5UvXXDPmRz/6UW5ubuyzJk6csHr16qFDh3QchbYTEQFALZkZTiZO8/ywkRPMVkLIBTFw9xefHfdd7ZDdk2dPnvH7/s01VM+wzw0d+cy5U89XnUlhvT0WDIbOn6+OW8jz/COPPDx79iwlJ6JYlsvJyVmwYOHMmbNee+21F154seMKeZ5fs+aBefO+GvtchmGys3OWLl1aUlKyfft2o9HI87zyJb3+0jEwnU7P83w0nJTIUXCcJu5ZS5fetnr1arPZ3HGUUaNG/epXv6b5ii4ASJkM3K1nZLn1I8YqyfSFt+XWioNXTybFhtrqe7887JfCDCFrilw/Lh6ckmK7y+VylZQUR//pdjefOXNZfPI8/5vf/PqGG26IS6ZYJpNpxYrl9957T8cvPfTQgzfe+LVOn8swzHXXjZ85c2afvwnC88KqVatikyl2lLKysu997/6+jwIAGSADw+lHxYOGGAVCyK7mhmVHDl0Mdvcchw+aGpYfPVTf/vj/UVg0NSs7yZV2V35+/oMPft/pLFL+GQ6Hdu58//PPP499zJo1D4wbdy3zr+kqRDFQUVGxdevWd95558SJ45IUmWBJp9MvXrx4wYL5sc9duvS2WbNmsu3njChCoWBlZeWJE8crKytDoSDLcpMnT4ru0+u1UaNG5eTkKPvxTpw4XltbGy1MyafRo0cvXry4j6MAQAbIwN16M6xtobLf03TPl4clWe7Rc4+2tiw98vGW0dcZWW66NfvD5oakldk5g8GwaNHN8+ffGF1SVOQsKXGZTJEzNUQx8NZbW5999v/EPmvy5ElTpkyOpkttbe1TT/12165L1xvde+89y5cvU3a4mc3m+fNvjJ3EYdasmQbDpeA5c+bM008/HT37buLECWvWrCkuLu77d5eXl+fxuP/4x5c3bHhVWbJo0aJvfONumy07+u0PH07L/boAQEUZGE52nYEQ8mFTQ0+TSXEu4D/max0tWJTrolLMbDbPnn19p1/y+32ffvrZ+vXrO560PXXqVKvVpnweCPg3btwYm0yEkD/84YUBA4pmzZqttFalpaWzZ8/aseM9Qsjs2bNKS0ujj/R43C+//HLsEPv27X/llVfuv//+TnfH9YgoBl55ZW00mZRrpOz2wuXLl3GcRmmeHA5HH0cBgAyQgeF0JbfkFs6wZufqdLELD3ncay9U1YgB9erqLoPBOHbsNRaLxWbL3rp1a+yXysvLWTayh7aq6vzGjZs6Pn3Pnr0TJ04SBEE5E33EiBFKOA0ePDh2f93hwxXbtm2Pe+6WLW/OnTt3/PjxffwWamtr33tvZ9zCjz766Gtf+1pOTnR2PlsfRwGADNBfwmmUYH580PCOyyeYrTOs2YsrDoZ71WYlnCSFAwFRjimGZRm93qB0PDqdvqys7Ic/fHjAgAEvvhg56W7cuHHZ2ZcOjzU1NU2fPr3jmgVBCAT8SjixLJeVFbnBfH5+fvQ8iFAo+M9//rPTwo4dO3bttWNjj0v1Qm3txcrKyriF1dU1Pp+XkJy+rBkAMkwGhpNEZJYwcVEzw9b22ifK0ict7uhCHcNeY7IM500D9cZT/ktX2NSJIhFI98+kSKD6+oaf//wXcVM/uFyu1avvmj59upIier1hyZJb6+rqNm/eTAjJycmJbX2ubdflQPn5+XGftO92C549Gx8eiurqalEUYw9N9YLU2QRRlZWVwWCoL6sFgMyTgeHUqZz2l/W6oHjH0U9ilz/mGhqQpNP+y679fLLy5D5309vtM0fQ4NSpUz/5yc8eeeThm25aqPQuZrN5wYL5Sjix7ZJdQ0tLqyRR0VwCQH+QgeHEkvYJ6C5fyFzhloCPnYrsxZpksT41uHyPu/EHxz8/6fOepOA+T3HWrVs/fvy46CQRhYUFU6dO/fDDD+MeFgj4w+GuZ7D1+/09Gt1kEliWyps9AkAShB0FvpnTgkNKiUFPNq8llefIvoNky1uk2Z2aAjIwnHpnrDkrV6u7MSf/B8c/V7uWzlVWVtbUXIiGk15vUM4vb2io9/l80VkYDhz46JFHftj91dbW1kY/1+m0AwcO6PRhdrtdd/m5JACQqVoXzW+9fdGlf2dZSFY5GVlOViwhv3+BvLUtBTVk4EW4Gcxg0Hdc+K8TCiJ6OiFsbW1tKBRUPtdotCNHjuz0YeXlZX08GwIA0kLL15ddlkyxjEby8APk1ptSUEZ/D6dig/E6i/U6i7XYYDSwrJHllH+ON2epXVq8G26YE3slrNRO6ahOn740lZHD4Zg7d27Hp7tcrjVrHrj99qVxt4Q/fvy4z+eL/nP48OGLFsX/Xi5atGjQILrmcwKAZPBPm+S9cU4XD/ruPaS8k5OfE6tf79Yr0OnfHjNROZBi1WitWg2Ryd/KrlG++rcLVb84fUzdCqNWrFi+YsVys9kSXdLQ0BCdwWjv3n3jxo1Tztkzm8133LHy2LFjcTOo3nnn1+fMmcOyrCzLLS2e6DQNO3a8d9ttS8aMiXzXJpPpnnu+IQj83/72irJk1aqVK1euiE5RAQAZzHvL/G49btmt5Ge/Smol/TqcZCJLRObiT5649NWUV0RycrKfeOJx+fKLrrRaTeydcJXp9Xbv3h29ZmjTpk3Tpk2dMGGCct7HoEGDf//7Z99++51t27bX19fPmDF94cIFgwYNjt6rsLm5+cCBj6Jre/PNf5SWDopOAJGVZf32t7999913SZLMcay+faYMj8fD80ZlHgcAyEjBYYNDzs7vxRNv6mRiNhOPJ1FDa7U6vd4Q+c9g0OsMGfha45XCPMvZtFecnDuqVhTnfrIvr/11/7Z8+4oCpyTLy458rHz1UEuKTkqJxbJcl/OryrL88ceHXnrpj7ELN2zYUFJSXFBQqPzTZste1q7j0z0eT9yNnbZsedPpdEYn31MCLPaSJo/H8/rrry9evJjnM/AXBgAUIVdPptAcXEoOfXr1hxQWOkdfM5FlWJZV/scqn0U/ZxhWo+n8VSUDX2tO+rwjBfPi3EKWMJ5w5OrOCRarVaNlGHJ/UYmypCEYfPVi9bmA/1zATwiZlGULSFKYyKpkUveJYmDnzvefeOLJuPvy7dmz9+c//+VDDz3ocrmudN58++VKLRs2bFAukIr1hz+84Ha7V61aGZ2DNe4pVVXnE/p9AAB1JL4nV9mbhC4fojfweXmFPS3D5/OKAX8GhtOfas79+6CyLI32zsKi6MIcrdas0Zg47j5nSXThuYD//aZ6lcrsmUDA39zsrqg4vHHj5kOHDnX6mEOHDt1zz73f/OY35s69wWq1xUWU3+87fLhi7dq1HeeNVaxbt/711//75ptvmjFjem5uriAIdXV1x44d37RpU0XFkXnz5iXnOwMAWrAtXd/67hJ31/v0An5v9fmzoXA4HAqFwsFw5LNg+4dg+8JwOBRsWxQUAwF/IOAP/mtqngwMpzfqLmgY5o4C51Be0DKR0xF9kmSSiTfm7kGNoWDsxBAfeZprxMBed2PqC165clWiVuX1ep955tlnnnl23LhxI0aUl5SUtN+Z0P3pp5/u27e/y5uge73edevWr1u3vuOXNBoumnayLMde5/tiu05XePDgwZtvvqXLshP4EwCAXtOcON2DRx873uVDamqqamqqellM755Guc0XazZfrOnRUw64m2Yc2pO0ilLtYLuePmv06FE1NRdiL8uNcrlc0Vuzh8OhhgYVUhwAkkp74pTm1NmQa2DXD93xPvH6klpMZoYT9IjL5Vq+/PbrrpuQl5d38ODBH//4f8b1WC6Xa+LEidGLcH0+34kTXb9pAoC0I2ze0vzgd7p+3NpXk11Jf78IF3ie/+lPf7JgwcKCggKWZcePH//8889FL+PleX7p0tueeOJ/x166e/LkSeVeUACQYfT7PxY2vtHFg558hpzsyQ7AXkmnzolJchfZC4woMqH0vt2D1+t9440tTqdTuc6JYZghQ4Y+9tijjz76M1EM6HT6uBMrPB73pk3xJ/sBQMYQXn2ddXtaVi6RO06neeEi+Y8Xya7dKSgjncKJo+9sZs056krqhc2bN2u1mtWr746dgYJhGH2HG9U3NjY8//x/drxVLgBkEuPbO/S79/tnTvXeNE8SeFJZRc5Vkf0HyZatJFX3ZU2rcKpv1JypDBV3Pm22KrSfHVG7hMTYsOHVo0eP3nXXXWPHXtPpHQVbWlr279+/fv36iooM+ZYB4CpYTwv/xlZxVLk40Enu+nbqC0incCKEGN7f3fL129Wu4hLDrn1ql5AwFRVHHnroBzzPT5w4YcyYMRZLpItyu9379x/YvTsVjTwAgCLNwon/xzbfnJlhR4HahbQxbtupoW9PYx95vd733tv53ns71S4EAPq19Dtbz/zntWqX0EZz9pzpL39XuwoAgMyUfuGk+/SI5T/+qG4N3PmarKefZ4JBdcsAAMhUabZbT2H4YA/b0NRy57LQAGfqR9fvOWB++RXW05L6oQEA+om0DKe2/qni8+yHH/XdMNM/bVJwaCpu0soEg7qDnxl37tJ9UpGC4QAA+rN0DSeFcdtO47adsmAMFRbKXd0GqfdkmXV7NJXnkrV+AAC4XHqHk4Jp9WlPnFK7CgAASJj0OyECAAAyHsIJAACog3ACAADqIJwAAIA6CCcAAKAOwgkAAKiDcAIAAOognAAAoJc4jtNoNHH3y04IhBMAAPQGy7Iul6usrMxsNid+5QlfIwAA9AcMwxgMBlmWtVptwleeCdMXAQBA6kmSdObMGZ1OV19fn/CVI5wAAKA3ZFn2eDxJWjl26wEAAHUQTgAAQB2EEwAAUAfhBAAA1EE4AQAAdRBOAABAHYQTAABQB+EEAADUQTgBAAB1EE4AAEAdhBMAAFAH4QQAANRBOAEAAHUQTgAAQB2EEwAAUAfhBAAA1EE4AQAAdRBOAABAnSSHkygSlpU1uBk8AED6kXXatpdxNSQ5nOobCCFSbk5yRwEAgCSQcmzKy3jqJTecmDOVhJBQyYCkjgIAAAknmU3hvFxy+qwqoye5c6r4nBAijipP7igAAJBo4qgRbR8OH1Fl9CSHU80FcvQL/8RxhGGSOxAAACRUYMr4tg97D6gyetLP1mPe2SGbBN+865M9EAAAJEqotDgwfix5dydpalalgOSfSv7GW+R8deui+ZLAJ30sAABIhNZbF7Z92PjfahWQiuucmD+9IlnMLXetTMFYAADQR96vzQmMu4ZsfoN88U+1auCYFBwNOnWG5GSH5swkHKc78kXShwMAgN4KTBzn+dZd5NgJ8uiviSyrVUZKwokQZu8BUjYsOGeGrNfrDh9NwYgAANBT/hlT3PffQxoayc9+SRqbVKwkReHUlk87PyCDSoNzZgQHl2pOV7JuT2rGBQCALsk6Xcuq21qX30rO15Cf/pKcPK1uPUzKwkkhf/NOsmwJIcT49g7jjl2a9qt0AQBALVJWln/mV7w3zpGyLOTDPeR3z6nbMylSHU5tRo+UVy4l48cSQjRnKrVfHNdUnWfdbhIKp7oSAID+iWUkwRQuzA8NKRXLh7UtOXuOrHuNvL1d7coi1AgnxchyedY0MmEccdjVKQAAANwecvAT8v6H5IP/p3Ypl1EvnKJysonTTiwWwnEqVwJUktU7XwggY8kyaW0lNbWk6rzapXSOgnACuCqEE0A/hJsNAgAAdRBOAABAHYQTAABQB+EEAADUQTgBAAB1EE4AAEAdhBMAAFAH4QQAANRBOAEAAHUQTgAAQB2EEwAAUCd1NxuMY7VaCwsLOY4TRZGSydP0er3dbrdYLIFAIBym5f4dBW0Kg8GgKIpq1xJhsVgKCwt1Op0oipIkqV1OG61Wa7fbrVabKAZCoZDa5UTk5+cXFBSEw2F6tp3JZCosLNTr9fRsO47jHA5Hdna2KIr0bLvc3NyCggJZloPBICUvUIIgFBbaed4oiiIlL1AMwzgcjtzcXFEUg8FgYleuWudkMpmysrIEQdBoNGrVEEer1dpsNpPJrNfr1a7lkuzsbIvFwvM8PVP0CoJgtVoFwUTPttNoNNnZ2Waz2WAwqF3LJVar1WKxCIJAz7bjed5qbfsl12q1atcSwXFc+7azGI1GtWu5xGKxKC9QLEvL7iW9Xm+zWU0ms06nU7uWCJZlk7ftVOucCCHhcNjtdvv9fkremCgTYHu9XrfbTcmbSkUwGGxoaKDnTSXDMKFQyO12+3w+erYdIcTn8zU1NVG27UINDfX0bDtCiCSFPR6P1+ulZ9vJshwI+BsbG6nadqFQqLGxkZ6ut33bSa2tLS0tLfRsO4ZhAoFAQ0NDwredarfMYNtJ7VQpoCOGYbj2e0pR9VLCcRzLsglvmfsixduuO3+HNG+7UChEz0sJhX93yg9KecejdiGXsCzLcRxV2075JZdlmZJ9eorkvUDhfk5AO3peHQAgeeLCiJZjBgAA0J/FvQ1FOAEAgAquvt+OlhNRAACgX5HbRXum2P/jmBOkARxzAsgMPYobdE4AAJAK8r902i2hc4I0g84JIE31JV/QOQEAQLJ02SFdCTonoB06J4B0kcBAQecEAACJIV8OnRNkMnROANRKXoKgcwIAgF7qe4d0JeicgHbonADokbLIQOcEAADdFXc86eqzPPQFOiegHTonABWpdlslVUYFAIB0kfDjSd2Bzgloh84JIJVUDIXYodW8TTsAAFCOYZjY+e5kWY77f/LGRTgB1dA5ASQVJa1SHBxzAgDo15J3rVJ3hr7S/9E5Ae3QOQEknFqv/N0fF8ecAADgaseTkn1sqeO46JwgDaBzAug7Og8sXQWOOQEAZLjoGXepv1ZJ+QSzkkMGQucE0Atp1yrFwTEnAIB+JJXXKnVz3E5rQOcEtEPnBNAd6d4qxcExJwCATKDWtUrdGb0X0DkB7dA5AVwJ/Zcr9Ro6JwCAdCVfLmWdUwrGRecEtEPnBBCVwa1SHHROAABpQImH5N15lsJx0TkB1dA5QX/Wf1qlOLjOCQAgzVxlPjq15sFL+LjonIB26Jygv1HlZZm2LMAxJwAAiihdSOqP8cSeg5ficTuFzgloh84JMl6/PbB0FeicAABUpsq1SiqO2x3onIB26Jwg86BV6hI6JwCAVLt6d5K8N2RqjdsL6JyAdlT9wQD0Gs7B6xF0TgAAqaDKPHhyB7QdW7oSdE5AO6r+YAC6D61SX6BzAgBIii6vGUrGG6/uXKuUFm/40DkB7dLiDwlAgW4pUVSbW89gMJhMJpZlw+EwJa8+Go3GZDLp9fpwOCxJktrlRJjahdupXUuEXq83m80cx9Gz7TiOM5vNBoOBqm0nCILJZJJlmZ6SdDqdyWTSaDSSJFGy7ViWNZvNRqORqm3H87zJZCKE9P3vLlFz0Gm1WrPZrNVqr/J3l+I59xiGMZvNgiAkY9upFk55eXl2u51hGJ/PR8nLrtFoHDhwoCAIPp9PFEW1y4kYOHBgbm5eIOD3+/1q1xKRk5Njt9s5jqNn2+n1+oEDB5rNZr/fHwgE1C4noqhoQH5+fjAY9Pl8lCSB1Wp1Op1ardbn84VCIbXLIcqbwuLikqysLJ/PR8+2czgc+fn54XC4y23HdCXa2cT+vxcsFktRUZHBYFC2XffH6uO4V8GyrMvlys7O9vl8CX+B+v8BAAD//0jNmAsqrBHTAAAAAElFTkSuQmCC" width="564" height="247"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>In the "Start" node, you can set the initial greeting of the assistant, for example: "Hello! I'm your stock research assistant."</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/7-8c06d0418767260518bee4782201ebcd.png" width="863" height="918"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="22-build-the-function-of-extract-stock-codes" class="anchor anchorTargetStickyNavbar_Vzrq">2.2 Build the function of "Extract Stock Codes"<a href="https://ragflow.io/en/blog/ragflow-in-practice-building-an-agent-for-deep-dive-analysis-of-company-research-reports#22-build-the-function-of-extract-stock-codes" class="hash-link" aria-label="Direct link to 2.2 Build the function of &quot;Extract Stock Codes&quot;" title="Direct link to 2.2 Build the function of &quot;Extract Stock Codes&quot;" translate="no"></a></h2>
<h3 id="221-agent-extracts-stock-codes" class="anchor anchorTargetStickyNavbar_Vzrq">2.2.1 Agent extracts stock codes<a href="https://ragflow.io/en/blog/ragflow-in-practice-building-an-agent-for-deep-dive-analysis-of-company-research-reports#221-agent-extracts-stock-codes" class="hash-link" aria-label="Direct link to 2.2.1 Agent extracts stock codes" title="Direct link to 2.2.1 Agent extracts stock codes" translate="no"></a></h3>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/8-64888d31cfd058320f1201c465781704.png" width="542" height="384"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Use an Agent node and attach a TavilySearch tool to identify stock names or abbreviations from the user's natural language input and return a unique standard stock code. When no match is found, uniformly output "Not Found."</p>
<p>In financial scenarios, users' natural language is often ambiguous. For example:</p>
<ul>
<li class="">"Help me check the research report on Apple Inc."</li>
<li class="">"How is NVIDIA's financial performance?"</li>
<li class="">"What's the situation with the Shanghai Composite Index today?"</li>
</ul>
<p>These requests all contain stock-related information, but the system can only further query financial reports, research reports, or market data after accurately identifying the stock code.</p>
<p>This is why we need an Agent with the function of "extracting stock codes."</p>
<p>Below is the system prompt for this Agent:</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;role&gt; </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Your responsibility is: to identify and extract the stock name or abbreviation from the user's natural language query and return the corresponding unique stock code. </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/role&gt; </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;rules&gt; </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">1. Only one result is allowed: - If a stock is identified → return the corresponding stock code only; - If no stock is identified → return “Not Found” only. </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">2. **Do not** output any extra words, punctuation, explanations, prefixes, suffixes, or newline prompts. 3. The output must strictly follow the &lt;response_format&gt;. &lt;/rules&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;response_format&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Output only the stock code (e.g., AAPL or 600519)</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Or output “Not Found”</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/response_format&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;response_examples&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">User input: “Please check the research report for Apple Inc.” → Output: AAPL</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">User input: “How is the financial performance of Moutai?” → Output: 600519</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">User input: “How is the Shanghai Composite Index performing today?” → Output: Not Found</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/response_examples&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;tools&gt; - Tavily Search: You may use this tool to query when you're uncertain about the stock code. - If you're confident, there's no need to use the tool. </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/tools&gt; </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;Strict Output Requirements&gt; - Only output the result, no explanations, prompts, or instructions allowed. - The output can only be the stock code or “Not Found,” otherwise, it will be considered an incorrect answer.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain"> &lt;/Strict Output Requirements&gt;</span><br></span></code></pre></div></div>
<h3 id="222-conditional-node-for-identifying-stock-codes" class="anchor anchorTargetStickyNavbar_Vzrq">2.2.2 Conditional node for identifying stock codes<a href="https://ragflow.io/en/blog/ragflow-in-practice-building-an-agent-for-deep-dive-analysis-of-company-research-reports#222-conditional-node-for-identifying-stock-codes" class="hash-link" aria-label="Direct link to 2.2.2 Conditional node for identifying stock codes" title="Direct link to 2.2.2 Conditional node for identifying stock codes" translate="no"></a></h3>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/9-e0bc797eb6cfb8f899ae52efe9837db5.png" width="1193" height="961"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Use a conditional node to evaluate the output result of the previous Agent node and guide the process flow based on different outcomes:</p>
<ul>
<li class="">If the output is a stock code: It indicates successful identification of the stock, and the process will proceed to the "Case1" branch.</li>
<li class="">If the output contains "Not Found": It indicates that no valid stock name was identified from the user's input, and the process will proceed to the "Else" branch, where it will execute a node for replying with an irrelevant message, outputting "Your query is not supported."</li>
</ul>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/10-7271361e67f08dbdccedb7aa378faf3d.png" width="1054" height="709"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="23-build-the-company-financial-statements-feature" class="anchor anchorTargetStickyNavbar_Vzrq">2.3 Build the "Company Financial Statements" feature<a href="https://ragflow.io/en/blog/ragflow-in-practice-building-an-agent-for-deep-dive-analysis-of-company-research-reports#23-build-the-company-financial-statements-feature" class="hash-link" aria-label="Direct link to 2.3 Build the &quot;Company Financial Statements&quot; feature" title="Direct link to 2.3 Build the &quot;Company Financial Statements&quot; feature" translate="no"></a></h2>
<p>The data for this feature is sourced from financial data provided by Yahoo Finance. By calling this API, we obtain core financial data for specified stocks, including operating revenue, net profit, etc., which drives the generation of the "Company Financial Statements."</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/11-886a78e3659b708e38fa8385fc24f7c9.png" width="870" height="177"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="231-yahoo-finance-tools-request-for-financial-data" class="anchor anchorTargetStickyNavbar_Vzrq">2.3.1 Yahoo Finance Tools: Request for Financial Data<a href="https://ragflow.io/en/blog/ragflow-in-practice-building-an-agent-for-deep-dive-analysis-of-company-research-reports#231-yahoo-finance-tools-request-for-financial-data" class="hash-link" aria-label="Direct link to 2.3.1 Yahoo Finance Tools: Request for Financial Data" title="Direct link to 2.3.1 Yahoo Finance Tools: Request for Financial Data" translate="no"></a></h3>
<p>By using the "Yahoo Finance Tools" node, select "Balance sheet" and pass the <code>stockCode</code> output by the upstream Agent as a parameter. This allows you to fetch the core financial indicators of the corresponding company.</p>
<p>The returned results contain key data such as total assets, total equity, and tangible book value, which are used to generate the "Company Financial Statements" feature.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/12-ee8d2ac2665957f2ffd58a014e0a7709.png" width="621" height="1181"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="232-financial-table-generation-by-code-node" class="anchor anchorTargetStickyNavbar_Vzrq">2.3.2 Financial table generation by Code node<a href="https://ragflow.io/en/blog/ragflow-in-practice-building-an-agent-for-deep-dive-analysis-of-company-research-reports#232-financial-table-generation-by-code-node" class="hash-link" aria-label="Direct link to 2.3.2 Financial table generation by Code node" title="Direct link to 2.3.2 Financial table generation by Code node" translate="no"></a></h3>
<p>Utilize the Code node to perform field mapping and numerical formatting on the financial data returned by Yahoo Finance Tools through Python scripts, ultimately generating a Markdown table with bilingual indicator comparisons, enabling a clear and intuitive display of the "Company Financial Statements."</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/13-79e4d6014799095baff30ade69ef9090.png" width="1280" height="1046"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Code:</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">import re</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">def format_number(value: str) -&gt; str:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    """Convert scientific notation or floating-point numbers to comma-separated numbers"""</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    try:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        num = float(value)</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        if num.is_integer():</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            return f"{int(num):,}"  # If it's an integer, format without decimal places</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        else:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            return f"{num:,.2f}"  # Otherwise, keep two decimal places and add commas</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    except:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        return value  # Return the original value if it's not a number (e.g., — or empty)</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">def extract_md_table_single_column(input_text: str) -&gt; str:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    # Use English indicators directly</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    indicators = [</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "Total Assets", "Total Equity", "Tangible Book Value", "Total Debt", </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "Net Debt", "Cash And Cash Equivalents", "Working Capital", </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "Long Term Debt", "Common Stock Equity", "Ordinary Shares Number"</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    ]</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    # Core indicators and their corresponding units</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    unit_map = {</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "Total Assets": "USD",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "Total Equity": "USD",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "Tangible Book Value": "USD",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "Total Debt": "USD",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "Net Debt": "USD",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "Cash And Cash Equivalents": "USD",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "Working Capital": "USD",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "Long Term Debt": "USD",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "Common Stock Equity": "USD",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "Ordinary Shares Number": "Shares"</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    lines = input_text.splitlines()</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    # Automatically detect the date column, keeping only the first one</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    date_pattern = r"\d{4}-\d{2}-\d{2}"</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    header_line = ""</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    for line in lines:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        if re.search(date_pattern, line):</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            header_line = line</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            break</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    if not header_line:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        raise ValueError("Date column header row not found")</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    dates = re.findall(date_pattern, header_line)</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    first_date = dates[0]  # Keep only the first date</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    header = f"| Indicator | {first_date} |"</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    divider = "|------------------------|------------|"</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    rows = []</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    for ind in indicators:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        unit = unit_map.get(ind, "")</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        display_ind = f"{ind} ({unit})" if unit else ind</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        found = False</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        for line in lines:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            if ind in line:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">                # Match numbers and possible units</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">                pattern = r"(nan|[0-9\.]+(?:[eE][+-]?\d+)?)"</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">                values = re.findall(pattern, line)</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">                # Replace 'nan' with '—' and format the number</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">                first_value = values[0].strip() if values and values[0].strip().lower() != "nan" else "—"</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">                first_value = format_number(first_value) if first_value != "—" else "—"</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">                rows.append(f"| {display_ind} | {first_value} |")</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">                found = True</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">                break</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        if not found:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            rows.append(f"| {display_ind} | — |")</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    md_table = "\n".join([header, divider] + rows)</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    return md_table</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">def main(input_text: str):</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    return extract_md_table_single_column(input_text)</span><br></span></code></pre></div></div>
<p>We have also received requests from everyone expressing a preference not to extract JSON fields through coding, and we will gradually provide solutions in future versions.</p>
<h2 id="24-build-the-research-report-information-extraction-function" class="anchor anchorTargetStickyNavbar_Vzrq">2.4 Build the "Research Report Information Extraction" function<a href="https://ragflow.io/en/blog/ragflow-in-practice-building-an-agent-for-deep-dive-analysis-of-company-research-reports#24-build-the-research-report-information-extraction-function" class="hash-link" aria-label="Direct link to 2.4 Build the &quot;Research Report Information Extraction&quot; function" title="Direct link to 2.4 Build the &quot;Research Report Information Extraction&quot; function" translate="no"></a></h2>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/14-acde9b6b460ee1d1b9b5e6b02c56bf24.png" width="1280" height="865"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Utilize an information extraction agent, which, based on the <code>stockCode</code>, calls the AlphaVantage API to extract the latest authoritative research reports and insights. Meanwhile, it invokes the internal research report retrieval agent to obtain the full text of the complete research reports. Finally, it outputs the two parts of content separately in a fixed structure, thereby achieving an efficient information extraction function.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/15-09bd312ad6f628844f9772cfafb58194.png" width="874" height="1735"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>System prompt:</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;role&gt; </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">You are the information extraction agent. You understand the user’s query and delegate tasks to alphavantage and the internal research report retrieval agent. </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/role&gt; </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;requirements&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain"> 1. Based on the stock code output by the "Extract Stock Code" agent, call alphavantage's EARNINGS_CALL_TRANSCRIPT to retrieve the latest information that can be used in a research report, and store all publicly available key details.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">2. Call the "Internal Research Report Retrieval Agent" and save the full text of the research report output. </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">3. Output the content retrieved from alphavantage and the Internal Research Report Retrieval Agent in full. </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/requirements&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;report_structure_requirements&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">The output must be divided into two sections:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">#1. Title: “alphavantage”</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Directly output the content collected from alphavantage without any additional processing.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">#2. Title: "Internal Research Report Retrieval Agent"</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Directly output the content provided by the Internal Research Report Retrieval Agent.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/report_structure_requirements&gt;</span><br></span></code></pre></div></div>
<h3 id="241-configure-the-mcp-tool" class="anchor anchorTargetStickyNavbar_Vzrq">2.4.1 Configure the MCP tool<a href="https://ragflow.io/en/blog/ragflow-in-practice-building-an-agent-for-deep-dive-analysis-of-company-research-reports#241-configure-the-mcp-tool" class="hash-link" aria-label="Direct link to 2.4.1 Configure the MCP tool" title="Direct link to 2.4.1 Configure the MCP tool" translate="no"></a></h3>
<p>Add the MCP tool:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/16-4f7b9ee25f8b6ec8d2652ac83468424a.png" width="1280" height="634"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Add the MCP tool under the agent and select the required method, such as "EARNINGS_CALL_TRANSCRIPT".</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/17-caf7fe68925bf286d5c6bf3a30a8b6b1.png" width="1280" height="745"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="242-internal-research-report-retrieval-agent" class="anchor anchorTargetStickyNavbar_Vzrq">2.4.2 Internal Research Report Retrieval Agent<a href="https://ragflow.io/en/blog/ragflow-in-practice-building-an-agent-for-deep-dive-analysis-of-company-research-reports#242-internal-research-report-retrieval-agent" class="hash-link" aria-label="Direct link to 2.4.2 Internal Research Report Retrieval Agent" title="Direct link to 2.4.2 Internal Research Report Retrieval Agent" translate="no"></a></h3>
<p>The key focus in constructing the internal research report retrieval agent lies in accurately identifying the company or stock code in user queries. It then invokes the Retrieval tool to search for research reports from the dataset and outputs the full text, ensuring that information such as data, viewpoints, conclusions, tables, and risk warnings is not omitted. This enables high-fidelity extraction of research report content.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/18-5bf97b2b7fbc5579b067a05c97cbd51b.png" width="853" height="2084"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>System Prompt:</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;Task Objective&gt; </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Read user input → Identify the involved company/stock (supports abbreviations, full names, codes, and aliases) → Retrieve the most relevant research reports from the dataset → Output the full text of the research report, retaining the original format, data, chart descriptions, and risk warnings. </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/Task Objective&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;Execution Rules&gt; </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">1. Exact Match: Prioritize exact matches of company full names and stock codes. </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">2. Content Fidelity: Fully retain the research report text stored in the dataset without deletion, modification, or omission of paragraphs. </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">3. Original Data: Retain table data, dates, units, etc., in their original form. </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">4. Complete Viewpoints: Include investment logic, financial analysis, industry comparisons, earnings forecasts, valuation methods, risk warnings, etc. </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">5. Merging Multiple Reports: If there are multiple relevant research reports, output them in reverse chronological order. </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">6. No Results Feedback: If no matching reports are found, output “No related research reports available in the dataset.”</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain"> &lt;/Execution Rules&gt;</span><br></span></code></pre></div></div>
<h2 id="25-add-a-research-report-generation-agent" class="anchor anchorTargetStickyNavbar_Vzrq">2.5 Add a Research Report Generation Agent<a href="https://ragflow.io/en/blog/ragflow-in-practice-building-an-agent-for-deep-dive-analysis-of-company-research-reports#25-add-a-research-report-generation-agent" class="hash-link" aria-label="Direct link to 2.5 Add a Research Report Generation Agent" title="Direct link to 2.5 Add a Research Report Generation Agent" translate="no"></a></h2>
<p>The research report generation agent automatically extracts and structurally organizes financial and economic information, generating foundational data and content for investment bank analysts that are professional, retain differentiation, and can be directly used in investment research reports.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/19-deae2c9649695b909c1b44ec94170ba0.png" width="846" height="2047"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;role&gt; </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">You are a senior investment banking (IB) analyst with years of experience in capital market research. You excel at writing investment research reports covering publicly listed companies, industries, and macroeconomics. You possess strong financial analysis skills and industry insights, combining quantitative and qualitative analysis to provide high-value references for investment decisions. </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**You are able to retain and present differentiated viewpoints from various reports and sources in your research, and when discrepancies arise, you do not merge them into a single conclusion. Instead, you compare and analyze the differences.** </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/role&gt; </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;input&gt; </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">You will receive financial information extracted by the information extraction agent.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain"> &lt;/input&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;core_task&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Based on the content returned by the information extraction agent (no fabrication of data), write a professional, complete, and structured investment research report. The report must be logically rigorous, clearly organized, and use professional language, suitable for reference by fund managers, institutional investors, and other professional readers.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">When there are differences in analysis or forecasts between different reports or institutions, you must list and identify the sources in the report. You should not select only one viewpoint. You need to point out the differences, their possible causes, and their impact on investment judgments.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/core_task&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;report_structure_requirements&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">##1. Summary</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Provide a concise overview of the company’s core business, recent performance, industry positioning, and major investment highlights.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Summarize key conclusions in 3-5 sentences.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Highlight any discrepancies in core conclusions and briefly describe the differing viewpoints and areas of disagreement.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">##2. Company Overview</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Describe the company's main business, core products/services, market share, competitive advantages, and business model.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Highlight any differences in the description of the company’s market position or competitive advantages from different sources. Present and compare these differences.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">##3. Recent Financial Performance</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Summarize key metrics from the latest financial report (e.g., revenue, net profit, gross margin, EPS).</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Highlight the drivers behind the trends and compare the differential analyses from different reports. Present this comparison in a table.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">##4. Industry Trends &amp; Opportunities</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Overview of industry development trends, market size, and major drivers.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">If different sources provide differing forecasts for industry growth rates, technological trends, or competitive landscape, list these and provide background information. Present this comparison in a table.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">##5. Investment Recommendation</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Provide a clear investment recommendation based on the analysis above (e.g., "Buy/Hold/Neutral/Sell"), presented in a table.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Include investment ratings or recommendations from all sources, with the source and date clearly noted.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">If you provide a combined recommendation based on different viewpoints, clearly explain the reasoning behind this integration.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">##6. Appendix &amp; References</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">List the data sources, analysis methods, important formulas, or chart descriptions used.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">All references must come from the information extraction agent and the company financial data table provided, or publicly noted sources.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">For differentiated viewpoints, provide full citation information (author, institution, date) and present this in a table.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/report_structure_requirements&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;output_requirements&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Language Style: Financial, professional, precise, and analytical.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Viewpoint Retention: When there are multiple viewpoints and conclusions, all must be retained and compared. You cannot choose only one.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Citations: When specific data or viewpoints are referenced, include the source in parentheses (e.g., Source: Morgan Stanley Research, 2024-05-07).</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Facts: All data and conclusions must come from the information extraction agent or their noted legitimate sources. No fabrication is allowed.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Readability: Use short paragraphs and bullet points to make it easy for professional readers to grasp key information and see the differences in viewpoints.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/output_requirements&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;output_goal&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Generate a complete investment research report that meets investment banking industry standards, which can be directly used for institutional investment internal reference, while faithfully retaining differentiated viewpoints from various reports and providing the corresponding analysis.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/output_goal&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;heading_format_requirements&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">All section headings in the investment research report must be formatted as N. Section Title (e.g., 1. Summary, 2. Company Overview), where:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">The heading number is followed by a period and the section title.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">The entire heading (number, period, and title) is rendered in bold text (e.g., using &lt;b&gt; in HTML or equivalent bold formatting, without relying on Markdown ** syntax).</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Do not use ##, **, or any other prefix before the heading number.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Apply this format consistently to all section headings (Summary, Company Overview, Recent Financial Performance, Industry Trends &amp; Opportunities, Investment Recommendation, Appendix &amp; References).</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/heading_format_requirements&gt;</span><br></span></code></pre></div></div>
<h2 id="26-add-a-reply-message-node" class="anchor anchorTargetStickyNavbar_Vzrq">2.6 Add a Reply Message Node<a href="https://ragflow.io/en/blog/ragflow-in-practice-building-an-agent-for-deep-dive-analysis-of-company-research-reports#26-add-a-reply-message-node" class="hash-link" aria-label="Direct link to 2.6 Add a Reply Message Node" title="Direct link to 2.6 Add a Reply Message Node" translate="no"></a></h2>
<p>The reply message node is used to output the "financial statements" and "research report content" that are the final outputs of the workflow.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/20-c269494ae4d1de4b47dbf9c71a64b13a.png" width="600" height="719"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="27-save-and-test" class="anchor anchorTargetStickyNavbar_Vzrq">2.7 Save and Test<a href="https://ragflow.io/en/blog/ragflow-in-practice-building-an-agent-for-deep-dive-analysis-of-company-research-reports#27-save-and-test" class="hash-link" aria-label="Direct link to 2.7 Save and Test" title="Direct link to 2.7 Save and Test" translate="no"></a></h2>
<p>Click "Save" - "Run" - and view the execution results.
The entire process takes approximately 5 minutes to run.
Execution Results:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/21-5170652e0c94f1fbc5a2b037d1c00b2f.png" width="1900" height="5485"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Log:
The entire process took approximately 5 minutes to run.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/22-d6f0022f0f5ce6820ff324b81700e7c3.png" width="784" height="1952"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h1>Summary and Outlook</h1>
<p>This case study has constructed a complete workflow for stock research reports using RAGFlow, encompassing three core steps:</p>
<ol>
<li class="">Utilizing an Agent node to extract stock codes from user inputs.</li>
<li class="">Acquiring and formatting company financial data through Yahoo Finance tools and Code nodes to generate clear financial statements.</li>
<li class="">Invoking information extraction agents and an internal research report retrieval agent, and using a research report generation agent to output the latest research report insights and the full text of complete research reports, respectively.</li>
</ol>
<p>The entire process achieves automated handling from stock code identification to the integration of financial and research report information.</p>
<p>We observe several directions for sustainable development: More data sources can be incorporated to make analytical results more comprehensive, while providing a code-free method for data processing to lower the barrier to entry. The system also has the potential to analyze multiple companies within the same industry, track industry trends, and even cover a wider range of investment instruments such as futures and funds, thereby assisting analysts in forming superior investment portfolios. As these features are gradually implemented, the intelligent investment research assistant will not only help analysts make quicker judgments but also establish an efficient and reusable research methodology, enabling the team to consistently produce high-quality analytical outputs.</p>]]></content:encoded>
            <category>Tutorials</category>
        </item>
        <item>
            <title><![CDATA[RAGFlow Named Among GitHub’s Fastest-Growing Open Source Projects, Reflecting Surging Demand for Production-Ready AI]]></title>
            <link>https://ragflow.io/en/blog/ragflow-named-among-github-fastest-growing-open-source-projects</link>
            <guid>https://ragflow.io/en/blog/ragflow-named-among-github-fastest-growing-open-source-projects</guid>
            <pubDate>Tue, 28 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[The release of GitHub’s 2025 Octoverse report marks a pivotal moment for the open source ecosystem—and for projects like RAGFlow, which has emerged as one of the fastest-growing open source projects by contributors this year. With a remarkable 2,596% year-over-year growth in contributor engagement, RAGFlow isn’t just gaining traction—it’s defining the next wave of AI-powered development.]]></description>
            <content:encoded><![CDATA[<p>The release of GitHub’s 2025 Octoverse report marks a pivotal moment for the open source ecosystem—and for projects like <strong>RAGFlow</strong>, which has emerged as one of the <strong>fastest-growing open source projects by contributors</strong> this year. With a remarkable <strong>2,596% year-over-year growth</strong> in contributor engagement, RAGFlow isn’t just gaining traction—it’s defining the next wave of AI-powered development.</p>
<h3 id="the-rise-of-retrieval-augmented-generation-in-production" class="anchor anchorTargetStickyNavbar_Vzrq">The Rise of Retrieval-Augmented Generation in Production<a href="https://ragflow.io/en/blog/ragflow-named-among-github-fastest-growing-open-source-projects#the-rise-of-retrieval-augmented-generation-in-production" class="hash-link" aria-label="Direct link to The Rise of Retrieval-Augmented Generation in Production" title="Direct link to The Rise of Retrieval-Augmented Generation in Production" translate="no"></a></h3>
<p>As the Octoverse report highlights, AI is no longer experimental—it’s foundational. More than <strong>4.3 million AI-related repositories</strong> now exist on GitHub, and over <strong>1.1 million public repos import LLM SDKs</strong>, a 178% YoY increase. In this context, RAGFlow’s rapid adoption signals a clear shift: developers are moving beyond prototyping and into <strong>production-grade AI workflows</strong>.</p>
<p>RAGFlow—an end-to-end retrieval-augmented generation engine with built-in agent capabilities—is perfectly positioned to meet this demand. It enables developers to build scalable, context-aware AI applications that are both powerful and practical. As the report notes, <em>“AI infrastructure is emerging as a major magnet”</em> for open source contributions, and RAGFlow sits squarely at the intersection of AI infrastructure and real-world usability.</p>
<h3 id="why-ragflow-resonates-in-the-ai-era" class="anchor anchorTargetStickyNavbar_Vzrq">Why RAGFlow Resonates in the AI Era<a href="https://ragflow.io/en/blog/ragflow-named-among-github-fastest-growing-open-source-projects#why-ragflow-resonates-in-the-ai-era" class="hash-link" aria-label="Direct link to Why RAGFlow Resonates in the AI Era" title="Direct link to Why RAGFlow Resonates in the AI Era" translate="no"></a></h3>
<p>Several trends highlighted in the Octoverse report align closely with RAGFlow’s design and mission:</p>
<ul>
<li class=""><strong>From Notebooks to Production</strong>: The report notes a shift from Jupyter Notebooks (+75% YoY) to Python codebases, signaling that AI projects are maturing. RAGFlow supports this transition by offering a structured, reproducible framework for deploying RAG systems in production.</li>
<li class=""><strong>Agentic Workflows Are Going Mainstream</strong>: With the launch of GitHub Copilot coding agent and the rise of AI-assisted development, developers are increasingly relying on tools that automate complex tasks. RAGFlow’s built-in agent capabilities allow teams to automate retrieval, reasoning, and response generation—key components of modern AI apps.</li>
<li class=""><strong>Security and Scalability Are Top of Mind</strong>: The report also highlights a 172% YoY increase in Broken Access Control vulnerabilities, underscoring the need for secure-by-design AI systems. RAGFlow’s focus on enterprise-ready deployment helps teams address these challenges head-on.</li>
</ul>
<h3 id="a-project-in-active-development" class="anchor anchorTargetStickyNavbar_Vzrq">A Project in Active Development<a href="https://ragflow.io/en/blog/ragflow-named-among-github-fastest-growing-open-source-projects#a-project-in-active-development" class="hash-link" aria-label="Direct link to A Project in Active Development" title="Direct link to A Project in Active Development" translate="no"></a></h3>
<p>RAGFlow's evolution mirrors a deliberate journey—from solving foundational RAG challenges to shaping the next generation of enterprise AI infrastructure.</p>
<p>The project first made its mark by systematically addressing core RAG limitations through integrated technological innovation. With features such as <strong>deep document understanding</strong> for parsing complex formats, <strong>hybrid retrieval</strong> that blends multiple search strategies, and built-in advanced tools like <strong>GraphRAG</strong> and <strong>RAPTOR</strong>, RAGFlow established itself as an end-to-end solution that dramatically enhances retrieval accuracy and reasoning performance.</p>
<p>Now, building on this robust technical foundation, RAGFlow is steering toward a bolder vision: <strong>to become the superior context engine for enterprise-grade Agents</strong>. Evolving from a specialized RAG engine into a unified, resilient context layer, RAGFlow is positioning itself as the essential <strong>data foundation for LLMs</strong> in the enterprise—enabling Agents of any kind to access rich, precise, and secure context, ensuring reliable and effective operation across all tasks.</p>
<hr>
<p><em>RAGFlow is an open source retrieval-augmented generation engine designed for building production-ready AI applications. To learn more or contribute, visit the <a href="https://github.com/infiniflow/ragflow" target="_blank" rel="noopener noreferrer" class=""><span>RAGFlow GitHub repository</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a>.</em></p>
<p><em>This post was inspired by insights from the <a href="https://gh.io/octoverse" target="_blank" rel="noopener noreferrer" class=""><span>GitHub Octoverse 2025 Report</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a>. Special thanks to the GitHub team for amplifying the voices of open source builders everywhere.</em></p>
<hr>]]></content:encoded>
            <category>Product News</category>
        </item>
        <item>
            <title><![CDATA[Is data processing like building with lego? Here is a detailed explanation of the ingestion pipeline.]]></title>
            <link>https://ragflow.io/en/blog/is-data-processing-like-building-with-lego-here-is-a-detailed-explanation-of-the-ingestion-pipeline</link>
            <guid>https://ragflow.io/en/blog/is-data-processing-like-building-with-lego-here-is-a-detailed-explanation-of-the-ingestion-pipeline</guid>
            <pubDate>Thu, 23 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Since its open-source release, RAGFlow has consistently garnered widespread attention from the community. Its core module, DeepDoc, leverages built-in document parsing models to provide intelligent document-sharding capabilities tailored for multiple business scenarios, ensuring that RAGFlow can deliver accurate and high-quality answers during both the retrieval and generation phases. Currently, RAGFlow comes pre-integrated with over a dozen document-sharding templates, covering various business scenarios and file types.]]></description>
            <content:encoded><![CDATA[<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/toutu-89a14de30d0295e44bf4982ae914d27a.PNG" width="1280" height="546"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Since its open-source release, RAGFlow has consistently garnered widespread attention from the community. Its core module, DeepDoc, leverages built-in document parsing models to provide intelligent document-sharding capabilities tailored for multiple business scenarios, ensuring that RAGFlow can deliver accurate and high-quality answers during both the retrieval and generation phases. Currently, RAGFlow comes pre-integrated with over a dozen document-sharding templates, covering various business scenarios and file types.</p>
<p>However, as RAGFlow becomes increasingly widely adopted in production environments, the original dozen-plus fixed sharding methods have struggled to keep pace with the complex and diverse array of data sources, document structures, and file types encountered. Specific challenges include:</p>
<ul>
<li class="">The need to flexibly configure different parsing and sharding strategies based on specific business scenarios to accommodate varied document structures and content logic.</li>
<li class="">Document parsing and ingestion involve not only segmenting unstructured data into text blocks but also encompass a series of critical preprocessing steps to bridge the "semantic gap" during RAG retrieval. This often requires leveraging models to enrich raw content with semantic information such as summaries, keywords, and hierarchical structures.</li>
<li class="">In addition to locally uploaded files, a significant amount of data, files, and knowledge originate from various sources, including cloud drives and online services.</li>
<li class="">With the maturation of multimodal vision-language models (VLMs), models like MinerU and Docling, which excel in parsing documents with complex layouts, tables, and mixed text-image arrangements, have emerged. These models demonstrate unique advantages across various application scenarios.</li>
</ul>
<p>To address these challenges, RAGFlow 0.21.0 has introduced a groundbreaking Ingestion pipeline. This pipeline restructures the cleaning process for unstructured data, allowing users to construct customized data-processing pipelines tailored to specific business needs and enabling precise parsing of heterogeneous documents.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/1-51eb24c41eaa08176ebfb9c47bb5aa1e.PNG" width="1280" height="809"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>The Ingestion Pipeline is essentially a visual ETL process tailored for unstructured data. Built upon an Agent foundation, it restructures a typical RAG data ingestion workflow—which usually encompasses key stages such as document parsing, text chunking, vectorization, and index construction—into three distinct phases: Parser, Transformer, and Indexer. These phases correspond to document parsing, data transformation, and index construction, respectively.</p>
<ul>
<li class="">Document Parsing: As a critical step in data cleaning, this module integrates multiple parsing models, with DeepDoc being a representative example. It transforms raw unstructured data into semi-structured content, laying the groundwork for subsequent processing.</li>
<li class="">Data Transformation: Currently offering two core types of operators, including Chunker and Transformer, this phase aims to further process the cleaned data into formats suitable for various index access methods, thereby ensuring high-quality recall performance.</li>
<li class="">Index Construction: Responsible for the final data write-in. RAGFlow inherently adopts a multi-path recall architecture to guarantee retrieval effectiveness. Consequently, the Indexer incorporates multiple indexing methods, allowing users to configure them flexibly.</li>
</ul>
<p>Below, we will demonstrate the construction and use of the Ingestion Pipeline through a specific example.</p>
<p>First, click on "Create agent" on the "Agent" page. You can choose "Create from blank" to create an Ingestion Pipeline from scratch:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/2-17b0168479d55519690c98a95d45d85e.PNG" width="1216" height="712"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Alternatively, you can select "Create from template" to utilize a pre-configured Ingestion pipeline template:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/3-b73f9aef2241441eaf3af0c346045850.PNG" width="1280" height="435"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Next, we will begin to arrange various operators required for the Pipeline. When creating from scratch, only the Begin and Parser operators will be displayed on the initial canvas. Subsequently, you can drag and connect additional operators with different functions from the right side of the existing operators.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/4-e6781c652a879d82cdead0e3d4d50e12.png" width="1280" height="487"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>First, it is necessary to configure the Parser operator.</p>
<h2 id="parser" class="anchor anchorTargetStickyNavbar_Vzrq">Parser<a href="https://ragflow.io/en/blog/is-data-processing-like-building-with-lego-here-is-a-detailed-explanation-of-the-ingestion-pipeline#parser" class="hash-link" aria-label="Direct link to Parser" title="Direct link to Parser" translate="no"></a></h2>
<p>The Parser operator is responsible for reading and parsing documents: identifying their layouts, extracting structural and textual information from them, and ultimately obtaining structured document data.</p>
<p>This represents a "high-fidelity, structured" extraction strategy. The Parser intelligently adapts to and preserves the original characteristics of different files, whether it's the hierarchical outline of a Word document, the row-and-column layout of a spreadsheet, or the complex layout of a scanned PDF. It not only extracts the main text but also fully retains auxiliary information such as titles, tables, headers, and footers, transforming them into appropriate data forms, which will be detailed below. This structured differentiation is crucial, providing the necessary foundation for subsequent refined processing.</p>
<p>Currently, the Parser operator supports input from 8 major categories encompassing 23 file types, summarized as follows:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/5-3f0e1fd72bd2deb1a8df471f17984196.jpg" width="804" height="531"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>When in use, simply click "Add Parser" within the Parser node and select the desired file category (such as PDF, Image, or PPT). When the Ingestion pipeline is running, the Parser node will automatically identify the input file and route it to the corresponding parser for parsing.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/6-6dae06a8d7434942fdd49d98021db2e6.png" width="1280" height="661"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Here, we provide further explanations for the parsers of several common file categories:</p>
<ul>
<li class="">
<p>For PDF files, RAGFlow offers multiple parsing model options, with a unified output in JSON format:</p>
<ol>
<li class="">Default DeepDoc: This is RAGFlow's built-in document understanding model, capable of recognizing layout, columns, and tables. It is suitable for processing scanned documents or those with complex formatting.</li>
<li class="">MinerU: Currently an outstanding document parsing model in the industry. Besides parsing complex document content and layouts, MinerU also provides excellent parsing for complex file elements such as mathematical formulas.</li>
<li class="">Naive: A pure text extraction method without using any models. It is suitable for documents with no complex structure or non-textual elements.</li>
</ol>
</li>
</ul>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/7-7e926b1eb432c172b994b204e0d43890.png" width="972" height="962"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<ul>
<li class="">For Image files, the system will by default invoke OCR to extract text from the image. Additionally, users can also configure VLMs (Vision Language Models) that support visual recognition to process them.</li>
<li class="">For Audio files, it is necessary to configure a model that supports speech-to-text conversion. The Parser will then extract the textual content from the Audio. Users can configure the API keys of model providers that support this type of parsing on the "Model provider" page of the homepage. After that, they can return to the Parser node and select it from the dropdown menu. This "configure first, then select" logic also applies to PDF, Image, and Video files.</li>
<li class="">For Video files, it is necessary to configure a large model that supports multimodal recognition. The Parser will invoke this model to conduct a comprehensive analysis of the video and output the results in text format.</li>
<li class="">When parsing Email files, RAGFlow provides Field options, allowing users to select only the desired fields, such as "subject" and "body." The Parser will then precisely extract the textual content of these fields.</li>
</ul>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/8-e631814fb0bd07b2070237e9ac02cefa.png" width="1280" height="692"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<ul>
<li class="">The Spreadsheet parser will output the file in HTML format, preserving its row and column structure intact to ensure that the tabular data remains clear and readable after conversion.</li>
<li class="">Files of Word and PPT types will be parsed and output in JSON format. For Word files, the original hierarchical structure of the document, such as titles, paragraphs, lists, headers, and footers, will be retained. For PPT files, the content will be extracted page by page, distinguishing between the title, main text, and notes of each slide.</li>
<li class="">The Text &amp; Markup category will automatically strip formatting tags from files such as HTML and MD (Markdown), outputting only the cleanest text content.</li>
</ul>
<h2 id="chunker" class="anchor anchorTargetStickyNavbar_Vzrq">Chunker<a href="https://ragflow.io/en/blog/is-data-processing-like-building-with-lego-here-is-a-detailed-explanation-of-the-ingestion-pipeline#chunker" class="hash-link" aria-label="Direct link to Chunker" title="Direct link to Chunker" translate="no"></a></h2>
<p>The Chunker node is responsible for dividing the documents output by upstream nodes into Chunk segments. Chunk is a concept introduced by RAG technology, representing the unit of recall. Users can choose whether to add a Chunker node based on their needs, but it is generally recommended to use it for two main reasons:</p>
<ol>
<li class="">If the entire document is used as the unit for recall, the data passed to the large model during the final generation phase may exceed the context window limit.</li>
<li class="">In typical RAG systems, vector search serves as an important recall method. However, vectors inherently have issues with inaccurate semantic representation. For example, users can choose to convert a single sentence into a vector or the entire document into a vector. The former loses global semantic information, while the latter loses local information. Therefore, selecting an appropriate segment length to achieve a relatively good balance when represented by a single vector is an essential technical approach.</li>
</ol>
<p>In practical engineering systems, how the Chunk segmentation results are determined often significantly impacts the recall quality of RAG. If content containing the answer is split across different Chunks, and the Retrieval phase cannot guarantee that all these Chunks are recalled, it can lead to inaccurate answer generation and hallucinations. Therefore, the Ingestion pipeline introduces the Chunker node, allowing users to slice text more flexibly.</p>
<p>The current system incorporates two built-in segmentation methods: segmentation based on text tokens and titles.</p>
<p>Segmentation by tokens is the most common approach. Users can customize the size of each segment, with a default setting of 512 tokens, which represents a balance optimized for retrieval effectiveness and model compatibility. When setting the segment size, trade-offs must be considered: if the segment token count remains too large, portions exceeding the model's limit will still be discarded; if set too small, it may result in excessive segmentation of coherent semantics in the original text, disrupting context and affecting retrieval effectiveness.</p>
<p>To address this, the Chunker operator provides a segment overlap feature, which allows the end portion of the previous segment to be duplicated as the beginning of the next segment, thereby enhancing semantic continuity. Users can increase the "Overlapped percent" to improve the correlation between segments.</p>
<p>Additionally, users can further optimize segmentation rules by defining "Separators." The system defaults to using \n (newline characters) as separators, meaning the segmenter will prioritize attempting to split along natural paragraphs rather than abruptly truncating sentences in the middle, as shown in the following figure.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/9-1581efbce8e33e571f0929b4f661e106.png" width="1280" height="677"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>If the document itself has a clear chapter structure, segmenting the text by tokens may not be the optimal choice. In such cases, the Title option in the Chunker can be selected to slice the document according to its headings. This method is primarily suitable for documents with layouts such as technical manuals, academic papers, and legal clauses. We can customize expressions for headings at different levels in the Title node. For example, the expression for a first-level heading (H1) can be set as ^#[^#], and for a second-level heading (H2) as ^##[^#]. Based on these expressions, the system will strictly slice the document according to the predefined chapter structure, ensuring that each segment represents a structurally complete "chapter" or "subsection." Users can also freely add or reduce heading levels in the configuration to match the actual structure of the document, as shown in the following figure.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/10-852d5c68a243304c3e9959fb72369be0.png" width="1280" height="658"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Note: In the current RAGFlow v0.21 version, if both the Token and Title options of the Chunker are configured simultaneously, please ensure that the Title node is connected after the Token node. Otherwise, if the Title node is directly connected to the Parser node, format errors may occur for files of types Email, Image, Spreadsheet, and Text&amp;Markup. These limitations will be optimized in subsequent versions.</p>
<h2 id="transformer" class="anchor anchorTargetStickyNavbar_Vzrq">Transformer<a href="https://ragflow.io/en/blog/is-data-processing-like-building-with-lego-here-is-a-detailed-explanation-of-the-ingestion-pipeline#transformer" class="hash-link" aria-label="Direct link to Transformer" title="Direct link to Transformer" translate="no"></a></h2>
<p>The Transformer operator is responsible for transforming textual content. Simply resolving the accuracy of text parsing and segmentation does not guarantee the final retrieval accuracy. This is because there is always a so-called "semantic gap" between a user's query and the documents containing the answers. By using the Transformer operator, users can leverage large models to extract information from the input document content, thereby bridging the "semantic gap."</p>
<p>The current Transformer operator supports functions such as summary generation, keyword generation, question generation, and metadata generation. Users can choose to incorporate this operator into their pipeline to supplement the original data with these contents, thereby enhancing the final retrieval accuracy. Similar to other scenarios involving large models, the Transformer node also offers three modes for the large model: Improvise, Precise, and Balance.</p>
<ul>
<li class="">Improvise (Improvisational Mode) encourages the model to exhibit greater creativity and associative thinking, making it well-suited for generating diverse Questions.</li>
<li class="">Precise (Precise Mode) strictly constrains the model to ensure its output is highly faithful to the original text, making it suitable for generating Summaries or extracting Keywords.</li>
<li class="">Balance (Balanced Mode) strikes a balance between the two, making it applicable to most scenarios.</li>
</ul>
<p>Users can select one of these three styles or achieve finer control by adjusting parameters such as Temperature and Top P on their own.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/11-3e868a4cb6dfb43b84ee8e47e7e43eb8.png" width="1280" height="610"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>The Transformer node can generate four types of content: Summary, Keywords, Questions, and Metadata. RAGFlow also makes the prompts for each type of content openly accessible, which means users can enrich and personalize text processing by modifying the system prompts.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/12-7369409513825bdfa94c2a98b1d37b29.png" width="1280" height="636"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>If multiple functions need to be implemented, such as summarizing content and extracting keywords simultaneously, users are required to configure a separate Transformer node for each function and connect them in series within the Pipeline. In other words, a Transformer node can be directly connected after the Parser to process the entire document (e.g., generating a full-text summary), or it can be connected after the Chunker to process each text segment (e.g., generating questions for each Chunk). Additionally, a Transformer node can be connected after another Transformer node to perform complex content extraction and generation in a cascaded manner.</p>
<p>Please note: The Transformer node does not automatically acquire content from its preceding nodes. The actual source of information it processes entirely depends on the variables referenced in the User prompt. In the User prompt, variables output by upstream nodes must be manually selected and referenced by entering the / symbol.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/13-24d4f136038c5ae0cf859e20c623122e.png" width="806" height="607"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>For example, in a Parser - Chunker - Transformer pipeline, even though the Transformer is visually connected after the Chunker, if the variable referenced in the User prompt is the output from the Parser node, then the Transformer will actually process the entire original document rather than the chunks generated by the Chunker.</p>
<p>Similarly, when users choose to connect multiple Transformer nodes in series (e.g., the first one generates a Summary, and the second one generates Keywords), if the second Transformer references the Summary variable generated by the first Transformer, it will process this Summary as the "new original text" for further processing, rather than handling the text chunks from the more upstream Chunker.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/14-3ccf316364bfe07d7ab45b983447dab7.png" width="1280" height="535"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="indexer" class="anchor anchorTargetStickyNavbar_Vzrq">Indexer<a href="https://ragflow.io/en/blog/is-data-processing-like-building-with-lego-here-is-a-detailed-explanation-of-the-ingestion-pipeline#indexer" class="hash-link" aria-label="Direct link to Indexer" title="Direct link to Indexer" translate="no"></a></h2>
<p>The preceding Parser, Chunker, and Transformer nodes handle data inflow, segmentation, and optimization. However, the final execution unit in the Pipeline is the Indexer node, which is responsible for writing the processed data into the Retrieval engine (RAGFlow currently supports Infinity, Elasticsearch, and OpenSearch).</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/15-c8d23b0bc9def18b46b7da07fdef1bdd.png" width="1280" height="582"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>The core capability of the Retrieval engine is to establish various types of indexes for data, thereby providing search capabilities, including vector indexing, full-text indexing, and future tensor indexing capabilities, among others. In other words, it is the ultimate embodiment of "Retrieval" in the term RAG.</p>
<p>Due to the varying capabilities of different types of indexes, the Indexer simultaneously offers options for creating different indexes. Specifically, the Search method option within the Indexer node determines how user data can be "found."</p>
<p>Full-text refers to traditional "keyword search," which is an essential option for precise recall, such as searching for a specific product number, person's name, or code. Embedding, on the other hand, represents modern AI-driven "semantic search." Users can ask questions in natural language, and the system can "understand" the meaning of the question and retrieve the most relevant document chunks in terms of content. Enabling both simultaneously for hybrid search is the default option in RAGFlow. Effective multi-channel recall can balance precision and semantics, maximizing the discovery of text segments where answers reside.</p>
<p>Note: There is no need to select a specific Embedding model within the Indexer node, as it will automatically invoke the embedding model set when creating the knowledge base. Additionally, the Chat, Search, and Agent functionalities in RAGFlow support cross-knowledge base retrieval, meaning a single question can be searched across multiple knowledge bases simultaneously. However, to enable this feature, <strong>a prerequisite must be met</strong>: all simultaneously selected knowledge bases must utilize the same Embedding model. This is because different embedding models convert the same text into completely different and incompatible vectors, preventing cross-base retrieval.</p>
<p>Furthermore, finer retrieval settings can be achieved through the Filename embedding weight and Field options. The Filename embedding weight is a fine-tuning slider that allows users to consider the "filename" of a document as part of the semantic information and assign it a specific weight.</p>
<p>The Field option, on the other hand, determines the specific content to be indexed and the retrieval strategy. Currently, three distinct strategy options are provided:</p>
<ul>
<li class="">Processed Text: This is the default option and the most intuitive. It means that the Indexer will index the processed text chunks from preceding nodes.</li>
<li class="">Questions: If a Transformer node is used before the Indexer to generate "potential questions that each text chunk can answer," these Questions can be indexed here. In many scenarios, matching "user questions" with "pre-generated questions" yields significantly higher similarity than matching "questions" with "answers" (i.e., the original text), effectively improving retrieval accuracy.</li>
<li class="">Augmented Context: This involves using Summaries instead of the original text for retrieval. It is suitable for scenarios requiring quick broad topic matching without being distracted by the details of the original text.</li>
</ul>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/16-48b55a85995cefb89fc8693757a5892f.png" width="1280" height="915"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h1>Link the Ingestion Pipeline to the Knowledge Base</h1>
<p>After constructing an Ingestion pipeline, the next step is to associate it with the corresponding knowledge base. On the page for creating a knowledge base, locate and click the "Choose pipeline" option under the "Ingestion pipeline" tab. Subsequently, select the already created Pipeline from the dropdown menu to establish the association. Once set, this Pipeline will become the default file parsing process for this knowledge base.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/17-c1d27879479271805223c4b767745470.png" width="425" height="431"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>For an already created knowledge base, users can enter its "Ingestion pipeline" module at any time to readjust and reselect the associated parsing process.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/18-51d86e938944933b71eeca8c02ec4b09.png" width="1021" height="1280"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>If users wish to adjust the Ingestion pipeline for a single file, they can also do so by clicking on the Parse location to make adjustments.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/19-255af44c4dc9776859421b1e06d045c1.png" width="1280" height="256"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Finally, make adjustments and save the updates in the pop-up window.</p>
<h2 id="logs" class="anchor anchorTargetStickyNavbar_Vzrq">Logs<a href="https://ragflow.io/en/blog/is-data-processing-like-building-with-lego-here-is-a-detailed-explanation-of-the-ingestion-pipeline#logs" class="hash-link" aria-label="Direct link to Logs" title="Direct link to Logs" translate="no"></a></h2>
<p>The execution of an Ingestion Pipeline may take a considerable amount of time, making observability an indispensable capability. To this end, RAGFlow provides a log panel for the Ingestion pipeline, which records the full-chain logs for each file parsing operation. For files parsed through the Ingestion Pipeline, users can delve into the operational details of each processing node. This offers comprehensive data support for subsequent issue auditing, process debugging, and performance insights.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/20-2c989856c8e3212c5f21a99207a698a1.png" width="1280" height="436"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>The following image is an example diagram of step logs.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/21-e35c71761ce569a24453805ae6883c9d.png" width="1315" height="256"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h1>Case Reference</h1>
<p>When creating a Pipeline, you can select the "Chunk Summary" template as the foundation for construction, although you also have the option to choose other templates as starting points for subsequent building.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/22-3293e22c0e4d4f8c17deec42a11b4c55.png" width="1280" height="662"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>The orchestration design of the "Chunk Summary" template is as follows:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/23-dfd4ec60243460226b4a92582602d5e0.png" width="1280" height="381"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Next, switch the large model in the Transformer node to the desired model and set the "Result destination" field to "Metadata." This configuration means that the processing results (such as summaries) of the large model on text chunks will be directly stored in the file's metadata, providing capability support for subsequent precise retrieval and filtering.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/24-45f903556529588c848661edd55ffb6e.png" width="1280" height="878"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Click Run in the top right corner and upload a file to test the pipeline:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/25-66f6fb8bd50f44cb9cb16a93379128bc.png" width="1280" height="1105"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>You can click View result to check the test run results:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/26-3666c17998cc5af0ff2fb59aa4f20751.png" width="1280" height="955"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h1>Summary</h1>
<p>The above content provides a comprehensive introduction to the usage methods and core capabilities of the current Ingestion pipeline. Looking ahead, RAGFlow will continue to evolve in terms of data import and parsing clarity, including the following specific enhancements:</p>
<ol>
<li class="">Expanding Data Source Support: In addition to local file uploads, we will gradually integrate various data sources such as S3, cloud storage, email, online notes, and more. Through automatic and manual synchronization mechanisms, we will achieve seamless data import into knowledge bases, automatically applying the Ingestion pipeline to complete document parsing.</li>
<li class="">Enhancing Parsing Capabilities: We will integrate more document parsing models, such as Docling, into the Parser operator to cover parsing needs across different vertical domains, comprehensively improving the quality and accuracy of document information extraction.</li>
<li class="">Opening Up Custom Slicing Functionality: In addition to built-in Chunker types, we will gradually open up underlying slicing capabilities, allowing users to write custom slicing logic for more flexible and controllable text organization.</li>
<li class="">Strengthening the Extensibility of Semantic Enhancement: Building on existing capabilities for summarization, keyword extraction, and question generation, we will further support customizable semantic enhancement strategies in a programmable manner, providing users with more technical means to optimize retrieval and ranking.</li>
</ol>
<p>Through these enhancements, RAGFlow will continuously improve retrieval accuracy, serving as a robust support for providing high-quality context to large models.</p>
<p>Finally, we appreciate your attention and support. We welcome you to star RAGFlow on GitHub and join us in witnessing the continuous evolution of large model technology!</p>
<p>GitHub:  <a href="https://github.com/infiniflow/ragflow" target="_blank" rel="noopener noreferrer" class=""><span>https://github.com/infiniflow/ragflow</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></p>]]></content:encoded>
            <category>Product News</category>
        </item>
        <item>
            <title><![CDATA[Bid Farewell to Complexity — RAGFlow CLI Makes Back-end Management a Breeze]]></title>
            <link>https://ragflow.io/en/blog/bid-farewell-to-complexity-ragflow-cli-makes-back-end-management-a-breezeindex</link>
            <guid>https://ragflow.io/en/blog/bid-farewell-to-complexity-ragflow-cli-makes-back-end-management-a-breezeindex</guid>
            <pubDate>Mon, 20 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[To meet the refined requirements for system operation and maintenance monitoring as well as user account management, especially addressing practical issues currently faced by RAGFlow users, such as "the inability of users to recover lost passwords on their own" and "difficulty in effectively controlling account statuses," RAGFlow has officially launched a professional back-end management command-line tool.]]></description>
            <content:encoded><![CDATA[<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/toutu-7901f8747cd461dbafcc8bc7424ea64a.jpg" width="2250" height="960"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>To meet the refined requirements for system operation and maintenance monitoring as well as user account management, especially addressing practical issues currently faced by RAGFlow users, such as "the inability of users to recover lost passwords on their own" and "difficulty in effectively controlling account statuses," RAGFlow has officially launched a professional back-end management command-line tool.</p>
<p>This tool is based on a clear client-server architecture. By adopting the design philosophy of functional separation, it constructs an efficient and reliable system management channel, enabling administrators to achieve system recovery and permission control at the fundamental level.</p>
<p>The specific architectural design is illustrated in the following diagram:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/1-179d014e9552214222302abea2a402d2.jpg" width="2312" height="1518"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Through this tool, RAGFlow users can gain a one-stop overview of the operational status of the RAGFlow Server as well as components such as MySQL, Elasticsearch, Redis, MinIO, and Infinity. It also supports comprehensive user lifecycle management, including account creation, status control, password reset, and data cleanup.</p>
<h2 id="start-the-service" class="anchor anchorTargetStickyNavbar_Vzrq">Start the service<a href="https://ragflow.io/en/blog/bid-farewell-to-complexity-ragflow-cli-makes-back-end-management-a-breezeindex#start-the-service" class="hash-link" aria-label="Direct link to Start the service" title="Direct link to Start the service" translate="no"></a></h2>
<p>If you deploy RAGFlow via Docker, please modify the <code>docker/docker_compose.yml</code> file and add parameters to the service startup command.</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">command:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  - --enable-adminserver</span><br></span></code></pre></div></div>
<p>If you are deploying RAGFlow from the source code, you can directly execute the following command to start the management server:</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">python3 admin/server/admin_server.py</span><br></span></code></pre></div></div>
<p>After the server starts, it listens on port 9381 by default, waiting for client connections. If you need to use a different port, please modify the <code>ADMIN_SVR_HTTP_PORT</code> configuration item in the <code>docker/.env file</code>.</p>
<h2 id="install-the-client-and-connect-to-the-management-service" class="anchor anchorTargetStickyNavbar_Vzrq">Install the client and connect to the management service<a href="https://ragflow.io/en/blog/bid-farewell-to-complexity-ragflow-cli-makes-back-end-management-a-breezeindex#install-the-client-and-connect-to-the-management-service" class="hash-link" aria-label="Direct link to Install the client and connect to the management service" title="Direct link to Install the client and connect to the management service" translate="no"></a></h2>
<p>It is recommended to use pip to install the specified version of the client:</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">pip install ragflow-cli==0.21.0</span><br></span></code></pre></div></div>
<p>Version <code>0.21.0</code> is the current latest version. Please ensure that the version of <code>ragflow-cli</code> matches the version of the RAGFlow server to avoid compatibility issues:</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">ragflow-cli -h 127.0.0.1 -p 9381</span><br></span></code></pre></div></div>
<p>Here, <code>-h</code> specifies the server IP, and <code>-p</code> specifies the server port. If the server is deployed at a different address or port, please adjust the parameters accordingly.</p>
<p>For the first login, enter the default administrator password <code>admin</code>. After successfully logging in, it is recommended to promptly change the default password in the command-line tool to enhance security.</p>
<h2 id="command-usage-guide" class="anchor anchorTargetStickyNavbar_Vzrq">Command Usage Guide<a href="https://ragflow.io/en/blog/bid-farewell-to-complexity-ragflow-cli-makes-back-end-management-a-breezeindex#command-usage-guide" class="hash-link" aria-label="Direct link to Command Usage Guide" title="Direct link to Command Usage Guide" translate="no"></a></h2>
<p>By entering the following commands through the client, you can conveniently manage users and monitor the operational status of the service.</p>
<p><strong>Interactive Feature Description</strong></p>
<ul>
<li class="">Supports using arrow keys to move the cursor and review historical commands.</li>
<li class="">Pressing <code>Ctrl+C</code> allows you to terminate the current interaction at any time.</li>
<li class="">If you need to copy content, please avoid using <code>Ctrl+C</code> to prevent accidentally interrupting the process.</li>
</ul>
<p><strong>Command Format Specifications</strong></p>
<ul>
<li class="">All commands are case-insensitive and must end with a semicolon <code>;</code>.</li>
<li class="">Text parameters such as usernames and passwords need to be enclosed in single quotes <code>'</code> or double quotes <code>"</code>.</li>
<li class="">Special characters like <code>\</code>, <code>'</code>, and <code>"</code> are prohibited in passwords.</li>
</ul>
<h3 id="service-management-commands" class="anchor anchorTargetStickyNavbar_Vzrq">Service Management Commands<a href="https://ragflow.io/en/blog/bid-farewell-to-complexity-ragflow-cli-makes-back-end-management-a-breezeindex#service-management-commands" class="hash-link" aria-label="Direct link to Service Management Commands" title="Direct link to Service Management Commands" translate="no"></a></h3>
<p><code>LIST SERVICES;</code></p>
<ul>
<li class="">List the operational status of RAGFlow backend services and all associated middleware.</li>
</ul>
<p><strong>Usage Example</strong></p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">admin&gt; list services;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Listing all services</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+-------------------------------------------------------------------------------------------+-----------+----+---------------+-------+----------------+---------+</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| extra                                                                                     | host      | id | name          | port  | service_type   | status  |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+-------------------------------------------------------------------------------------------+-----------+----+---------------+-------+----------------+---------+</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| {}                                                                                        | 0.0.0.0   | 0  | ragflow_0     | 9380  | ragflow_server | Timeout |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| {'meta_type': 'mysql', 'password': 'infini_rag_flow', 'username': 'root'}                 | localhost | 1  | mysql         | 5455  | meta_data      | Alive   |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| {'password': 'infini_rag_flow', 'store_type': 'minio', 'user': 'rag_flow'}                | localhost | 2  | minio         | 9000  | file_store     | Alive   |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| {'password': 'infini_rag_flow', 'retrieval_type': 'elasticsearch', 'username': 'elastic'} | localhost | 3  | elasticsearch | 1200  | retrieval      | Alive   |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| {'db_name': 'default_db', 'retrieval_type': 'infinity'}                                   | localhost | 4  | infinity      | 23817 | retrieval      | Timeout |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| {'database': 1, 'mq_type': 'redis', 'password': 'infini_rag_flow'}                        | localhost | 5  | redis         | 6379  | message_queue  | Alive   |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+-------------------------------------------------------------------------------------------+-----------+----+---------------+-------+----------------+---------+</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<p>List the operational status of RAGFlow backend services and all associated middleware.</p>
<p><code>SHOW SERVICE &lt;id&gt;;</code></p>
<ul>
<li class="">Query the detailed operational status of the specified service.</li>
<li class=""><code>&lt;id&gt;</code>: Command: <code>LIST SERVICES；</code> The service identifier <strong>ID</strong> in the displayed results.</li>
</ul>
<p><strong>Usage Example:</strong></p>
<ol>
<li class="">Query the RAGFlow backend service:</li>
</ol>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">admin&gt; show service 0;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Showing service: 0</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Service ragflow_0 is alive. Detail:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Confirm elapsed: 4.1 ms.</span><br></span></code></pre></div></div>
<p>The response indicates that the RAGFlow backend service is online, with a response time of 4.1 milliseconds.</p>
<ol start="2">
<li class="">Query the MySQL service:</li>
</ol>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">admin&gt; show service 1;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Showing service: 1</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Service mysql is alive. Detail:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+---------+----------+------------------+------+------------------+------------------------+-------+-----------------+</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| command | db       | host             | id   | info             | state                  | time  | user            |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+---------+----------+------------------+------+------------------+------------------------+-------+-----------------+</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| Daemon  | None     | localhost        | 5    | None             | Waiting on empty queue | 86356 | event_scheduler |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| Sleep   | rag_flow | 172.18.0.6:56788 | 8790 | None             |                        | 2     | root            |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| Sleep   | rag_flow | 172.18.0.6:53482 | 8791 | None             |                        | 73    | root            |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| Query   | rag_flow | 172.18.0.6:56794 | 8795 | SHOW PROCESSLIST | init                   | 0     | root            |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+---------+----------+------------------+------+------------------+------------------------+-------+-----------------+</span><br></span></code></pre></div></div>
<p>The response indicates that the MySQL service is online, with the current connection and execution status shown in the table above.</p>
<ol start="3">
<li class="">Query the MinIO service:</li>
</ol>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">admin&gt; show service 2;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Showing service: 2</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Service minio is alive. Detail:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Confirm elapsed: 2.3 ms.</span><br></span></code></pre></div></div>
<p>The response indicates that the MinIO service is online, with a response time of 2.3 milliseconds.</p>
<ol start="4">
<li class="">Query the Elasticsearch service:</li>
</ol>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">admin&gt; show service 3;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Showing service: 3</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Service elasticsearch is alive. Detail:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+----------------+------+--------------+---------+----------------+--------------+---------------+--------------+------------------------------+----------------------------+-----------------+-------+---------------+---------+-------------+---------------------+--------+------------+--------------------+</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| cluster_name   | docs | docs_deleted | indices | indices_shards | jvm_heap_max | jvm_heap_used | jvm_versions | mappings_deduplicated_fields | mappings_deduplicated_size | mappings_fields | nodes | nodes_version | os_mem  | os_mem_used | os_mem_used_percent | status | store_size | total_dataset_size |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+----------------+------+--------------+---------+----------------+--------------+---------------+--------------+------------------------------+----------------------------+-----------------+-------+---------------+---------+-------------+---------------------+--------+------------+--------------------+</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| docker-cluster | 8    | 0            | 1       | 2              | 3.76 GB      | 2.15 GB       | 21.0.1+12-29 | 17                           | 757 B                      | 17              | 1     | ['8.11.3']    | 7.52 GB | 2.30 GB     | 31                  | green  | 226 KB     | 226 KB             |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+----------------+------+--------------+---------+----------------+--------------+---------------+--------------+------------------------------+----------------------------+-----------------+-------+---------------+---------+-------------+---------------------+--------+------------+--------------------+</span><br></span></code></pre></div></div>
<p>The response indicates that the Elasticsearch cluster is operating normally, with specific metrics including document count, index status, memory usage, etc.</p>
<ol start="5">
<li class="">Query the Infinity service:</li>
</ol>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">admin&gt; show service 4;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Showing service: 4</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Fail to show service, code: 500, message: Infinity is not in use.</span><br></span></code></pre></div></div>
<p>The response indicates that Infinity is not currently in use by the RAGFlow system.</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">admin&gt; show service 4;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Showing service: 4</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Service infinity is alive. Detail:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+-------+--------+----------+</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| error | status | type     |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+-------+--------+----------+</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">|       | green  | infinity |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+-------+--------+----------+</span><br></span></code></pre></div></div>
<p>After enabling Infinity and querying again, the response indicates that the Infinity service is online and in good condition.</p>
<ol start="6">
<li class="">Query the Redis service:</li>
</ol>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">admin&gt; show service 5;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Showing service: 5</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Service redis is alive. Detail:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+-----------------+-------------------+---------------------------+-------------------------+---------------+-------------+--------------------------+---------------------+-------------+</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| blocked_clients | connected_clients | instantaneous_ops_per_sec | mem_fragmentation_ratio | redis_version | server_mode | total_commands_processed | total_system_memory | used_memory |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+-----------------+-------------------+---------------------------+-------------------------+---------------+-------------+--------------------------+---------------------+-------------+</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| 0               | 3                 | 10                        | 3.03                    | 7.2.4         | standalone  | 404098                   | 30.84G              | 1.29M       |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+-----------------+-------------------+---------------------------+-------------------------+---------------+-------------+--------------------------+---------------------+-------------+</span><br></span></code></pre></div></div>
<p>The response indicates that the Redis service is online, with the version number, deployment mode, and resource usage shown in the table above.</p>
<h3 id="user-management-commands" class="anchor anchorTargetStickyNavbar_Vzrq">User Management Commands<a href="https://ragflow.io/en/blog/bid-farewell-to-complexity-ragflow-cli-makes-back-end-management-a-breezeindex#user-management-commands" class="hash-link" aria-label="Direct link to User Management Commands" title="Direct link to User Management Commands" translate="no"></a></h3>
<p><code>LIST USERS;</code></p>
<ul>
<li class="">List all users in the RAGFlow system.</li>
</ul>
<p><strong>Usage Example:</strong></p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">admin&gt; list users;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Listing all users</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+-------------------------------+----------------------+-----------+----------+</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| create_date                   | email                | is_active | nickname |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+-------------------------------+----------------------+-----------+----------+</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| Mon, 13 Oct 2025 15:58:42 GMT | admin@ragflow.io     | 1         | admin    |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| Mon, 13 Oct 2025 15:54:34 GMT | lynn_inf@hotmail.com | 1         | Lynn     |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+-------------------------------+----------------------+-----------+----------+</span><br></span></code></pre></div></div>
<p>The response indicates that there are currently two users in the system, both of whom are <strong>enabled</strong>.</p>
<p>Among them, <a href="mailto:admin@ragflow.io" target="_blank" rel="noopener noreferrer" class=""><span>admin@ragflow.io</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a> is the administrator account, which is automatically created during the initial system startup.</p>
<p><code>SHOW USER &lt;username&gt;;</code></p>
<ul>
<li class="">Query detailed user information by email.</li>
<li class=""><code>&lt;username&gt;</code>:  The user's email address, which must be enclosed in single quotes <code>'</code> or double quotes <code>"</code>.</li>
</ul>
<p><strong>Usage Example:</strong></p>
<ol>
<li class="">Query the administrator user</li>
</ol>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">admin&gt; show user "admin@ragflow.io";</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Showing user: admin@ragflow.io</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+-------------------------------+------------------+-----------+--------------+------------------+--------------+----------+-----------------+---------------+--------+-------------------------------+</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| create_date                   | email            | is_active | is_anonymous | is_authenticated | is_superuser | language | last_login_time | login_channel | status | update_date                   |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+-------------------------------+------------------+-----------+--------------+------------------+--------------+----------+-----------------+---------------+--------+-------------------------------+</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| Mon, 13 Oct 2025 15:58:42 GMT | admin@ragflow.io | 1         | 0            | 1                | True         | English  | None            | None          | 1      | Mon, 13 Oct 2025 15:58:42 GMT |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+-------------------------------+------------------+-----------+--------------+------------------+--------------+----------+-----------------+---------------+--------+-------------------------------+</span><br></span></code></pre></div></div>
<p>The response indicates that <a href="mailto:admin@ragflow.io" target="_blank" rel="noopener noreferrer" class=""><span>admin@ragflow.io</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a> is a super administrator and is currently <strong>enabled</strong>.</p>
<ol start="2">
<li class="">Query a regular user</li>
</ol>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">admin&gt; show user "lynn_inf@hotmail.com";</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Showing user: lynn_inf@hotmail.com</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+-------------------------------+----------------------+-----------+--------------+------------------+--------------+----------+-------------------------------+---------------+--------+-------------------------------+</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| create_date                   | email                | is_active | is_anonymous | is_authenticated | is_superuser | language | last_login_time               | login_channel | status | update_date                   |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+-------------------------------+----------------------+-----------+--------------+------------------+--------------+----------+-------------------------------+---------------+--------+-------------------------------+</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| Mon, 13 Oct 2025 15:54:34 GMT | lynn_inf@hotmail.com | 1         | 0            | 1                | False        | English  | Mon, 13 Oct 2025 15:54:33 GMT | password      | 1      | Mon, 13 Oct 2025 17:24:09 GMT |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+-------------------------------+----------------------+-----------+--------------+------------------+--------------+----------+-------------------------------+---------------+--------+-------------------------------+</span><br></span></code></pre></div></div>
<p>The response indicates that <a href="mailto:lynn_inf@hotmail.com" target="_blank" rel="noopener noreferrer" class=""><span>lynn_inf@hotmail.com</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a> is a regular user who logs in via password, with the last login time shown as the provided timestamp.</p>
<p><code>CREATE USER &lt;username&gt; &lt;password&gt;;</code></p>
<ul>
<li class="">Create a new user.</li>
<li class=""><code>&lt;username&gt;</code>: The user's email address must comply with standard email format specifications.</li>
<li class=""><code>&lt;password&gt;</code>: The user's password must not contain special characters such as <code>\</code>, <code>'</code>, or <code>"</code>.</li>
</ul>
<p><strong>Usage Example:</strong></p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">admin&gt; create user "example@ragflow.io" "psw";</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Create user: example@ragflow.io, password: psw, role: user</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+----------------------------------+--------------------+----------------------------------+--------------+---------------+----------+</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| access_token                     | email              | id                               | is_superuser | login_channel | nickname |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+----------------------------------+--------------------+----------------------------------+--------------+---------------+----------+</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| be74d786a9b911f0a726d68c95a0776b | example@ragflow.io | be74d6b4a9b911f0a726d68c95a0776b | False        | password      |          |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+----------------------------------+--------------------+----------------------------------+--------------+---------------+----------+</span><br></span></code></pre></div></div>
<p>A regular user has been successfully created. Personal information such as nickname and avatar can be set by the user themselves after logging in and accessing the profile page.</p>
<p><code>ALTER USER PASSWORD &lt;username&gt; &lt;new_password&gt;;</code></p>
<ul>
<li class="">Change the user's password.</li>
<li class=""><code>&lt;username&gt;</code>: User email address</li>
<li class=""><code>&lt;password&gt;</code>: New password (must not be the same as the old password and must not contain special characters)</li>
</ul>
<p><strong>Usage Example:</strong></p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">admin&gt; alter user password "example@ragflow.io" "psw";</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Alter user: example@ragflow.io, password: psw</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Same password, no need to update!</span><br></span></code></pre></div></div>
<p>When the new password is the same as the old password, the system prompts that no change is needed.</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">admin&gt; alter user password "example@ragflow.io" "new psw";</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Alter user: example@ragflow.io, password: new psw</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Password updated successfully!</span><br></span></code></pre></div></div>
<p>The password has been updated successfully. The user can log in with the new password thereafter.</p>
<p><code>ALTER USER ACTIVE &lt;username&gt; &lt;on/off&gt;;</code></p>
<ul>
<li class="">Enable or disable a user.</li>
<li class=""><code>&lt;username&gt;</code>: User email address</li>
<li class=""><code>&lt;on/off&gt;</code>: Enabled or disabled status</li>
</ul>
<p><strong>Usage Example:</strong></p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">admin&gt; alter user active "example@ragflow.io" off;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Alter user example@ragflow.io activate status, turn off.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Turn off user activate status successfully!</span><br></span></code></pre></div></div>
<p>The user has been successfully disabled. Only users in a <strong>disabled</strong> state can be deleted.</p>
<p><code>DROP USER &lt;username&gt;;</code></p>
<ul>
<li class="">Delete the user and all their associated data</li>
<li class=""><code>&lt;username&gt;</code>: User email address</li>
</ul>
<p><strong>Important Notes:</strong></p>
<ul>
<li class="">Only <strong>disabled</strong> users can be deleted.</li>
<li class="">Before proceeding, ensure that all necessary data such as knowledge bases and files that need to be retained have been transferred to other users.</li>
<li class="">This operation will permanently delete the following user data:</li>
</ul>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/2-e6836f85d6a2227b16c88d0524eadca4.jpg" width="1758" height="1128"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>All knowledge bases created by the user, uploaded files, and configured agents, as well as files uploaded by the user in others' knowledge bases, will be permanently deleted. This operation is irreversible, so please proceed with extreme caution.</p>
<ul>
<li class="">The deletion command is <strong>idempotent</strong>. If the system fails or the operation is interrupted during the deletion process, the command can be re-executed after troubleshooting to continue deleting the remaining data.</li>
</ul>
<p><strong>Usage Example:</strong></p>
<ol>
<li class="">User Successfully Deleted</li>
</ol>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">admin&gt; drop user "example@ragflow.io";</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Drop user: example@ragflow.io</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Successfully deleted user. Details:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Start to delete owned tenant.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Deleted 2 tenant-LLM records.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Deleted 0 langfuse records.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Deleted 1 tenant.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Deleted 1 user-tenant records.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Deleted 1 user.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Delete done!</span><br></span></code></pre></div></div>
<p>The response indicates that the user has been successfully deleted, and it lists detailed steps for data cleanup.</p>
<ol start="2">
<li class="">Deleting Super Administrator (Prohibited Operation)</li>
</ol>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">admin&gt; drop user "admin@ragflow.io";</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Drop user: admin@ragflow.io</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Fail to drop user, code: -1, message: Can't delete the super user.</span><br></span></code></pre></div></div>
<p>The response indicates that the deletion failed. The super administrator account is protected and cannot be deleted, even if it is in a <strong>disabled</strong> state.</p>
<h3 id="data-and-agent-management-commands" class="anchor anchorTargetStickyNavbar_Vzrq">Data and Agent Management Commands<a href="https://ragflow.io/en/blog/bid-farewell-to-complexity-ragflow-cli-makes-back-end-management-a-breezeindex#data-and-agent-management-commands" class="hash-link" aria-label="Direct link to Data and Agent Management Commands" title="Direct link to Data and Agent Management Commands" translate="no"></a></h3>
<p><code>LIST DATASETS OF &lt;username&gt;;</code></p>
<ul>
<li class="">List all knowledge bases of the specified user</li>
<li class=""><code>&lt;username&gt;</code>: User email address</li>
</ul>
<p><strong>Usage Example:</strong></p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">admin&gt; list datasets of "lynn_inf@hotmail.com";</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Listing all datasets of user: lynn_inf@hotmail.com</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+-----------+-------------------------------+---------+----------+-----------------+------------+--------+-----------+-------------------------------+</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| chunk_num | create_date                   | doc_num | language | name            | permission | status | token_num | update_date                   |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+-----------+-------------------------------+---------+----------+-----------------+------------+--------+-----------+-------------------------------+</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| 8         | Mon, 13 Oct 2025 15:56:43 GMT | 1       | English  | primary_dataset | me         | 1      | 3296      | Mon, 13 Oct 2025 15:57:54 GMT |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+-----------+-------------------------------+---------+----------+-----------------+------------+--------+-----------+-------------------------------+</span><br></span></code></pre></div></div>
<p>The response shows that the user has one private knowledge base, with detailed information such as the number of documents and segments displayed in the table above.</p>
<p><code>LIST AGENTS OF &lt;username&gt;;</code></p>
<ul>
<li class="">List all Agents of the specified user</li>
<li class=""><code>&lt;username&gt;</code>: User email address</li>
</ul>
<p><strong>Usage Example:</strong></p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">admin&gt; list agents of "lynn_inf@hotmail.com";</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Listing all agents of user: lynn_inf@hotmail.com</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+-----------------+-------------+------------+----------------+</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| canvas_category | canvas_type | permission | title          |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+-----------------+-------------+------------+----------------+</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">| agent_canvas    | None        | me         | finance_helper |</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">+-----------------+-------------+------------+----------------+</span><br></span></code></pre></div></div>
<p>The response indicates that the user has one private Agent, with detailed information shown in the table above.</p>
<h3 id="other-commands" class="anchor anchorTargetStickyNavbar_Vzrq">Other commands<a href="https://ragflow.io/en/blog/bid-farewell-to-complexity-ragflow-cli-makes-back-end-management-a-breezeindex#other-commands" class="hash-link" aria-label="Direct link to Other commands" title="Direct link to Other commands" translate="no"></a></h3>
<ul>
<li class="">? or \help</li>
</ul>
<p>Display help information.</p>
<ul>
<li class="">\q or \quit</li>
</ul>
<h2 id="follow-up-plan" class="anchor anchorTargetStickyNavbar_Vzrq">Follow-up plan<a href="https://ragflow.io/en/blog/bid-farewell-to-complexity-ragflow-cli-makes-back-end-management-a-breezeindex#follow-up-plan" class="hash-link" aria-label="Direct link to Follow-up plan" title="Direct link to Follow-up plan" translate="no"></a></h2>
<p>We are always committed to enhancing the system management experience and overall security. Building on its existing robust features, the RAGFlow back-end management tool will continue to evolve. In addition to the current efficient and flexible command-line interface, we are soon launching a professional system management UI, enabling administrators to perform all operational and maintenance tasks in a more secure and intuitive graphical environment.</p>
<p>To strengthen permission control, the system status information currently visible in the ordinary user interface will be revoked. After the future launch of the professional management UI, access to the core operational status of the system will be restricted to administrators only. This will effectively address the current issue of excessive permission exposure and further reinforce the system's security boundaries.</p>
<p>In addition, we will also roll out more fine-grained management features sequentially, including:</p>
<ul>
<li class="">Fine-grained control over Datasets and Agents</li>
<li class="">User Team collaboration management mechanisms</li>
<li class="">Enhanced system monitoring and auditing capabilities</li>
</ul>
<p>These improvements will establish a more comprehensive enterprise-level management ecosystem, providing administrators with a more all-encompassing and convenient system control experience.</p>]]></content:encoded>
            <category>Product News</category>
        </item>
        <item>
            <title><![CDATA[500 Percent Faster Vector Retrieval! 90 Percent Memory Savings! Three Groundbreaking Technologies in Infinity v0.6.0 That Revolutionize HNSW]]></title>
            <link>https://ragflow.io/en/blog/500-percent-faster-vector-retrieval-90-percent-memory-savings-three-groundbreaking-technologies-in-infinity-v0.6.0-that-revolutionize-hnsw</link>
            <guid>https://ragflow.io/en/blog/500-percent-faster-vector-retrieval-90-percent-memory-savings-three-groundbreaking-technologies-in-infinity-v0.6.0-that-revolutionize-hnsw</guid>
            <pubDate>Fri, 17 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Introduction]]></description>
            <content:encoded><![CDATA[<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/toutu-2a751661b46420edf4fcdf67e9b08133.jpg" width="1078" height="460"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="introduction" class="anchor anchorTargetStickyNavbar_Vzrq">Introduction<a href="https://ragflow.io/en/blog/500-percent-faster-vector-retrieval-90-percent-memory-savings-three-groundbreaking-technologies-in-infinity-v0.6.0-that-revolutionize-hnsw#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no"></a></h2>
<p>In RAG (Retrieval-Augmented Generation) and LLM (Large Language Model) Memory, vector retrieval is widely employed. Among various options, graph-based indexing has become the most common choice due to its high accuracy and performance, with the HNSW (Hierarchical Navigable Small World) index being the most representative one<a href="https://github.com/nmslib/hnswlib" target="_blank" rel="noopener noreferrer" class=""><span>1</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a> <a href="https://github.com/facebookresearch/faiss" target="_blank" rel="noopener noreferrer" class=""><span>2</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a>.</p>
<p>However, during our practical application of HNSW in RAGFlow, we encountered the following two major bottlenecks:</p>
<ol>
<li class="">As the data scale continues to grow, the memory consumption of vector data becomes highly significant. For instance, one billion 1024-dimensional floating-point vectors would require approximately 4TB of memory space.</li>
<li class="">When constructing an HNSW index on complex datasets, there is a bottleneck in retrieval accuracy. After reaching a certain threshold, it becomes difficult to further improve accuracy solely by adjusting parameters.</li>
</ol>
<p>To address this, Infinity has implemented a variety of improved algorithms based on HNSW. Users can select different indexing schemes by adjusting the index parameters of HNSW. Each HNSW index variant possesses distinct characteristics and is suitable for different scenarios, allowing users to construct corresponding index structures based on their actual needs.</p>
<h2 id="introduction-to-indexing-schemes" class="anchor anchorTargetStickyNavbar_Vzrq">Introduction to Indexing Schemes<a href="https://ragflow.io/en/blog/500-percent-faster-vector-retrieval-90-percent-memory-savings-three-groundbreaking-technologies-in-infinity-v0.6.0-that-revolutionize-hnsw#introduction-to-indexing-schemes" class="hash-link" aria-label="Direct link to Introduction to Indexing Schemes" title="Direct link to Introduction to Indexing Schemes" translate="no"></a></h2>
<p>The original HNSW, as a commonly used graph-based index, exhibits excellent performance.</p>
<p>Its structure consists of two parts:</p>
<p>A set of original vector data, along with a graph structure jointly constructed by a skip list and an adjacency list. Taking the Python interface as an example, the index can be constructed and utilized in the following manner:</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">## Create index</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">table_obj.create_index(</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    "hnsw_index",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    index.IndexInfo(</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "embedding",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        index.IndexType.Hnsw, {</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            "m": 16,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            "ef_construction": 200,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            "metric": "l2"</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    )</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">)</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">## Vector retrieval</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">query_builder.match_dense('embedding', [1.0, 2.0, 3.0], 'float', 'l2', 10, {'ef': 200})</span><br></span></code></pre></div></div>
<p>To address the issues of high memory consumption and accuracy bottlenecks, Infinity provides the following solutions:</p>
<ol>
<li class="">Introduce LVQ and RaBitQ quantization methods to reduce the memory overhead of original vectors during graph search processes.</li>
<li class="">Introduce the LSG strategy to optimize the graph index structure of HNSW, enhancing its accuracy threshold and query efficiency.</li>
</ol>
<p>To facilitate users in testing the performance of different indexes locally, Infinity provides a benchmark script. You can follow the tutorial provided by Infinity on GitHub to set up the environment and prepare the dataset, and then test different indexing schemes using the benchmark.</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">######################   compile benchmark  ######################</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">cmake --build cmake-build-release --target hnsw_benchmark</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">###################### build index &amp; execute query ######################</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">#           mode : build, query</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain"># benchmark_type : sift, gist, msmarco</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">#     build_type : plain, lvq, crabitq, lsg, lvq_lsg, crabitq_lsg</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">##############################################################</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">benchmark_type=sift</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">build_type=plain</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">./cmake-build-release/benchmark/local_infinity/hnsw_benchmark --mode=build --benchmark_type=$benchmark_type --build_type=$build_type --thread_n=8</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">./cmake-build-release/benchmark/local_infinity/hnsw_benchmark --mode=query --benchmark_type=$benchmark_type --build_type=$build_type --thread_n=8 --topk=10</span><br></span></code></pre></div></div>
<p>Among them, the original HNSW corresponds to the parameter <code>build_type=plain</code>. This paper conducts a unified test on the query performance of all variant indexes, with the experimental environment configuration adopted as follows:</p>
<ol>
<li class="">OS: Ubuntu 24.04 LTS (Noble Numbat)</li>
<li class="">CPU: 13th Gen Intel(R) Core(TM) i5-13400</li>
<li class="">RAM: 64G</li>
</ol>
<p>The CPU has a 16-core specification. To align with the actual device environments of most users, the parallel computing parameter in the benchmark is uniformly set to 8 threads.</p>
<h3 id="solution-1-original-hnsw--lvq-quantizer-hnswlvq" class="anchor anchorTargetStickyNavbar_Vzrq">Solution 1: Original HNSW + LVQ Quantizer (HnswLvq)<a href="https://ragflow.io/en/blog/500-percent-faster-vector-retrieval-90-percent-memory-savings-three-groundbreaking-technologies-in-infinity-v0.6.0-that-revolutionize-hnsw#solution-1-original-hnsw--lvq-quantizer-hnswlvq" class="hash-link" aria-label="Direct link to Solution 1: Original HNSW + LVQ Quantizer (HnswLvq)" title="Direct link to Solution 1: Original HNSW + LVQ Quantizer (HnswLvq)" translate="no"></a></h3>
<p>LVQ is a scalar quantization method that compresses each 32-bit floating-point number in the original vectors into an 8-bit integer<a href="https://arxiv.org/pdf/2304.04759" target="_blank" rel="noopener noreferrer" class=""><span>3</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a>, thereby reducing memory usage to one-fourth of that of the original vectors.</p>
<p>Compared to simple scalar quantization methods (such as mean scalar quantization), LVQ reduces errors by statistically analyzing the residuals of each vector, effectively minimizing information loss in distance calculations for quantized vectors. Consequently, LVQ can accurately estimate the distances between original vectors with only approximately 30% of the original memory footprint.</p>
<p>In the HNSW algorithm, original vectors are utilized for distance calculations, which enables LVQ to be directly integrated with HNSW. We refer to this combined approach as HnswLvq. In Infinity, users can enable LVQ encoding by setting the parameter <code>"encode"</code>: <code>"lvq"</code>:</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">## Create index</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">table_obj.create_index(</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    "hnsw_index",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    index.IndexInfo(</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "embedding",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        index.IndexType.Hnsw, {</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            "m": 16,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            "ef_construction": 200,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            "metric": "l2",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            "encode": "lvq"</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    )</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">)</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">## Vector retrieval</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">query_builder.match_dense('embedding', [1.0, 2.0, 3.0], 'float', 'l2', 10, {'ef': 200})</span><br></span></code></pre></div></div>
<p>The graph structure of HnswLvq remains consistent with that of the original HNSW, with the key difference being that it uses quantized vectors to perform all distance calculations within the graph. Through this improvement, HnswLvq outperforms the original HNSW index in terms of both index construction and query efficiency.</p>
<p>The improvement in construction efficiency stems from the shorter length of quantized vectors, which results in reduced time for distance calculations using SIMD instructions. The enhancement in query efficiency is attributed to the computational acceleration achieved through quantization, which outweighs the negative impact caused by the loss of precision.</p>
<p>In summary, HnswLvq significantly reduces memory usage while maintaining excellent query performance. We recommend that users adopt it as the primary index in most scenarios. To replicate this experiment, users can set the parameter <code>build_type=lvq</code> in the benchmark. The specific experimental results are compared alongside the RaBitQ quantizer scheme in Solution two.</p>
<h3 id="solution-2-original-hnsw--rabitq-quantizer-hnswrabitq" class="anchor anchorTargetStickyNavbar_Vzrq">Solution 2: Original HNSW + RaBitQ Quantizer (HnswRabitq)<a href="https://ragflow.io/en/blog/500-percent-faster-vector-retrieval-90-percent-memory-savings-three-groundbreaking-technologies-in-infinity-v0.6.0-that-revolutionize-hnsw#solution-2-original-hnsw--rabitq-quantizer-hnswrabitq" class="hash-link" aria-label="Direct link to Solution 2: Original HNSW + RaBitQ Quantizer (HnswRabitq)" title="Direct link to Solution 2: Original HNSW + RaBitQ Quantizer (HnswRabitq)" translate="no"></a></h3>
<p>RaBitQ is a binary scalar quantization method that shares a similar core idea with LVQ, both aiming to replace the 32-bit floating-point numbers in original vectors with fewer encoded bits. The difference lies in that RaBitQ employs binary scalar quantization, representing each floating-point number with just 1 bit, thereby achieving an extremely high compression ratio.</p>
<p>However, this extreme compression also leads to more significant information loss in the vectors, resulting in a decline in the accuracy of distance estimation. To mitigate this issue, RaBitQ introduces a rotation matrix to preprocess the dataset during the preprocessing stage and retains more residual information, thereby reducing errors in distance calculations to a certain extent<a href="https://doi.org/10.1145/3654970" target="_blank" rel="noopener noreferrer" class=""><span>4</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a>.</p>
<p>Nevertheless, binary quantization has obvious limitations in terms of precision, showing a substantial gap compared to LVQ. Indexes built directly using RaBitQ encoding exhibit poor query performance.</p>
<p>Therefore, the HnswRabitq scheme implemented in Infinity involves first constructing an original HNSW index for the dataset and then converting it into an HnswRabitq index through the <code>compress_to_rabitq</code> parameter in the optimize method.</p>
<p>During the query process, the system initially uses quantized vectors for preliminary retrieval and then re-ranks the ef candidate results specified by the user using the original vectors.</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">## Create index</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">table_obj.create_index(</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    "hnsw_index",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    index.IndexInfo(</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "embedding",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        index.IndexType.Hnsw, {</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            "m": 16,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            "ef_construction": 200,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            "metric": "l2"</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    )</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">)</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">## Construct RaBitQ coding</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">table_obj.optimize("hnsw_index", {"compress_to_rabitq": "true"})</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">## Vector retrieval</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">query_builder.match_dense('embedding', [1.0, 2.0, 3.0], 'float', 'l2', 10, {'ef': 200})</span><br></span></code></pre></div></div>
<p>Compared to LVQ, RaBitQ can further reduce the memory footprint of encoded vectors by nearly 70%. On some datasets, the query efficiency of HnswRabitq even surpasses that of HnswLvq due to the higher efficiency of distance calculations after binary quantization.</p>
<p>However, it should be noted that on certain datasets (such as sift1M), the quantization process may lead to significant precision loss, making such datasets unsuitable for using HnswRabitq.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/infinity-1-1e03abbcd2afec044598936d15a2deeb.jpg" width="1823" height="262"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/infinity-2-eabd8476481ef100fb86b67aa6fe93ac.png" width="1341" height="633"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/infinity-3-2324189c64c6fd19a843f1739e8fc0ad.jpg" width="1869" height="273"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/infinity-4-b49cbd08aa034f55f8d449ebc36861cb.png" width="1280" height="550"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>In summary, if a user's dataset is not sensitive to quantization errors, adopting the HnswRabitq index can significantly reduce memory overhead while still maintaining relatively good query performance.</p>
<p>In such scenarios, it is recommended to prioritize the use of the HnswRabitq index. Users can replicate the aforementioned experiments by setting the benchmark parameter <code>build_type=crabitq</code>.</p>
<h3 id="solution-3-lsg-graph-construction-strategy" class="anchor anchorTargetStickyNavbar_Vzrq">Solution 3: LSG Graph Construction Strategy<a href="https://ragflow.io/en/blog/500-percent-faster-vector-retrieval-90-percent-memory-savings-three-groundbreaking-technologies-in-infinity-v0.6.0-that-revolutionize-hnsw#solution-3-lsg-graph-construction-strategy" class="hash-link" aria-label="Direct link to Solution 3: LSG Graph Construction Strategy" title="Direct link to Solution 3: LSG Graph Construction Strategy" translate="no"></a></h3>
<p>LSG (Local Scaling Graph) is an improved graph construction strategy based on graph indexing algorithms (such as HNSW, DiskANN, etc.) <a href="https://doi.ieeecomputersociety.org/10.1109/ICDE65448.2025.00032" target="_blank" rel="noopener noreferrer" class=""><span>5</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a>.</p>
<p>This strategy scales the distance (e.g., L2 distance, inner product distance, etc.) between any two vectors by statistically analyzing the local information—neighborhood radius—of each vector in the dataset. The scaled distance is referred to as the LS distance.</p>
<p>During the graph indexing construction process, LSG uniformly replaces the original distance metric with the LS distance, effectively performing a "local scaling" of the original metric space. Through theoretical proofs and experiments, the paper demonstrates that constructing a graph index in this scaled space can achieve superior query performance in the original space.</p>
<p>LSG optimizes the HNSW index in multiple ways. When the accuracy requirement is relatively lenient (&lt; 99%), LSG exhibits higher QPS (Queries Per Second) compared to the original HNSW index.</p>
<p>In high-precision scenarios (&gt; 99%), LSG enhances the quality of the graph index, enabling HNSW to surpass its original accuracy limit and achieve retrieval accuracy that is difficult for the original HNSW index to attain. These improvements translate into faster response times and more precise query results for users in real-world applications of RAGFlow.</p>
<p>In Infinity, LSG is provided as an optional parameter for HNSW. Users can enable this graph construction strategy by setting build_type=lsg, and we refer to the corresponding index as HnswLsg.</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">## Create index</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">table_obj.create_index(</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    "hnsw_index",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    index.IndexInfo(</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        "embedding",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        index.IndexType.Hnsw, {</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            "m": 16,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            "ef_construction": 200,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            "metric": "l2",</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">            "build_type": "lsg"</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">    )</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">)</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">## Vector retrieval</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">query_builder.match_dense('embedding', [1.0, 2.0, 3.0], 'float', 'l2', 10, {'ef': 200})</span><br></span></code></pre></div></div>
<p>LSG essentially alters the metric space during the index construction process. Therefore, it can not only be applied to the original HNSW but also be combined with quantization methods (such as LVQ or RaBitQ) to form variant indexes like HnswLvqLsg or HnswRabitqLsg. The usage of the user interface remains consistent with that of HnswLvq and HnswRabitq.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/infinity-5-60cb515bfc10ec6ccabf57a78dc561ae.jpg" width="1772" height="213"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/infinity-6-e038b7f51b77e676f6dce5083de20da6.png" width="1344" height="652"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>LSG can enhance the performance of the vast majority of graph indexes and datasets, but at the cost of additional computation of local information—neighborhood radius—during the graph construction phase, which thus increases the construction time to a certain extent. For example, on the sift1M dataset, the construction time of HnswLsg is approximately 1.2 times that of the original HNSW.</p>
<p>In summary, if users are not sensitive to index construction time, they can confidently enable the LSG option, as it can steadily improve query performance. Users can replicate the aforementioned experiments by setting the benchmark parameter to <code>build_type=[lsg/lvq_lsg/crabitq_lsg]</code>.</p>
<h2 id="index-performance-evaluation" class="anchor anchorTargetStickyNavbar_Vzrq">Index Performance Evaluation<a href="https://ragflow.io/en/blog/500-percent-faster-vector-retrieval-90-percent-memory-savings-three-groundbreaking-technologies-in-infinity-v0.6.0-that-revolutionize-hnsw#index-performance-evaluation" class="hash-link" aria-label="Direct link to Index Performance Evaluation" title="Direct link to Index Performance Evaluation" translate="no"></a></h2>
<p>To evaluate the performance of various indexes in Infinity, we selected three representative datasets as benchmarks, including the widely used sift and gist datasets in vector index evaluations.</p>
<p>Given that Infinity is frequently used in conjunction with RAGFlow in current scenarios, the retrieval effectiveness on RAG-type datasets is particularly crucial for users assessing index performance.</p>
<p>Therefore, we also incorporated the msmarco dataset. This dataset was generated by encoding the TREC-RAG 2024 corpus using the Cohere Embed English v3 model, comprising embedded vectors for 113.5 million text passages, as well as embedded vectors corresponding to 1,677 query instructions from TREC-Deep Learning 2021-2023.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/infinity-7-21c893f07ec272c0d5b47a6152bb3f70.png" width="1280" height="848"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/infinity-8-b49cc9b948e6d22b1ee65c87d2612b26.png" width="1280" height="849"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/infinity-9-8de8d6dc47119ad8061810afdc666e52.png" width="1280" height="849"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>From the test results of each dataset, it can be observed that in most cases, HnswRabitqLsg achieves the best overall performance. For instance, on the msmarco dataset in RAG scenarios, RaBitQ achieves a 90% reduction in memory usage while delivering query performance that is 5 times that of the original HNSW at a 99% recall rate.</p>
<p>Based on the above experimental results, we offer the following practical recommendations for Infinity users:</p>
<ol>
<li class="">The original HNSW can attain a higher accuracy ceiling compared to HnswLvq and HnswRabitq. If users have extremely high accuracy requirements, this strategy should be prioritized.</li>
<li class="">Within the allowable accuracy range, HnswLvq can be confidently selected for most datasets. For datasets that are less susceptible to quantization effects, HnswRabitq is generally a better choice.</li>
<li class="">The LSG strategy enhances performance across all index variants. If users are not sensitive to index construction time, it is recommended to enable this option in all scenarios to improve query efficiency. Additionally, due to its algorithmic characteristics, LSG can significantly raise the accuracy ceiling. Therefore, if the usage scenario demands extremely high accuracy (&gt;99.9%), enabling LSG is strongly recommended to optimize index performance.</li>
</ol>
<p>Infinity continues to iterate and improve. We welcome ongoing attention and valuable feedback and suggestions from everyone.</p>]]></content:encoded>
            <category>Technologies</category>
        </item>
        <item>
            <title><![CDATA[RAGFlow 0.21.0 - Ingestion Pipeline, Long-Context RAG, and Admin CLI]]></title>
            <link>https://ragflow.io/en/blog/ragflow-0.21.0-ingestion-pipeline-long-context-rag-and-admin-cli</link>
            <guid>https://ragflow.io/en/blog/ragflow-0.21.0-ingestion-pipeline-long-context-rag-and-admin-cli</guid>
            <pubDate>Wed, 15 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[RAGFlow 0.21.0 officially released]]></description>
            <content:encoded><![CDATA[<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/ingestion_pipeline_cover-996d540773231269cc6d96341d3bce9a.PNG" width="1280" height="546"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="ragflow-0210-officially-released" class="anchor anchorTargetStickyNavbar_Vzrq">RAGFlow 0.21.0 officially released<a href="https://ragflow.io/en/blog/ragflow-0.21.0-ingestion-pipeline-long-context-rag-and-admin-cli#ragflow-0210-officially-released" class="hash-link" aria-label="Direct link to RAGFlow 0.21.0 officially released" title="Direct link to RAGFlow 0.21.0 officially released" translate="no"></a></h2>
<p>This release shifts focus from enhancing online Agent capabilities to strengthening the data foundation, prioritising usability and dialogue quality from the ground up. Directly addressing common RAG pain points—from data preparation to long-document understanding—version 0.21.0 brings crucial upgrades: a flexible, orchestratable Ingestion Pipeline, long-context RAG to close semantic gaps in complex files, and a new admin CLI for smoother operations. Taken together, these elements establish RAGFlow’s refreshed data-pipeline core, providing a more solid foundation for building robust and effective RAG applications.</p>
<h2 id="orchestratable-ingestion-pipeline" class="anchor anchorTargetStickyNavbar_Vzrq">Orchestratable Ingestion Pipeline<a href="https://ragflow.io/en/blog/ragflow-0.21.0-ingestion-pipeline-long-context-rag-and-admin-cli#orchestratable-ingestion-pipeline" class="hash-link" aria-label="Direct link to Orchestratable Ingestion Pipeline" title="Direct link to Orchestratable Ingestion Pipeline" translate="no"></a></h2>
<p>If earlier Agents primarily tackled the orchestration of online data—as seen in Workflow and Agentic Workflow—the Ingestion Pipeline mirrors this capability by applying the same technical architecture to orchestrate offline data ingestion. Its introduction enables users to construct highly customized RAG data pipelines within a unified framework. This not only streamlines bespoke development but also more fully embodies the "Flow" in RAGFlow.</p>
<p>A typical RAG ingestion process involves key stages such as document parsing, text chunking, vectorization, and index building. When RAGFlow first launched in April 2024, it already incorporated an advanced toolchain, including the DeepDoc-based parsing engine and a templated chunking mechanism. These state-of-the-art solutions were foundational to its early adoption.</p>
<p>However, with rapid industry evolution and deeper practical application, we have observed new trends and demands:</p>
<ul>
<li class="">The rise of Vision Language Models (VLMs): Increasingly mature VLMs have driven a wave of fine-tuned document parsing models. These offer significantly improved accuracy for unstructured documents with complex layouts or mixed text and images.</li>
<li class="">Demand for flexible chunking: Users now seek more customized chunking strategies. Faced with diverse knowledge-base scenarios, RAGFlow's original built-in chunking templates have proved insufficient for covering all niche cases, which can impact the accuracy of final Q&amp;A outcomes.</li>
</ul>
<p>To this end, RAGFlow 0.21.0 formally introduces the Ingestion Pipeline, featuring core capabilities including:</p>
<ul>
<li class="">Orchestratable Data Ingestion: Building on the underlying Agent framework, users can create varied data ingestion pipelines. Each pipeline may apply different strategies to connect a data source to the final index, turning the previous built-in data-writing process into a user-customizable workflow. This provides more flexible ingestion aligned with specific business logic.</li>
<li class="">Decoupling of Upload and Cleansing: The architecture separates data upload from cleansing, establishing standard interfaces for future batch data sources and a solid foundation for expanding data preprocessing workflows.</li>
<li class="">Refactored Parser: The Parser component has been redesigned for extensibility, laying groundwork for integrating advanced document-parsing models beyond DeepDoc.</li>
<li class="">Customizable Chunking Interface: By decoupling the chunking step, users can plug in custom chunkers to better suit the segmentation needs of different knowledge structures.</li>
<li class="">Optimized Efficiency for Complex RAG: The execution of IO/compute-intensive tasks, such as GraphRAG and RAPTOR, has been overhauled. In the pre-pipeline architecture, processing each new document triggered a full compute cycle, resulting in slow performance. The new pipeline enables batch execution, significantly improving data throughput and overall efficiency.</li>
</ul>
<p>If ETL/ELT represents the standard pipeline for processing structured data in the modern data stack—with tools like dbt and Fivetran providing unified and flexible data integration solutions for data warehouses and data lakes—then RAGFlow's Ingestion Pipeline is positioned to become the equivalent infrastructure for unstructured data.
The following diagram illustrates this architectural analogy:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/etl-d6881635db05cfb72ca27d4ed2c59d21.PNG" width="1280" height="913"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Specifically, while the Extract phase in ETL/ELT is responsible for pulling data from diverse sources, the RAGFlow Ingestion Pipeline augments this with a dedicated Parsing stage to extract information from unstructured data. This stage integrates multiple parsing models, led by DeepDoc, to convert multimodal documents (for example, text and images) into a unimodal representation suitable for processing.</p>
<p>In the Transform phase, where traditional ETL/ELT focuses on data cleansing and business logic, RAGFlow instead constructs a series of LLM-centric Agent components. These are optimized to address semantic gaps in retrieval, with a core mission that can be summarized as: to enhance recall and ranking accuracy.</p>
<p>For data loading, ETL/ELT writes results to a data warehouse or data lake, while RAGFlow uses an Indexer component to build the processed content into a retrieval-optimised index format. This reflects the RAG engine’s hybrid retrieval architecture, which must support full-text, vector, and future tensor-based retrieval to ensure optimal recall.</p>
<p>Thus, the modern data stack serves business analytics for structured data, whereas a RAG engine with an Ingestion Pipeline specializes in the intelligent retrieval of unstructured data—providing high-quality context for LLMs. Each occupies an equivalent ecological niche in its domain.</p>
<p>Regarding processing structured data, this is not the RAG engine’s core duty. It is handled by a Context Layer built atop the engine. This layer leverages the MCP (Model Context Protocol)—described as “TCP/IP for the AI era” —and accompanying Context Engineering to automate the population of all context types. This is a key focus area for RAGFlow’s next development phase.</p>
<p>Below is a preliminary look at the Ingestion Pipeline in v0.21.0; a more detailed guide will follow. We have introduced components for parsing, chunking, and other unstructured data processing tasks into the Agent Canvas, enabling users to freely orchestrate their parsing workflows.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/ingestion_pipeline_common-51eb24c41eaa08176ebfb9c47bb5aa1e.png" width="1280" height="809"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Orchestrating an Ingestion Pipeline automates the process of parsing files and chunking them by length. It then leverages a large language model to generate summaries, keywords, questions, and even metadata. Previously, this metadata had to be entered manually. Now, a single configuration dramatically reduces maintenance overhead.</p>
<p>Furthermore, the pipeline process is fully observable, recording and displaying complete processing logs for each file.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/observable_ingestion_pipeline-6e5ccca80721161a2227002ba56882b7.png" width="1280" height="660"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>The implementation of the Ingestion Pipeline in version 0.21.0 is a foundational step. In the next release, we plan to significantly enhance it by:</p>
<ul>
<li class="">Adding support for more data sources.</li>
<li class="">Providing a wider selection of Parsers.</li>
<li class="">Introducing more flexible Transformer components to facilitate orchestration of a richer set of semantic-enhancement templates.</li>
</ul>
<h2 id="long-context-rag" class="anchor anchorTargetStickyNavbar_Vzrq">Long-context RAG<a href="https://ragflow.io/en/blog/ragflow-0.21.0-ingestion-pipeline-long-context-rag-and-admin-cli#long-context-rag" class="hash-link" aria-label="Direct link to Long-context RAG" title="Direct link to Long-context RAG" translate="no"></a></h2>
<p>As we enter 2025, Retrieval-Augmented Generation (RAG) faces notable challenges driven by two main factors.</p>
<p>Fundamental limitations of traditional RAG</p>
<p>Traditional RAG architectures often fail to guarantee strong dialogue performance because they rely on a retrieval mechanism built around text chunks as the primary unit. This makes them highly sensitive to chunk quality and can yield degraded results due to insufficient context. For example:</p>
<ul>
<li class="">If a coherent semantic unit is split across chunks, retrieval can be incomplete.</li>
<li class="">If a chunk lacks global context, the information presented to the LLM is weakened.</li>
</ul>
<p>While strategies such as automatically detecting section headers and attaching them to chunks can help with global semantics, they are constrained by header-identification accuracy and the header’s own completeness.</p>
<p>Cost-efficiency concerns with advanced pre-processing techniques</p>
<p>Modern pre-processing methods—GraphRAG, RAPTOR, and Context Retrieval—aim to inject additional semantic information into raw data to boost search hit rates and accuracy for complex queries. They, however, share issues of high cost and unpredictable effectiveness.</p>
<ul>
<li class="">GraphRAG: This approach often consumes many times more tokens than the original text, and the automatically generated knowledge graphs are frequently unsatisfactory. Its effectiveness in complex multi-hop reasoning is limited by uncontrollable reasoning paths. As a supplementary retrieval outside the original chunks, the knowledge graph also loses some granular context from the source.</li>
<li class="">RAPTOR: This technique produces clustered summaries that are recalled as independent chunks but naturally lack the detail of the source text, reintroducing the problem of insufficient context.</li>
</ul>
<p>Context Retrieval: This method enriches original chunks with extra semantics such as keywords or potential questions. It presents a clear trade-off:</p>
<ul>
<li class="">The more effective option queries the LLM multiple times per chunk, using both full text and the current chunk for context, improving performance but driving token costs several times higher than the original text.</li>
<li class="">The cheaper option generates semantic information based only on the current chunk, saving costs but providing limited global context and modest performance gains.
The last few years have seen the emergence of new RAG schemes.</li>
<li class="">Complete abandonment of retrieval: some approaches have the LLM read documents directly, splitting them into chunks according to the context window and performing multi-stage searches. First, the LLM decides which global document is relevant, then which chunks, and finally loads those chunks to answer. While this avoids recall inaccuracies, it harms response latency, concurrency, and large-scale data handling, making practical deployment difficult.</li>
<li class="">Abandoning embedding or indexing in favour of tools like grep: this evolves RAG into Agentic RAG. As applications grow more complex and user queries diversify, combining RAG with agents is increasingly inevitable, since only LLMs can translate raw inquiries into structured retrieval commands. In RAGFlow, this capability has long been realized. Abandoning indexing to use grep is a compromise for simplifying agent development in personal or small-scale contexts; in enterprise settings, a powerful retrieval engine remains essential.</li>
<li class="">Long-Context RAG: introduced in version 0.21.0 as part of the same family as GraphRAG, RAPTOR and Context Retrieval, this approach uses LLMs to enrich raw text semantics to boost recall while retaining indexing and search. Retrieval remains central. Long-context RAG mirrors how people consult information: identify relevant chapters via the table of contents, then locate exact pages for detail. During indexing, the LLM extracts and attaches chapter information to each chunk to provide global context; during retrieval, it finds matching chunks and uses the table-of-contents structure to fill in gaps from chunk fragmentation.</li>
<li class="">Current experience and future direction: users can try Long-Context RAG via the “TOC extraction” (Table of Contents) feature, though it is in beta. The next release will add an Ingestion Pipeline. A key path to improving RAG lies in using LLMs to enrich content semantics without discarding retrieval altogether. Consequently, a flexible pipeline that lets users assemble LLM-based content-transformation components is an important direction for enhancing RAG retrieval quality.</li>
</ul>
<h2 id="backend-management-cli" class="anchor anchorTargetStickyNavbar_Vzrq">Backend management CLI<a href="https://ragflow.io/en/blog/ragflow-0.21.0-ingestion-pipeline-long-context-rag-and-admin-cli#backend-management-cli" class="hash-link" aria-label="Direct link to Backend management CLI" title="Direct link to Backend management CLI" translate="no"></a></h2>
<p>RAGFlow’s progression has shifted from core module development to strengthening administrative and operational capabilities.</p>
<ul>
<li class="">In earlier versions, while parsing and retrieval-augmented generation improved, system administration lagged. Administrators could not modify passwords or delete accounts, complicating deployment and maintenance.</li>
<li class="">With RAGFlow 0.21.0, fundamental system management is markedly improved. A new command-line administration tool provides a central, convenient interface for administrators. Core capabilities include:<!-- -->
<ul>
<li class="">Service lifecycle management: monitoring built-in RAGFlow services for greater operational flexibility.</li>
<li class="">Comprehensive user management:<!-- -->
<ul>
<li class="">Create new registered users.</li>
<li class="">Directly modify login passwords.</li>
<li class="">Delete user accounts.</li>
<li class="">Enable or disable accounts.</li>
<li class="">View details of all registered users.</li>
</ul>
</li>
<li class="">Resource overview: listing knowledge bases and Agents created under registered users for system-wide monitoring.</li>
</ul>
</li>
</ul>
<p>This upgrade underlines RAGFlow’s commitment to robust functionality and foundational administrative strength essential for enterprise use. Looking ahead, the team plans an enterprise-grade web administration panel and accompanying user interface to streamline management, boost efficiency, and enhance the end-user experience, supporting greater maturity and stability.</p>
<h2 id="finale" class="anchor anchorTargetStickyNavbar_Vzrq">Finale<a href="https://ragflow.io/en/blog/ragflow-0.21.0-ingestion-pipeline-long-context-rag-and-admin-cli#finale" class="hash-link" aria-label="Direct link to Finale" title="Direct link to Finale" translate="no"></a></h2>
<p>RAGFlow 0.21.0 marks a significant milestone, building on prior progress and outlining future developments. It introduces the first integration of Retrieval (RAG) with orchestration (Flow), forming an intelligent engine to support the LLM context layer, underpinned by unstructured data ELT and a robust RAG capability set.</p>
<p>From the user-empowered Ingestion Pipeline to long-context RAG that mitigates semantic fragmentation, and the management backend that ensures reliable operation, every new feature is designed to make the RAG system smarter, more flexible, and enterprise-ready. This is not merely a feature tally but an architectural evolution, establishing a solid foundation for future growth.</p>
<p>Our ongoing focus remains the LLM context layer: building a powerful, reliable data foundation for LLMs and effectively serving all Agents. This remains RAGFlow’s core aim.</p>
<p>We invite you to continue following and starring our project as we grow together.</p>
<p>GitHub: <a href="https://github.com/infiniflow/ragflow" target="_blank" rel="noopener noreferrer" class=""><span>https://github.com/infiniflow/ragflow</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></p>]]></content:encoded>
            <category>Product News</category>
        </item>
        <item>
            <title><![CDATA[Tutorial - Build an E-Commerce Customer Support Agent Using RAGFlow]]></title>
            <link>https://ragflow.io/en/blog/tutorial-build-an-e-commerce-customer-support-agent-using-ragflow</link>
            <guid>https://ragflow.io/en/blog/tutorial-build-an-e-commerce-customer-support-agent-using-ragflow</guid>
            <pubDate>Fri, 12 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Currently, e-commerce retail platforms extensively use intelligent customer service systems to manage a wide range of user enquiries. However, traditional intelligent customer service often struggles to meet users’ increasingly complex and varied needs. For example, customers may require detailed comparisons of functionalities between different product models before making a purchase; they might be unable to use certain features due to losing the instruction manual; or, in the case of home products, they may need to arrange an on-site installation appointment through customer service.]]></description>
            <content:encoded><![CDATA[<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/phonecall-0766db01288954bc13b6d882fa9434de.png" width="1380" height="669"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Currently, e-commerce retail platforms extensively use intelligent customer service systems to manage a wide range of user enquiries. However, traditional intelligent customer service often struggles to meet users’ increasingly complex and varied needs. For example, customers may require detailed comparisons of functionalities between different product models before making a purchase; they might be unable to use certain features due to losing the instruction manual; or, in the case of home products, they may need to arrange an on-site installation appointment through customer service.</p>
<p>To address these challenges, we have identified several common demand scenarios, including queries about functional differences between product models, requests for usage assistance, and scheduling of on-site installation services. Building on the recently launched Agent framework of RAGFlow, this blog presents an approach for the automatic identification and branch-specific handling of user enquiries, achieved by integrating workflow orchestration with large language models.</p>
<p>The workflow is orchestrated as follows:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/1-779c331885831a1505700ddbabb733fd.PNG" width="1280" height="784"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>The following sections offer a detailed explanation of the implementation process for this solution.</p>
<h2 id="1-prepare-datasets" class="anchor anchorTargetStickyNavbar_Vzrq">1. Prepare datasets<a href="https://ragflow.io/en/blog/tutorial-build-an-e-commerce-customer-support-agent-using-ragflow#1-prepare-datasets" class="hash-link" aria-label="Direct link to 1. Prepare datasets" title="Direct link to 1. Prepare datasets" translate="no"></a></h2>
<h3 id="11-create-datasets" class="anchor anchorTargetStickyNavbar_Vzrq">1.1 Create datasets<a href="https://ragflow.io/en/blog/tutorial-build-an-e-commerce-customer-support-agent-using-ragflow#11-create-datasets" class="hash-link" aria-label="Direct link to 1.1 Create datasets" title="Direct link to 1.1 Create datasets" translate="no"></a></h3>
<p>You can download the sample datasets from <a href="https://huggingface.co/datasets/InfiniFlow/Ecommerce-Customer-Service-Workflow" target="_blank" rel="noopener noreferrer" class=""><span>Hugging Face Datasets</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a>.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/createdatasets-785f6edd83b5af967230d240fc84e89e.png" width="1453" height="286"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Create the "Product Information" and "User Guide" knowledge bases and upload the relevant dataset documents.</p>
<h3 id="12-parse-documents" class="anchor anchorTargetStickyNavbar_Vzrq">1.2 Parse documents<a href="https://ragflow.io/en/blog/tutorial-build-an-e-commerce-customer-support-agent-using-ragflow#12-parse-documents" class="hash-link" aria-label="Direct link to 1.2 Parse documents" title="Direct link to 1.2 Parse documents" translate="no"></a></h3>
<p>For documents in the 'Product Information' and 'User Guide' knowledge bases, we choose to use Manual chunking.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/2-3c257b1c60951c35bcb62495b5b0ed9e.PNG" width="1280" height="744"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Product manuals are often richly illustrated with a combination of text and images, containing extensive information and complex structures. Relying solely on text length for segmentation risks compromising the integrity of the content. RAGFlow assumes such documents follow a hierarchical structure and therefore uses the "smallest heading" as the basic unit of segmentation, ensuring each section of text and its accompanying graphics remain intact within a single chunk.
A preview of the user manual following segmentation is shown below:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/3-748661a1f21a372bafbdc05770d1bc5a.png" width="1280" height="638"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="2-build-workflow" class="anchor anchorTargetStickyNavbar_Vzrq">2. Build workflow<a href="https://ragflow.io/en/blog/tutorial-build-an-e-commerce-customer-support-agent-using-ragflow#2-build-workflow" class="hash-link" aria-label="Direct link to 2. Build workflow" title="Direct link to 2. Build workflow" translate="no"></a></h2>
<h3 id="21-create-an-app" class="anchor anchorTargetStickyNavbar_Vzrq">2.1 Create an app<a href="https://ragflow.io/en/blog/tutorial-build-an-e-commerce-customer-support-agent-using-ragflow#21-create-an-app" class="hash-link" aria-label="Direct link to 2.1 Create an app" title="Direct link to 2.1 Create an app" translate="no"></a></h3>
<p>Upon successful creation, the system will automatically generate a Begin component on the canvas.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/1-24759098862a63d926cbbff7d0d18300.jpg" width="1280" height="801"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>In the Begin component, the opening greeting message for customer service can be configured, for example:</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">Hi! I'm your assistant. </span><br></span></code></pre></div></div>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/4-a934bd0e6db3ba5dd465580100d67064.png" width="770" height="631"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="22-add-a-categorize-component" class="anchor anchorTargetStickyNavbar_Vzrq">2.2 Add a Categorize component<a href="https://ragflow.io/en/blog/tutorial-build-an-e-commerce-customer-support-agent-using-ragflow#22-add-a-categorize-component" class="hash-link" aria-label="Direct link to 2.2 Add a Categorize component" title="Direct link to 2.2 Add a Categorize component" translate="no"></a></h3>
<p>The Categorize component uses a Large Language Model (LLM) for intent recognition. It classifies user inputs and routes them to the appropriate processing workflows based on the category’s name, description, and provided examples.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/5-e6606e3eb39f725ac5ee06ebe8f36518.png" width="1085" height="663"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="23-build-a-product-feature-comparison-workflow" class="anchor anchorTargetStickyNavbar_Vzrq">2.3 Build a product feature comparison workflow<a href="https://ragflow.io/en/blog/tutorial-build-an-e-commerce-customer-support-agent-using-ragflow#23-build-a-product-feature-comparison-workflow" class="hash-link" aria-label="Direct link to 2.3 Build a product feature comparison workflow" title="Direct link to 2.3 Build a product feature comparison workflow" translate="no"></a></h3>
<p>The Retrieval component connects to the "Product Information" knowledge base to fetch content relevant to the user’s query, which is then passed to the Agent component to generate a response.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/6-8dea7141c411aeecd4430c759bf725b9.png" width="1122" height="558"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Add a Retrieval component named "Feature Comparison Knowledge Base" and link it to the "Product Information" knowledge base.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/7-67c9d876eb2081c06596b538fc14263e.png" width="764" height="942"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Add an Agent component after the Retrieval component, name it "Feature Comparison Agent," and configure the System Prompt as follows:</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">## Role</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">You are a product specification comparison assistant.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">## Goal</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Help the user compare two or more products based on their features and specifications. Provide clear, accurate, and concise comparisons to assist the user in making an informed decision.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">---</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">## Instructions</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Start by confirming the product models or options the user wants to compare.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- If the user has not specified the models, politely ask for them.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Present the comparison in a structured way (e.g., bullet points or a table format if supported).</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Highlight key differences such as size, capacity, performance, energy efficiency, and price if available.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Maintain a neutral and professional tone without suggesting unnecessary upselling.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">---</span><br></span></code></pre></div></div>
<p>Configure User prompt</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">User's query is /(Begin Input) sys.query </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Schema is /(Feature Comparison Knowledge Base) formalized_content</span><br></span></code></pre></div></div>
<p>After configuring the Agent component, the result is as follows:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/8-8af39f9b308da4a392308ded2a4f3479.png" width="765" height="1243"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="24-build-a-product-user-guide-workflow" class="anchor anchorTargetStickyNavbar_Vzrq">2.4 Build a product user guide workflow<a href="https://ragflow.io/en/blog/tutorial-build-an-e-commerce-customer-support-agent-using-ragflow#24-build-a-product-user-guide-workflow" class="hash-link" aria-label="Direct link to 2.4 Build a product user guide workflow" title="Direct link to 2.4 Build a product user guide workflow" translate="no"></a></h3>
<p>The Retrieval component queries the "User Guide" knowledge base for content relevant to the user’s question, then passes the results to the Agent component to formulate a response.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/9-6f1dd2765a9fa64b4b00d4774a2202b1.png" width="1105" height="553"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Add a Retrieval component named "Usage Guide Knowledge Base" and link it to the "User Guide" knowledge base.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/10-ab7aca5218811a68c33f359583e7b40f.png" width="772" height="974"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Add an Agent component after the Retrieval component, name it "Usage Guide Agent," and configure its System Prompt as follows:</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">## Role</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">You are a product usage guide assistant.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">## Goal</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Provide clear, step-by-step instructions to help the user set up, operate, and maintain their product. Answer questions about functions, settings, and troubleshooting.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">---</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">## Instructions</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- If the user asks about setup, provide easy-to-follow installation or configuration steps.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- If the user asks about a feature, explain its purpose and how to activate it.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- For troubleshooting, suggest common solutions first, then guide through advanced checks if needed.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Keep the response simple, clear, and actionable for a non-technical user.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">---</span><br></span></code></pre></div></div>
<p>Write user prompt</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">User's query is /(Begin Input) sys.query </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Schema is / (Usage Guide Knowledge Base) formalized_content</span><br></span></code></pre></div></div>
<p>After configuring the Agent component, the result is as follows:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/12-5d825a21aa6f1659e185b98ba676fefc.png" width="591" height="1053"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="25-build-an-installation-booking--assistant" class="anchor anchorTargetStickyNavbar_Vzrq">2.5 Build an installation booking  assistant<a href="https://ragflow.io/en/blog/tutorial-build-an-e-commerce-customer-support-agent-using-ragflow#25-build-an-installation-booking--assistant" class="hash-link" aria-label="Direct link to 2.5 Build an installation booking  assistant" title="Direct link to 2.5 Build an installation booking  assistant" translate="no"></a></h3>
<p>The Agent engages in a multi-turn dialogue with the user to collect three key pieces of information: contact number, installation time, and installation address.
Create an Agent component named "Installation Booking Agent" and configure its System Prompt as follows:</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain"># Role</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">You are an Installation Booking Assistant.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">## Goal</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Collect the following three pieces of information from the user </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">1. Contact Number  </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">2. Preferred Installation Time  </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">3. Installation Address  </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Once all three are collected, confirm the information and inform the user that a technician will contact them later by phone.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">## Instructions</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">1. **Check if all three details** (Contact Number, Preferred Installation Time, Installation Address) have been provided.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">2. **If some details are missing**, acknowledge the ones provided and only ask for the missing information.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">3. Do **not repeat** the full request once some details are already known.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">4. Once all three details are collected, summarize and confirm them with the user.</span><br></span></code></pre></div></div>
<p>Write user prompt</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">User's query is /(Begin Input) sys.query </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<p>After configuring the Agent component, the result is as follows:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/14-d585bb03421aa50fe0126315c7262a46.png" width="591" height="1053"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>If user information needs to be registered, an HTTP Request component can be connected after the Agent component to transmit the data to platforms such as Google Sheets or Notion. Developers may implement this according to their specific requirements; this blog article does not cover implementation details.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/15-f68768593ca28b5df257c905c74703a4.png" width="1280" height="541"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="26-add-a-reply-message-component" class="anchor anchorTargetStickyNavbar_Vzrq">2.6 Add a reply message component<a href="https://ragflow.io/en/blog/tutorial-build-an-e-commerce-customer-support-agent-using-ragflow#26-add-a-reply-message-component" class="hash-link" aria-label="Direct link to 2.6 Add a reply message component" title="Direct link to 2.6 Add a reply message component" translate="no"></a></h3>
<p>For these three workflows, a single Message component is used to receive the output from the Agent components, which then displays the processed results to the user.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/17-7bce84da2f8ff4efad8b0a9f1f782d4a.png" width="1087" height="561"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="27-save-and-test" class="anchor anchorTargetStickyNavbar_Vzrq">2.7 Save and test<a href="https://ragflow.io/en/blog/tutorial-build-an-e-commerce-customer-support-agent-using-ragflow#27-save-and-test" class="hash-link" aria-label="Direct link to 2.7 Save and test" title="Direct link to 2.7 Save and test" translate="no"></a></h3>
<p>Click Save → Run → View Execution Result.
When inquiring about product models and features, the system correctly returns a comparison:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/18-277206e585a8e9257bf55a46de58e1f4.png" width="1280" height="977"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>When asked about usage instructions, the system provides accurate guidance:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/19-399796e7a1fbcd5e5ed83382a622479b.png" width="1280" height="996"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>When scheduling an installation, the system collects and confirms all necessary information:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/20-ba0a95f26685de5453a3626769eb3ae4.png" width="1280" height="1001"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="summary" class="anchor anchorTargetStickyNavbar_Vzrq">Summary<a href="https://ragflow.io/en/blog/tutorial-build-an-e-commerce-customer-support-agent-using-ragflow#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary" translate="no"></a></h2>
<p>This use case can also be implemented using an Agent-based workflow, which offers the advantage of flexibly handling complex problems. However, since Agents actively engage in planning and reflection, they often significantly increase response times, leading to a diminished customer experience. As such, this approach is not well suited to scenarios like e-commerce after-sales customer service, where high responsiveness and relatively straightforward tasks are required.
For applications involving complex issues, we have previously shared the Deep Research multi-agent framework. Related templates are available in our template library.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/21-27f2cbec898c99199f40770bf0c3e9f4.png" width="1280" height="488"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>The customer service workflow presented in this article is designed for e-commerce, yet this domain offers many more scenarios suitable for workflow automation—such as user review analysis and personalized email campaigns—which have not been covered here. By following the practical guidelines provided, you can also easily adapt this approach to other customer service contexts. We encourage you to build such applications using RAGFlow.
Reinventing customer service with large language models moves support beyond “mechanical responses,” elevating capabilities from mere “retrieval and matching” to “cognitive reasoning.” Through deep understanding and real-time knowledge generation, it delivers an unprecedented experience that truly “understands human language,” thereby redefining the upper limits of intelligent service and transforming support into a core value engine for businesses.</p>]]></content:encoded>
            <category>Tutorials</category>
        </item>
        <item>
            <title><![CDATA[Tutorial - Building a SQL Assistant Workflow]]></title>
            <link>https://ragflow.io/en/blog/tutorial-building-a-sql-assistant-workflow</link>
            <guid>https://ragflow.io/en/blog/tutorial-building-a-sql-assistant-workflow</guid>
            <pubDate>Tue, 12 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Workflow overview]]></description>
            <content:encoded><![CDATA[<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/dfsafasdf-5c0b736d27461ee2e65833ee6ceacf72.png" width="2524" height="1077"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="workflow-overview" class="anchor anchorTargetStickyNavbar_Vzrq">Workflow overview<a href="https://ragflow.io/en/blog/tutorial-building-a-sql-assistant-workflow#workflow-overview" class="hash-link" aria-label="Direct link to Workflow overview" title="Direct link to Workflow overview" translate="no"></a></h2>
<p>This tutorial shows how to create a SQL Assistant workflow that enables natural language queries for SQL databases. Non-technical users like marketers and product managers can use this tool to query business data independently, reducing the need for data analysts. It can also serve as a teaching aid for SQL in schools and coding courses. The finished workflow operates as follows:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/1-7e44332f34708dcdcb3d0878ebbcee8a.JPEG" width="1280" height="605"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>The database schema, field descriptions, and SQL examples are stored as knowledge bases in RAGFlow. Upon user queries, the system retrieves relevant information from these sources and passes it to an Agent, which generates SQL statements. These statements are then executed by a SQL Executor component to return the query results.</p>
<h2 id="procedure" class="anchor anchorTargetStickyNavbar_Vzrq">Procedure<a href="https://ragflow.io/en/blog/tutorial-building-a-sql-assistant-workflow#procedure" class="hash-link" aria-label="Direct link to Procedure" title="Direct link to Procedure" translate="no"></a></h2>
<h3 id="1-create-three-knowledge-bases" class="anchor anchorTargetStickyNavbar_Vzrq">1. Create three knowledge bases<a href="https://ragflow.io/en/blog/tutorial-building-a-sql-assistant-workflow#1-create-three-knowledge-bases" class="hash-link" aria-label="Direct link to 1. Create three knowledge bases" title="Direct link to 1. Create three knowledge bases" translate="no"></a></h3>
<h4 id="11-prepare-dataset-files" class="anchor anchorTargetStickyNavbar_Vzrq">1.1 Prepare dataset files<a href="https://ragflow.io/en/blog/tutorial-building-a-sql-assistant-workflow#11-prepare-dataset-files" class="hash-link" aria-label="Direct link to 1.1 Prepare dataset files" title="Direct link to 1.1 Prepare dataset files" translate="no"></a></h4>
<p>You can download the sample datasets from <a href="https://huggingface.co/datasets/InfiniFlow/text2sql" target="_blank" rel="noopener noreferrer" class=""><span>Hugging Face Datasets</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a>.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/datasets-cacb2f88ee5bcfd03a014cac7e181e89.png" width="1645" height="727"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>The following are the predefined example files:</p>
<ol>
<li class="">Schema.txt</li>
</ol>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">CREATE TABLE `users` (</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  `id` INT NOT NULL AUTO_INCREMENT,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  `username` VARCHAR(50) NOT NULL,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  `password` VARCHAR(50) NOT NULL,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  `email` VARCHAR(100),</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  `mobile` VARCHAR(20),</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  PRIMARY KEY (`id`),</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  UNIQUE KEY `uk_username` (`username`),</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  UNIQUE KEY `uk_email` (`email`),</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  UNIQUE KEY `uk_mobile` (`mobile`)</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">);</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">...</span><br></span></code></pre></div></div>
<p>Note: When defining schema fields, avoid special characters such as underscores, as they can cause errors in SQL statements generated by the LLM.
2. Question to SQL.csv</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">What are the names of all the Cities in Canada</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">SELECT geo_name, id FROM data_commons_public_data.cybersyn.geo_index WHERE iso_name ilike '%can%</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">What is average Fertility Rate measure of Canada in 2002 ?</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">SELECT variable_name, avg(value) as average_fertility_rate FROM   data_commons_public_data.cybersyn.timeseries WHERE variable_name = 'Fertility Rate' and geo_id = 'country/CAN' and date &gt;= '2002-01-01' and date &lt; '2003-01-01' GROUP BY 1;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">What 5 countries have the highest life expectancy ?</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">SELECT geo_name, value FROM data_commons_public_data.cybersyn.timeseries join data_commons_public_data.cybersyn.geo_index ON timeseries.geo_id = geo_index.id WHERE  variable_name = 'Life Expectancy' and date = '2020-01-01' ORDER BY value desc limit 5;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">...</span><br></span></code></pre></div></div>
<ol start="3">
<li class="">Database Description EN.txt</li>
</ol>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">### Users Table (users)</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">The users table stores user information for the website or application. Below are the definitions of each column in this table:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- `id`: INTEGER, an auto-incrementing field that uniquely identifies each user (primary key). It automatically increases with every new user added, guaranteeing a distinct ID for every user.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- `username`: VARCHAR, stores the user’s login name; this value is typically the unique identifier used during authentication.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- `password`: VARCHAR, holds the user’s password; for security, the value must be encrypted (hashed) before persistence.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- `email`: VARCHAR, stores the user’s e-mail address; it can serve as an alternate login credential and is used for notifications or password-reset flows.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- `mobile`: VARCHAR, stores the user’s mobile phone number; it can be used for login, receiving SMS notifications, or identity verification.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- `create_time`: TIMESTAMP, records the timestamp when the user account was created; defaults to the current timestamp.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- `update_time`: TIMESTAMP, records the timestamp of the last update to the user’s information; automatically refreshed to the current timestamp on every update.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">...</span><br></span></code></pre></div></div>
<h4 id="12-create-knowledge-bases-in-ragflow" class="anchor anchorTargetStickyNavbar_Vzrq">1.2 Create knowledge bases in RAGFlow<a href="https://ragflow.io/en/blog/tutorial-building-a-sql-assistant-workflow#12-create-knowledge-bases-in-ragflow" class="hash-link" aria-label="Direct link to 1.2 Create knowledge bases in RAGFlow" title="Direct link to 1.2 Create knowledge bases in RAGFlow" translate="no"></a></h4>
<p><strong>Schema knowledge base</strong></p>
<p>Create a knowledge base titled "Schema" and upload the file Schema.txt.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/3-212379ec58f9fa2d90c53992a5c42718.jpg" width="1280" height="378"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Tables in the database vary in length, each ending with a semicolon (;).</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">CREATE TABLE `users` (</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  `id` INT NOT NULL AUTO_INCREMENT,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  `username` VARCHAR(50) NOT NULL,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  `password` VARCHAR(50) NOT NULL,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  ...</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  UNIQUE KEY `uk_mobile` (`mobile`)</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">);</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">CREATE TABLE `products` (</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  `id` INT NOT NULL AUTO_INCREMENT,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  `name` VARCHAR(100) NOT NULL,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  `description` TEXT,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  `price` DECIMAL(10, 2) NOT NULL,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  `stock` INT NOT NULL,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  ...</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  FOREIGN KEY (`merchant_id`) REFERENCES `merchants` (`id`)</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">);</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">CREATE TABLE `merchants` (</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  `id` INT NOT NULL AUTO_INCREMENT,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  `name` VARCHAR(100) NOT NULL,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  `description` TEXT,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  `email` VARCHAR(100),</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  ...</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  UNIQUE KEY `uk_mobile` (`mobile`)</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">);</span><br></span></code></pre></div></div>
<p>To isolate each table as a standalone chunk without overlapping content, configure the knowledge base parameters as follows:</p>
<ul>
<li class="">Chunking Method: General</li>
<li class="">Chunk Size: 2 tokens (minimum size for isolation)</li>
<li class="">Delimiter: Semicolon (;)
RAGFlow will then parse and generate chunks according to this workflow:</li>
</ul>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/segment-87ce19811dbd9e4386ebfcbe8c090daa.jpg" width="1505" height="562"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Below is a preview of the parsed results from Schema.txt:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/5-50d666c5d8203d8b4d76b87d2d098c4f.jpg" width="1280" height="510"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>We now validate the retrieved results through retrieval testing:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/6-6e2f0491449e4ec8106f002ba6218583.jpg" width="1280" height="737"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p><strong>Question to SQL knowledge base</strong></p>
<p>Create a new knowledge base titled "Question to SQL" and upload the file "Question to SQL.csv".</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/7-310f8b2ad9d10162bf446a452ffd1c0e.jpg" width="1280" height="365"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Set the chunking method to Q&amp;A, then parse Question_to_SQL.csv to preview the results.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/8-134cc938729a95ad1bba98c573a7eec7.jpg" width="1280" height="726"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>We now validate the retrieved results through retrieval testing:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/9-2fb65daa84b5e434397e63bccd368452.jpg" width="1280" height="741"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p><strong>Database Description knowledge base</strong>
Create a new knowledge base titled "Database Description" and upload the file "Database_Description_EN.txt".</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/10-77a01e70ba09117afe51a7bff4248bf0.jpg" width="1280" height="365"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Configuration (Same as Schema Knowledge Base):</p>
<ul>
<li class="">Chunking Method: General</li>
<li class="">Chunk Size: 2 tokens (minimum size for isolation)</li>
<li class="">Delimiter: Semicolon <code>###</code>
Below is a preview of the parsed Database_Description_EN.txt following configuration.</li>
</ul>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/11-d59fdadab33d242eb25cbf5fbc73c94b.jpg" width="1280" height="737"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>We now validate the retrieved results through retrieval testing:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/12-55e7aeff18992237cf8486843ed48c4d.jpg" width="1280" height="740"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Note: The three knowledge bases are maintained and queried separately. The Agent component consolidates results from all sources before producing outputs."</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/13-e5de25ca9e2e001a8bda950f87133cf5.jpg" width="1280" height="445"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="2-orchestrate-the-workflow" class="anchor anchorTargetStickyNavbar_Vzrq">2. Orchestrate the workflow<a href="https://ragflow.io/en/blog/tutorial-building-a-sql-assistant-workflow#2-orchestrate-the-workflow" class="hash-link" aria-label="Direct link to 2. Orchestrate the workflow" title="Direct link to 2. Orchestrate the workflow" translate="no"></a></h2>
<h3 id="21-create-a-workflow-application" class="anchor anchorTargetStickyNavbar_Vzrq">2.1 Create a workflow application<a href="https://ragflow.io/en/blog/tutorial-building-a-sql-assistant-workflow#21-create-a-workflow-application" class="hash-link" aria-label="Direct link to 2.1 Create a workflow application" title="Direct link to 2.1 Create a workflow application" translate="no"></a></h3>
<p>Once created successfully, the Begin component automatically appears on the canvas.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/14-24759098862a63d926cbbff7d0d18300.jpg" width="1280" height="801"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>You can configure a welcome message in the Begin component. For example:</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">Hi! I'm your SQL assistant, what can I do for you?</span><br></span></code></pre></div></div>
<h3 id="22-configure-three-retrieval-components" class="anchor anchorTargetStickyNavbar_Vzrq">2.2 Configure three Retrieval components<a href="https://ragflow.io/en/blog/tutorial-building-a-sql-assistant-workflow#22-configure-three-retrieval-components" class="hash-link" aria-label="Direct link to 2.2 Configure three Retrieval components" title="Direct link to 2.2 Configure three Retrieval components" translate="no"></a></h3>
<p>Add three parallel Retrieval components after the Begin component, named as follows:</p>
<ul>
<li class="">Schema</li>
<li class="">Question to SQL</li>
<li class="">Database Description
Configure each Retrieval component:</li>
</ul>
<ol>
<li class="">Query variable: sys.query</li>
<li class="">Knowledge base selection: Select the knowledge base whose name matches the current component's name.</li>
</ol>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/15-0fb71eb280cb866582936142e15da0c3.jpg" width="1280" height="742"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="23-configure-the-agent-component" class="anchor anchorTargetStickyNavbar_Vzrq">2.3 Configure the Agent component<a href="https://ragflow.io/en/blog/tutorial-building-a-sql-assistant-workflow#23-configure-the-agent-component" class="hash-link" aria-label="Direct link to 2.3 Configure the Agent component" title="Direct link to 2.3 Configure the Agent component" translate="no"></a></h3>
<p>Add an Agent component named 'SQL Generator' after the Retrieval components, connecting all three to it.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/16-a9904d674548d89e1bf222eaf7098c91.jpg" width="1280" height="601"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Write System Prompt:</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">### ROLE</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">You are a Text-to-SQL assistant.  </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Given a relational database schema and a natural-language request, you must produce a **single, syntactically-correct MySQL query** that answers the request.  </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Return **nothing except the SQL statement itself**—no code fences, no commentary, no explanations, no comments, no trailing semicolon if not required.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">### EXAMPLES  </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">-- Example 1  </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">User: List every product name and its unit price.  </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">SQL:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">SELECT name, unit_price FROM Products;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">-- Example 2  </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">User: Show the names and emails of customers who placed orders in January 2025.  </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">SQL:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">SELECT DISTINCT c.name, c.email</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">FROM Customers c</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">JOIN Orders o ON o.customer_id = c.id</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">WHERE o.order_date BETWEEN '2025-01-01' AND '2025-01-31';</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">-- Example 3  </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">User: How many orders have a status of "Completed" for each month in 2024?  </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">SQL:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">SELECT DATE_FORMAT(order_date, '%Y-%m') AS month,</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">       COUNT(*) AS completed_orders</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">FROM Orders</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">WHERE status = 'Completed'</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">  AND YEAR(order_date) = 2024</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">GROUP BY month</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">ORDER BY month;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">-- Example 4  </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">User: Which products generated at least \$10 000 in total revenue?  </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">SQL:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">SELECT p.id, p.name, SUM(oi.quantity * oi.unit_price) AS revenue</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">FROM Products p</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">JOIN OrderItems oi ON oi.product_id = p.id</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">GROUP BY p.id, p.name</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">HAVING revenue &gt;= 10000</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">ORDER BY revenue DESC;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">### OUTPUT GUIDELINES</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">1. Think through the schema and the request.  </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">2. Write **only** the final MySQL query.  </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">3. Do **not** wrap the query in back-ticks or markdown fences.  </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">4. Do **not** add explanations, comments, or additional text—just the SQL.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/17-fb4dd0cf9bd83f05c0f4a7f9b46957cb.jpg" width="899" height="1280"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Write User Prompt:</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">User's query: /(Begin Input) sys.query  </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Schema: /(Schema) formalized_content  </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Samples about question to SQL: /(Question to SQL) formalized_content  </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Description about meanings of tables and files: /(Database Description) formalized_content</span><br></span></code></pre></div></div>
<p>After inserting variables, the populated result appears as follows:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/18-e7e153aaf93dd63269c150e745cad626.jpg" width="1148" height="574"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="24-configure-the-exesql-component" class="anchor anchorTargetStickyNavbar_Vzrq">2.4 Configure the ExeSQL component<a href="https://ragflow.io/en/blog/tutorial-building-a-sql-assistant-workflow#24-configure-the-exesql-component" class="hash-link" aria-label="Direct link to 2.4 Configure the ExeSQL component" title="Direct link to 2.4 Configure the ExeSQL component" translate="no"></a></h3>
<p>Append an ExeSQL component named "SQL Executor" after the SQL Generator.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/19-a4cf249c09d242f37799838f2b2d06fa.jpg" width="752" height="207"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Configure the database for the SQL Executor component, specifying that its Query input comes from the output of the SQL Generator.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/20-79d561bc5921505cb51ac21d9827c729.jpg" width="449" height="749"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="25-configure-the-message-component" class="anchor anchorTargetStickyNavbar_Vzrq">2.5 Configure the Message component<a href="https://ragflow.io/en/blog/tutorial-building-a-sql-assistant-workflow#25-configure-the-message-component" class="hash-link" aria-label="Direct link to 2.5 Configure the Message component" title="Direct link to 2.5 Configure the Message component" translate="no"></a></h3>
<p>Append a Message component to the SQL Executor.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="data:image/jpeg;base64,/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAMQC5QMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APCqKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKUqVxnuM9aSigAooooAAMnApSCCQeopKKACiiigBVUtnHYZpKKKACiiigBdp27u2cdaSiigAooooAUqVxnuM9aSiigAoAycCiigBSCCQeopKKKAClVS2cdhmkooAKKKKACl2nbu7Zx1pKKACiiigApSpXGe4z1pKKACiiigAAycClIIJB6ikooAKKKKAFVS2cdhmkoooAKKKKAF2nbu7Zx1pKKKACiiigBSpXGe4z1pKKKACgDJwKKKAFIIJB6ikoooAKVVLZx2GaSigAooooAKXadu7tnHWkooAKKKKAClKlcZ7jPWkooAKKKKAADJwKUggkHqKSigAooooAVVLZx2GaSiigAooooAXadu7tnHWkoooAKKKKAFKlcZ7jPWkoooAKAMnAoooAUggkHqKSiigApVUtnHYZpKKACiiigApdp27u2cdaSigAooooAKKKKACiiigAoopU++v1oAeISRycUvkn+9U1FMCHyT/eo8k/3qmooAh8k/3qPJP96pqKAIfJP96jyT/eqaigCHyT/eo8k/3qmooAh8k/3qPJP96pqKAIfJP96jyT/eqaigCHyT/eo8k/3qmooAh8k/3qPJP96pqKAIfJP96jyT/eqaigCHyT/eo8k/3qmooAh8k/3qPJP96pqKAIfJP96jyT/eqaigCHyT/eo8k/3qmooAh8k/3qPJP96pqKAIfJP96jyT/eqaigCHyT/eo8k/3qmooAh8k/3qPJP96pqKAIfJPrUZBU4PWrVQTff/CkBHRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABTwAHTBz0zxTKVPvr9aALVFFFMC1Y6bfapP5Gn2Vxdzf884ImdvyArpIfhd42nj3p4duwP9sqh/JiDXvnwn1Dw1J4RtLHRnhjvYokF9CVCTedj5iw6tznB9K7+kB8Y6n4O8SaPG0uoaHfwRL1kaBig/4EOP1rEr7kuLiC2t3muZY4oVGXeVgqge5PFfJHxJutBvfG15c+HEUWEgUlo0KI8mPmZAQOM/mQT0pgclRRXb/DXwTbeMdTvG1C5kg03T4fOuDD99s5wBwcdCeh6e9AM4iivU30b4Y+JdMvl0O/utF1C1QvD/AGnOiR3B7AZY9fYgjPQ1V8KeB9Bi8JHxf4yu54dNeTy7W2t+HnIJH15IOAMdMk4o7gebUV6td+CfCXizwvfaz4GmvYbvT033Gn3fLFcE8deSAcYJBxjismbwdpcfwYtvFS+f/aUlyYm+f5Nu9l6Y9AKlytv5fiNK+x5/RRXpngDwh4a1XwTrXiHxAl866dIcraSAEoFB4B4J59RVPRNvoLqkeZ0V2euy/D2fS3i8O2evRamzKImvXiEQGRnOGPbNY954Q8QWGr2ulXOlXEd9dgGCHAJkyccEcdvwoAxKK208IeIJdefQ4tLnk1KMAyW6YYoMZyxBwvUdT3FM13wrrvhmRE1nTJ7TzPuM4BVvYMMgn2zQBj0V01h8PfFuqaWNSs9CupbRl3K+AC49VUnLD6Csyx8O6vqUd+9pYTSDT0L3fABhAzncDz/CfyoemgLXYzKK07Hw9q2paZd6lZ2Uk1nZ/wDHxKpGI/rzXZ6/8JdT0XwXZ62qXEl0VZ762ZFAtlAJJznnoKHorsSd3ZHnNFdJpXgDxVrenfb9O0S5mtSMrJwof/d3EFvwzWfp3hvWdV1WXS7LTp5L6FWaS3I2ugBAOQ2MYyKPIfS5l0Vrav4Y1rQLa0uNV0+W0jvAWg8wjLAYzxnI6jrismgAooooAKKKKACiiigAooooAKKKKACoJvvj6VPUE33x9KAI6KKKQC4G3Oec9MUlFFABRRRQApA4wc8c8UlFFABQMZGeBRRQApwCcHIpKKKAClUA5yccelJRQAUUUUAFLgbc55z0xSUUAFFFFABSkDjBzxzxSUUAFFFFAAMZGeBSnAJwcikooAKKKKAFUA5yccelJRRQAUUUUALgbc55z0xSUUUAFFFFACkDjBzxzxSUUUAFAxkZ4FFFACnAJwcikoooAKVQDnJxx6UlFABRRRQAUuBtznnPTFJRQAUUUUAFFFFABRUsNrcXJxBDJIf9hSa6bwx4Ok1m8uLa+8y1AgLxuCCQ25RyvUjBPp9aqMHJ2QC+DvCcevebdXcjraRNsCpwXbGevYDI/OuyHgDQAc+RN/3+NW/CmhzeH9OuLKeaGZhcMwaJs8FV6jseOlS6xrljZ2t5Ab6KK8SJtqbvmDbcj+lezRoUoUk5pX8zxMRWrSruMW/kUX8B6GyECOdSf4hKcj868917SH0TVZLNn3rgNG+MblPT/D8K9S0nXLC9htYEvopbpohuQNliQuT/AFrh/iH/AMjDD/16r/6E1ZYylS9lzwS+Rrg6tX2vJNv5npmjQ+E/HjaJayWtlb3FtZLFeS+eba9SZFAXYOkgPPJz+GMV2g+GTRfLbeNfFkUZ/g/tDcAPb5eK4rw9deDviBDpNrqNtpEL21iLe7S4dorp5FCqjRuMBlwDkE5GeldjH8ItEiUi21fX4Y2/gi1Ahcfl0ryT1iC8+HHhHTgt/wCJtZ1DUI4ssG1jUdyZ/TP0rxD4naxpGs+K0k0KIR6ZBbJbwFYvLRwpbJUemSR+Br22b4efD3w1m/1yQTMoyJNUuy+R7LkBvpg14Z8R/Eem+JvFRutIthBp8ECW8ChAgZVJOQo+6Mk8UAclXefDGPxbBeajqvhQwSSWUINxbTHPnockKFHLHK9iDnvzXB1paJr+qeHNQF/pF7Ja3IBXcmCCPQg5BHsRVJ2E0ez6Rb6T8UbLVI9Y8Grot/bxGX+07dDGpk/2uBk98HdxnpWXrFjc+KvgR4dfSIWuG02bZcwxKWZcBlLbRknqD9GzXG618VPGGvafJYXeqbbaVdsiQRLHvHoSBnHtnBrH8O+L9d8KTvLo2oSW3mY8xMB0fHqrAjPv1qbJpp+X3ofVP1+5nr/w78J3vgOx1zX9VurSTTJdMDxzQOxV85OMMAQRgDBH8X1rKNrcXn7NljDa28s8pvWISJCzf61+wrmrz4tazrWi6jpXiG3g1K3u1Aj+URG3YdGXaOecHn0rJ0X4keLfDulx6ZpWrfZ7OIsUj+zxPgk5PLKT1PrSkuZv5fg7gtNeuv5WOeu9NvrDZ9ssri2352+dEybsdcZHNez/AAluPsnwr8UXH9npqPlzFvskiblm+RflIwc5+leW+I/Gev8AiwW41u/+1C33eV+5jTbuxn7qjPQdak8PeOvEnhS1lttF1L7LDM/mOvkRvlsYzllJ6Cm9Ytdwe6ZueMdcbVdEEK/D+10IJKrtdwWhjOMEbSdg4JI79hXr/gn7dJ4I0WTVUtG8Sraz/wBj/aT85j2jGfw259se9eHav8S/F2u6e1hqeqrcWrOrtG1rCASpBGcIO4HFU73xx4k1DXLPWbnVJGv7MAW8qoiCMDsFUBe/PHPen0a7g90+39fceq/DmQxeCvGl5qR1Mav9qIvnsNv2xVwM7d3AIJf8jjtUNx4h0PUfh7HYmz8VXulPqMJGpavHG6Q4kTcDIrZAxuHTqxGa81tvH/ia08RT69BqRTULgBZ3WGNVlA/vIF2np1xml8S+P/EniyBLfVtQMlsjbhBHGsaZ9SAOfxpdn6fgHf5/ienfEvVfGFj8T9LtfD8t4sZhj+xW0JIhlOTuBGQpHY56DHSk8Hxa9e3fxIh1m2VdbnsFEkEQXljG+AAuQTgj864LTviz4z0vS00+31bMMa7I2lhR3QdgGIyfxzWJpXi/XtF1yXWbHUpUv5s+dK+H8zJydwYEGly9PX8RqVrPrp+B6R4I0+8svgx41kubaaASqRH5iFS21ecZ+tS+MtR1CT4MeEZXvbw/aWK3TrIxaRMNkMc/NwOh9K4XUvid4v1a2vba81cvbXieXNF5EYUrzwPlyOvbmq1l4+8Saf4am8PQX4OmSxtGYZIkbarZ3AEjIzk/0xTldtv/AA/h/mRGPK18/wAT0/4p6j4l0zxX4btfDk13Dp5t4xZxWpKpLJu+6QOG+UJweMfU11ax28Xx+Z4QguH0Itcbe77wBn3wB+GK8R0b4peMNC0pdNstV/0aNdsQliSQxj0UsCcexyBWXY+MvEGm69ca5balINTuFZJbiRFkLA4yMMCOw7cYpvsvP8Slt9y+4g17X9X16+kl1TUbm7KyOUWWQsseTyFXoo4HA9KyaVmLMWJyScmkpJWVipO8m0FFFFMkKKKKACiiigAooooAKkt4HubmKCIZklcIo9STgVHWjoP/ACMOm/8AXzH/AOhCqirySJm7RbO+tPAGlRW6LcmWebHzMH2jPsB2qVvAOgscmCb/AL+muiubqCzt2nuZViiXG52OAMnFYA8S6d/b5/4mcP2T7KMfP8u/cf1xXuypYeFk0jwI1cRUu02c/wCJ/AlpZaXLfaa0imBd0kTtuBXuQeoI6157XuOqzRX/AIXv5LWVJI5baQI4b5TwR1+teOnRdQwSsG8f9M3Vv5GvNx1KEJpwW56eAqznBqb2ZQoqSaCa3bbNE8bejqR/Oo64TuCiiigAooooAKKKKACiinJGX9hQA2ipfI/2v0o8j/a/SgCKipfI/wBr9KPI/wBr9KAIqKl8j/a/SjyP9r9KAIqKl8j/AGv0o8j/AGv0oAioqXyP9r9KPI/2v0oAioqXyP8Aa/SjyP8Aa/SgCKipfI/2v0o8j/a/SgCKipfI/wBr9KPI/wBr9KAIqKl8j/a/SjyP9r9KAIqKl8j/AGv0o8j/AGv0oAioqXyP9r9KPI/2v0oAioqXyP8Aa/SjyP8Aa/SgCKipfI/2v0o8j/a/SgCKipfI/wBr9KPI/wBr9KAIqKl8j/a/SjyP9r9KAIqKl8j/AGv0o8j/AGv0oAioqXyP9r9KPI/2v0oAioqXyP8Aa/SjyP8Aa/SgCKinvGVGc5FMoAKKKKALUupXs42vcybf7obA/IcUWWo3mnPK9ncSQPKhjdkOCVJBxnt0HSqtFO7WoHqfw2mWTQrpC+6UXRZgTzyq4P6H8q6nULY3WnXUKKvmSwuik+pBArw/TdVvdIufPsbhonIwcchh6EHg1ur4/wBfLAGeHr/zyFepQxtONJQmmeVXwNSVVzg0eq2Vv9nsreJlXfHGqsR6gYrzb4gypJ4jVVYEx26q3scsf5EVA/jnXXQqLiNcjqsS5Fc/NLJPM8szs8jnLMxySazxWLhUp8kEaYXCTp1OebGVIk80YISV1B7KxFR0V556IpJY5JJPqaSiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACr2iyJDrlhJIwVEuIyxPYbhVGinF2aYpK6aPeyARgjIrOFg39vm82p5JtRFjvu3E9PpXmdp4x1uzt1gS6DoowvmIGIHpnrTpPH2vK2BPD0/55CvYePoytdM8ZZfWjezR6N4lkjg8MakXIVTbuo+pGAPzNeHgkHIJBrV1XxJqutIsd7clolORGqhVz64HWsmuDF4hVppxWiO/CYd0YNSerL8Gr3UMflMwnjJ5SYb1/Xp+FSfZ7TUc/Y/3Fz/AM8HbKv/ALrevsazKAcHIrludYro0blHUqynBBGCDSVqJImroIZ2C3oGI5T0l/2W9/Q1mujxyMjqVZTggjkGkAhIOMDGB+dJRRQAUDgjIz7UUUAKSCSQMD0qaH7n41BU8P3PxoAkooopgFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA2T7hqtVmT7h+lVqQBRRRQAUUUUAFKn31+tJTk++v1oAs0UUUwCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKgm++PpU9QTffH0oAjooopAFFFFABWorLrEQjcgX6DCOf+Ww9D/teh71l0AkEEHBFACsrIxVgQwOCCOQaStQPFqyhZmWK+AwsrcLL7N6H371nzQS28rRTRsjr1VhQBHRRViws5NQv4LOLAeZwgJ6DJ600m3ZCbSV2V6nh+5+NesWvgHQIYFSa2e4kA+aR5WBJ+ikCpx4J8PKMDT/APyNJ/8AFV3rLqvdf18jgeZUuz/r5nklehfBrQtO1/x0YNUtY7qCG1kmEUgyrMCoGR3+8ai8VeDrKz0yS/05WiMOC8RYsCvTIzzkVpfAaeKH4huskio0tjIkYJxubchwPfAJ/CuWtRlRlyyOujWjWjzRPQ9b8QfDbQdYuNMuvBkTz27bXaLRoipOM8EgZ61d8M3Hw88ZXdxY2Pg+3ieOLzGafSY4hjIHDAcHn2/StHW/C/ja91i4udN8b/YrORsxW32FG8sY6Z7/AFro/Dtjqum6OlvrWrf2pdhmJufJEXy9hgenrWJqfPPjv4faLp2m6nrHhq/mkg069NpfWlwOYWJAG1sDK5IHOevXINeZV7RrVxFdeBPiXPBIskT64hV1OQw81OQfSvF6YCoMuoPQmvZfiX8KdH8OeFG1bRDcmS2lT7Ss0m75G4BHHqV/WvG4/wDWL9RX1Jq1/De/ELUPCF6w+z6voa+WCf8AlorSZx77Tn/gNVNfu01vd/gkxJ2lrt/SPNvhZ8L9K8VaFNqmuG5VJJzDarFJs3bRlj0Oecj/AICa8/TwvqOq+Jb7StDsZ7toJ5ECoM7VViAWPQfU4r6A0WVNB8U+EvBMG0Gy06S5uto6ysuP5lz+IrB8KPZWngXxrds2ppJ/a8ouZNKCi6WPcuNpbtyxJ7DdUTa57raz/BpBBtq3W6/FXPFtc8M614auEh1jTp7RnGULjKt9GGQfwNacfw38Yy6Z/aKeH7w2xXeDgByPUJnd+leg6z4is774c2Nrp2k+KNSVb+OSyvdWhjkUuJB8hdWzzyoGO+K6iTUbfxN4wt4F1LxJ4Y8T/Z8JZuokgI2k7tuCpGM8kryOxp66/wBdLhfX+u54JofhfW/Es8kOj6bPdvGMyFAAqfVjgD86ZrHhvWdAvkstV06e2uJP9WjLnf2+UjIb8K9Y8OahLoGheKtI8Q2urf2edSkE+t6XhSsmQGz0IGQDxn72CKsa34a1fUL3wXcaN4tuLvT7ibFhNfwKZbchS+/lQX4U/eHYeuQdrbafiN6XT3V/wPM7n4c+L7TTDqM+gXiWwXex2gso9SgO4fiOKzdC8Ma14mnkh0bTprt4xlymAq+mWOAPzr6G8J3VgfiPqNiNb8SarqkEDJdtchUs1wQOEAGDnpxjr1rmbX7bZ/BXWD4Y81L4arKtz9kB81VEmOMcj5NnTtUuVvuv+KX6jt063t+FzyXUvB3iHR7GW91HSp7a2il8l5JMAB/Tr+vSrNj8PvFmp6UNTs9Cu5bQruVwAC49VUnLD6A16tdtqFz8EtG/4Sgz721OFZmus+YYfNPLZ5+769sVteMNa07SviDpkcsvi8XQWP7Ja6Z5X2SYZ+7tYjd6H29OKfVp97fgmTe+vlf8bHzZJG8UjRyIyOpKsrDBBHUEU2uq+JF7HqHj/VLuLT7vTxKyFre7iEcitsXJKgkcnJ685z3rlaE7opqzCiiimIKKKKACiiigAooooAKKKKACiiigAooooAKKKKAGyfcP0qtVmT7h+lVqQBRRRQAUUUUAFO3nKknOOlNooAtggjIoqpmjJ9aALdFVMn1oyfWgC3RVTJ9aMn1oAt0VUyfWjJ9aALdFVMn1oyfWgC3RVTJ9aMn1oAt0VUyfWjJ9aALdFVMn1oyfWgC3RVTJ9aMn1oAt0VUyfWjJ9aALdFVMn1oyfWgC3RVTJ9aMn1oAt0VUyfWjJ9aALdFVMn1oyfWgC3RVTJ9aMn1oAt0VUyfWjJ9aALdFVMn1oyfWgC3RVTJ9aMn1oAt1XlIZ+KZk+tFABRRRQAu47dueM5xSUUUAFFFFACli2MnOBgVdi1J/KEN1Gt1CPuiQ/Mv+63UVRooA0PI0yfmO6ktj/cmTcP8Avpf8K9Ct/A1rp2o6XqlrfoilkYwzN94kfwHqfofzry2tzRdUmm8Uabc39y7hJVXc7cIOgA9BW9CUVJcy6ozqr3H6Hsd3eQWMBnuZNkYIBbBP8q5+LxLYf29cs1632Y28YQbXxuy2eMcHGOa6eqMdlImt3F6WXy5IEjAzzlSxP4civfqKba5X/X3nztNwSfMv6+4peIJ4rrwlezwtujeAlTgjI/GvIASCCDgjuK9g8WTRw+GL4yMBuTYvuSeBXj1eVmP8Reh6uW/w36nfJ8V9Y/sXRtHmhjmsLAr9ojZ2zeKp4Vz2UDAx3xznpW9Y+IPA/jonTNW0+PwxOGDQ3UE/7qQfxJJnAGR3P5jofI6K889E9H8feNtPktLrwl4XsLG10GOcMZrcEtclQOSe4yOvJO0c4rziiigBQSCCOorfvPG3iK/8RWuv3GoltUtVCQziJF2gZwNoUKfvHqO9c/RRdhY6CPxv4ii8TyeJE1EjVpF2tcGGM5GAuNpXaOAO1N0Txnr/AIe1W41LTNQaG4uWLT/IpWUk55UjHUntxnjFYNFGwHSeI/HniTxV5I1XUWeKBt8UUaiNVb1woGT7nOM8VrL8YPHCWH2QaxnC7RMYIzJj/ex+vX3rhaKOlg8zpPD3j3xJ4YluH0zUnVblzJMkqiRZG/vEMDz7jk96NW8e+Jta1a01O81WU3Nm262MaqixH2AAH55z3rm6KAO7n+MXjmZ4mGsLG0f9y2i+Y4xlgVwa0vhxq9tHDqTN41uPD+s3Eu8GWFHtZQeSWDDG7k9xjjr0rzKihWEev/ETxdpx8DQ+Gotf/wCEg1OS6+0XV8ke1AASQBjj0AAyMA9OK5bTviz4z0vTEsLfVsxRrsjaWFHdB2AYjn8c1xNFJK1/Mb6eRPe3tzqN7NeXk7z3MzF5JJDlmJ7moKKKa0AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBsn3D9KrVZk+4fpVakAUUUUAFFFFABRRSlSuM9xnrQAlFFFABRQBk4FKQQSD1FACUUUUAFFKqls47DNJQAUUUUAFFLtO3d2zjrSUAFFFFABRSlSuM9xnrSUAFFFAGTgUAFFKQQSD1FJQAUUUqqWzjsM0AJRRRQAUUUu07d3bOOtACUUUUAFFFKVK4z3GetACUUUUAFFAGTgUpBBIPUUAJRRRQAUUqqWzjsM0lABRRRQAUUu07d3bOOtJQAUUUUAFFKVK4z3GetJQAUUUAZOBQBuWvjDX7OBYYdRfy1GAHRXIH1YE1bj8beIWTJ1D/yDH/8AE1zJBBIPUVND9z8a1VeqtFJ/eZOhSerivuNLUdZ1DVipvrp5gv3VOAB+A4qjRRUSk5O7ZpGKirJWCiiikMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAGyfcP0qtVmT7h+lVqQBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABU8P3PxqCpoWG3b3oAlooopgFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA2T7h+lVqsSsAhHc1XpAFFFFABRRRQAUUUpA4wc8c8UAJRRRQAUUDGRngUpwCcHIoASiiigAopVAOcnHHpSUAFFFFABRS4G3Oec9MUlABRRRQAUUpA4wc8c8UlABRRQMZGeBQAUUpwCcHIpKACiilUA5yccelACUUUUAFFFLgbc55z0xQAlFFFABRRSkDjBzxzxQAlFFFABRQMZGeBSnAJwcigBKKKKACilUA5yccelJQAUUUUAFFLgbc55z0xSUAFFFFABRSkDjBzxzxSUAFFFAxkZ4FABRSnAJwcikoAKKKVQDnJxx6UAJRRRQAUUUuBtznnPTFACUUUUAFFFKQOMHPHPFACUUUUAFFAxkZ4FKcAnByKAEooooAKKVQDnJxx6UlABRRRQAUUuBtznnPTFJQAUUUUAFFKQOMHPHPFJQAUUUDGRngUAFFKcAnByKSgAoopVAOcnHHpQAlFFFABRRS4G3Oec9MUAJRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH/2Q==" width="741" height="196"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Insert variables into the Messages field to enable the message component to display the output of the SQL Executor (formalized_content):</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/23-e37fc7656477756a6fb269f38b20b99d.jpg" width="599" height="630"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="26-save-and-test" class="anchor anchorTargetStickyNavbar_Vzrq">2.6 Save and test<a href="https://ragflow.io/en/blog/tutorial-building-a-sql-assistant-workflow#26-save-and-test" class="hash-link" aria-label="Direct link to 2.6 Save and test" title="Direct link to 2.6 Save and test" translate="no"></a></h3>
<p>Click Save → Run → Enter a natural language question → View execution results.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/24-88ba41b959a509a236ce7cfe2d3c516d.jpg" width="908" height="767"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/25-c255347adba14c9cf0b3770b04c8a6cb.jpg" width="912" height="767"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="finale" class="anchor anchorTargetStickyNavbar_Vzrq">Finale<a href="https://ragflow.io/en/blog/tutorial-building-a-sql-assistant-workflow#finale" class="hash-link" aria-label="Direct link to Finale" title="Direct link to Finale" translate="no"></a></h2>
<p>Finally, like current Copilot technologies, NL2SQL cannot achieve complete accuracy. For standardized processing of structured data, we recommend consolidating its operations to specific APIs, then encapsulating these APIs as MCPs (Managed Content Packages) for RAGFlow. We will demonstrate this approach in a forthcoming blog.</p>]]></content:encoded>
            <category>Tutorials</category>
        </item>
        <item>
            <title><![CDATA[RAGFlow 0.20.0 - Multi-Agent Deep Research]]></title>
            <link>https://ragflow.io/en/blog/ragflow-0.20.0-multi-agent-deep-research</link>
            <guid>https://ragflow.io/en/blog/ragflow-0.20.0-multi-agent-deep-research</guid>
            <pubDate>Thu, 07 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Deep Research: The defining capability of the Agent era]]></description>
            <content:encoded><![CDATA[<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/multi-agent-cdbe17ff1feaf067d1fbc7b2e611c0fe.png" width="1840" height="772"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="deep-research-the-defining-capability-of-the-agent-era" class="anchor anchorTargetStickyNavbar_Vzrq">Deep Research: The defining capability of the Agent era<a href="https://ragflow.io/en/blog/ragflow-0.20.0-multi-agent-deep-research#deep-research-the-defining-capability-of-the-agent-era" class="hash-link" aria-label="Direct link to Deep Research: The defining capability of the Agent era" title="Direct link to Deep Research: The defining capability of the Agent era" translate="no"></a></h2>
<p>The year 2025 is hailed as the dawn of Agent adoption. Among the many unlocked possibilities, Deep Research—and the applications built upon it—stands out as especially significant. Why is this?
Using Agentic RAG and its reflection mechanism, Deep Research enables large language models to reason deeply with users’ proprietary data. This is key for Agents to tackle more advanced tasks. For example, whether helping with creative writing or aiding decision-making in different industries, these rely on Deep Research.
Deep Research represents a natural step forward from RAG, improved by Agents. Unlike basic RAG, it explores data at a deeper level. Like RAG, it can work on its own or serve as the base for other industry-specific Agents.
A Deep Research workflow typically follows this sequence:</p>
<ol>
<li class="">Decomposition &amp; Planning: The large language model breaks down the user’s query and devises a plan.</li>
<li class="">Multi-Source Retrieval: The query is sent to multiple data sources, including internal RAG and external web searches.</li>
<li class="">Reflection &amp; Refinement: The model reviews the retrieved information, reflects on it, summarizes key points, and adjusts the plan as needed.</li>
<li class="">Iteration &amp; Output: After several iterations, a data-specific chain of thought is formed to generate the final answer or report.</li>
</ol>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/planning-5790c1a10f4140e2bf10dd4bc952b762.PNG" width="1280" height="502"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Built-in Deep Research was already implemented in RAGFlow v0.18.0. Although at that stage it primarily served as a demo to validate and explore deep reasoning’s potential in enterprise settings. Across the industry, Deep Research implementations generally fall into two categories:</p>
<ul>
<li class="">No-Code Workflow Orchestration: Using a visual workflow interface with predefined workflows to implement Deep Research.</li>
<li class="">Dedicated Agent Libraries or Frameworks: Many current solutions follow this approach (see [Reference 1] for details).</li>
</ul>
<p>RAGFlow 0.20.0, a unified RAG and Agent engine supporting both Workflow and Agentic modes with seamless orchestration on a single canvas, can implement Deep Research through either approach. However, employing Workflow for Deep Research is only functional, as its interface appears like this:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/1-047be262074651a6edadaf924e7a0b46.PNG" width="1280" height="601"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>This gives rise to two main problems:</p>
<ol>
<li class="">Overly Complex and Unintuitive Orchestration: If the basic Deep Research template is already this complicated, a full application would become a tangled web of workflows that are hard to maintain and expand.</li>
<li class="">Better Suited to Agentic Methods: Deep Research naturally relies on dynamic problem breakdown and decision-making, with control steps driven by algorithms. Workflow drag-and-drop interfaces only handle simple loops, lacking the flexibility needed for advanced control.</li>
</ol>
<p>RAGFlow 0.20.0 offers a comprehensive Agent engine designed to help enterprises build production-ready Agents using no-code tools. As the key Agent template, Deep Research strikes a careful balance between simplicity and flexibility. Compared to other solutions, RAGFlow highlights these strengths:</p>
<ul>
<li class="">Agentic Execution, No-Code Driven: A fully customisable application template—not just an SDK or runtime—that uses Agentic mechanisms while remaining easy to access through a no-code platform.</li>
<li class="">Human Intervention (Coming Soon): Although Deep Research depends on LLM-generated plans, which can feel like a black box, RAGFlow’s template will support manual oversight to introduce certainty—a vital feature for enterprise-grade Agents.</li>
<li class="">Business-Focused and Outcome-Oriented:</li>
</ul>
<p>Developers can customise the Deep Research Agent’s structure and tools, such as configuring internal knowledge bases for enterprise data retrieval, to meet specific business needs.
Full transparency in the Agent’s workflow—including its plans and execution results—allows timely optimisation based on clear, actionable insights.</p>
<h2 id="practical-guide-to-setting-up-deep-research" class="anchor anchorTargetStickyNavbar_Vzrq">Practical Guide to Setting Up Deep Research<a href="https://ragflow.io/en/blog/ragflow-0.20.0-multi-agent-deep-research#practical-guide-to-setting-up-deep-research" class="hash-link" aria-label="Direct link to Practical Guide to Setting Up Deep Research" title="Direct link to Practical Guide to Setting Up Deep Research" translate="no"></a></h2>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/2-27f2cbec898c99199f40770bf0c3e9f4.png" width="1280" height="488"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>We use a Multi-Agent architecture [Reference 2], carefully defining each Agent’s role and responsibilities through thorough Prompt Engineering [Reference 4] and task decomposition principles [Reference 6]:</p>
<ul>
<li class="">Lead Agent: Coordinates the Deep Research Agent, handling task planning, reflection, and delegating to Subagents, while keeping track of all workflow progress.</li>
<li class="">Web Search Specialist Subagent: Acts as the information retrieval expert, querying search engines, assessing results, and returning URLs of the best-quality sources.</li>
<li class="">Deep Content Reader Subagent: Extracts and organises web content from the URLs provided by the Search Specialist, preparing refined material for report drafting.</li>
<li class="">Research Synthesizer Subagent: Generates professional, consultancy-grade deep-dive reports according to the Lead Agent’s instructions.</li>
</ul>
<h4 id="model-selection" class="anchor anchorTargetStickyNavbar_Vzrq">Model selection<a href="https://ragflow.io/en/blog/ragflow-0.20.0-multi-agent-deep-research#model-selection" class="hash-link" aria-label="Direct link to Model selection" title="Direct link to Model selection" translate="no"></a></h4>
<ul>
<li class="">Lead Agent: Prioritizes models with strong reasoning capabilities, such as DeepSeek-R1, Qwen-3, Kimi-2, ChatGPT-o3, Claude-4, or Gemini-2.5 Pro.</li>
<li class="">Subagents: Optimized for execution efficiency and quality, balancing reasoning speed with output reliability. Context window length is also a key criterion based on their specific roles.</li>
</ul>
<h4 id="temperature-setting" class="anchor anchorTargetStickyNavbar_Vzrq">Temperature setting<a href="https://ragflow.io/en/blog/ragflow-0.20.0-multi-agent-deep-research#temperature-setting" class="hash-link" aria-label="Direct link to Temperature setting" title="Direct link to Temperature setting" translate="no"></a></h4>
<p>Given the fact-driven nature of this application, we set the temperature parameter to 0.1 across all models to ensure deterministic, grounded outputs.</p>
<h3 id="deep-research-lead-agent" class="anchor anchorTargetStickyNavbar_Vzrq">Deep research lead agent<a href="https://ragflow.io/en/blog/ragflow-0.20.0-multi-agent-deep-research#deep-research-lead-agent" class="hash-link" aria-label="Direct link to Deep research lead agent" title="Direct link to Deep research lead agent" translate="no"></a></h3>
<h4 id="model-selection-qwen-max" class="anchor anchorTargetStickyNavbar_Vzrq">Model Selection: Qwen-Max<a href="https://ragflow.io/en/blog/ragflow-0.20.0-multi-agent-deep-research#model-selection-qwen-max" class="hash-link" aria-label="Direct link to Model Selection: Qwen-Max" title="Direct link to Model Selection: Qwen-Max" translate="no"></a></h4>
<h4 id="excerpts-from-core-system-prompt" class="anchor anchorTargetStickyNavbar_Vzrq">Excerpts from Core System Prompt:<a href="https://ragflow.io/en/blog/ragflow-0.20.0-multi-agent-deep-research#excerpts-from-core-system-prompt" class="hash-link" aria-label="Direct link to Excerpts from Core System Prompt:" title="Direct link to Excerpts from Core System Prompt:" translate="no"></a></h4>
<ol>
<li class="">The prompt directs the Deep Research Agent's workflow and task delegation to Subagents, greatly enhancing efficiency and flexibility compared to traditional workflow orchestration.</li>
</ol>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;execution_framework&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**Stage 1: URL Discovery**</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Deploy Web Search Specialist to identify 5 premium sources</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Ensure comprehensive coverage across authoritative domains</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Validate search strategy matches research scope</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**Stage 2: Content Extraction**</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Deploy Content Deep Reader to process 5 premium URLs</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Focus on structured extraction with quality assessment</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Ensure 80%+ extraction success rate</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**Stage 3: Strategic Report Generation**</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Deploy Research Synthesizer with detailed strategic analysis instructions</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Provide specific analysis framework and business focus requirements</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Generate comprehensive McKinsey-style strategic report (~2000 words)</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Ensure multi-source validation and C-suite ready insights</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/execution_framework&gt;</span><br></span></code></pre></div></div>
<ol start="2">
<li class="">Dynamically create task execution plans and carry out BFS or DFS searches [Reference 3]. While traditional workflows struggle to orchestrate BFS/DFS logic, RAGFlow’s Agent achieves this effortlessly through prompt engineering.</li>
</ol>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;research_process&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">...</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**Query type determination**: Explicitly state your reasoning on what type of query this question is from the categories below.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">...</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**Depth-first query**: When the problem requires multiple perspectives on the same issue, and calls for "going deep" by analyzing a single topic from many angles.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">...</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**Breadth-first query**: When the problem can be broken into distinct, independent sub-questions, and calls for "going wide" by gathering information about each sub-question.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">...</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**Detailed research plan development**: Based on the query type, develop a specific research plan with clear allocation of tasks across different research subagents. Ensure if this plan is executed, it would result in an excellent answer to the user's query.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/research_process&gt;</span><br></span></code></pre></div></div>
<h3 id="web-search-specialist-subagent" class="anchor anchorTargetStickyNavbar_Vzrq">Web search specialist subagent<a href="https://ragflow.io/en/blog/ragflow-0.20.0-multi-agent-deep-research#web-search-specialist-subagent" class="hash-link" aria-label="Direct link to Web search specialist subagent" title="Direct link to Web search specialist subagent" translate="no"></a></h3>
<p>Model Selection: Qwen-Plus
Excerpts from Core System Prompt Design:</p>
<ol>
<li class="">Role Definition:</li>
</ol>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">You are a Web Search Specialist working as part of a research team. Your expertise is in using web search tools and Model Context Protocol (MCP) to discover high-quality sources.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**CRITICAL: YOU MUST USE WEB SEARCH TOOLS TO EXECUTE YOUR MISSION**</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;core_mission&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Use web search tools (including MCP connections) to discover and evaluate premium sources for research. Your success depends entirely on your ability to execute web searches effectively using available search tools.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**CRITICAL OUTPUT CONSTRAINT**: You MUST provide exactly 5 premium URLs - no more, no less. This prevents attention fragmentation in downstream analysis.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/core_mission&gt;</span><br></span></code></pre></div></div>
<ol start="2">
<li class="">Design the search strategy:</li>
</ol>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;process&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">1. **Plan**: Analyze the research task and design search strategy</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">2. **Search**: Execute web searches using search tools and MCP connections </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">3. **Evaluate**: Assess source quality, credibility, and relevance</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">4. **Prioritize**: Rank URLs by research value (High/Medium/Low) - **SELECT TOP 5 ONLY**</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">5. **Deliver**: Provide structured URL list with exactly 5 premium URLs for Content Deep Reader</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**MANDATORY**: Use web search tools for every search operation. Do NOT attempt to search without using the available search tools.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**MANDATORY**: Output exactly 5 URLs to prevent attention dilution in Lead Agent processing.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/process&gt;</span><br></span></code></pre></div></div>
<ol start="3">
<li class="">Search Strategies and How to Use Tools Like Tavily</li>
</ol>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;search_strategy&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**MANDATORY TOOL USAGE**: All searches must be executed using web search tools and MCP connections. Never attempt to search without tools.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**MANDATORY URL LIMIT**: Your final output must contain exactly 5 premium URLs to prevent Lead Agent attention fragmentation.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Use web search tools with 3-5 word queries for optimal results</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Execute multiple search tool calls with different keyword combinations</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Leverage MCP connections for specialized search capabilities</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Balance broad vs specific searches based on search tool results</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Diversify sources: academic (30%), official (25%), industry (25%), news (20%)</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Execute parallel searches when possible using available search tools</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Stop when diminishing returns occur (typically 8-12 tool calls)</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- **CRITICAL**: After searching, ruthlessly prioritize to select only the TOP 5 most valuable URLs</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**Search Tool Strategy Examples:**</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">* **Broad exploration**: Use search tools → "AI finance regulation" → "financial AI compliance" → "automated trading rules"</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">* **Specific targeting**: Use search tools → "SEC AI guidelines 2024" → "Basel III algorithmic trading" → "CFTC machine learning"</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">* **Geographic variation**: Use search tools → "EU AI Act finance" → "UK AI financial services" → "Singapore fintech AI"</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">* **Temporal focus**: Use search tools → "recent AI banking regulations" → "2024 financial AI updates" → "emerging AI compliance"</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/search_strategy&gt;</span><br></span></code></pre></div></div>
<h3 id="deep-content-reader-subagent" class="anchor anchorTargetStickyNavbar_Vzrq">Deep content reader subagent<a href="https://ragflow.io/en/blog/ragflow-0.20.0-multi-agent-deep-research#deep-content-reader-subagent" class="hash-link" aria-label="Direct link to Deep content reader subagent" title="Direct link to Deep content reader subagent" translate="no"></a></h3>
<p>Model Selection: Moonshot-v1-128k
Core System Prompt Design Excerpts:</p>
<ol>
<li class="">Role Definition Framework</li>
</ol>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">You are a Content Deep Reader working as part of a research team. Your expertise is in using web extracting tools and Model Context Protocol (MCP) to extract structured information from web content.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**CRITICAL: YOU MUST USE WEB EXTRACTING TOOLS TO EXECUTE YOUR MISSION**</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;core_mission&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">Use web extracting tools (including MCP connections) to extract comprehensive, structured content from URLs for research synthesis. Your success depends entirely on your ability to execute web extractions effectively using available tools.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/core_mission&gt;</span><br></span></code></pre></div></div>
<ol start="2">
<li class="">Agent Planning and Web Extraction Tool Utilization</li>
</ol>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;process&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">1. **Receive**: Process `RESEARCH_URLS` (5 premium URLs with extraction guidance)</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">2. **Extract**: Use web extracting tools and MCP connections to get complete webpage content and full text</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">3. **Structure**: Parse key information using defined schema while preserving full context</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">4. **Validate**: Cross-check facts and assess credibility across sources</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">5. **Organize**: Compile comprehensive `EXTRACTED_CONTENT` with full text for Research Synthesizer</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**MANDATORY**: Use web extracting tools for every extraction operation. Do NOT attempt to extract content without using the available extraction tools.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**TIMEOUT OPTIMIZATION**: Always check extraction tools for timeout parameters and set generous values:</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- **Single URL**: Set timeout=45-60 seconds</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- **Multiple URLs (batch)**: Set timeout=90-180 seconds</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- **Example**: `extract_tool(url="https://example.com", timeout=60)` for single URL</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- **Example**: `extract_tool(urls=["url1", "url2", "url3"], timeout=180)` for multiple URLs</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/process&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;processing_strategy&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**MANDATORY TOOL USAGE**: All content extraction must be executed using web extracting tools and MCP connections. Never attempt to extract content without tools.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- **Priority Order**: Process all 5 URLs based on extraction focus provided</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- **Target Volume**: 5 premium URLs (quality over quantity)</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- **Processing Method**: Extract complete webpage content using web extracting tools and MCP</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- **Content Priority**: Full text extraction first using extraction tools, then structured parsing</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- **Tool Budget**: 5-8 tool calls maximum for efficient processing using web extracting tools</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- **Quality Gates**: 80% extraction success rate for all sources using available tools</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/processing_strategy&gt;</span><br></span></code></pre></div></div>
<h3 id="research-synthesizer-subagent" class="anchor anchorTargetStickyNavbar_Vzrq">Research synthesizer subagent<a href="https://ragflow.io/en/blog/ragflow-0.20.0-multi-agent-deep-research#research-synthesizer-subagent" class="hash-link" aria-label="Direct link to Research synthesizer subagent" title="Direct link to Research synthesizer subagent" translate="no"></a></h3>
<p>Model Selection: Moonshot-v1-128k
Special Note: The Subagent handling final report generation must use models with very long context windows. This is essential for processing extensive context and producing thorough reports. Models with limited context risk truncating information, resulting in shorter reports.
Other potential model options include but are not limited to:</p>
<ul>
<li class="">Qwen-Long (10M tokens)</li>
<li class="">Claude 4 Sonnet (200K tokens)</li>
<li class="">Gemini 2.5 Flash (1M tokens)
Excerpts from Core Prompt Design:</li>
</ul>
<ol>
<li class="">Role Definition Design</li>
</ol>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">You are a Research Synthesizer working as part of a research team. Your expertise is in creating McKinsey-style strategic reports based on detailed instructions from the Lead Agent.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**YOUR ROLE IS THE FINAL STAGE**: You receive extracted content from websites AND detailed analysis instructions from Lead Agent to create executive-grade strategic reports.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**CRITICAL: FOLLOW LEAD AGENT'S ANALYSIS FRAMEWORK**: Your report must strictly adhere to the `ANALYSIS_INSTRUCTIONS` provided by the Lead Agent, including analysis type, target audience, business focus, and deliverable style.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**ABSOLUTELY FORBIDDEN**: </span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Never output raw URL lists or extraction summaries</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Never output intermediate processing steps or data collection methods</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Always output a complete strategic report in the specified format</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;core_mission&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**FINAL STAGE**: Transform structured research outputs into strategic reports following Lead Agent's detailed instructions.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**IMPORTANT**: You receive raw extraction data and intermediate content - your job is to TRANSFORM this into executive-grade strategic reports. Never output intermediate data formats, processing logs, or raw content summaries in any language.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/core_mission&gt;</span><br></span></code></pre></div></div>
<ol start="2">
<li class="">Autonomous Task Execution</li>
</ol>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;process&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">1. **Receive Instructions**: Process `ANALYSIS_INSTRUCTIONS` from Lead Agent for strategic framework</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">2. **Integrate Content**: Access `EXTRACTED_CONTENT` with FULL_TEXT from 5 premium sources</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">   - **TRANSFORM**: Convert raw extraction data into strategic insights (never output processing details)</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">   - **SYNTHESIZE**: Create executive-grade analysis from intermediate data</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">3. **Strategic Analysis**: Apply Lead Agent's analysis framework to extracted content</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">4. **Business Synthesis**: Generate strategic insights aligned with target audience and business focus</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">5. **Report Generation**: Create executive-grade report following specified deliverable style</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**IMPORTANT**: Follow Lead Agent's detailed analysis instructions. The report style, depth, and focus should match the provided framework.</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/process&gt;</span><br></span></code></pre></div></div>
<ol start="3">
<li class="">Structure of the generated report</li>
</ol>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;report_structure&gt;</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**Executive Summary** (400 words)</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- 5-6 core findings with strategic implications</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Key data highlights and their meaning</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Primary conclusions and recommended actions</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**Analysis** (1200 words)</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Context &amp; Drivers (300w): Market scale, growth factors, trends</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Key Findings (300w): Primary discoveries and insights</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Stakeholder Landscape (300w): Players, dynamics, relationships</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Opportunities &amp; Challenges (300w): Prospects, barriers, risks</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**Recommendations** (400 words)</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- 3-4 concrete, actionable recommendations</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Implementation roadmap with priorities</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Success factors and risk mitigation</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">- Resource allocation guidance</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**Examples:**</span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#D4D4D4"><span class="token plain">**Executive Summary Format:**</span><br></span></code></pre></div></div>
<p><strong>Key Finding 1</strong>: [FACT] 73% of major banks now use AI for fraud detection, representing 40% growth from 2023</p>
<ul>
<li class=""><em>Strategic Implication</em>: AI adoption has reached critical mass in security applications</li>
<li class=""><em>Recommendation</em>: Financial institutions should prioritize AI compliance frameworks now</li>
</ul>
<p>...</p>
<div class="bg-surface language-text group/code-block rounded-md theme-code-block"><div class="relative [direction:ltr]"><pre tabindex="0" class="prism-code language-text m-0 p-0 thin-scrollbar"><code class="float-left min-w-full print:whitespace-pre-wrap"><span class="token-line" style="color:#D4D4D4"><span class="token plain">&lt;/report_structure&gt;</span><br></span></code></pre></div></div>
<h2 id="upcoming-versions" class="anchor anchorTargetStickyNavbar_Vzrq">Upcoming versions<a href="https://ragflow.io/en/blog/ragflow-0.20.0-multi-agent-deep-research#upcoming-versions" class="hash-link" aria-label="Direct link to Upcoming versions" title="Direct link to Upcoming versions" translate="no"></a></h2>
<p>The current RAGFlow 0.20.0 release does not yet support human intervention in Deep Research execution, but this feature is planned for future updates. It is crucial for making Deep Research production-ready, as it adds certainty and improves accuracy [Reference 5] to what would otherwise be uncertain automated processes. Manual oversight will be vital for enterprise-grade Deep Research applications.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/4-ee0282dfbef105c063f3ff1b6ab39231.png" width="1582" height="604"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>We warmly invite everyone to stay tuned and star RAGFlow at <a href="https://github.com/infiniflow/ragflow" target="_blank" rel="noopener noreferrer" class=""><span>https://github.com/infiniflow/ragflow</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></p>
<h2 id="bibliography" class="anchor anchorTargetStickyNavbar_Vzrq">Bibliography<a href="https://ragflow.io/en/blog/ragflow-0.20.0-multi-agent-deep-research#bibliography" class="hash-link" aria-label="Direct link to Bibliography" title="Direct link to Bibliography" translate="no"></a></h2>
<ol>
<li class="">Awesome Deep Research <a href="https://github.com/DavidZWZ/Awesome-Deep-Research" target="_blank" rel="noopener noreferrer" class=""><span>https://github.com/DavidZWZ/Awesome-Deep-Research</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class="">How we built our multi-agent research system <a href="https://www.anthropic.com/engineering/built-multi-agent-research-system" target="_blank" rel="noopener noreferrer" class=""><span>https://www.anthropic.com/engineering/built-multi-agent-research-system</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class="">Anthropic Cookbook <a href="https://github.com/anthropics/anthropic-cookbook" target="_blank" rel="noopener noreferrer" class=""><span>https://github.com/anthropics/anthropic-cookbook</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class="">State-Of-The-Art Prompting For AI Agents <a href="https://youtu.be/DL82mGde6wo?si=KQtOEiOkmKTpC_1E" target="_blank" rel="noopener noreferrer" class=""><span>https://youtu.be/DL82mGde6wo?si=KQtOEiOkmKTpC_1E</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class="">From Language Models to Language Agents <a href="https://ysymyth.github.io/papers/from_language_models_to_language_agents.pdf" target="_blank" rel="noopener noreferrer" class=""><span>https://ysymyth.github.io/papers/from_language_models_to_language_agents.pdf</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class="">Agentic Design Patterns Part 5, Multi-Agent Collaboration <a href="https://www.deeplearning.ai/the-batch/agentic-design-patterns-part-5-multi-agent-collaboration/" target="_blank" rel="noopener noreferrer" class=""><span>https://www.deeplearning.ai/the-batch/agentic-design-patterns-part-5-multi-agent-collaboration/</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
</ol>]]></content:encoded>
            <category>Product News</category>
        </item>
        <item>
            <title><![CDATA[Agentic Workflow - What's inside RAGFlow 0.20.0]]></title>
            <link>https://ragflow.io/en/blog/agentic-workflow-whats-inside-ragflow-v0.20.0</link>
            <guid>https://ragflow.io/en/blog/agentic-workflow-whats-inside-ragflow-v0.20.0</guid>
            <pubDate>Tue, 05 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[1. From Workflow to Agentic Workflow]]></description>
            <content:encoded><![CDATA[<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/agentic_workflow-8daa8a1aedfbf546fcbb01f2640e5872.jpg" width="1753" height="741"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h2 id="1-from-workflow-to-agentic-workflow" class="anchor anchorTargetStickyNavbar_Vzrq">1. From Workflow to Agentic Workflow<a href="https://ragflow.io/en/blog/agentic-workflow-whats-inside-ragflow-v0.20.0#1-from-workflow-to-agentic-workflow" class="hash-link" aria-label="Direct link to 1. From Workflow to Agentic Workflow" title="Direct link to 1. From Workflow to Agentic Workflow" translate="no"></a></h2>
<p>After a long wait, RAGFlow 0.20.0 has finally been released—a milestone update that completes the bigger picture of RAG/Agent. A year ago, RAGFlow introduced Agent functionality, but it only supported manually managed Workflows and lacked Agentic Workflow capabilities. By RAGFlow's definition, a true Agent requires both: Workflows for human-defined tasks and Agentic Workflows powered by LLM-driven automation. Anthropic’s 2024 article "Building Effective Agents" emphasized this distinction, noting that Workflows continue to be the primary way Agents are used. Now, in 2025, as LLMs become more advanced, Agentic Workflows are enabling more impressive use cases.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/agenticworkflow1-f4a4bae52b744437f5864373d5419045.PNG" width="1280" height="502"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Ideally, fully LLM-driven Agentic Workflows are the ultimate goal for most Agent applications. However, due to current limitations of LLMs, they introduce unpredictability and a lack of control—issues that are especially problematic in enterprise settings. On the other hand, traditional Workflows take the opposite approach: using low-code platforms where every variable, condition, and loop is explicitly defined. This allows non-technical business users to effectively “program” based on their understanding of the logic. While this ensures predictability, it often leads to overly complex, tangled workflows that are hard to maintain and prone to misuse. More importantly, it makes it difficult to properly break down and manage tasks. Therefore, the long-term solution requires both Agentic and manual Workflows working together in harmony. Only this unified approach can truly meet the demands of enterprise-level Agents.
With full Agent capabilities now in place, RAGFlow has become a more enterprise-ready, platform-level LLM engine. In the enterprise ecosystem, RAG occupies a role similar to traditional databases, while Agents serve as the specific applications—yet there are important differences. First, RAG focuses on leveraging unstructured data rather than structured datasets. Second, the interaction between RAG and Agents is much more frequent and intensive compared to typical application-database relationships because Agents need real-time, precise context to ensure their actions align closely with user intent. RAG plays a vital role in providing this context. For these reasons, completing the Agent capabilities is key to RAGFlow’s evolution.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/darkdata-7d49021133adb2fb18b0fc436201203b.PNG" width="1280" height="771"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Let’s take a look at the key features of RAGFlow 0.20.0.</p>
<h2 id="2-key-updates-in-ragflow-0200" class="anchor anchorTargetStickyNavbar_Vzrq">2. Key Updates in RAGFlow 0.20.0<a href="https://ragflow.io/en/blog/agentic-workflow-whats-inside-ragflow-v0.20.0#2-key-updates-in-ragflow-0200" class="hash-link" aria-label="Direct link to 2. Key Updates in RAGFlow 0.20.0" title="Direct link to 2. Key Updates in RAGFlow 0.20.0" translate="no"></a></h2>
<p>The key features of this release include:</p>
<ul>
<li class="">Unified orchestration of both Agents and Workflows.</li>
<li class="">A complete refactor of the Agent, significantly improving its capabilities and usability, with support for Multi-Agent configurations, planning and reflection, and visual features.</li>
<li class="">Full MCP functionality, enabling MCP Server import, Agents to act as MCP Clients, and RAGFlow itself to function as an MCP Server.</li>
<li class="">Access to runtime logs for Agents.</li>
<li class="">Chat histories with Agents available via the management panel.</li>
</ul>
<p>How does the updated Agent-building experience differ for developers?</p>
<p>Take the 0.19.1 customer service template as an example: previously, building this Workflow required seven types of components (Begin, Interact, Refine Question, Categorize, Knowledge Retrieval, Generate, and Message), with the longest chain for a category 4 question involving seven steps.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/old_flow-fc043de8554f4c23e9786a09cd6e374a.PNG" width="1034" height="1061"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>In the new version, building in pure Workflow mode requires only five types of components (Begin, Categorize, Knowledge Retrieval, Agent, and Message), with the workflow for a category 4 question (product related) reduced to five steps.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/new_workflow-a4d13c20f81200ddb50bd816430bed32.png" width="1280" height="592"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>With Agentic mode, just three types of components are needed - the original workflow logic can now be handled entirely through prompt engineering.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/agentic_mode-3ea10022ddd5a4486a4b9c03f23696a9.png" width="1280" height="539"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Developers can inspect Agents' execution paths and verify their inputs/outputs.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/execution_path-0d1e4eb5ec2d2a499a3ab773a542b323.png" width="1238" height="1247"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Business users can view Agents' reasoning processes through either the embedded page or chat interface.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/reasoning_process-9e4ad235237b5fddac9c9c1261de18e3.png" width="649" height="1044"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>This comparison quantitatively demonstrates reduced complexity and improved efficiency. Further details follow below - we encourage you to try it yourself.</p>
<h2 id="3-a-unified-orchestration-engine-for-agents" class="anchor anchorTargetStickyNavbar_Vzrq">3. A unified orchestration engine for Agents<a href="https://ragflow.io/en/blog/agentic-workflow-whats-inside-ragflow-v0.20.0#3-a-unified-orchestration-engine-for-agents" class="hash-link" aria-label="Direct link to 3. A unified orchestration engine for Agents" title="Direct link to 3. A unified orchestration engine for Agents" translate="no"></a></h2>
<p>RAGFlow 0.20.0 introduces unified orchestration of both Workflow and Agentic Workflow. As mentioned earlier, these represent two extremes, but enterprise scenarios demand their collaboration. The platform now supports co-orchestration on one, inherently Multi-Agent canvas—users can designate uncertain inputs as Agentic Workflows and deterministic ones as Workflows. To align with common practice, Agentic Workflows are represented as separate Agent components on the canvas.
This release redesigns the orchestration interface and component functions around this goal, while also improving usability issues from earlier Workflow versions. Key improvements include reducing core Components from 12 to 10, with the main changes as follows:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/19vs20-a9ef3c01e8349f3af1d4acae7c246f63.jpg" width="2035" height="1629"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="begin-component" class="anchor anchorTargetStickyNavbar_Vzrq">Begin component<a href="https://ragflow.io/en/blog/agentic-workflow-whats-inside-ragflow-v0.20.0#begin-component" class="hash-link" aria-label="Direct link to Begin component" title="Direct link to Begin component" translate="no"></a></h3>
<p>It now supports a task-based Agent mode that does not require a conversation to be triggered. Developers can build both conversational and task-based Agents on the same canvas.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/begin_component-b01780402193e78184ee858fdc0a6bb7.png" width="1196" height="843"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="retrieval-component" class="anchor anchorTargetStickyNavbar_Vzrq">Retrieval component<a href="https://ragflow.io/en/blog/agentic-workflow-whats-inside-ragflow-v0.20.0#retrieval-component" class="hash-link" aria-label="Direct link to Retrieval component" title="Direct link to Retrieval component" translate="no"></a></h3>
<p>Retrieval can function as a component within a workflow and also be used as a Tool by an Agent component, enabling the Agent to determine when and how to invoke retrieval queries.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/retrieval_component-1b8c9a3c1bdfdb78734aa10575b86d55.png" width="1280" height="689"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="agent-component" class="anchor anchorTargetStickyNavbar_Vzrq">Agent component<a href="https://ragflow.io/en/blog/agentic-workflow-whats-inside-ragflow-v0.20.0#agent-component" class="hash-link" aria-label="Direct link to Agent component" title="Direct link to Agent component" translate="no"></a></h3>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/agent1-31adb9961b6004317c696e8ce9817494.png" width="1280" height="748"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>An Agent capable of independently replacing your work needs to have the following abilities:</p>
<ul>
<li class="">Autonomous reasoning [1], with the capacity to reflect and adjust based on environmental feedback</li>
<li class="">The ability to use tools to complete tasks [3]</li>
</ul>
<p>With the new Agent component, developers only need to configure the Prompt and Tools to quickly build an Agent, as RAGFlow has already handled the underlying technical implementation.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/agent2-a7dd91a071e30be2a7adf6398d0084d8.png" width="1280" height="872"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Besides the single-agent mode, the new agent component also supports adding subagents that can be called during runtime.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/agent3-fda1df5c88b16ffa0f6cfdf21b583204.png" width="1280" height="875"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>You can freely add agents to build your own unlimited agent team.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/agent4-13aa004f25d41d4ae8dd56e69833dc3a.png" width="1261" height="884"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Add and bulk import your already deployed MCP Servers.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/agent5-e82a9a64e03824f8dd86cb3e25058e83.png" width="1208" height="525"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Tools from added MCP Servers can be used within the agent.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/agent6-ea500ad8cdf1cf05058d11176edd3695.png" width="1164" height="1041"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="await-response-component" class="anchor anchorTargetStickyNavbar_Vzrq">Await Response component<a href="https://ragflow.io/en/blog/agentic-workflow-whats-inside-ragflow-v0.20.0#await-response-component" class="hash-link" aria-label="Direct link to Await Response component" title="Direct link to Await Response component" translate="no"></a></h3>
<p>The original Interact component has been refactored into an await-response component, allowing developers to actively pause the process to initiate preset conversations and collect key information via forms.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/await_component-5a1332bdfa2f9004fbeaf11d76df6cf6.png" width="1280" height="647"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="switch-component" class="anchor anchorTargetStickyNavbar_Vzrq">Switch component<a href="https://ragflow.io/en/blog/agentic-workflow-whats-inside-ragflow-v0.20.0#switch-component" class="hash-link" aria-label="Direct link to Switch component" title="Direct link to Switch component" translate="no"></a></h3>
<p>Improved the usability of the switch component.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/switch_component-f1e4b7c4f9e63b2bfa7152d60d8b76bf.png" width="1186" height="977"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="iteration-component" class="anchor anchorTargetStickyNavbar_Vzrq">Iteration component<a href="https://ragflow.io/en/blog/agentic-workflow-whats-inside-ragflow-v0.20.0#iteration-component" class="hash-link" aria-label="Direct link to Iteration component" title="Direct link to Iteration component" translate="no"></a></h3>
<p>The input parameter type for the Iteration component has been changed to an array; during iteration, both the index and value are accessible to internal components, whose outputs can be formed into an array and passed downstream.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/iteration-887547be5e6e64f6376156ff04492147.png" width="1280" height="912"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="reply-message-component" class="anchor anchorTargetStickyNavbar_Vzrq">Reply Message component<a href="https://ragflow.io/en/blog/agentic-workflow-whats-inside-ragflow-v0.20.0#reply-message-component" class="hash-link" aria-label="Direct link to Reply Message component" title="Direct link to Reply Message component" translate="no"></a></h3>
<p>Messages can now be replied to directly via Reply Message, eliminating the need for the Interact component.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/reply-ff50ddc888c526727e11409e7fcc0db6.png" width="1280" height="628"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="text-processing-component" class="anchor anchorTargetStickyNavbar_Vzrq">Text Processing component<a href="https://ragflow.io/en/blog/agentic-workflow-whats-inside-ragflow-v0.20.0#text-processing-component" class="hash-link" aria-label="Direct link to Text Processing component" title="Direct link to Text Processing component" translate="no"></a></h3>
<p>Developers can easily concatenate strings through Text Processing.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/text1-196d135af0c8db6970681df44df97d2f.png" width="1280" height="778"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>You can also split strings into arrays.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/text2-5516c6d04e23fa1d11672e8762ff979f.png" width="1280" height="694"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<h3 id="summary" class="anchor anchorTargetStickyNavbar_Vzrq">Summary<a href="https://ragflow.io/en/blog/agentic-workflow-whats-inside-ragflow-v0.20.0#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary" translate="no"></a></h3>
<p>RAGFlow 0.20 enables simultaneous orchestration of both Agentic and Workflow modes, with built-in Multi-Agent support allowing multiple agents to coexist on a single canvas. For open-ended queries like “Why has company performance declined?” where the approach isn’t predetermined, users can define the process in Agentic style. In contrast, scenarios with clear, fixed steps use Workflow style. This lets developers build Agent applications with minimal configuration. The seamless integration of Agentic and Workflow approaches is the best practice for deploying enterprise-grade intelligent agents.</p>
<h2 id="4-application-ecosystem-and-future-development" class="anchor anchorTargetStickyNavbar_Vzrq">4. Application Ecosystem and Future Development<a href="https://ragflow.io/en/blog/agentic-workflow-whats-inside-ragflow-v0.20.0#4-application-ecosystem-and-future-development" class="hash-link" aria-label="Direct link to 4. Application Ecosystem and Future Development" title="Direct link to 4. Application Ecosystem and Future Development" translate="no"></a></h2>
<p>With a complete, unified no-code Agent framework in place, RAGFlow naturally supports a wide range of scenario-specific Agent applications—this is a major focus for its long-term development. In other words, a vast number of Agent templates will be built on top of RAGFlow, backed by our new ecosystem co-creation initiative.</p>
<p>RAGFlow 0.20.0 introduces Deep Research as a built-in template—an exceptional Agent that can serve both as a standalone application and as a foundation for building other intelligent agents. We will explain how to build the Deep Research template in detail in a forthcoming article.</p>
<p>The example below shows that on the RAGFlow platform, Deep Research can be created using either Agentic Workflow or traditional Workflow methods, with the former offering far greater flexibility and simplicity.
Deep Research built via a traditional Workflow:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/traditional-047be262074651a6edadaf924e7a0b46.png" width="1280" height="601"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Deep Research built with an Agentic Workflow shows significantly reduced complexity compared to the Workflow implementation above:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/agentic-8c3ee1ed002fd311c6fc84513e2b633d.png" width="1280" height="523"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>RAGFlow’s ecosystem initiative aims to provide enterprise-ready Agent templates embedded with industry know-how. Developers can easily customize these templates to fit their own business needs. Among these, Deep Research is the most important, as it represents the most common form of Agentic RAG and represents the essential path for Agents to unlock deeper value from enterprise data. Built on RAGFlow’s built-in Deep Research template, developers can quickly adapt it into specialized assistants—such as legal or medical advisors—significantly narrowing the gap between business systems and underlying infrastructure. This ecosystem approach is made possible by the close collaboration between RAG and Agents.
The 0.20.0 release marks a major step in integrating RAG and Agent capabilities within RAGFlow, with rapid updates planned ahead, including memory management and manual adjustment of Agent Plans. While unifying Workflow and Agentic Workflow greatly lowers the barriers to building enterprise Agents, and the ecosystem expands their application scope, the data foundation that merges structured and unstructured data around RAG remains the cornerstone of Agent capabilities. This approach is now known as “context engineering,” with traditional RAG representing its 1.0 version. Our future articles will explore these advancements in greater detail.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" alt="Image" src="https://ragflow.io/en/assets/images/context-1258ee2395d2976c927b2f497592ccdc.png" width="1280" height="875"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>We welcome your continued support - star RAGFlow on GitHub: <a href="https://github.com/infiniflow/ragflow" target="_blank" rel="noopener noreferrer" class=""><span>https://github.com/infiniflow/ragflow</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></p>
<h2 id="bibliography" class="anchor anchorTargetStickyNavbar_Vzrq">Bibliography<a href="https://ragflow.io/en/blog/agentic-workflow-whats-inside-ragflow-v0.20.0#bibliography" class="hash-link" aria-label="Direct link to Bibliography" title="Direct link to Bibliography" translate="no"></a></h2>
<ol>
<li class="">ReAct: Synergizing Reasoning and Acting in Language Models <a href="https://arxiv.org/abs/2210.03629" target="_blank" rel="noopener noreferrer" class=""><span>https://arxiv.org/abs/2210.03629</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class="">Reflexion: Language Agents with Verbal Reinforcement Learning <a href="https://arxiv.org/abs/2303.11366" target="_blank" rel="noopener noreferrer" class=""><span>https://arxiv.org/abs/2303.11366</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class="">A Practical Guide to Building Agents <a href="https://cdn.openai.com/business-guides-and-resources/a-practical-guide-to-building-agents.pdf" target="_blank" rel="noopener noreferrer" class=""><span>https://cdn.openai.com/business-guides-and-resources/a-practical-guide-to-building-agents.pdf</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
</ol>]]></content:encoded>
            <category>Product News</category>
        </item>
        <item>
            <title><![CDATA[RAG at the Crossroads - Mid-2025 Reflections on AI’s Incremental Evolution]]></title>
            <link>https://ragflow.io/en/blog/rag-at-the-crossroads-mid-2025-reflections-on-ai-evolution</link>
            <guid>https://ragflow.io/en/blog/rag-at-the-crossroads-mid-2025-reflections-on-ai-evolution</guid>
            <pubDate>Wed, 02 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Six months have passed since our last year-end review. As the initial wave of excitement sparked by DeepSeek earlier this year begins to wane, AI seems to have entered a phase of stagnation. This pattern is evident in Retrieval-Augmented Generation (RAG) as well: although academic papers on RAG continue to be plentiful, significant breakthroughs have been few and far between in recent months. Likewise, recent iterations of RAGFlow have focused on incremental improvements rather than major feature releases. Is this the start of future leaps forward, or the beginning of a period of steady, incremental growth? A mid-year assessment is therefore both timely and necessary.``]]></description>
            <content:encoded><![CDATA[<p>Six months have passed since our last year-end review. As the initial wave of excitement sparked by DeepSeek earlier this year begins to wane, AI seems to have entered a phase of stagnation. This pattern is evident in Retrieval-Augmented Generation (RAG) as well: although academic papers on RAG continue to be plentiful, significant breakthroughs have been few and far between in recent months. Likewise, recent iterations of RAGFlow have focused on incremental improvements rather than major feature releases. Is this the start of future leaps forward, or the beginning of a period of steady, incremental growth? A mid-year assessment is therefore both timely and necessary.<code>&lt;!--truncate--&gt;</code></p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/agent_rag-92150bc588aa56e99675862db36f4b36.jpg" width="1115" height="474"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Since it began, RAG has been the focus of ongoing debate — from the 2023 “fine-tuning debates” to the 2024 “long-context disputes.” However, since 2025, discourse around RAG has diminished as attention has shifted towards Agent systems. This shift has given rise to claims that “Agents eliminate the need for RAG.” As practitioners in the field, we recognize such assertions as a market-driven stunt, though we also acknowledge their potential to mislead non-specialists. Some have even begun rebranding RAG as “Agentic RAG,” accompanied by exaggerated market forecasts predicting its dominance over conventional RAG [Ref 1]. It is this growing confusion that prompts our review.</p>
<p>Notably, the earliest references to “Agentic RAG” appeared around the time RAGFlow launched its “Agent” feature a year ago. As a result, RAGFlow is frequently cited in academic literature as a benchmark for comparisons involving Agentic RAG. Our analysis therefore begins with an examination of both RAG and Agents.</p>
<p>Definitional Clarification: We define “Agent” as encompassing both Workflows and intelligent agents. In RAGFlow’s current version (v0.19), the year-old “Agent” label remains limited to Workflow functionality and does not yet possess full agentic capabilities. Unlike Anthropic’s proposal to separate these concepts [Ref 2], RAGFlow adheres to an integrated design philosophy, wherein Workflows and Agents are intrinsically unified.</p>
<h2 id="reflection-driven-the-key-to-agents-empowering-rag-reasoning" class="anchor anchorTargetStickyNavbar_Vzrq">Reflection-Driven: The Key to Agents Empowering RAG Reasoning<a href="https://ragflow.io/en/blog/rag-at-the-crossroads-mid-2025-reflections-on-ai-evolution#reflection-driven-the-key-to-agents-empowering-rag-reasoning" class="hash-link" aria-label="Direct link to Reflection-Driven: The Key to Agents Empowering RAG Reasoning" title="Direct link to Reflection-Driven: The Key to Agents Empowering RAG Reasoning" translate="no"></a></h2>
<p><em>Through manual or model-driven reflective loops, Agents tackle RAG reasoning challenges and enable intelligent breakthroughs; the two are inseparable.</em></p>
<p>Throughout our events from late 2024 to early 2025, we consistently highlighted three key features for RAG in 2025: reasoning, memory, and multimodality. The first two are inherently linked to Agents. In our initial blog this year, we offered a comprehensive overview of implementation of reasoning. A recent survey [Ref 3] further synthesizes reasoning and RAG, and we have adapted and condensed its framework as shown below:</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/workflow_agentic-133b74703df7f987eb692a97f96fcf45.jpg" width="1280" height="778"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>It is evident that the author has incorporated last year’s work into their reasoning framework. Implementations such as Self-RAG, RAPTOR, and Adaptive-RAG in RAGFlow from a year ago are classified as “predefined reasoning” in the source material. We propose instead defining these as Workflow-Based Approaches. Accordingly, the “Agentic RAG” described in our earlier publications employs workflows—manually defined interactions between RAG and Agents—to implement reflection (a core Agent capability) via components like Iteration and Switch. This approach addresses reasoning challenges such as ambiguous intents and long-context comprehension.</p>
<p>By contrast, Agentic-Based Approaches use models to autonomously drive reflection. Examples include Search O1, various open-source DeepResearch implementations, and Search R1. These divide further into two categories:</p>
<ul>
<li class="">Prompt-Driven Reflection (above the arrow): relying on LLM prompting.</li>
<li class="">Training-Dependent Reflection (typically reinforcement learning): learning domain-specific chains-of-thought (CoT) and reflection termination conditions.</li>
</ul>
<p>A crucial clarification: Search R1-style methods are not inherently superior. Their primary role is to optimize CoTs and termination conditions for domain-specific data within general-purpose LLMs, yet they remain fundamentally reliant on prompt-based Agent frameworks.</p>
<h2 id="the-foundation-of-memory-how-rag-supports-the-agents-memory-system" class="anchor anchorTargetStickyNavbar_Vzrq">The Foundation of Memory: How RAG Supports the Agent’s Memory System<a href="https://ragflow.io/en/blog/rag-at-the-crossroads-mid-2025-reflections-on-ai-evolution#the-foundation-of-memory-how-rag-supports-the-agents-memory-system" class="hash-link" aria-label="Direct link to The Foundation of Memory: How RAG Supports the Agent’s Memory System" title="Direct link to The Foundation of Memory: How RAG Supports the Agent’s Memory System" translate="no"></a></h2>
<p><em>RAG builds the agent’s long-term memory, enabling task state tracking and context acceleration through indexing, forgetting, and consolidation, while working with short-term memory to form a complete architecture.</em></p>
<p>Agents, regardless of their implementation, do little beyond RAG itself. So how do they make the seemingly routine RAG more intelligent and less reliant on reasoning models? Their transformative power lies in turning LLMs from single-step “intuitive guesswork” into systems capable of iterative observation and reflection—much like human cognition. This fundamental synergy explains why RAG frameworks such as RAGFlow naturally progress towards full Agent integration (beyond workflows), a key feature of RAGFlow's upcoming release.</p>
<p>Often dubbed the "Year of the Agent," 2025 saw a dazzling range of Agent applications emerge. However, core Agent frameworks showed little advancement compared to 2024. The rise in Agent adoption is chiefly due to improved In-Context Learning (ICL) in Large Language Models (LLMs), followed by the maturing Tools ecosystem and buzzwords like multi-agent systems enabling new use cases. Thus, beyond inherent LLM improvements, the core Agent paradigm exhibits limited technological innovation. One notable area of progress is the development of so-called "Memory" mechanisms.</p>
<p>If OpenAI’s 2024 acquisition of Rockset aimed to enhance Retrieval-Augmented Generation (RAG), its 2025 investment in Supabase seeks to equip Agents with more accessible Tools and partly to offer memory management. From the Agent’s perspective, RAG and various Data Infrastructure solutions are functionally equivalent—simply Tools invoked within the Agent’s context. However, the intrinsic link between RAG and Memory distinguishes RAG from other Data Infrastructure components.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/act-c6b2d8269f6bf20401ead7c735c14200.jpg" width="1280" height="741"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Memory gains significance only within the context of an Agent, prompting the question: what distinguishes Memory from RAG? [Ref. 4] offers a detailed summary, broadly dividing Memory into Contextual Memory and Parametric Memory—the latter typically relating to KV Cache and models, which we will address later. Generally, “Agent Memory” refers to Contextual Memory, which benefits the Agent in two key ways:</p>
<ol>
<li class="">Storing Task Management Metadata: For example, in Agentic Reasoning, introducing determinism into Planning (such as incorporating human feedback) means the Plan is not solely dictated by the LLM. Instead, a mechanism is needed to store the plan’s state, transforming the Agent from stateless to stateful. Additionally, tracking task decomposition during reasoning requires a repository for task-related metadata.</li>
<li class="">Context Management: Beyond retaining context, Memory caches and accelerates LLM outputs and provides personalised data necessary for tailored responses.</li>
</ol>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/memory-ac5445a652851f98ba092e559eb1b4e2.jpg" width="1280" height="728"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>From an interface perspective, the diagram shows that Memory must provide four key functions. While Updating is straightforward, the other three are explained below:</p>
<ol>
<li class="">Indexing: Memory must offer advanced search capabilities beyond simple queries. For Context Management—the second key value of Agent Memory—real-time search is often essential. For example, session data stored in short-term memory may need to be searched by topic to enrich subsequent interactions.</li>
<li class="">Forgetting: This refers to intentional forgetting, mimicking human cognition. Forgetting helps maintain focus and, technically, smaller datasets often improve search precision.</li>
<li class="">Consolidation: Meaning “strengthening,” this simulates cognitive processes by summarising and annotating stored data. Technically, it aligns closely with GraphRAG in the RAG paradigm, where an LLM organizes Memory content into a knowledge graph to enhance recall by providing richer context.</li>
</ol>
<p>The diagram below captures the true relationship between Memory and RAG, revealing that RAG is essentially part of long-term memory. Memory also includes short-term memory, which typically holds an Agent’s session-based interactions and personalized data, often in raw or unprocessed form. High-value data is then transferred via Consolidation as another part of long-term memory.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/long_term-d77d5309550ba7895d210e84dfa798d0.jpg" width="1280" height="741"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>Therefore, Memory without strong RAG support is fundamentally unsustainable. Beyond this reliance, other aspects of Memory remain limited. Regarding Parametric Memory, though it may seem closer to the essence of “memory,” its core principle offers no inherent technical advantage: it is a computationally intensive method based on KV Cache and Attention operations, tightly integrated with the LLM’s inference engine, essentially a dense attention mechanism. In contrast, long-term memory built on RAG provides filtered, supplementary material for reasoning within an effectively infinite context—also an attention mechanism, but a sparse one. What would be the implications of implementing KV Cache with sparse attention? We will explore this question later.</p>
<h2 id="rag-2025-overcoming-the-plateau-of-technological-challenges" class="anchor anchorTargetStickyNavbar_Vzrq">RAG 2025: Overcoming the Plateau of Technological Challenges<a href="https://ragflow.io/en/blog/rag-at-the-crossroads-mid-2025-reflections-on-ai-evolution#rag-2025-overcoming-the-plateau-of-technological-challenges" class="hash-link" aria-label="Direct link to RAG 2025: Overcoming the Plateau of Technological Challenges" title="Direct link to RAG 2025: Overcoming the Plateau of Technological Challenges" translate="no"></a></h2>
<p><em>Long-context reasoning depends on hierarchical indexing; multimodal data struggles with storage inflation; and slow infrastructure limits innovation.</em></p>
<p>Having examined the relationship between RAG and Agents, let us now refocus on RAG itself. Although RAG-related papers continued to be published steadily in 2025, genuine innovation in concepts and systems was notably scarce. Has RAG technology reached a critical plateau? At its core, RAG relies on information retrieval (IR), a well-established field. Yet RAG presents new challenges beyond traditional IR, including query diversity and multimodal data.</p>
<p>Query diversity remains a perennial challenge in information retrieval (IR), bridging the semantic gap between queries and answers. Numerous methods address this, including notable 2024 works such as GraphRAG, Contextual Retrieval, RAPTOR, and RAGFlow’s approach using automated tag libraries informed by domain experts. These methods essentially employ forms of sparse attention: complex queries require longer contexts and the identification of relevant attention within them. For simple queries, effective solutions exist, relying on good chunking and efficient multi-path recall. However, truly effective implementations for complex queries remain elusive.</p>
<p>Consequently, some argue that if bridging the semantic gap depends largely on LLMs generating auxiliary data, why not inject knowledge directly into the LLM’s working memory, bypassing such workarounds? This idea originated with CAG [Ref. 5], which proposed using KV Cache to store all data converted into KV format by the LLM. Later efforts sought to reduce the heavy bandwidth and computational costs of dense attention by combining KV data with database techniques to achieve sparse attention. Examples include RetrievalAttention [Ref. 6], RetroInfer [Ref. 7], and AlayaDB [Ref. 8].
These solutions split KV Cache data between two regions: a portion remains in the traditional KV Cache, while the bulk is stored in vector indexes or databases. During generation—specifically the Decoder phase of LLM inference—the current query vector (Q) retrieves relevant value vectors (V) from the index or database. These V vectors are then loaded into the KV Cache to complete the final attention computation, as illustrated below.</p>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/sparse_attention-cb9cd768c115d399d3fad9593f18b402.jpg" width="1280" height="741"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>While this technology shows promise in addressing current RAG challenges, it still faces significant hurdles. The main aim of such schemes is often to reduce LLM inference costs. Traditional inference, using Prefill/Decoder separation, relies on dense attention mechanisms that deliver high accuracy but at considerable cost and heavy GPU memory demands. In contrast, sparse attention schemes utilize CPU memory, disk storage, and Approximate Nearest Neighbour (ANN) vector search to lower costs.</p>
<p>These solutions require deep integration with the LLM inference engine, necessitating modifications to handle both text and vector data, which effectively limits their use to open-source models. Moreover, frequent vector retrievals during the Decoder phase demand co-located deployment of the retrieval system and inference engine to reduce network latency, restricting applicability mainly to private or on-premises setups.</p>
<p>Paradoxically, this integrated “Attention Engine” approach may not fully resolve core RAG issues, especially with lengthy documents. In long-context LLMs, overly verbose input can impair performance, causing key details to be overlooked or misinterpreted. For precise detail retrieval, traditional RAG methods still hold the edge.</p>
<p>Therefore, while we must keep a close eye on the “Attention Engine” approach, the practical focus remains on RAG outside the LLM, improving support for reasoning over long texts. Whether it’s an Attention Engine or a Search Engine, their strengths do not fully overlap—the former excels at rapid inference over smaller datasets, the latter at fast retrieval across vast data. They remain largely complementary, even as the scope of RAG continues to evolve and expand.</p>
<p>Currently, aside from methods like GraphRAG and RAPTOR that support cross-chunk reasoning, few solutions for retrieval and reasoning over very long texts demonstrate strong engineering viability. The main approaches can be summarized as follows:</p>
<ol>
<li class="">No Chunking, Whole Document Retrieval: Skip chunking and recall entire documents based on brief queries, feeding them directly into the context. This works for a small number of documents but struggles at scale due to poor understanding of global document context, resulting in low recall relevance.</li>
<li class="">Hierarchical Indexing &amp; In-Document Agentic RAG: Construct a tree-like index during ingestion reflecting document structure (e.g., sections, subsections). Recall happens at the document level, followed by structured traversal within the document using the hierarchical index to locate relevant chunks, enabling “Agentic RAG” within documents.</li>
<li class="">Overlapped Chunking &amp; Multi-Granular Retrieval: Use chunking with significant overlap and build a multi-layered index (e.g., document, section, paragraph levels). This employs a combined retrieval strategy leveraging both coarse and fine granularities.
Though conceptually straightforward, each approach poses unique challenges. As a tool provider, RAGFlow plans to offer similar functionalities in due course.</li>
</ol>
<p>Turning to the second aspect: multimodal data. In our year-end review, we highlighted Multimodal RAG (MM-RAG) as a key trend for 2025. Yet, by mid-year, this trend has failed to gain momentum. The primary obstacle remains the immaturity of the supporting infrastructure. As noted, late interaction models continue to dominate MM-RAG pipelines, meaning embedding models produce Tensors, or multi-vectors. For instance, a single image may be represented by 1,024 vectors, each comprising 128-dimensional floats, as illustrated below.</p>
<p>Several vector databases now claim to offer native Tensor support; however, comprehensive solutions for practical Tensor utilization remain scarce. This scarcity stems from the dramatic data expansion caused by Tensors, which can increase storage demands by up to two orders of magnitude. Consequently, beyond native Tensor support, holistic approaches are required to mitigate storage bloat. These include:</p>
<ul>
<li class="">Binary quantization at the database level: representing each vector dimension with a single bit, thereby reducing storage to approximately one thirty-second of the original size.</li>
<li class="">Index support for quantised multi-vectors or Tensor indexes: ensuring vector indexes can efficiently manage these binary-quantised multi-vectors.</li>
<li class="">Reranker compensation: to minimise precision loss from quantisation, binary vectors are de-quantised back into floats during the reranking phase to recalculate similarity scores, thus preserving accuracy.</li>
</ul>
<p><span class="w-full img my-2 only:my-0 block text-center"><img decoding="async" loading="lazy" class="w-full" src="https://ragflow.io/en/assets/images/tensor-25d55bd8e4c0bebc75d1eda26d653d1a.jpg" width="1280" height="741"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-loader-circle icon stroke-[1.5] lucide animate-spin" aria-hidden="true"><path d="M21 12a9 9 0 1 1-6.219-8.56"></path></svg></span></p>
<p>At the model level, efforts are needed to reduce overhead from Tensor storage growth. This includes:</p>
<ul>
<li class="">Using Multi-Representation Learning (MRL) to lower the dimensionality of each vector, for example, cutting dimensions to 64 could halve storage but slightly reduce recall accuracy.</li>
<li class="">Applying Token or Patch merging to reduce the number of vectors, such as shrinking from 1,024 patches to 128.</li>
</ul>
<p>While some progress has been made in optimizing models for text ranking, much more work is needed to meet the demands of Multimodal RAG. As a result, widespread adoption of MM-RAG depends on the development of its supporting infrastructure.</p>
<h2 id="end" class="anchor anchorTargetStickyNavbar_Vzrq">End<a href="https://ragflow.io/en/blog/rag-at-the-crossroads-mid-2025-reflections-on-ai-evolution#end" class="hash-link" aria-label="Direct link to End" title="Direct link to End" translate="no"></a></h2>
<p>In summary, our analysis shows that core RAG technology saw little significant progress in 2025. Meanwhile, the interdependence between RAG and Agents has deepened considerably—whether as the foundation of Agent Memory or enabling DeepResearch capabilities. From an Agent’s perspective, RAG may be just one Tool among many, but by managing unstructured data and Memory, it stands as one of the most fundamental and critical Tools. It is fair to say that without robust RAG, practical enterprise deployment of Agents would be unfeasible. Consequently, RAG’s value as a distinct architectural layer is now more pronounced than ever. These insights will directly inform the flagship features of the next RAGFlow release.</p>
<p>As for the complex challenges in RAG’s evolution, let's leave it to time for solution. After all, RAG is fundamentally an architectural framework; its true potential will be realized through the co-evolution of Infrastructure and models.
Stay tuned and welcome to star RAGFlow: <a href="https://github.com/infiniflow/ragflow" target="_blank" rel="noopener noreferrer" class=""><span>https://github.com/infiniflow/ragflow</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></p>
<h2 id="bibligraphy" class="anchor anchorTargetStickyNavbar_Vzrq">Bibligraphy<a href="https://ragflow.io/en/blog/rag-at-the-crossroads-mid-2025-reflections-on-ai-evolution#bibligraphy" class="hash-link" aria-label="Direct link to Bibligraphy" title="Direct link to Bibligraphy" translate="no"></a></h2>
<ol>
<li class=""><a href="https://market.us/report/agentic-retrieval-augmented-generation-market/" target="_blank" rel="noopener noreferrer" class=""><span>https://market.us/report/agentic-retrieval-augmented-generation-market/</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class=""><a href="https://www.anthropic.com/engineering/building-effective-agents" target="_blank" rel="noopener noreferrer" class=""><span>https://www.anthropic.com/engineering/building-effective-agents</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class="">Reasoning RAG via System 1 or System 2: A Survey on Reasoning Agentic Retrieval-Augmented Generation for Industry Challenges <a href="https://arxiv.org/abs/2506.10408" target="_blank" rel="noopener noreferrer" class=""><span>https://arxiv.org/abs/2506.10408</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class="">Rethinking Memory in AI: Taxonomy, Operations, Topics and Future Directions <a href="https://arxiv.org/abs/2505.00675" target="_blank" rel="noopener noreferrer" class=""><span>https://arxiv.org/abs/2505.00675</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class="">Don't Do RAG: When Cache-Augmented Generation is All You Need for Knowledge Tasks <a href="https://arxiv.org/abs/2412.15605" target="_blank" rel="noopener noreferrer" class=""><span>https://arxiv.org/abs/2412.15605</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class="">RetrievalAttention: Accelerating Long-Context LLM Inference via Vector Retrieval <a href="https://arxiv.org/abs/2409.10516" target="_blank" rel="noopener noreferrer" class=""><span>https://arxiv.org/abs/2409.10516</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class="">RetroInfer: A Vector-Storage Approach for Scalable Long-Context LLM Inference <a href="https://arxiv.org/abs/2505.02922" target="_blank" rel="noopener noreferrer" class=""><span>https://arxiv.org/abs/2505.02922</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
<li class="">AlayaDB: The Data Foundation for Efficient and Effective Long-context LLM Inference <a href="https://arxiv.org/abs/2504.10326" target="_blank" rel="noopener noreferrer" class=""><span>https://arxiv.org/abs/2504.10326</span><span class="icon size-[1.15em] align-baseline ml-[.25em] inline-flex items-center justify-center text-[.85rem] relative leading-[0] after:content-['_'] after:absolute after:inset-0 after:rounded after:bg-current after:opacity-20"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-up-right icon lucide stroke-[2]" aria-label="(opens in new tab)"><path d="M7 7h10v10"></path><path d="M7 17 17 7"></path></svg></span></a></li>
</ol>]]></content:encoded>
            <category>Insights</category>
        </item>
    </channel>
</rss>