<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://xpertai.cn/blog</id>
    <title>XpertAI Blog</title>
    <updated>2026-05-20T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://xpertai.cn/blog"/>
    <subtitle>XpertAI Blog</subtitle>
    <icon>https://xpertai.cn/icons/logo.png</icon>
    <entry>
        <title type="html"><![CDATA[Data Xpert 正式发布：企业智能体的业务操作系统]]></title>
        <id>data-xpert-release</id>
        <link href="https://xpertai.cn/blog/data-xpert-release"/>
        <updated>2026-05-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Data Xpert 正式发布。它面向企业智能体落地，把数据、知识和业务系统转化为可发现、可治理、可执行的对象语义空间，让智能体真正进入业务现场。]]></summary>
        <content type="html"><![CDATA[<p>企业智能体走向生产环境后，真正困难的地方往往不再是“模型会不会回答”，而是它能不能安全地理解和操作真实业务数据。</p><p>数据分散在商业智能语义模型、SAP 数据服务、知识库、数据库和各种业务系统中；同一个业务对象在不同系统里可能有不同的名称、字段、粒度和权限边界；智能体如果只能凭自然语言猜测数据库查询语句、接口参数或业务含义，就很难被企业放心地放进核心流程。</p><p>今天，我们正式发布 <strong><a href="https://docs.xpertai.cn/zh-Hans/data/overview/concept" target="_blank" rel="noopener noreferrer">Data Xpert</a></strong>，一套面向企业智能体的业务操作系统。</p><p>Data Xpert 的目标不是再做一个静态数据目录，也不是让智能体绕过已有系统直接调用任意接口。它要做的是在企业已有数据和业务系统之上，建立一层统一的对象语义执行空间：资源可以被接入，对象可以被理解，动作可以被发现，执行可以被治理，结果可以被追踪。</p><p><img loading="lazy" alt="Data Xpert 与 XpertAI 集成架构" src="/assets/images/system-architecture-58b2a7ae05ed6d7eec9247399aa96a49.png" width="1536" height="1024" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="从数据目录到业务操作系统">从数据目录到业务操作系统<a class="hash-link" href="#从数据目录到业务操作系统" title="标题的直接链接">​</a></h2><p>传统数据目录主要回答两个问题：资产在哪里，字段是什么意思。</p><p>但当智能体开始参与业务执行时，企业还需要回答更多问题：</p><ul><li>这个对象能做什么？</li><li>当前用户和当前助手是否有权限使用它？</li><li>它支持查询、预览、分析、创建还是更新？</li><li>执行前能否先模拟和校验？</li><li>高风险动作是否需要审批？</li><li>执行之后如何追溯输入、输出、策略和证据？</li></ul><p>Data Xpert 正是围绕这些问题设计的。它把企业资源转化为可被智能体使用的对象空间，让指标、模型、表、字段、SAP 实体集合、知识实体和业务动作都拥有清晰的语义、关系、约束和执行边界。</p><p>在底层，Data Xpert 使用 <a href="https://docs.xpertai.cn/zh-Hans/data/overview/uose-theory" target="_blank" rel="noopener noreferrer">UOSE</a>，也就是统一对象语义执行系统。你可以把它理解为智能体访问企业资源之前的一层语义控制面和治理执行面。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="统一接入企业数据知识与业务系统">统一接入企业数据、知识与业务系统<a class="hash-link" href="#统一接入企业数据知识与业务系统" title="标题的直接链接">​</a></h2><p>Data Xpert 首先提供的是统一<a href="https://docs.xpertai.cn/zh-Hans/data/features/control-plane/resource-access" target="_blank" rel="noopener noreferrer">资源接入能力</a>。</p><p>管理员可以通过<a href="https://docs.xpertai.cn/zh-Hans/data/features/control-plane/secret-management" target="_blank" rel="noopener noreferrer">密钥管理</a>维护连接凭据，通过资源注册表登记资源，通过资源类型能力表单配置同步范围、查询限制、服务白名单和运行参数。资源接入后，系统会通过<a href="https://docs.xpertai.cn/zh-Hans/data/features/control-plane/sync-jobs" target="_blank" rel="noopener noreferrer">同步任务</a>把外部元数据拉入 Data Xpert，并生成后续可被本体、智能体工具和治理模块使用的语义对象。</p><p>当前产品主线覆盖的资源类型包括：</p><ul><li><a href="https://docs.xpertai.cn/zh-Hans/data/integrations/semantic-model" target="_blank" rel="noopener noreferrer">语义模型</a>：连接 Xpert 语义模型、多维数据集、指标、度量和维度。</li><li><a href="https://docs.xpertai.cn/zh-Hans/data/integrations/sap-odata" target="_blank" rel="noopener noreferrer">SAP 数据服务</a>：连接 SAP OData 服务、实体集合、实体类型和业务操作。</li><li><a href="https://docs.xpertai.cn/zh-Hans/data/integrations/knowledge" target="_blank" rel="noopener noreferrer">图谱增强检索知识库</a>：连接 xpert-pro 知识库图谱，让文档证据和实体关系进入智能体上下文。</li><li><a href="https://docs.xpertai.cn/zh-Hans/data/integrations/xpert-database" target="_blank" rel="noopener noreferrer">企业数据库</a>：连接数据源元数据，用于表、字段、关系、预览和查询分析。</li></ul><p>这些资源的协议各不相同，但进入 Data Xpert 后，会被转换成统一的实体、关系、属性、动作和策略对象。对智能体来说，它不需要直接理解每个系统的内部细节，而是通过稳定的对象语义协议完成发现、分析和执行。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="让数据拥有可被智能体理解的本体语义">让数据拥有可被智能体理解的本体语义<a class="hash-link" href="#让数据拥有可被智能体理解的本体语义" title="标题的直接链接">​</a></h2><p>资源接入只是第一步。要让智能体可靠工作，还需要让资源拥有可理解、可搜索、可验证的业务语义。</p><p>Data Xpert 的本体语义层会把外部资源同步为<a href="https://docs.xpertai.cn/zh-Hans/data/features/ontology/snapshot-and-projection" target="_blank" rel="noopener noreferrer">本体快照</a>，并进一步投影为运行时实体、关系和动作实例。管理员可以在<a href="https://docs.xpertai.cn/zh-Hans/data/features/ontology/ontology-workspace" target="_blank" rel="noopener noreferrer">本体工作区</a>中查看每个资源的快照状态，搜索跨资源实体，检查图谱关系，并进入<a href="https://docs.xpertai.cn/zh-Hans/data/features/ontology/entity-graph" target="_blank" rel="noopener noreferrer">单资源图谱</a>查看节点、边、属性和原始值摘要。</p><p>这一步很关键。因为智能体不应该只从页面文字或历史对话里猜测业务对象，而应该先定位对象，再查看它的上下游关系和结构定义，再判断它当前能执行哪些动作。</p><p>一个更可靠的业务流程会是：</p><ul><li>先确认用户真正要找的是哪个业务对象。</li><li>再查看这个对象的关键属性、上下游关系和可用数据。</li><li>判断它当前允许执行哪些分析、查询或业务操作。</li><li>正式执行前先完成参数、权限和风险校验。</li><li>执行之后把结果、证据和审计记录返回给用户。</li></ul><p>这条路径让智能体从“猜答案”转向“在可验证的对象空间里工作”。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="智能体工具协议接入与对话工作台">智能体工具、协议接入与对话工作台<a class="hash-link" href="#智能体工具协议接入与对话工作台" title="标题的直接链接">​</a></h2><p>Data Xpert 为智能体提供<a href="https://docs.xpertai.cn/zh-Hans/data/features/agent-execution/agent-tools" target="_blank" rel="noopener noreferrer">标准工具能力</a>，包括实体查询、关系读取、本体结构查询、<a href="https://docs.xpertai.cn/zh-Hans/data/features/agent-execution/action-discovery" target="_blank" rel="noopener noreferrer">动作发现</a>、动作模拟、动作执行和审计追踪。</p><p>这些能力可以通过标准接口使用，也可以通过<a href="https://docs.xpertai.cn/zh-Hans/ai/tutorial/integrate-with-mcp-dify" target="_blank" rel="noopener noreferrer">模型上下文协议</a>服务开放给业务助手。对前端用户来说，Data Xpert 通过 <a href="https://docs.xpertai.cn/zh-Hans/ai/chatkit/index" target="_blank" rel="noopener noreferrer">ChatKit</a> 和<a href="https://docs.xpertai.cn/zh-Hans/data/features/agent-execution/workbench-and-chatkit" target="_blank" rel="noopener noreferrer">助手工作台</a>提供交互式执行体验：用户可以在当前资源、当前本体图谱或当前业务助手上下文中发起对话，让智能体带着上下文完成分析和操作。</p><p>执行结果也不只是返回一段文本。Data Xpert 可以把语义模型查询结果、OData 集合数据、数据库查询结果和知识图谱证据渲染为表格、图表、证据卡片或可下载数据，让智能体的工作结果更接近业务用户真正能使用的交付物。</p><p>这也是 Data Xpert 与普通聊天入口的区别。它不是让用户“问一个模型”，而是让用户在企业数据对象和业务操作空间中，与一个可治理的智能体协作。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="治理审批与审计是生产环境的默认能力">治理、审批与审计是生产环境的默认能力<a class="hash-link" href="#治理审批与审计是生产环境的默认能力" title="标题的直接链接">​</a></h2><p>企业智能体要进入真实业务，治理能力必须是默认设计，而不是后补功能。</p><p>Data Xpert 内置<a href="https://docs.xpertai.cn/zh-Hans/data/features/governance/policies" target="_blank" rel="noopener noreferrer">策略绑定</a>、<a href="https://docs.xpertai.cn/zh-Hans/data/features/governance/approvals" target="_blank" rel="noopener noreferrer">审批队列</a>和<a href="https://docs.xpertai.cn/zh-Hans/data/features/governance/audit" target="_blank" rel="noopener noreferrer">执行审计</a>。管理员可以围绕资源、动作、实体类型配置允许、拒绝或需要审批。智能体在发现动作、模拟执行和真实执行时，都会经过策略判断。高风险动作可以进入审批队列，执行完成后则会留下任务、资源、动作、目标对象、策略结果、输入输出和审计引用。</p><p>同时，Data Xpert 与 XpertAI 的<a href="https://docs.xpertai.cn/zh-Hans/ai/agent/agent" target="_blank" rel="noopener noreferrer">工作空间</a>、用户组和已发布智能体访问控制体系协同工作。业务助手的可见与运行权限不再散落在本地角色表里，而是围绕工作空间、用户组和已发布智能体进行统一管理。前端菜单不是安全边界，ChatKit 会话创建时仍会由后端重新校验助手状态、工作空间访问权限和发布访问权限。</p><p>这让企业可以把智能体放进真实组织结构里，而不是只在演示环境里运行。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="一条更清晰的落地路径">一条更清晰的落地路径<a class="hash-link" href="#一条更清晰的落地路径" title="标题的直接链接">​</a></h2><p>Data Xpert 的典型使用路径很直接：</p><ol><li>管理员创建连接密钥，注册语义模型、SAP 数据服务、知识库或数据库资源。</li><li>系统同步资源元数据，生成本体快照和实体、关系、动作投影。</li><li>管理员在本体工作区中验证语义图谱和实体搜索结果。</li><li>智能体构建器将可访问资源绑定到业务助手，并配置工作空间、用户组、运行环境、工具集和运行凭据。</li><li>业务用户在助手工作台中通过 ChatKit 发起分析、查询、解释或受控执行。</li><li>对高风险动作，系统进入审批；对已执行动作，系统保留审计轨迹。</li></ol><p>这条链路把过去分散在数据平台、业务系统、权限系统、对话入口和审计日志里的能力，收束成一套面向智能体生产环境的业务操作系统。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="data-xpert-的意义">Data Xpert 的意义<a class="hash-link" href="#data-xpert-的意义" title="标题的直接链接">​</a></h2><p>Data Xpert 的发布，意味着 XpertAI 在企业智能体方向上进入了一个更深的阶段。</p><p>如果说智能体平台解决的是智能体如何构建、编排和运行，ChatKit 解决的是智能体如何嵌入产品体验，那么 Data Xpert 解决的就是智能体如何可靠地进入企业数据和业务系统。</p><p>它让企业可以用统一方式接入资源，用本体语义组织业务对象，用智能体工具约束智能体执行，用策略、审批和审计守住生产边界。最终，智能体不再只是一个会回答问题的界面，而是能够在企业业务对象之上持续工作的数字协作者。</p><p><a href="https://data.xpertai.cn/" target="_blank" rel="noopener noreferrer">立即体验 Data Xpert</a></p>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="Data Xpert" term="Data Xpert"/>
        <category label="UOSE" term="UOSE"/>
        <category label="智能体" term="智能体"/>
        <category label="数据" term="数据"/>
        <category label="发布" term="发布"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[XpertAI 3.9.0 发布：从 Prompt Engineering 走向 Harness Engineering]]></title>
        <id>harness-engineering-3-9</id>
        <link href="https://xpertai.cn/blog/harness-engineering-3-9"/>
        <updated>2026-04-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[XpertAI 3.9.0 以 ClawXpert 与 Skills 为核心，把长期上下文、技能沉淀、能力控制与计划执行组合成一套更完整的智能体工作台。]]></summary>
        <content type="html"><![CDATA[<p>最近，行业对 agent 的讨论，正在从 “prompt engineering” 转向 “harness engineering”。</p><p>OpenAI 在官方文章 <a href="https://openai.com/index/harness-engineering/" target="_blank" rel="noopener noreferrer">Harness Engineering</a> 中强调，随着模型能力持续提升，决定 agent 上限的往往不再只是单次 prompt，而是模型外部那层完整的工作台。Anthropic 在 <a href="https://www.anthropic.com/engineering/building-effective-agents" target="_blank" rel="noopener noreferrer">Building Effective Agents</a> 中强调，真正有效的 agent 往往来自简单、可组合、可持续优化的模式；Claude Code 的官方设计里，也把长期指令、Skills、Subagents、MCP 看作 agent 的执行外壳。LangChain 则持续把 middleware 与 context engineering 当成 agent loop 的关键控制层。</p><p>XpertAI 3.9.0 的重点，正是把这套思路产品化为一套更完整的智能体工作台：<code>ClawXpert + Skills</code>。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="为什么-prompt-已经不够了">为什么 Prompt 已经不够了<a class="hash-link" href="#为什么-prompt-已经不够了" title="标题的直接链接">​</a></h2><p>当智能体开始承担更真实的工作时，团队很快会发现，一个 prompt 很难覆盖所有需求。</p><p>你可能希望它：</p><ul><li>长期记住自己的角色和边界。</li><li>记住某个用户或团队的偏好。</li><li>在不同任务里调用不同的方法论和最佳实践。</li><li>有些能力默认开放，有些能力只在特定场景可用。</li><li>不只在聊天中回答，还能被触发、被安排、被持续执行。</li></ul><p>这时候，问题就不再是“这一轮对话该怎么写 prompt”，而是“这个智能体应该拥有什么样的工作台”。</p><p>这就是 harness engineering 的核心。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="什么是-harness-engineering">什么是 Harness Engineering<a class="hash-link" href="#什么是-harness-engineering" title="标题的直接链接">​</a></h2><p>如果说 prompt engineering 是打磨一句话，那么 harness engineering 更像是在设计一个完整的操作系统。</p><p>它关注的不是模型单轮输出，而是模型周围那一整套可持续运行的结构，例如：</p><ul><li>身份与行为规则。</li><li>用户画像与<a href="https://docs.xpertai.cn/zh-Hans/ai/digital-expert/long-term-memory" target="_blank" rel="noopener noreferrer">长期记忆</a>。</li><li><a href="https://docs.xpertai.cn/zh-Hans/ai/digital-expert/skill" target="_blank" rel="noopener noreferrer">技能</a>库与可复用方法。</li><li>工具和能力的可见范围，以及<a href="https://docs.xpertai.cn/zh-Hans/ai/middleware" target="_blank" rel="noopener noreferrer">智能体中间件</a>这样的控制层。</li><li>文件、环境与<a href="https://docs.xpertai.cn/zh-Hans/ai/digital-expert/sandbox" target="_blank" rel="noopener noreferrer">执行空间</a>。</li><li><a href="https://docs.xpertai.cn/zh-Hans/ai/workflow/trigger" target="_blank" rel="noopener noreferrer">触发器</a>、计划与持续动作。</li></ul><p>换句话说，harness engineering 不是让模型“更会说”，而是让智能体“更会工作”。</p><p>XpertAI 3.9.0 做的，就是把这套结构真正落到产品里。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="390-的核心变化clawxpert-成为长期可用的智能体外壳">3.9.0 的核心变化：ClawXpert 成为长期可用的智能体外壳<a class="hash-link" href="#390-的核心变化clawxpert-成为长期可用的智能体外壳" title="标题的直接链接">​</a></h2><p><code>ClawXpert</code> 是 3.9.0 新增的专用 assistant shell。它让一个已发布的智能体，不再只是“发布后等待调用”的能力，而是拥有了一个长期可运营、可持续调校、可积累上下文的<a href="https://docs.xpertai.cn/zh-Hans/ai/ai-assistant/configure-ai-assistant" target="_blank" rel="noopener noreferrer">助手入口</a>。</p><p>在这个入口里，团队可以围绕同一个智能体持续工作：</p><ul><li>选择并绑定要长期使用的智能体。</li><li>统一维护它的角色设定、行为原则和用户偏好。</li><li>在同一入口里继续历史对话，而不是每次从零开始。</li><li>调整它当前使用的模型与能力边界。</li><li>让它从即时问答逐步走向计划执行与持续运行。</li></ul><p>这意味着，智能体不再只是一个临时聊天窗口，而更像一个可以长期协作的数字工作台。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="skills把团队经验沉淀成可复用能力">Skills：把团队经验沉淀成可复用能力<a class="hash-link" href="#skills把团队经验沉淀成可复用能力" title="标题的直接链接">​</a></h2><p>3.9.0 的另一条主线，是 <code>Skills</code>。</p><p>很多团队在做 agent 时都会遇到同一个问题：真正有价值的经验，往往不是“某一句提示词”，而是一套反复验证过的方法。</p><p>比如：</p><ul><li>某类文档该如何拆解和处理。</li><li>某个任务应该按什么顺序完成。</li><li>某种分析、写作、研究、生成工作有哪些固定步骤。</li><li>某个工具该在什么条件下使用，输出应该长成什么样。</li></ul><p>如果这些经验只存在聊天记录里，它们就很难复用，也很难沉淀成团队资产。</p><p><code>Skills</code> 的价值，就在于把这些经验变成可安装、可浏览、可更新、可持续积累的<a href="https://docs.xpertai.cn/zh-Hans/ai/digital-expert/skill" target="_blank" rel="noopener noreferrer">能力模块</a>。团队可以：</p><ul><li>从技能仓库中安装需要的 skills。</li><li>把私有方法论整理成自己的技能包。</li><li>在工作区里持续维护这些技能内容。</li><li>让不同智能体共享同一套能力资产。</li></ul><p>这让团队构建 agent 的方式，从“重复写 prompt”，转向“持续建设能力库”。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="关键不只是有技能而是技能会在需要时被用起来">关键不只是“有技能”，而是“技能会在需要时被用起来”<a class="hash-link" href="#关键不只是有技能而是技能会在需要时被用起来" title="标题的直接链接">​</a></h2><p>更重要的是，3.9.0 并没有把 skills 停留在资料管理层。</p><p>在 XpertAI 的设计里，skills 不是摆在旁边的文档，而是会进入智能体工作流的一部分：</p><ul><li>智能体会先知道自己有哪些可用技能。</li><li>当任务匹配时，再进一步读取对应技能的详细说明。</li><li>技能不是一次性塞满上下文，而是按需进入执行过程。</li></ul><p>这种方式有两个直接好处：</p><ul><li>一方面，智能体始终知道自己“能做什么”。</li><li>另一方面，它又不会因为无关信息过多而让上下文变得臃肿。</li></ul><p>这也是当前行业里越来越重要的一种思路：不是把所有知识一次性压进 prompt，而是让智能体在执行过程中按需发现和使用能力。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="同一套技能库不同的人可以拥有不同的工作面">同一套技能库，不同的人可以拥有不同的工作面<a class="hash-link" href="#同一套技能库不同的人可以拥有不同的工作面" title="标题的直接链接">​</a></h2><p>团队在真实使用中，还有一个非常实际的需求：同一个技能库，不一定适合所有人完全照单全收。</p><p>有人需要更完整的能力面，有人只需要更聚焦的工作面；有人在运营场景下需要更多自动化能力，有人在创作场景里只希望保留少量核心技能。</p><p>XpertAI 3.9.0 在这里做了很重要的一步：把“共享能力库”和“个性化可见面”拆开了。</p><p>你可以理解为：</p><ul><li>团队共享同一个技能资产池。</li><li>但每个人都可以为自己的智能体工作台决定哪些能力保持开启。</li><li>同一个智能体，可以因用户、任务和场景不同，呈现不同的能力边界。</li></ul><p>这让智能体更像一个可定制的工作环境，而不是所有人都被迫面对同一块复杂面板。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="从会回答到会执行">从“会回答”到“会执行”<a class="hash-link" href="#从会回答到会执行" title="标题的直接链接">​</a></h2><p>当长期上下文、技能库、能力控制和计划机制被放在一起之后，智能体的使用方式会发生明显变化。</p><p>它不再只是在聊天里回答问题，而开始具备更连续的工作特征：</p><ul><li>能持续保持稳定的人设和协作方式。</li><li>能在不同任务中复用成熟的方法。</li><li>能根据场景切换可见能力。</li><li>能被<a href="https://docs.xpertai.cn/zh-Hans/ai/workflow/trigger" target="_blank" rel="noopener noreferrer">触发</a>、被安排、被持续调用。</li></ul><p>这正是 harness engineering 真正有价值的地方。</p><p>它让智能体从“一个会聊天的模型入口”，逐渐变成“一个可以长期运营的数字员工界面”。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="一个更适合团队理解的搭建路径">一个更适合团队理解的搭建路径<a class="hash-link" href="#一个更适合团队理解的搭建路径" title="标题的直接链接">​</a></h2><p>如果用更直观的方式理解，XpertAI 3.9.0 带来的工作流大致是这样的：</p><ol><li>先选定一个长期使用的智能体入口。</li><li>给它明确的角色、原则和用户偏好。</li><li>把团队常用的方法论整理成 skills。</li><li>为不同用户或场景决定哪些能力应该可见。</li><li>把它接入需要的<a href="https://docs.xpertai.cn/zh-Hans/ai/workflow/trigger" target="_blank" rel="noopener noreferrer">触发</a>和<a href="https://docs.xpertai.cn/zh-Hans/ai/toolset/scheduled-tasks" target="_blank" rel="noopener noreferrer">计划执行</a>，让它开始承担持续任务。</li><li>随着团队使用不断补充和迭代能力库。</li></ol><p>这条路径非常适合你后续配图，因为它本质上就是一个“从智能体配置到智能体运营”的演进过程。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="这也是-xpertai-对行业趋势的回应">这也是 XpertAI 对行业趋势的回应<a class="hash-link" href="#这也是-xpertai-对行业趋势的回应" title="标题的直接链接">​</a></h2><p>今天大家越来越清楚，真正有价值的 agent 产品，不是只会在单轮对话里表现聪明，而是能够在长期协作中保持稳定、积累经验、按需调用能力，并逐步承担真实工作。</p><p>OpenAI、Anthropic、LangChain 都在推动这条方向，而 XpertAI 3.9.0 用 <code>ClawXpert + Skills</code> 给出了自己的产品化答案：</p><ul><li>用长期入口承接持续协作。</li><li>用技能库承接团队经验。</li><li>用能力控制承接不同角色和场景。</li><li>用计划与触发承接持续执行。</li></ul><p>这意味着，XpertAI 3.9.0 不只是增加了几个功能点，而是把智能体从“会回答”推进到了“可运营”。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="立即体验">立即体验<a class="hash-link" href="#立即体验" title="标题的直接链接">​</a></h2><p>如果你已经在使用 XpertAI，3.9.0 很适合从下面几个动作开始：</p><ul><li>为团队选定一个长期使用的 <code>ClawXpert</code> 入口。</li><li>把角色设定、行为原则和用户偏好整理清楚。</li><li>安装第一批真正有复用价值的 <a href="https://docs.xpertai.cn/zh-Hans/ai/digital-expert/skill" target="_blank" rel="noopener noreferrer">skills</a>。</li><li>根据不同用户和任务场景，调整能力可见面。</li><li>尝试把一部分固定工作交给<a href="https://docs.xpertai.cn/zh-Hans/ai/toolset/scheduled-tasks" target="_blank" rel="noopener noreferrer">计划执行</a>或<a href="https://docs.xpertai.cn/zh-Hans/ai/workflow/trigger" target="_blank" rel="noopener noreferrer">触发机制</a>。</li></ul><p>当这些能力组合在一起之后，你得到的就不再只是一个聊天机器人，而是一套真正可长期演进的智能体工作台。</p><hr><p>XpertAI 3.9.0，不只是让智能体“更聪明”，而是让智能体开始拥有一套更完整的工作方式。</p>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="Release" term="Release"/>
        <category label="Agent" term="Agent"/>
        <category label="Skills" term="Skills"/>
        <category label="ClawXpert" term="ClawXpert"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[CodeXpert 正式发布：面向企业工程团队的智能编码平台]]></title>
        <id>code-xpert-release</id>
        <link href="https://xpertai.cn/blog/code-xpert-release"/>
        <updated>2026-02-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[CodeXpert 是基于 XpertAI 智能体平台打造的新一代智能编码产品，面向企业工程团队，将对话式协作、任务化工作流与可编排智能体体系融合在一起，帮助团队在安全可控的环境中完成从需求拆解、代码生成、执行验证到 PR 协作的闭环。]]></summary>
        <content type="html"><![CDATA[<p><a href="https://code.xpertai.cn" target="_blank" rel="noopener noreferrer">CodeXpert</a> 是基于 XpertAI 智能体平台打造的新一代智能编码产品，面向企业工程团队，将对话式协作、任务化工作流与可编排智能体体系融合在一起，帮助团队在安全可控的环境中完成从需求拆解、代码生成、执行验证到 PR 协作的闭环。</p><p><img loading="lazy" alt="Code Xpert" src="/assets/images/code-xpert-arch-0e73f0b887d49399bfeaf1aa98077922.png" width="3356" height="1804" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="架构位置与系统角色">架构位置与系统角色<a class="hash-link" href="#架构位置与系统角色" title="标题的直接链接">​</a></h2><p>在整个系统架构中，CodeXpert 位于“交互与任务编排”的关键层：</p><ul><li><strong>CodeXpert Web 与 CodeXpert Server</strong> 负责用户交互、任务管理与会话编排，提供任务创建、执行观察、变更集与 PR 流程等能力。</li><li><strong>XpertAI Agent Server</strong> 作为智能体编排核心，调度多智能体协作，管理上下文与线程状态，操作沙箱环境，并调用 LLM 进行推理与代码生成。</li><li><strong>Sandbox 沙箱环境</strong> 负责与编码相关的命令执行、测试与文件操作的隔离运行，保障安全与可观测性。</li><li><strong>工具集与插件体系</strong> 提供企业系统接入与能力扩展，为智能体提供稳定、可扩展的工具链入口。</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="为什么是-codexpert">为什么是 CodeXpert<a class="hash-link" href="#为什么是-codexpert" title="标题的直接链接">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-智能体可编排性从单体到多智能体协作">1. 智能体可编排性：从单体到多智能体协作<a class="hash-link" href="#1-智能体可编排性从单体到多智能体协作" title="标题的直接链接">​</a></h3><p>XpertAI 平台支持多智能体架构，包括监督型、蜂群型、层级型与自定义工作流。CodeXpert 将这种可编排能力用于编码场景：</p><ul><li>专家型智能体分工协作，覆盖需求理解、改动分析、代码生成与验证等环节。</li><li>任务级编排确保执行步骤可追踪、可复盘，减少“黑盒式”生成。</li><li>企业可根据组织结构或交付流程自定义智能体体系，实现更可控的研发协作。</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-架构解耦更易扩展更易治理">2. 架构解耦：更易扩展、更易治理<a class="hash-link" href="#2-架构解耦更易扩展更易治理" title="标题的直接链接">​</a></h3><p>CodeXpert 的分层架构将“交互、编排、执行、工具”解耦：</p><ul><li>前后端与智能体平台松耦合，便于独立升级。</li><li>执行环境与业务逻辑隔离，保障安全与稳定。</li><li>统一的工具与插件机制减少系统侵入，避免扩展带来的复杂度累积。</li></ul><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_S0QG"><p>这种解耦方式带来的是更易扩展的架构演进路径和更稳定的工程治理能力。</p></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-可扩展能力插件与工具生态">3. 可扩展能力：插件与工具生态<a class="hash-link" href="#3-可扩展能力插件与工具生态" title="标题的直接链接">​</a></h3><p>XpertAI 插件系统提供标准化扩展点，支持在不修改核心代码的前提下扩展能力：</p><ul><li>插件采用模块化与策略机制，支持生命周期管理与健康检查。</li><li>内置与自定义工具集（MCP、OpenAPI、OData 等）让企业系统快速接入。</li><li>统一配置与授权机制降低接入门槛，便于运维管理。</li></ul><p>这意味着企业可以按需将内部系统、知识库与工具链引入到 CodeXpert 任务中，打造专属的智能编码能力栈。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="4-企业级本地化部署与本地大模型">4. 企业级本地化部署与本地大模型<a class="hash-link" href="#4-企业级本地化部署与本地大模型" title="标题的直接链接">​</a></h3><p>CodeXpert 面向企业场景提供本地化部署选项，支持在企业内网环境中运行整体关键组件，并与企业本地大模型或私有模型服务对接，满足合规与数据安全需求。</p><ul><li>支持在本地或私有云环境运行关键服务。</li><li>可接入企业自有大模型能力，保持模型与数据的闭环可控。</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="5-安全可控的执行与审计">5. 安全可控的执行与审计<a class="hash-link" href="#5-安全可控的执行与审计" title="标题的直接链接">​</a></h3><p>所有代码执行与测试任务运行在隔离的 Sandbox 沙箱中：</p><ul><li>多租户隔离与权限控制降低风险。</li><li>生命周期治理与监测能力增强可观测性。</li><li>统一工具协议确保执行行为可追踪、可审计。</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="典型应用场景">典型应用场景<a class="hash-link" href="#典型应用场景" title="标题的直接链接">​</a></h2><ul><li>复杂需求下的多智能体协作编程</li><li>代码改动影响分析与自动化验证</li><li>企业内部平台与工具链的深度集成</li><li>安全合规场景下的本地模型编码协作</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="结语">结语<a class="hash-link" href="#结语" title="标题的直接链接">​</a></h2><p>CodeXpert 不只是一个“写代码的助手”，而是基于 XpertAI 智能体平台构建的企业级编码系统。它通过智能体可编排性、解耦架构与可扩展插件体系，帮助团队在安全可控的环境中实现高质量、可治理、可扩展的工程协作。</p><p><em><strong>如果你正在构建面向企业的智能研发体系，CodeXpert 将是你升级研发流程与智能体能力的关键一步。</strong></em></p><p>赶紧来试用 CodeXpert，开启智能编码的新篇章吧！<a href="https://code.xpertai.cn" target="_blank" rel="noopener noreferrer">点击这里免费使用</a></p>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="AI" term="AI"/>
        <category label="Agent" term="Agent"/>
        <category label="Code" term="Code"/>
        <category label="Release" term="Release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[ChatKit SDK 正式发布：构建智能对话体验的全栈解决方案]]></title>
        <id>chatkit-release</id>
        <link href="https://xpertai.cn/blog/chatkit-release"/>
        <updated>2025-12-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[XpertAI 全新推出 ChatKit SDK！这是一款可嵌入的智能对话 UI 组件，为开发者提供开箱即用的聊天体验，支持主题定制、小部件交互、客户端工具调用和副作用管理，让你无需从零构建聊天界面，即可打造专业级的智能体应用。]]></summary>
        <content type="html"><![CDATA[<p>今天，我们正式发布 <strong>ChatKit SDK</strong>——一款专为智能体对话体验打造的全栈 UI 解决方案！无论你是在构建内部知识库助手、HR 入职助手、研究伴侣、购物助手、故障排查机器人，还是客户支持代理，ChatKit 都提供可自定义的聊天嵌入来处理所有用户体验细节。</p><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_S0QG"><p>ChatKit 可以以最小的侵入性集成到你的应用中，支持高度定制和扩展，帮助你快速构建专业级的智能对话界面。</p></div></div><figure class="Large"><img loading="lazy" src="/img/ai/chatkit/Developer-ChatKit-Arch.png" alt="ChatKit Architecture" class="rounded-xl shadow-md img_ev3q"><figcaption>ChatKit 架构图：前端嵌入 + 后端工作流</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="-为什么选择-chatkit">🚀 为什么选择 ChatKit？<a class="hash-link" href="#-为什么选择-chatkit" title="标题的直接链接">​</a></h2><p>构建一个功能完善的聊天界面并非易事。你需要处理消息流式传输、文件上传、工具调用可视化、响应式布局、主题切换等诸多细节。ChatKit 将这些复杂性封装为一个简洁的 SDK，让你专注于智能体的业务逻辑。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="核心优势">核心优势<a class="hash-link" href="#核心优势" title="标题的直接链接">​</a></h3><ul><li><strong>开箱即用</strong>：一行代码即可嵌入功能完整的聊天界面</li><li><strong>深度定制</strong>：从主题颜色到交互组件，完全符合你的品牌风格</li><li><strong>前后端分离</strong>：前端使用 ChatKit，后端托管在 XpertAI Agent Builder</li><li><strong>生态兼容</strong>：基于成熟的 React 生态，支持 TypeScript</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="-主题和自定义让聊天界面融入你的产品">🎨 主题和自定义：让聊天界面融入你的产品<a class="hash-link" href="#-主题和自定义让聊天界面融入你的产品" title="标题的直接链接">​</a></h2><ul><li>配色与模式：浅色 / 深色、强调色等级、圆角与密度</li><li>字体与语气：自定义字体族、输入框占位符、欢迎语</li><li>启动提示：预置示例问题，引导用户快速上手</li><li>头部定制：支持自定义按钮与导航，贴合产品信息架构</li></ul><p>探索更多定制选项，请访问 <a href="https://chatkit.studio/playground" target="_blank" rel="noopener noreferrer">ChatKit Studio</a> 的交互式构建器。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="-小部件让数据可视化与交互更丰富">🧩 小部件：让数据可视化与交互更丰富<a class="hash-link" href="#-小部件让数据可视化与交互更丰富" title="标题的直接链接">​</a></h2><p>ChatKit 小部件是对话中的交互式卡片和组件。通过小部件，你可以在聊天中展示：</p><ul><li><strong>数据卡片</strong>：产品信息、订单详情、用户资料</li><li><strong>列表行</strong>：搜索结果、待办事项、推荐项</li><li><strong>交互按钮</strong>：快速操作、表单提交、状态切换</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="小部件中间件">小部件中间件<a class="hash-link" href="#小部件中间件" title="标题的直接链接">​</a></h3><ul><li>模型→前端：通过工具调用或结构化输出返回小部件 JSON，前端直接渲染</li><li>中间件：在服务端配置小部件生成/转换逻辑，按上下文动态调整内容与样式</li><li>交互回传：按钮/卡片点击会携带自定义负载回传给后端，触发业务处理</li></ul><p>可使用 <a href="https://go.copilotkit.ai/A2UI-widget-builder" target="_blank" rel="noopener noreferrer">A2UI Widget Builder</a> 设计并预览小部件，了解更多关于 <a href="https://a2ui.org/" target="_blank" rel="noopener noreferrer">A2UI 协议</a>。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="-客户端工具让模型操作前端功能">🔧 客户端工具：让模型操作前端功能<a class="hash-link" href="#-客户端工具让模型操作前端功能" title="标题的直接链接">​</a></h2><p>客户端工具将<strong>模型发起的工具调用路由到前端 UI 执行</strong>，适用于读取前端状态、用户交互、浏览器能力等场景。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="工作流程">工作流程<a class="hash-link" href="#工作流程" title="标题的直接链接">​</a></h3><p>1) 服务端：在工作流中用 Client Tool 中间件定义工具名称、描述、参数模式
2) 模型：基于上下文触发工具调用
3) 前端：通过回调接收调用并执行浏览器/本地逻辑（状态读取、UI 动作、权限能力）
4) 回传：将执行结果返回给模型，继续推理</p><p>常见用法：读取浏览器状态、触发路由/主题切换、调起弹窗或设备能力。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="-客户端副作用驱动-ui-变化不中断对话">⚡ 客户端副作用：驱动 UI 变化不中断对话<a class="hash-link" href="#-客户端副作用驱动-ui-变化不中断对话" title="标题的直接链接">​</a></h2><p>客户端副作用用于<strong>将模型产生的"副作用事件"推送到前端执行</strong>，<strong>不打断模型推理流程</strong>。适用于 UI 更新、视图聚焦、高亮、动画、状态同步等<strong>只影响前端、不依赖返回值</strong>的场景。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="核心特性">核心特性<a class="hash-link" href="#核心特性" title="标题的直接链接">​</a></h3><ul><li>不阻塞对话：模型触发副作用后继续生成回复</li><li>单向通知：模型 → 前端 UI，适合聚焦、高亮、动画、状态同步</li><li>预设结果：服务端配置默认 result，前端仅负责执行 UI 改变</li></ul><p>适用于：解释功能时自动高亮界面区域，引导操作时自动滚动到目标位置等。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="️-架构设计前后端分离的最佳实践">🏗️ 架构设计：前后端分离的最佳实践<a class="hash-link" href="#️-架构设计前后端分离的最佳实践" title="标题的直接链接">​</a></h2><p>ChatKit 采用前后端分离的架构设计：</p><ul><li><strong>前端</strong>：使用 <code>@xpert-ai/chatkit-react</code> SDK 嵌入聊天界面</li><li><strong>后端</strong>：在 <a href="https://app.xpertai.cn/xpert/w/" target="_blank" rel="noopener noreferrer">XpertAI Agent Builder</a> 创建智能体工作流</li><li><strong>安全认证</strong>：通过服务端生成客户端密钥，确保安全访问</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="快速开始概念级">快速开始（概念级）<a class="hash-link" href="#快速开始概念级" title="标题的直接链接">​</a></h3><p>1) 在 XpertAI Agent Builder 创建智能体工作流，获取数字专家 ID
2) 前端安装并嵌入 <code>@xpert-ai/chatkit-react</code>，指向你的工作流
3) 后端提供会话创建端点，安全下发客户端密钥
4) 渲染 ChatKit 组件，启用主题、小部件、工具和副作用能力</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="-适用场景">🎯 适用场景<a class="hash-link" href="#-适用场景" title="标题的直接链接">​</a></h2><p>ChatKit 适合各种智能体对话应用场景：</p><ul><li><strong>企业内部工具</strong>：知识库助手、HR 入职流程、IT 支持机器人</li><li><strong>电商与服务</strong>：购物顾问、订单查询、预约调度</li><li><strong>专业领域</strong>：研究助手、财务规划、医疗咨询</li><li><strong>开发者工具</strong>：代码审查助手、文档生成器、调试工具</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="-立即体验">📦 立即体验<a class="hash-link" href="#-立即体验" title="标题的直接链接">​</a></h2><p>ChatKit SDK 现已正式发布，提供完整的文档和示例代码。访问我们的<a href="/docs/ai/chatkit/">文档中心</a>开始构建你的第一个智能对话应用。</p><p><strong>无需重新发明聊天界面，专注于打造真正有价值的智能体能力。</strong></p><hr><p><em>XpertAI ChatKit——让智能对话体验触手可及。</em></p>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="ChatKit" term="ChatKit"/>
        <category label="SDK" term="SDK"/>
        <category label="Agent" term="Agent"/>
        <category label="Release" term="Release"/>
        <category label="Embedded Chat" term="Embedded Chat"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[3.7 版本发布：智能体中间件]]></title>
        <id>agent-middleware-3-7</id>
        <link href="https://xpertai.cn/blog/agent-middleware-3-7"/>
        <updated>2025-12-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[XpertAI 智能体平台 3.7 版本正式上线！本次更新的核心亮点是全新推出的 **智能体中间件** 功能，为开发者提供对智能体执行流程的精细化控制与模块化扩展能力，进一步推动智能体构建从“功能实现”迈向“流程可控、能力可塑”的新阶段。]]></summary>
        <content type="html"><![CDATA[<p>今天，我们激动地宣布 <strong>XpertAI 智能体平台 3.7 版本</strong> 正式上线！本次更新的核心亮点是全新推出的 <strong>智能体中间件</strong> 功能，为开发者提供对智能体执行流程的精细化控制与模块化扩展能力，进一步推动智能体构建从“功能实现”迈向“流程可控、能力可塑”的新阶段。</p><figure class="Large"><img loading="lazy" src="/img/ai/xpert/agent-middleware-nodes.png" alt="Middleware node config" class="rounded-xl shadow-md img_ev3q"><figcaption>智能体中间件节点</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="-智能体中间件重新定义智能体控制粒度">🧩 智能体中间件：重新定义智能体控制粒度<a class="hash-link" href="#-智能体中间件重新定义智能体控制粒度" title="标题的直接链接">​</a></h2><p>智能体中间件旨在通过<strong>模块化插件机制</strong>，让开发者能够灵活介入智能体的决策、执行与输出全流程，实现对智能体行为的透明观察与精准干预。  </p><p>其核心能力包括：  </p><ul><li><p><strong>模块化插件配置</strong><br>
<!-- -->将日志记录、提示词转换、响应格式化、错误重试等功能封装为独立插件，支持按需组合，像搭积木一样快速构建定制化智能体流程，提升功能复用与系统维护效率。  </p></li><li><p><strong>可视化执行链</strong><br>
<!-- -->在智能体思考、调用工具、生成结果等关键步骤前后提供可观察的钩子，形成清晰的执行链路视图。开发者可以直观跟踪智能体“思考—行动—观察”全过程，便于调试与策略优化。  </p></li><li><p><strong>集中式灵活配置</strong><br>
<!-- -->通过统一的中间件节点管理界面，动态配置插件启用状态与参数，支持不同环境下的快速切换与组合调整，大幅提升智能体应用的定制化能力。  </p></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="️-基于-nestjs-的可扩展架构">🏗️ 基于 NestJS 的可扩展架构<a class="hash-link" href="#️-基于-nestjs-的可扩展架构" title="标题的直接链接">​</a></h2><p>XpertAI 智能体中间件采用 <strong>NestJS 插件模块机制</strong> 构建，具备高度可扩展性和稳定性：  </p><ul><li>每个中间件功能封装为标准 NestJS 模块，遵循统一的插件接口，确保行为一致性。  </li><li>支持开发者基于约定接口快速开发自定义中间件，轻松集成到平台中，实现业务逻辑的独立演进与平滑升级。  </li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="-与-langchain-架构对齐生态兼容与最佳实践同步">🔗 与 LangChain 架构对齐：生态兼容与最佳实践同步<a class="hash-link" href="#-与-langchain-架构对齐生态兼容与最佳实践同步" title="标题的直接链接">​</a></h2><p>我们参考并兼容 <strong>LangChain Agent Middleware</strong> 的设计理念，此举带来多重战略价值：  </p><ul><li><p><strong>复用成熟生态</strong><br>
<!-- -->可直接借鉴或集成 LangChain 社区中丰富的中间件实现（如 PII 检测、人工审核、提示缓存等），加速功能落地与生态建设。  </p></li><li><p><strong>同步行业前沿</strong><br>
<!-- -->跟随 LangChain 在 Agent 架构上的持续演进，及时引入如上下文优化、多代理协同等新型中间件模式，保持平台技术领先性。  </p></li><li><p><strong>提升框架通用性</strong><br>
<!-- -->无论是简单问答机器人还是复杂多步任务代理，均可通过同一套中间件体系灵活组装，支持更广泛的业务场景与架构模式。  </p></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="-赋能多样化的智能体应用场景">🚀 赋能多样化的智能体应用场景<a class="hash-link" href="#-赋能多样化的智能体应用场景" title="标题的直接链接">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="内部研发提效">内部研发提效<a class="hash-link" href="#内部研发提效" title="标题的直接链接">​</a></h3><p>项目团队可通过插件组合快速搭建不同特性的智能体，例如：</p><ul><li>为对话系统添加“会话摘要”插件，自动生成对话总结；  </li><li>为检索场景加载“PII 检测”插件，实现敏感信息过滤。<br>结合可视化执行链，大幅降低调试与迭代成本。  </li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="生态合作与定制集成">生态合作与定制集成<a class="hash-link" href="#生态合作与定制集成" title="标题的直接链接">​</a></h3><p>第三方开发者可基于标准插件接口，开发面向行业场景的专用中间件（如金融合规审查、医疗术语标准化等），并无缝集成到 XpertAI 智能体流程中，实现安全可控的跨领域能力扩展。  </p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="-即刻体验">📦 即刻体验<a class="hash-link" href="#-即刻体验" title="标题的直接链接">​</a></h2><p>智能体中间件功能已在 XpertAI 3.7 版本中全面开放，现有用户可在智能体工作流管理界面中直接配置使用。我们同步提供了多个常用中间件插件示例与详细接入文档，助你快速上手。  </p><hr><p>智能体不应只是“黑箱”，而应是可观测、可干预、可组装的智能单元。XpertAI 3.7 推出的智能体中间件，正是我们向这一目标迈出的关键一步。  </p><p>欢迎访问我们的<a href="/docs/ai/middleware/">文档中心</a>了解更多详情，开启你的智能体流程定制之旅。  </p><p><strong>控制更细，组合更自由，智能更透明——XpertAI 智能体中间件，为你而来。</strong></p><hr><p><em>XpertAI 持续赋能智能体构建与落地，与开发者共同推进 AI 应用工程化进程。</em></p>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="Agent" term="Agent"/>
        <category label="Middleware" term="Middleware"/>
        <category label="Release" term="Release"/>
        <category label="Plugin" term="Plugin"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[XpertAI 3.6 发布：知识流水线与插件生态全面升级]]></title>
        <id>knowledge-pipeline-3-6</id>
        <link href="https://xpertai.cn/blog/knowledge-pipeline-3-6"/>
        <updated>2025-10-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[XpertAI 3.6 聚焦知识流水线创建、编排、授权、发布到运维的全流程升级，并让插件系统成为连接多源数据与 AI 工具的核心能力。]]></summary>
        <content type="html"><![CDATA[<p>XpertAI 3.6 正式上线！这一版本全面梳理了从知识流水线创建、编排、授权、发布到知识库运维的每一环节，让团队能够以视觉化方式构建可信赖的知识生产线。
同时，插件系统升级为流水线的原生能力，帮助你通过系统集成或市场插件快速接入外部数据源和文档处理等工具。</p><figure class="Large"><img loading="lazy" src="/img/ai/pipeline/basic-pipeline-workflow.png" alt="pipeline workflow" class="rounded-xl shadow-md img_ev3q"><figcaption>知识流水线基础工作流</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="三种创建路径秒速搭建适合你的流水线">三种创建路径，秒速搭建适合你的流水线<a class="hash-link" href="#三种创建路径秒速搭建适合你的流水线" title="标题的直接链接">​</a></h2><ul><li><strong>空白知识流水线</strong>：从零开始自由编排节点，针对特定业务流程精细化设计数据处理策略。</li><li><strong>内置模板</strong>：针对通用文档、富媒体 PDF 等典型场景提供优化配置，安装即可直接运行。</li><li><strong>导入流水线</strong>：支持将既有流水线导出为 YAML 并在其他工作区导入，团队之间快速复用最佳实践。</li></ul><p>无论采用哪种方式，知识流水线都会同时定义数据源、处理节点、存储配置、节点连接以及可选的用户输入表单，确保流程一体化落地。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="可视化编排从文档数据源到知识库的全链路升级">可视化编排：从文档数据源到知识库的全链路升级<a class="hash-link" href="#可视化编排从文档数据源到知识库的全链路升级" title="标题的直接链接">​</a></h2><p>新的编排界面围绕「文档数据源 → 文档转换器 → 分块器 → 知识库节点 → 触发器」的主路径展开，你可以拖拽节点、连接流程并查看每一环节的参数设置。</p><ul><li><strong>多源数据输入</strong>：本地文件、在线文档、网盘、网页爬虫等数据源可并行接入，后续还可在插件市场获取更多扩展。</li><li><strong>文档转换器升级</strong>：内置转换器支持 PDF、PPTX、DOCX 等文件的文本与图片抽取，也能通过插件市场选用 Unstructured、MinerU 等第三方转换器。</li><li><strong>树状分块体系</strong>：新增的父子分块器（Parent-Child Tree）以树状结构保存上下文，实现父块语义召回与子块精准命中；通用分块器和 Q&amp;A Processor（开发中）覆盖常规文本和问答型知识。</li><li><strong>触发器节点</strong>：自定义运行输入参数，在上传或调用 API 时动态传入分隔符、URL 等变量。</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="文档数据源授权环境变量与系统集成双轨并行">文档数据源授权：环境变量与系统集成双轨并行<a class="hash-link" href="#文档数据源授权环境变量与系统集成双轨并行" title="标题的直接链接">​</a></h2><p>为了保证外部数据接入安全，3.6 版提供了统一的授权机制：</p><ul><li><strong>默认环境变量</strong>：在部署阶段预设 API Key，流水线运行时自动使用，无需手动绑定。</li><li><strong>系统集成中心</strong>：在控制台统一配置 API Key 或未来的 OAuth 信息，授权状态同步回流水线界面。</li></ul><p>当前版本已支持 Firecrawl 与飞书文档的 API Key 与 OAuth（开发中）授权，后续会持续扩展更多云文档与网盘服务。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="一键发布同步数字专家生态">一键发布同步数字专家生态<a class="hash-link" href="#一键发布同步数字专家生态" title="标题的直接链接">​</a></h2><p>知识流水线作为数字专家能力的一部分，发布流程与专家发布体验保持一致。发布成功后即可：</p><ul><li>直接进入文档列表上传或同步数据；</li><li>浏览自动生成的 API 文档，完成外部系统对接；</li><li>下载为流水线模板，供其他知识库复用（开发中）。</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="上传与处理体验预览分段实时追踪">上传与处理体验：预览分段，实时追踪<a class="hash-link" href="#上传与处理体验预览分段实时追踪" title="标题的直接链接">​</a></h2><p>发布后，你可以在文档列表中执行全新的上传流程：</p><ul><li>根据流水线配置选择本地文件、远程文件系统、云文档或网页爬取等来源；</li><li>若定义了触发器参数，上传时填写变量并预览分段效果；</li><li>通过进度条实时查看解析、分块、嵌入状态，处理完成后可直接跳转到文档详情；</li><li>如需快速试验，也可随时切换至基础配置模式直接上传文件。</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="运维与优化持续管理知识库">运维与优化：持续管理知识库<a class="hash-link" href="#运维与优化持续管理知识库" title="标题的直接链接">​</a></h2><p>3.6 版本在知识库管理侧提供更多操作入口：</p><ul><li>回到流水线编辑界面调整节点配置或优化策略；</li><li>在知识库页面进行召回测试、更新文件、管理标签与描述；</li><li>与插件市场配合获取新的数据源或处理节点，持续扩展知识库能力。</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="插件系统连接无限扩展">插件系统，连接无限扩展<a class="hash-link" href="#插件系统连接无限扩展" title="标题的直接链接">​</a></h2><p>配合 3.6 发布的插件系统 GA，我们将流水线节点与插件生态深度融合。开发者可以：</p><ul><li>在插件市场查看官方或社区插件，快速接入 Firecrawl、飞书文档等数据源；</li><li>编写自定义插件，扩展 <code>Document Source</code>、<code>Document Transformer</code>、<code>Chunker</code> 或 <code>Image Understanding</code> 等增强点；</li><li>利用系统集成统一管理密钥与 OAuth 信息，保障多团队协作的安全性。</li></ul><p>更多关于插件体系的设计理念，可参考我们此前的 <a href="/blog/plugins-system">插件系统全面上线</a> 介绍。</p><hr><p>XpertAI 3.6 知识流水线让知识驱动的智能体建设更高效、更标准化、更易扩展。即刻 <a href="https://app.xpertai.cn/" target="_blank" rel="noopener noreferrer">登录</a> 云平台，体验全新模板、树状分块与插件生态带来的升级吧！</p>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="Knowledge" term="Knowledge"/>
        <category label="Pipeline" term="Pipeline"/>
        <category label="Release" term="Release"/>
        <category label="Plugin" term="Plugin"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[插件系统全面上线：打造无限扩展的智能体生态]]></title>
        <id>plugins-system</id>
        <link href="https://xpertai.cn/blog/plugins-system"/>
        <updated>2025-10-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[随着 AI 技术的快速发展，企业级智能应用对 灵活扩展、模块解耦和跨系统集成 的需求越来越迫切。为了满足开发者和企业用户的多样化场景，XpertAI 平台在本次版本中正式推出 全新插件系统，让平台具备了真正的「无限扩展」能力。]]></summary>
        <content type="html"><![CDATA[<p>随着 AI 技术的快速发展，企业级智能应用对 <strong>灵活扩展、模块解耦和跨系统集成</strong> 的需求越来越迫切。为了满足开发者和企业用户的多样化场景，XpertAI 平台在本次版本中正式推出 <a href="/docs/plugin/"><strong>全新插件系统</strong></a>，让平台具备了真正的「无限扩展」能力。</p><hr><h2 class="anchor anchorWithStickyNavbar_LWe7" id="为什么要打造插件系统">为什么要打造插件系统？<a class="hash-link" href="#为什么要打造插件系统" title="标题的直接链接">​</a></h2><p>在过去，企业往往需要在核心系统中直接编写业务逻辑，导致：</p><ul><li><strong>功能扩展困难</strong>：每次新增需求都需要修改主代码库</li><li><strong>系统耦合度高</strong>：不同业务模块之间相互牵制，难以维护</li><li><strong>生态缺失</strong>：外部开发者很难为平台贡献新能力</li></ul><p>XpertAI 插件系统的出现，正是为了解决这一痛点。它让开发者能够通过 <strong>插件化</strong> 的方式，为平台无缝引入新的 <strong>系统集成、数据源扩展和工具能力</strong>，而无需动核心代码。</p><figure class="Large"><img loading="lazy" src="/img/server/plugins/plugins.png" alt="plugins system" class="rounded-xl shadow-md img_ev3q"><figcaption>插件系统</figcaption></figure><hr><h2 class="anchor anchorWithStickyNavbar_LWe7" id="插件系统的核心特性">插件系统的核心特性<a class="hash-link" href="#插件系统的核心特性" title="标题的直接链接">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="-1-模块化--解耦">🔗 1. 模块化 &amp; 解耦<a class="hash-link" href="#-1-模块化--解耦" title="标题的直接链接">​</a></h3><p>每个插件就是一个独立的 <strong>NestJS 模块</strong>，包含自己的 <code>controller</code>、<code>service</code>、<code>entity</code> 和业务逻辑。</p><ul><li>插件独立开发与维护</li><li>插拔式安装与升级，不影响核心服务</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="-2-生命周期管理">⚡ 2. 生命周期管理<a class="hash-link" href="#-2-生命周期管理" title="标题的直接链接">​</a></h3><p>插件具备完整的生命周期：</p><ul><li><strong>onInit</strong>：模块注册完成</li><li><strong>onStart</strong>：应用启动后（可对外服务）</li><li><strong>onStop</strong>：优雅停机时（释放资源）</li></ul><p>这让开发者可以灵活控制插件的启动与关闭逻辑，提升系统稳定性。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="-3-增强出口点enhancement-points">🧩 3. 增强出口点（Enhancement Points）<a class="hash-link" href="#-3-增强出口点enhancement-points" title="标题的直接链接">​</a></h3><p>宿主系统预置了一系列增强点，插件只需实现对应接口，就能扩展系统能力。
目前支持：</p><ul><li><strong>IntegrationStrategy</strong>（系统集成策略） → 对接外部 API / 服务</li><li><strong>DocumentSourceStrategy</strong>（数据源策略） → 引入新的文档/知识来源</li></ul><p>例如，你可以通过插件快速接入 <strong>Firecrawl</strong>、<strong>OpenAI</strong>、<strong>Slack</strong>、<strong>飞书</strong> 等服务。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="️-4-类型安全的配置管理">🛠️ 4. 类型安全的配置管理<a class="hash-link" href="#️-4-类型安全的配置管理" title="标题的直接链接">​</a></h3><p>基于 <strong>zod Schema</strong> 的配置机制，插件可以声明所需参数（如 API Key、URL），平台会自动生成校验逻辑与 UI 配置表单。</p><ul><li>类型安全</li><li>默认值支持</li><li>安全字段（如密钥输入）的统一管理</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="-5-健康检查与可观测性">🔍 5. 健康检查与可观测性<a class="hash-link" href="#-5-健康检查与可观测性" title="标题的直接链接">​</a></h3><p>插件可实现 <code>checkHealth</code> 接口，返回运行状态和依赖检查详情，便于企业级监控与运维。</p><hr><h2 class="anchor anchorWithStickyNavbar_LWe7" id="实际案例飞书文档插件">实际案例：<a href="/docs/plugin/lark/">飞书文档插件</a><a class="hash-link" href="#实际案例飞书文档插件" title="标题的直接链接">​</a></h2><p>在本次升级中，我们同步推出了 <strong>飞书文档插件</strong> 作为示例：</p><ul><li><strong>系统集成</strong>：通过 <code>IntegrationStrategy</code> 对接 飞书文档 API</li><li><strong>数据源扩展</strong>：通过 <code>DocumentSourceStrategy</code> 将网页内容爬取并转化为结构化数据</li><li><strong>服务接口</strong>：提供测试 API 与服务方法，开发者可以直接调用</li></ul><p>有了这个插件，XpertAI 可以直接从 飞书文档 抓取文档数据，并转化为智能体可消费的 Markdown 或结构化信息，大大提升了企业文档获取的自动化能力。</p><hr><h2 class="anchor anchorWithStickyNavbar_LWe7" id="面向未来的插件生态">面向未来的插件生态<a class="hash-link" href="#面向未来的插件生态" title="标题的直接链接">​</a></h2><p>XpertAI 插件系统不仅是一个扩展机制，更是面向未来的 <strong>生态基石</strong>：</p><ul><li>内部团队可快速构建行业定制化插件（能源、金融、零售等）</li><li>第三方开发者可开发并发布插件，丰富平台能力</li><li>企业用户可以按需启用或禁用插件，构建专属的智能应用生态</li></ul><hr><h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a class="hash-link" href="#总结" title="标题的直接链接">​</a></h2><p>XpertAI 插件系统的上线，标志着平台进入了一个 <strong>可无限扩展、可生态化运营</strong> 的新阶段。
无论你是 <strong>AI 开发者</strong>、<strong>企业 IT 团队</strong>，还是希望将 <strong>智能体与业务系统深度结合</strong> 的合作伙伴，现在都可以通过插件系统，快速扩展和定制 XpertAI 的能力。</p><p>👉 在接下来的系列文章中，我们还会逐步发布 <strong>插件开发教程</strong>，带你从 0 到 1 编写属于自己的插件。</p>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="Plugin" term="Plugin"/>
        <category label="Agent" term="Agent"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[数字专家项目]]></title>
        <id>xpert-project</id>
        <link href="https://xpertai.cn/blog/xpert-project"/>
        <updated>2025-05-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[当智能体学会「自主运行」，协作的边界在哪里？]]></summary>
        <content type="html"><![CDATA[<div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_S0QG"><p>当智能体学会「自主运行」，协作的边界在哪里？  </p></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="引言从工具到伙伴的进化">引言：从「工具」到「伙伴」的进化<a class="hash-link" href="#引言从工具到伙伴的进化" title="标题的直接链接">​</a></h2><p>在AI技术爆发的今天，大多数智能体仍停留在「一问一答」的层面——它们能写代码、做分析、生成文案，却始终需要人类一步步下达指令。但真实世界的复杂任务，从来不是单线程的。一场市场调研可能需要同时调用数据清洗、趋势预测和报告撰写；一个产品开发项目往往涉及需求解析、代码生成和测试验证的循环……  </p><p><strong><a href="/docs/ai/chat/project/">Xpert 项目</a>的诞生，正是为了打破这种「人工指挥链」的桎梏</strong>。它让多个智能体像一支训练有素的数字团队，自主规划任务、共享知识、协同执行——而人类，只需定义目标，然后见证智能协作的奇迹。</p><figure class="Large"><img loading="lazy" src="/img/ai/project/xpert-project.png" alt="Xpert Project" class="rounded-xl shadow-md img_ev3q"><figcaption>项目</figcaption></figure><hr><h2 class="anchor anchorWithStickyNavbar_LWe7" id="为什么说这是自主运行智能体的里程碑">为什么说这是「自主运行智能体」的里程碑？<a class="hash-link" href="#为什么说这是自主运行智能体的里程碑" title="标题的直接链接">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-从单兵作战到军团协作">1. <strong>从「单兵作战」到「军团协作」</strong><a class="hash-link" href="#1-从单兵作战到军团协作" title="标题的直接链接">​</a></h3><p>传统AI工具如同独立的「专家顾问」，而 Xpert Project 构建了一个<strong>智能体生态网络</strong>：  </p><ul><li><strong>角色分工</strong>：为不同智能体分配明确职责（如「数据分析师」「审核员」「执行引擎」）  </li><li><strong>上下文共享</strong>：所有成员实时访问同一知识库（上传文件、工具输出、历史对话）  </li><li><strong>自主协商</strong>：智能体之间可互相验证结果、补充信息或触发子任务  </li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-两种模式重新定义人机协作">2. <strong>两种模式，重新定义「人机协作」</strong><a class="hash-link" href="#2-两种模式重新定义人机协作" title="标题的直接链接">​</a></h3><ul><li><strong>探索模式</strong>：AI像一名敏捷的「探险家」，快速试错、动态调整路径。</li><li><strong>规划模式</strong>：AI变身「项目经理」，先输出规划步骤，再按阶段推进。<ul><li><em>案例</em>：开发一个天气预报小程序时，AI严格遵循「需求确认→技术选型→编码→测试→部署」流程  </li></ul></li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-工具集成的无限可能">3. <strong>工具集成的「无限可能」</strong><a class="hash-link" href="#3-工具集成的无限可能" title="标题的直接链接">​</a></h3><p>Xpert 项目不仅连接智能体，更打通了外部工具链：  </p><ul><li><strong>MCP 工具</strong>：直接调用企业自有系统（如CRM、ERP、第三方工作流和知识库）</li><li><strong>内置工具</strong>：平台提供的内置工具集如 ChatBI 工具集，指标管理等工具。  </li><li><strong>自定义 API</strong>：接入私有化数据源或行业模型。</li></ul><figure class="Large"><img loading="lazy" src="/img/ai/project/project-tools.png" alt="Project tools" class="rounded-xl shadow-md img_ev3q"><figcaption>项目工具</figcaption></figure><hr><h2 class="anchor anchorWithStickyNavbar_LWe7" id="实际应用案例深度分析报告智能协作">实际应用案例：深度分析报告智能协作<a class="hash-link" href="#实际应用案例深度分析报告智能协作" title="标题的直接链接">​</a></h2><p><strong>——组合「深度研究专家」+「定制报告生成器」</strong>  </p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="场景需求"><strong>场景需求</strong><a class="hash-link" href="#场景需求" title="标题的直接链接">​</a></h3><p>某咨询公司需在48小时内完成《全球AI伦理治理深度报告》，涵盖政策对比、技术专利分析及风险评估。  </p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="实施流程"><strong>实施流程</strong><a class="hash-link" href="#实施流程" title="标题的直接链接">​</a></h3><ol><li><strong>创建项目</strong>：选择<strong>规划模式</strong>，上传咨询报告模板；  </li><li><strong>智能体协作</strong>：  <ul><li><strong>深度研究专家</strong>：<br>▶ 自动抓取1200+文献/专利/政策 → 生成核心论点与冲突地图  </li><li><strong>定制报告生成器</strong>：<br>▶ 按模板整合数据 → 批量生成18个专业图表 → 输出三格式（PDF/PPT/网页版）  </li></ul></li></ol><h3 class="anchor anchorWithStickyNavbar_LWe7" id="关键成果"><strong>关键成果</strong><a class="hash-link" href="#关键成果" title="标题的直接链接">​</a></h3><ul><li><strong>效率</strong>：从 5 人 3 天 → 1 人 4 小时（效率提升 35 倍）（大概）。</li><li><strong>深度</strong>：分析覆盖量显著提升，隐性矛盾点识别率明显增加。  </li><li><strong>复用性</strong>：自动存档过程中的报告文档，支持在项目中复用。</li></ul><figure class="Large"><img loading="lazy" src="/img/ai/project/project-deepresearch.png" alt="Project deepresearch" class="rounded-xl shadow-md img_ev3q"><figcaption>项目实际应用</figcaption></figure><div class="theme-admonition theme-admonition-success alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>客户反馈</div><div class="admonitionContent_S0QG"><p><em>「智能体协作不是取代人类，而是让我们专注价值判断，而非信息苦力。」</em></p></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="立即体验成为第一批智能体指挥官">立即体验，成为第一批「智能体指挥官」<a class="hash-link" href="#立即体验成为第一批智能体指挥官" title="标题的直接链接">​</a></h2><p>无论你是想：  </p><ul><li>🔥 将重复性工作交给AI军团  </li><li>🚀 用1/10的时间验证创新想法  </li><li>🌐 构建跨地域、跨时区的无缝协作网络  </li></ul><p><strong>Xpert 项目都已准备好成为你的「数字交响乐团指挥棒」</strong>。  </p><p>👉 <strong><a href="https://app.xpertai.cn/chat/p" target="_blank" rel="noopener noreferrer">点击进入 XpertAI 平台创建第一个项目</a></strong>
（已有用户可直接在对话界面找到「项目」入口）  </p><hr><div class="theme-admonition theme-admonition-success alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>XpertAI 产品团队</div><div class="admonitionContent_S0QG"><p><em>「真正的智能，不在于回答一个问题，而在于自主解决一类问题。」</em></p></div></div>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="Project" term="Project"/>
        <category label="Agent" term="Agent"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[智能体与工作流混合架构]]></title>
        <id>agent-workflow-hybrid-architecture</id>
        <link href="https://xpertai.cn/blog/agent-workflow-hybrid-architecture"/>
        <updated>2025-02-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[在AI技术快速落地的今天，企业面临一个关键矛盾：如何平衡 LLM 的创造性与流程的稳定性？纯粹的智能体架构虽灵活，却难以控制；传统工作流虽可靠，却缺乏应变能力。Xpert AI 平台的智能体与工作流混合架构，正是为解决这一矛盾而生——它让 AI 既拥有“自由意志”，又遵循“规则秩序”。]]></summary>
        <content type="html"><![CDATA[<p>在AI技术快速落地的今天，企业面临一个关键矛盾：<strong>如何平衡 LLM 的创造性与流程的稳定性</strong>？纯粹的智能体架构虽灵活，却难以控制；传统工作流虽可靠，却缺乏应变能力。Xpert AI 平台的<strong>智能体与工作流混合架构</strong>，正是为解决这一矛盾而生——它让 AI 既拥有“自由意志”，又遵循“规则秩序”。</p><figure class="Large"><img loading="lazy" src="/img/ai/agent-workflow-hybrid-architecture.png" alt="hybrid architecture" class="rounded-lg img_ev3q"><figcaption>智能体工作流混合架构</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="一架构设计的核心思想">一、架构设计的核心思想<a class="hash-link" href="#一架构设计的核心思想" title="标题的直接链接">​</a></h2><p><strong>“让合适的工具做合适的事”</strong><br>
<!-- -->混合架构的本质是<strong>动态适配任务需求</strong>，通过两种模式的协同实现效率与灵活性的最优解：  </p><ol><li><p><strong><a href="/docs/ai/workflow/agent/">智能体</a>模式（高自主性）</strong>  </p><ul><li><strong>适用场景</strong>：开放域对话、创意生成、复杂决策  </li><li><strong>技术特性</strong>：  <ul><li>基于LLM的自主推理与工具调用  </li><li>支持动态调整策略（如实时学习用户偏好）  </li><li>示例：客户投诉时自动分析情绪、生成个性化补偿方案  </li></ul></li></ul></li><li><p><strong><a href="/docs/ai/workflow/">工作流</a>模式（高可控性）</strong>  </p><ul><li><strong>适用场景</strong>：数据清洗、API调用、审批链条  </li><li><strong>技术特性</strong>：  <ul><li>预定义标准化操作序列  </li><li>确保结果可重复、可审计  </li><li>示例：订单支付时严格验证风控规则  </li></ul></li></ul></li><li><p><strong>混合协同机制</strong>  </p><ul><li><strong>状态共享</strong>：通过统一的会话变量传递数据，避免信息孤岛  </li><li><strong>动态切换</strong>：单流程中可多次交替使用两种模式  </li><li><strong>成本优化</strong>：仅在必要时触发LLM推理（如用工作流规则替代LLM基础判断）  </li></ul></li></ol><h2 class="anchor anchorWithStickyNavbar_LWe7" id="二架构落地的突破">二、架构落地的突破<a class="hash-link" href="#二架构落地的突破" title="标题的直接链接">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-动态路由引擎">1. <strong>动态路由引擎</strong><a class="hash-link" href="#1-动态路由引擎" title="标题的直接链接">​</a></h3><p>通过<strong>大模型</strong>实现智能决策分发：</p><ul><li><strong>路由策略</strong>：大模型根据上下文、用户意图和任务复杂度实时推理，动态选择最佳处理节点</li><li><strong>横向与纵向策略</strong>：支持横向路由与纵向自主工具策略，实现复杂任务的分层处理。</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-状态感知系统">2. <strong>状态感知系统</strong><a class="hash-link" href="#2-状态感知系统" title="标题的直接链接">​</a></h3><ul><li><strong>全局状态管理</strong>：  <ul><li>所有节点通过 <a href="/docs/ai/workflow/variables/">会话变量</a> 读写统一上下文  </li><li>变量级版本控制（如追溯某决策的历史状态）  </li></ul></li><li><strong>副作用隔离</strong>：  <ul><li>智能体的试错性操作在沙箱中执行，仅确认后更新主状态  </li></ul></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="三真实场景的价值验证">三、真实场景的价值验证<a class="hash-link" href="#三真实场景的价值验证" title="标题的直接链接">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="案例跨境电商客服系统">案例：跨境电商客服系统<a class="hash-link" href="#案例跨境电商客服系统" title="标题的直接链接">​</a></h3><div class="language-plaintext codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-plaintext codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">用户咨询 → 工作流（结构化解析订单号） → Router节点 → </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ├→ 若需退换货 → 工作流（调用ERP接口验证策略） → 智能体（生成多语言解决方案）  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ├→ 若产品咨询 → 智能体（结合知识库实时检索+LLM解释）  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  └→ 若投诉升级 → 工作流（生成工单） → 人工坐席 ← 智能体（提供话术建议）  </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><ul><li><strong>成果</strong>：  <ul><li>客服响应速度提升40%  </li><li>LLM调用成本降低65%（通过工作流前置过滤）  </li><li>客户满意度从78%升至92%  </li></ul></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="四开发者体验升级">四、开发者体验升级<a class="hash-link" href="#四开发者体验升级" title="标题的直接链接">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-可视化编排器">1. <strong>可视化编排器</strong><a class="hash-link" href="#1-可视化编排器" title="标题的直接链接">​</a></h3><ul><li>拖拽式连接智能体与工作流节点  </li><li>实时可视化数据流动路径  </li></ul><figure class="Large"><img loading="lazy" src="/img/ai/workflow/orchestration.png" alt="hybrid architecture orchestration" class="rounded-lg img_ev3q"><figcaption>混合架构编排界面</figcaption></figure><h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-调试工具链-开发中">2. <strong>调试工具链</strong> (开发中)<a class="hash-link" href="#2-调试工具链-开发中" title="标题的直接链接">​</a></h3><ul><li><strong>状态时光机</strong>：回滚到任意历史节点重新执行</li><li><strong>AI辅助诊断</strong>：自动定位异常节点并推荐修复方案</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="五架构演进的未来方向">五、架构演进的未来方向<a class="hash-link" href="#五架构演进的未来方向" title="标题的直接链接">​</a></h2><ol><li><strong>智能体联邦学习</strong>  <ul><li>跨流程共享智能体的经验记忆  </li></ul></li><li><strong>工作流自进化</strong>  <ul><li>通过LLM分析执行日志，自动优化节点顺序  </li></ul></li><li><strong>量子化决策</strong>  <ul><li>在路由层引入概率化分支（如同时探索多条路径后择优）  </li></ul></li></ol><h2 class="anchor anchorWithStickyNavbar_LWe7" id="结语">结语<a class="hash-link" href="#结语" title="标题的直接链接">​</a></h2><p>Xpert AI 的混合架构不是简单的技术堆砌，而是对 AI 工程范式的重新思考。它证明了一个真理：<strong>在确定性与不确定性共存的现实世界中，唯有“弹性架构”才能让AI真正创造价值</strong>。当您的下一个 AI 项目需要在严谨的流程与灵感的迸发之间找到平衡点时，这种架构或许就是破局之匙。  </p><blockquote><p><strong>让机器像人类一样思考，但比人类更可靠</strong>——这正是混合架构的终极追求。</p></blockquote>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="AI" term="AI"/>
        <category label="Xpert" term="Xpert"/>
        <category label="Agent" term="Agent"/>
        <category label="Workflow" term="Workflow"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[探索 XpertAI 全新任务工具集]]></title>
        <id>scheduled-tasks</id>
        <link href="https://xpertai.cn/blog/scheduled-tasks"/>
        <updated>2025-01-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[在快节奏的现代社会，高效的任务管理至关重要。XpertAI 平台的 定时任务工具集 通过整合智能体 (Agent) 进入您的工作流，将任务调度和执行提升到全新水平。这一功能允许用户创建、定制并自动化任务，极大简化日常操作，提升工作效率。让我们一起来看看这个创新工具集如何助力日常工作管理。]]></summary>
        <content type="html"><![CDATA[<p>在快节奏的现代社会，高效的任务管理至关重要。XpertAI 平台的 定时任务工具集 通过整合智能体 (Agent) 进入您的工作流，将任务调度和执行提升到全新水平。这一功能允许用户创建、定制并自动化任务，极大简化日常操作，提升工作效率。让我们一起来看看这个创新工具集如何助力日常工作管理。</p><figure class="Large"><img loading="lazy" src="/img/ai/tasks-create.png" alt="Create task" class="rounded-xl img_ev3q"><figcaption>创建定时任务</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="truncate"><a class="hash-link" href="#truncate" title="标题的直接链接">​</a></h2><h2 class="anchor anchorWithStickyNavbar_LWe7" id="什么是定时任务工具集">什么是定时任务工具集？<a class="hash-link" href="#什么是定时任务工具集" title="标题的直接链接">​</a></h2><p>定时任务工具集是 XpertAI 平台的一项全新功能，它结合 AI 智能体帮助用户高效管理定时任务。从设置提醒、生成报告到触发工作流，该工具集提供了前所未有的灵活性与便捷性。</p><p>主要功能亮点：</p><ol><li><p>多智能体协同工作</p><p>XpertAI 平台支持多智能体协作架构，用户可以：</p><ul><li>a. 设计多智能体无缝协作的工作流。</li><li>b. 将任务分配给特定智能体或团队，最大限度提高效率。</li></ul></li><li><p>灵活的任务定制</p><p>用户可根据需求创建一次性任务或周期性任务。无论是每日提醒还是定期财务报告，任务均可：</p><ul><li>通过详细的触发条件进行精细化调整。</li><li>融合 AI 功能，例如数据分析和知识检索。</li></ul></li><li><p>多渠道通知支持</p><p>任务完成后，通知可通过以下常用沟通工具发送：</p><ul><li>飞书 (Lark)。</li><li>邮件。</li><li>其他集成平台。</li></ul><p>确保重要信息和任务结果能够及时传达至用户。</p></li><li><p>深度集成 XpertAI 工具</p><p>定时任务工具集与 XpertAI 其他功能（如 ChatBI、ChatDB 和 Search）深度融合，可：</p><ul><li>自动化数据分析和报告生成。</li><li>实现实时知识检索，为决策提供支持。</li></ul></li></ol><h2 class="anchor anchorWithStickyNavbar_LWe7" id="功能介绍">功能介绍<a class="hash-link" href="#功能介绍" title="标题的直接链接">​</a></h2><p>定时任务工具集由以下三个主要工具组成：</p><ol><li><p>创建任务</p><p>用户可创建自定义任务，包括：</p><ul><li>任务名称：清晰简洁的任务标题。</li><li>时间安排：任务执行的时间细节。</li><li>智能体分配：负责任务执行的数字专家 (Agent)。</li><li>指令说明：指导智能体执行任务的具体说明。</li></ul></li></ol><figure class="Middle"><img loading="lazy" src="/img/ai/tasks-edit.png" alt="Edit task" class="rounded-xl shadow-lg img_ev3q"><figcaption>编辑定时任务</figcaption></figure><ol start="2"><li><p>任务列表</p><p>查看分配给智能体的所有任务，轻松监控和管理正在执行的计划。</p></li><li><p>删除任务</p><p>一键删除已完成或不再需要的任务，保持任务列表的整洁。</p></li></ol><h2 class="anchor anchorWithStickyNavbar_LWe7" id="实际应用场景">实际应用场景<a class="hash-link" href="#实际应用场景" title="标题的直接链接">​</a></h2><p>定时任务工具集具有高度灵活性，适用于多种实际场景。以下是几个示例：</p><ul><li><p>每日财务更新</p><p>CFO 可安排智能体每天自动编制财务总结，通过邮件发送，确保每天清楚了解公司运营表现。</p></li><li><p>团队会议提醒</p><p>HR 团队可以使用工具集，通过飞书向所有参会者发送个性化会议提醒，包括最后一刻的更新或议程。</p></li><li><p>客户支持工作流自动化</p><p>客户服务经理可安排任务，自动检索和分析客户反馈数据，帮助主动解决潜在问题。</p></li><li><p>内容发布提醒</p><p>市场团队可借助工具集通知团队成员社交媒体发布、营销活动或博客更新的时间。</p></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="为何选择-xpertai-的任务工具集">为何选择 XpertAI 的任务工具集？<a class="hash-link" href="#为何选择-xpertai-的任务工具集" title="标题的直接链接">​</a></h2><p>相比其他平台，XpertAI 的定时任务工具集具有以下优势：</p><ul><li>多智能体协作：区别于单一智能体系统，XpertAI 允许用户设计多智能体协作工作流。</li><li>平台深度集成：与 XpertAI 强大工具无缝结合，确保任务执行更智能、更高效。</li><li>灵活的通知方式：多渠道支持，确保用户可通过熟悉的沟通工具及时接收更新。</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="立即开始使用">立即开始使用<a class="hash-link" href="#立即开始使用" title="标题的直接链接">​</a></h2><p>无论是试用用户探索平台潜力，还是高级用户利用高级功能，定时任务工具集都旨在让您的任务管理更加轻松高效。体验 AI 驱动的任务管理，彻底革新您的工作方式。</p><p>立即使用 <a href="https://app.xpertai.cn/" target="_blank" rel="noopener noreferrer">XpertAI</a> 定时任务工具集，开启您的高效之旅！</p>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="Xpert" term="Xpert"/>
        <category label="Task" term="Task"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Xpert AI 发版 v3.0：开启企业数字大脑时代]]></title>
        <id>xpert-releases-3</id>
        <link href="https://xpertai.cn/blog/xpert-releases-3"/>
        <updated>2024-11-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[在当今快速发展的科技时代，人工智能（AI）正逐步改变我们的生活和工作方式。Xpert AI 平台 v3.0 的发布标志着这一领域的又一次重大进步。]]></summary>
        <content type="html"><![CDATA[<p>在当今快速发展的科技时代，人工智能（AI）正逐步改变我们的生活和工作方式。Xpert AI 平台 v3.0 的发布标志着这一领域的又一次重大进步。
此次更新引入了智能体编排平台，通过智能体编排平台，企业可以更好地管理和利用AI智能体，提高业务流程的自动化程度和效率。</p><figure class="Large"><img loading="lazy" src="/img/ai/xpert-agent-run-with-kb.png" alt="Xpert with knowledgebase" class="rounded-xl shadow-md img_ev3q"><figcaption>Xpert knowledgebase</figcaption></figure><p>主要功能亮点</p><ol><li><p><strong>Xpert 智能体编排</strong>:</p><p>Xpert AI 平台 v3.0 引入了全新的 Xpert Agents 编排功能。用户可以在 Xpert Studio 中通过图形化界面编排智能体，模拟人类社会中的上下级组织方式。上级智能体可以通过计划、划分和分配任务给下级智能体，下级智能体则通过调用工具集或知识库解决问题后回复给上级。这样的编排方式使得智能体的运行更加高效和灵活，能够更好地服务于复杂的业务需求。</p></li><li><p><strong>升级智能助理角色</strong>：</p><p>在新版本中，智能助理角色得到了显著升级，成为 Copilot 类型的 Xpert。这一升级使得智能助理能够更好地理解和执行用户的命令，并在复杂的业务场景中提供更精准的支持。通过结合大语言模型和自定义命令功能， 智能助理 Xpert 能够在用户界面中快速操作，提高用户的专业度和工作效率。</p></li><li><p><strong>知识库功能增强</strong>：</p><p>知识库是 Xpert AI 平台的核心组成部分之一。v3.0 版本中，知识库功能得到了显著增强。通过文件文本嵌入、Chunk 检索和实时更新等技术，用户可以更快速地检索到所需信息。多语言支持和上下文感知嵌入确保了信息的准确性和实用性。</p></li><li><p><strong>工具集扩展</strong>：</p><p>Xpert AI 平台提供了丰富的内置和自定义工具集，支持多种协议（如 OpenAPI 和 OData）。用户可以根据自身需求创建和配置工具集，整合不同的服务和数据源，以满足特定的业务需求。这种灵活性使得平台能够适应各种复杂的业务场景。</p></li><li><p><strong>多任务处理与团队协作</strong>：</p><p>新版本引入了多任务处理和团队协作功能。用户可以通过 Team 功能让多个数字专家协同工作，由 Leader 分配任务，整合所有成员的结果，提供全面的解决方案。这种虚拟团队的组织方式提高了任务执行的效率和质量。</p></li></ol><h2 class="anchor anchorWithStickyNavbar_LWe7" id="智能体编排">智能体编排<a class="hash-link" href="#智能体编排" title="标题的直接链接">​</a></h2><p>智能体编排是一个用于设计和管理 AI 智能体的平台。它允许用户通过直观的图形化界面来创建、配置和优化智能体的行为和交互方式。智能体编排平台的核心功能包括：</p><ul><li><p><strong>任务分配与管理</strong>：用户可以定义智能体的任务，并通过平台将这些任务分配给不同的智能体。平台支持任务的优先级设置和进度跟踪，确保任务的高效执行。</p></li><li><p><strong>智能体协作</strong>：平台支持多个智能体之间的协作，用户可以设置智能体之间的通信和信息共享规则，以实现复杂任务的协同处理。</p></li><li><p><strong>行为模拟与优化</strong>：用户可以在平台上模拟智能体的行为，观察其在不同场景下的表现，并通过调整参数来优化智能体的决策和反应能力。</p></li><li><p><strong>集成与扩展</strong>：智能体编排平台通常支持与其他系统和工具的集成，用户可以通过API或插件扩展平台的功能，以满足特定的业务需求。</p></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="未来展望">未来展望<a class="hash-link" href="#未来展望" title="标题的直接链接">​</a></h2><p>Xpert AI 平台 v3.0 的发布不仅是技术上的一次飞跃，更是对未来智能化生活的展望。通过不断创新和优化，Xpert AI 将继续引领行业发展，为用户提供更智能、更高效的解决方案。无论是企业用户还是个人用户，都能在这个平台上找到适合自己的智能助手，开启智能化未来的新篇章。
Xpert AI 平台 v3.0，期待您的体验与反馈！</p>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="Xpert" term="Xpert"/>
        <category label="Copilot" term="Copilot"/>
        <category label="Release" term="Release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[新版本 2.7 - AI 数字专家与知识库]]></title>
        <id>releases-2-7-xpert</id>
        <link href="https://xpertai.cn/blog/releases-2-7-xpert"/>
        <updated>2024-09-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[我们很高兴地宣布，元数分析平台 最新版本 2.7 GitHub 正式发布！这个版本带来了四个令人兴奋的新功能，旨在进一步增强用户的智能交互和数据分析体验。这些新功能包括全新的 数字专家 角色、灵活高效的 知识库 系统、功能强大的 工具集 以及 ChatBI 的 多飞书机器人 支持。]]></summary>
        <content type="html"><![CDATA[<p>我们很高兴地宣布，<a href="https://app.xpertai.cn/" target="_blank" rel="noopener noreferrer">元数分析平台</a> 最新版本 2.7 <a href="https://github.com/meta-d/ocap/" target="_blank" rel="noopener noreferrer">GitHub</a> 正式发布！这个版本带来了四个令人兴奋的新功能，旨在进一步增强用户的智能交互和数据分析体验。这些新功能包括全新的 <strong>数字专家</strong> 角色、灵活高效的 <strong>知识库</strong> 系统、功能强大的 <strong>工具集</strong> 以及 ChatBI 的 <strong>多飞书机器人</strong> 支持。
本文将详细介绍这些新功能如何帮助您更智能地管理数据和提升工作效率。</p><figure class="Large"><img loading="lazy" src="/img/ai/chat-with-xpert-ai.png" alt="Chat with Xpert role use tools" class="rounded-lg shadow-lg img_ev3q"><figcaption>与数字专家对话</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="1-数字专家您的智能助理">1. 数字专家：您的智能助理<a class="hash-link" href="#1-数字专家您的智能助理" title="标题的直接链接">​</a></h2><p>元数分析平台 2.7 引入了 <a href="/docs/ai/digital-expert"><strong>数字专家</strong></a> 功能，他们是专为不同领域设计的虚拟智能助理。数字专家具备特定的专业知识，能够帮助您回答问题、执行任务，并提供精准的业务支持。无论是数据分析、市场研究，还是财务报告生成，数字专家都能根据您的需求提供个性化的服务。</p><p>每个数字专家都可以访问指定的 <a href="/docs/ai/knowledgebase">知识库</a>，调用 <a href="/docs/ai/toolset">工具集</a> 并参与任务协作。在实际使用中，用户可以根据任务需求选择合适的专家，并通过自然语言与之互动。未来，数字专家还将支持团队协作模式，让多个专家配合完成复杂的任务。</p><figure class="Small"><img loading="lazy" src="/img/ai/xpert-role.png" alt="Xpert role" class="rounded-xl shadow-md img_ev3q"><figcaption>数字专家</figcaption></figure><h3 class="anchor anchorWithStickyNavbar_LWe7" id="数字专家的主要功能">数字专家的主要功能：<a class="hash-link" href="#数字专家的主要功能" title="标题的直接链接">​</a></h3><ul><li><a href="/docs/ai/chat"><strong>智能对话</strong></a>：与用户进行自然语言互动，快速获取所需信息。</li><li><strong>个性化配置</strong>：每个数字专家都有特定的专业领域和工具权限，能够提供针对性的解决方案。</li><li><strong>任务协作</strong>（开发中）：支持未来的数字团队功能，复杂任务可以分解给多个专家共同完成。</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="2-知识库智能信息管理与检索">2. 知识库：智能信息管理与检索<a class="hash-link" href="#2-知识库智能信息管理与检索" title="标题的直接链接">​</a></h2><p>为了更好地管理私有知识信息，元数分析平台 2.7 增加了 <a href="/docs/ai/knowledgebase"><strong>知识库</strong></a> 功能。新的知识库系统允许用户上传多种格式的文档（如 PDF、Markdown、EPUB、DOCX），并自动解析成可检索的文本块。
通过区块大小、重叠度等参数配置，用户可以自定义文档解析方式，确保信息的组织更符合实际需求。</p><p>在对话中，数字专家可以通过调用检索知识库中的信息，基于嵌入技术和相似度阈值快速响应用户问题。用户还可以对不同权限的知识库进行管理，例如设置私有、组织内共享或公开知识库的访问权限。</p><figure class="Large"><img loading="lazy" src="/img/ai/rag_flow.webp" alt="Xpert RAG" class="rounded-xl shadow-md img_ev3q"><figcaption>数字专家 RAG</figcaption></figure><h3 class="anchor anchorWithStickyNavbar_LWe7" id="知识库的主要功能">知识库的主要功能：<a class="hash-link" href="#知识库的主要功能" title="标题的直接链接">​</a></h3><ul><li><strong>文档解析</strong>：支持多种文件格式的上传与解析，并根据需要自定义解析参数。</li><li><strong>智能检索</strong>：基于相似度算法，快速检索并返回最相关的信息。</li><li><strong>权限控制</strong>：支持私有、组织内和公开三种访问权限设置，确保信息的安全和共享性。</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="3-工具集增强-ai-操作能力">3. 工具集：增强 AI 操作能力<a class="hash-link" href="#3-工具集增强-ai-操作能力" title="标题的直接链接">​</a></h2><p>元数分析平台 2.7 的另一个重要升级是 <strong>工具集（Toolset）</strong> 功能。工具集赋予数字专家执行复杂任务的能力，例如数据查询、分析和外部信息检索等。
可以将工具集视为数字专家的“手脚感官”，通过调用不同的工具来完成任务。如果说数字专家是大脑，工具集就是他们在数字世界中与外界互动的能力。</p><p>目前，工具集分为两类：<strong>内置工具集</strong> 和 <strong>自定义工具集</strong>。内置工具集包括数据分析类工具（如 <a href="/docs/chatbi/">ChatBI</a>、ChatDB）和在线搜索类工具（如 DuckDuckGo、Wikipedia）。
自定义工具集功能正在开发中，未来用户可以根据需要定义专属工具，进一步扩展专家的能力。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="工具集的主要功能">工具集的主要功能：<a class="hash-link" href="#工具集的主要功能" title="标题的直接链接">​</a></h3><ul><li><strong>内置工具</strong>：包括在线搜索和数据分析工具，帮助用户快速获取和处理信息。</li><li><strong>自定义工具</strong>（开发中）：用户将能够创建自己的工具集，增强数字专家的执行能力。</li><li><strong>工具参数配置</strong>：支持为不同工具设置默认参数，优化任务执行效率。</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="4-chatbi-多飞书机器人扩展企业智能数据分析">4. ChatBI 多飞书机器人：扩展企业智能数据分析<a class="hash-link" href="#4-chatbi-多飞书机器人扩展企业智能数据分析" title="标题的直接链接">​</a></h2><p>元数分析平台 2.7 版本中，<strong><a href="/docs/chatbi/">ChatBI</a> 的 <a href="/docs/chatbi/feishu/bot">多飞书机器人</a></strong> 是一项重要升级，专为提升企业内部沟通与数据分析效率而设计。这个功能允许企业通过构建不同业务或部门的多个飞书机器人，每个机器人都能够无缝集成 ChatBI，实时提供智能数据分析支持。无论是财务数据的分析，市场趋势的洞察，还是业务运营中的数据查询，ChatBI 多飞书机器人都能为企业提供精准的数据解答。</p><p>用户可以通过在飞书中接入不同的 ChatBI 机器人，按需获取数据分析结果。每个机器人可以根据特定业务需求进行自定义配置，为不同角色或团队提供量身定制的分析服务。</p><figure class="Large"><img loading="lazy" src="/img/server/integration/lark-integrations.png" alt="Lark integrations" class="rounded-lg shadow-lg img_ev3q"><figcaption>飞书集成系统</figcaption></figure><h3 class="anchor anchorWithStickyNavbar_LWe7" id="chatbi-多飞书机器人的主要功能">ChatBI 多飞书机器人的主要功能：<a class="hash-link" href="#chatbi-多飞书机器人的主要功能" title="标题的直接链接">​</a></h3><ul><li><strong>多机器人支持</strong>：允许企业同时使用多个 ChatBI 机器人，与不同部门业务进行智能交互与数据分析。</li><li><strong>角色定制</strong>：每个机器人都无缝连接 ChatBI，提供财务、市场、运营等多维度的数据分析服务。</li><li><strong>数字专家集成</strong>：飞书机器人可以调用数字专家，获取智能分析和数据支持。</li></ul><figure class="Middle"><img loading="lazy" src="/img/server/integration/lark-bots.png" alt="Lark bots" class="rounded-lg shadow-lg img_ev3q"><figcaption>飞书机器人</figcaption></figure><p>ChatBI 多飞书机器人让企业能够将数据分析能力直接嵌入到日常沟通中，大幅提升信息获取和决策效率。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="5-支持主流-ai-提供商">5. 支持主流 AI 提供商<a class="hash-link" href="#5-支持主流-ai-提供商" title="标题的直接链接">​</a></h2><p>在元数分析平台 2.7 版本中，我们进一步扩展了对主流 AI 提供商的支持，确保用户可以灵活选择和集成最适合其业务需求的 AI 模型。
无论是自然语言处理、数据分析还是智能生成，平台支持的多种 AI 提供商为用户提供了更广泛的选择空间，以实现更高效、智能化的业务操作。</p><p>包括 OpenAI 等闭源模型，和 Ollama 等开源模型提供商。更多详情请参考 <a href="/docs/ai/copilot/settings/">智能助理-配置</a></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="结语">结语<a class="hash-link" href="#结语" title="标题的直接链接">​</a></h2><p><a href="https://app.xpertai.cn/" target="_blank" rel="noopener noreferrer">元数分析平台</a> 2.7 版本的发布标志着智能数据分析和信息管理进入了一个全新阶段。通过 <strong>数字专家</strong>、<strong>知识库</strong>、<strong>工具集</strong> 和 <strong>ChatBI 多飞书机器人</strong> 的全新功能，用户能够更高效地管理数据、获取信息，并提升企业协作能力。我们期待这些新功能为您的业务带来更多智能化的支持，帮助您在竞争激烈的市场中保持领先。</p><p>立即升级到 元数分析平台 <a href="https://github.com/meta-d/ocap/" target="_blank" rel="noopener noreferrer">2.7</a>，体验这些强大的新功能吧！</p>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="Xpert" term="Xpert"/>
        <category label="Copilot" term="Copilot"/>
        <category label="Knowledgebase" term="Knowledgebase"/>
        <category label="Release" term="Release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[ChatBI 我们是如何提升准确度的？]]></title>
        <id>chatbi-improve-accuracy</id>
        <link href="https://xpertai.cn/blog/chatbi-improve-accuracy"/>
        <updated>2024-08-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[在企业数据分析中，准确性 是确保决策正确性的关键。为了提供更精确和高效的分析，ChatBI 通过一系列功能优化了从数据检索到结果生成的全过程，帮助用户快速获取所需信息并确保答案的精确度。]]></summary>
        <content type="html"><![CDATA[<p>在企业数据分析中，<strong>准确性</strong> 是确保决策正确性的关键。为了提供更精确和高效的分析，<a href="https://github.com/meta-d/ocap/" target="_blank" rel="noopener noreferrer"><strong>ChatBI</strong></a> 通过一系列功能优化了从数据检索到结果生成的全过程，帮助用户快速获取所需信息并确保答案的精确度。
本文将介绍 ChatBI 的核心功能，包括 <strong>维度索引</strong>、<strong>指标管理</strong>、<strong>计算公式知识库</strong>、<strong>实时的模型上下文</strong> 以及 <strong>检索与生成</strong>，以及这些功能如何在实际使用中提升分析准确性。</p><figure class="Large"><img loading="lazy" src="/img/chatbi/chatbi-indicators.png" alt="ChatBI Indicators" class="rounded-lg shadow-lg img_ev3q"><figcaption>ChatBI 模型与指标管理</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="1-维度索引优化维度成员的检索">1. 维度索引：优化维度成员的检索<a class="hash-link" href="#1-维度索引优化维度成员的检索" title="标题的直接链接">​</a></h2><p>在复杂的业务分析场景中，维度成员（Dimension Members）是数据分析中的重要元素。为了确保用户能够高效地访问这些成员，ChatBI 提供了一条完整的 <strong>索引管道（Indexing Pipeline）</strong>，
该管道从数据源中提取维度成员，并将其进行索引。这个过程通常在 <strong>离线</strong> 进行，以减少在线处理时的负担。</p><p>通过对维度成员的有效索引，ChatBI 能够在用户查询时快速定位相关数据，避免在查询执行时遍历大型数据库表，从而大幅减少等待时间并提升检索效率。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="索引功能的主要优势">索引功能的主要优势：<a class="hash-link" href="#索引功能的主要优势" title="标题的直接链接">​</a></h3><ul><li>离线索引减少运行时负载</li><li>快速定位维度成员，提高查询响应速度</li><li>降低不必要的数据库扫描操作</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="2-指标管理提升指标分析的效率和准确度">2. 指标管理：提升指标分析的效率和准确度<a class="hash-link" href="#2-指标管理提升指标分析的效率和准确度" title="标题的直接链接">​</a></h2><p><strong>指标管理</strong> 是 ChatBI 的新增功能之一，它通过从指标管理系统中获取大量指标信息，显著提升了数据分析的效率和准确度。在进行指标相关的查询时，ChatBI 能够迅速访问并分析与业务相关的指标，确保用户获得精准的结果。</p><p>通过整合指标管理系统中的数据，ChatBI 能够更高效地处理复杂的指标分析需求，帮助用户快速完成数据监控、绩效评估等任务。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="指标管理的主要优势">指标管理的主要优势：<a class="hash-link" href="#指标管理的主要优势" title="标题的直接链接">​</a></h3><ul><li>从指标管理系统快速获取大量指标信息</li><li>提升指标数据查询的效率和准确度</li><li>支持多种业务场景下的指标分析</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="3-计算公式知识库构建精确的计算度量">3. 计算公式知识库：构建精确的计算度量<a class="hash-link" href="#3-计算公式知识库构建精确的计算度量" title="标题的直接链接">​</a></h2><p>ChatBI 通过 <strong>计算公式知识库</strong> 来存储和管理各种业务中的计算公式。这个知识库作为 ChatBI 的核心组成部分，确保所有涉及公式计算的查询都能得到精准的结果。
无论是财务报表的复杂公式，还是销售数据的加权平均计算，知识库中的公式都是经过验证和优化的。</p><p>在用户发起查询时，ChatBI 会自动从知识库中调用相关的计算公式，结合实际数据源进行计算。这不仅提高了分析的准确性，还能够帮助用户快速应对复杂的业务问题。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="计算公式知识库的主要优势">计算公式知识库的主要优势：<a class="hash-link" href="#计算公式知识库的主要优势" title="标题的直接链接">​</a></h3><ul><li>集中管理各类计算公式，减少 AI 临时生成查询语句的错误</li><li>实时调用公式，提供准确的分析结果</li><li>支持各行业复杂公式计算，满足多样化业务需求</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="4-实时的模型上下文提升分析效率">4. 实时的模型上下文：提升分析效率<a class="hash-link" href="#4-实时的模型上下文提升分析效率" title="标题的直接链接">​</a></h2><p><strong>实时的模型上下文</strong> 是 ChatBI 的另一项提升准确性的关键功能。它允许 AI 实时获取要访问的 <strong>Cube</strong> 中的维度、度量等信息。相比传统的数据库查询方法，实时 Cube 上下文避免了盲目遍历数据库表或数据集，大大缩短了分析时间。</p><p>通过即时了解用户查询的 Cube 上下文，ChatBI 能够快速、准确地缩小数据范围，专注于相关的维度和度量。这一功能不仅提高了数据分析效率，也减少了因信息超载或冗余查询导致的错误。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="实时模型上下文的主要优势">实时模型上下文的主要优势：<a class="hash-link" href="#实时模型上下文的主要优势" title="标题的直接链接">​</a></h3><ul><li>实时访问模型信息，快速定位数据</li><li>避免不必要的数据库查询，提升效率</li><li>精确获取维度与度量，确保结果的相关性</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="5-检索与生成智能链路确保精准回答">5. 检索与生成：智能链路确保精准回答<a class="hash-link" href="#5-检索与生成智能链路确保精准回答" title="标题的直接链接">​</a></h2><p>ChatBI 的核心功能之一是 <strong>RAG（检索增强生成）链路</strong>，它在用户发出查询时，实时检索相关知识库并调用合适的工具生成最终答案。在这一过程中，ChatBI 利用预先建立的索引和知识库，将与用户问题相似的样例检索出来，然后将其传递给 AI 模型进行回答。</p><p>RAG 链路确保了生成的答案基于最新、最相关的数据，避免了传统 AI 模型可能产生的不准确或不相关的内容。这种检索和生成的结合，不仅提升了响应的准确度，还能够实时响应动态变化的数据需求。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="rag-链路的主要优势">RAG 链路的主要优势：<a class="hash-link" href="#rag-链路的主要优势" title="标题的直接链接">​</a></h3><ul><li>实时检索与生成结合，确保答案的准确性</li><li>基于索引和知识库，提供最相关的数据</li><li>动态适应不同的业务查询场景</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="结语">结语<a class="hash-link" href="#结语" title="标题的直接链接">​</a></h2><p>通过 <strong>维度索引</strong>、<strong>指标管理</strong>、<strong>计算公式知识库</strong>、<strong>实时模型上下文</strong> 以及 <strong>RAG 检索与生成链路</strong>，ChatBI 在数据分析中显著提升了查询的准确性和效率。这些功能不仅帮助企业更精准地获取业务洞察，还为数据驱动的决策提供了可靠的支持。随着业务需求的变化，ChatBI 将继续优化这些功能，确保为用户提供最佳的数据分析体验。</p><p>立即体验 <a href="https://app.xpertai.cn/chatbi" target="_blank" rel="noopener noreferrer">ChatBI</a>，感受数据分析的精准与高效！</p>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="AI" term="AI"/>
        <category label="ChatBI" term="ChatBI"/>
        <category label="Indicator" term="Indicator"/>
        <category label="Cube" term="Cube"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[新版本 2.6 - ChatBI 飞书机器人智能化办公]]></title>
        <id>releases-2-6-lark-chatbi</id>
        <link href="https://xpertai.cn/blog/releases-2-6-lark-chatbi"/>
        <updated>2024-08-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[ChatBI 在飞书机器人中的应用]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="chatbi-在飞书机器人中的应用">ChatBI 在飞书机器人中的应用<a class="hash-link" href="#chatbi-在飞书机器人中的应用" title="标题的直接链接">​</a></h2><p>在数字化办公环境中，数据驱动的决策越来越受到重视。为了帮助企业更加高效地利用数据，ChatBI 机器人在飞书平台上提供了一套智能化的数据查询和分析解决方案。
通过 ChatBI 机器人，飞书用户可以轻松发掘数据的价值，实现更加智能化的决策和协作。无论是个人使用还是团队协作，ChatBI 都能为您的数据分析需求提供强大的支持。</p><p>详见 <a href="/docs/chatbi/feishu/bot">ChatBI 飞书机器人</a></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="chatbi-更新">ChatBI 更新<a class="hash-link" href="#chatbi-更新" title="标题的直接链接">​</a></h2><ul><li>改进了创建计算指标的智能体逻辑，提高了智能化水平。</li><li>增加了问题推荐功能，帮助用户快速开始对话。</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="飞书单点登录">飞书单点登录<a class="hash-link" href="#飞书单点登录" title="标题的直接链接">​</a></h2><ul><li>支持在飞书平台上使用单点登录（SSO）进行身份认证。</li><li>优化了 SSO 的安全性和隐私保护机制。</li></ul>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="Copilot" term="Copilot"/>
        <category label="Agent" term="Agent"/>
        <category label="Release" term="Release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[新版本 2.5 - Chat BI 数据洞察 & 故事命令]]></title>
        <id>releases-2-5-chatbi</id>
        <link href="https://xpertai.cn/blog/releases-2-5-chatbi"/>
        <updated>2024-08-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[我们很高兴地宣布，Metad Analytics Cloud 2.5 版本正式上线！这一最新版本带来了两项重磅功能更新：ChatBI 与故事命令多智能体（Story Multi-Agent Command）。这些新功能将进一步提升用户体验，使数据分析变得更加便捷、高效和智能化。]]></summary>
        <content type="html"><![CDATA[<p>我们很高兴地宣布，Metad Analytics Cloud 2.5 版本正式上线！这一最新版本带来了两项重磅功能更新：ChatBI 与故事命令多智能体（Story Multi-Agent Command）。这些新功能将进一步提升用户体验，使数据分析变得更加便捷、高效和智能化。</p><figure class="Large"><img loading="lazy" src="/img/copilot/chatbi-page.png" alt="Chat BI 洞察与分析" class="rounded-xl img_ev3q"><figcaption>Chat BI 洞察与分析</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="chatbi自然语言驱动的商业智能分析">ChatBI：自然语言驱动的商业智能分析<a class="hash-link" href="#chatbi自然语言驱动的商业智能分析" title="标题的直接链接">​</a></h2><p><a href="/docs/chatbi">ChatBI</a> 是我们新推出的一个创新功能，它将聊天功能与商业智能（BI）分析能力相结合，通过自然语言交互的方式，为用户提供更加直观和便捷的数据分析体验。以下是 ChatBI 的主要特点：</p><ol><li><p><strong>自然语言查询 (Natural Language Querying)</strong>：用户可以使用自然语言提问，直接获取数据分析结果，无需掌握复杂的查询语言。这一功能让即便是非技术人员，也能轻松获取数据洞察。</p></li><li><p><strong>多轮对话 (Multi-Turn Conversations)</strong>：支持多轮对话功能，允许用户进行连续的、上下文相关的交互。系统能够记住前面的对话内容，使数据分析更加深入和精准。</p></li><li><p><strong>支持各种大语言模型 (Various Large Language Models)</strong>：ChatBI 集成了多种主流大语言模型，如 ChatGPT 和 Llama，提升了自然语言理解和生成的准确性，满足不同业务需求和语言支持。</p></li><li><p><strong>实时数据分析 (Real-time Data Analytics)</strong>：提供实时数据的分析和可视化功能，帮助企业快速响应市场变化和决策。</p></li><li><p><strong>数据可视化 (Data Visualization)</strong>：支持多种数据可视化方式，包括饼图、线图、柱形图等，帮助用户直观地理解数据。</p></li><li><p><strong>自助式分析 (Self-Service Analytics)</strong>：用户可以自行探索和分析数据，无需依赖技术团队，使用拖放式的报表生成器和数据探索工具。</p></li><li><p><strong>集成多数据源 (Integration with Multiple Data Sources)</strong>：支持连接和集成来自不同来源的数据，如数据库、云端服务、SAP ERP 系统等，为用户提供丰富的数据来源。</p></li><li><p><strong>协作功能 (Collaboration Features)</strong>：支持团队协作，用户可以共享分析结果、评论和讨论数据洞察。</p></li><li><p><strong>安全与权限管理 (Security and Access Control)</strong>：提供严格的数据安全和权限管理，确保敏感数据的保护。</p></li><li><p><strong>移动支持 (Mobile Support)</strong>：支持移动设备访问和操作，实现随时随地的数据查询和分析。</p></li></ol><h2 class="anchor anchorWithStickyNavbar_LWe7" id="故事命令多智能体">故事命令多智能体<a class="hash-link" href="#故事命令多智能体" title="标题的直接链接">​</a></h2><p>在 Metad Analytics Cloud 2.5 中，我们引入了 <a href="/docs/stories/copilot/#story">故事命令</a> 多智能体功能，帮助用户通过自然语言命令控制和配置仪表板的各项设置。这个功能由多个智能代理协同工作，实现更高效的仪表板设计和配置体验。</p><figure class="Large"><img loading="lazy" src="/img/copilot/command-story-architecture.png" alt="Story Command Architecture" class="rounded-lg img_ev3q"><figcaption>故事命令架构</figcaption></figure><h3 class="anchor anchorWithStickyNavbar_LWe7" id="主要组件和功能">主要组件和功能：<a class="hash-link" href="#主要组件和功能" title="标题的直接链接">​</a></h3><ol><li><p><strong>User /s</strong>：用户通过输入命令（如 /story）与系统交互。</p></li><li><p><strong>Story Command</strong>：执行故事命令，检索系统知识库中的示例和参考信息。</p></li><li><p><strong>Supervisor</strong>：作为中央管理代理，负责接收用户命令，并将任务分配给合适的子智能体或工具，如选择数据集工具。</p></li><li><p><a href="/docs/stories/copilot/#calculation"><strong>Calculation Command Agent</strong></a>：专门处理计算度量的任务，当用户需要新建计算度量时，这个智能体会被激活。</p></li><li><p><a href="/docs/stories/copilot/#style"><strong>Style Command Agent</strong></a>：负责全局样式或配置相关的任务，如文本格式化或颜色风格修改。</p></li><li><p><a href="/docs/stories/copilot/#page"><strong>Page Command Agent</strong></a>：处理与新建故事仪表板页面相关的任务，包括页面布局和创建新页面。</p></li><li><p><strong>Pick Cube Tool</strong>：一个用于选择数据集的工具，当命令中没有指定数据集时，它会被调用。</p></li><li><p><strong>Story Examples 和 Story References</strong>：系统知识库中的参考资料和示例，为处理命令提供上下文或灵感。</p></li></ol><h3 class="anchor anchorWithStickyNavbar_LWe7" id="工作流程">工作流程：<a class="hash-link" href="#工作流程" title="标题的直接链接">​</a></h3><ul><li>用户输入命令（如 /story）。</li><li>故事命令检索系统知识库中的参考资料和示例。</li><li>Supervisor 判断需要哪些智能体和工具来完成任务，并分配任务。</li><li>各智能体完成任务后，将结果返回给 Supervisor。</li><li>最终结果通过 Supervisor 返回给用户。</li></ul><p>这种模块化的多智能体架构设计，使系统能够轻松扩展和维护，同时提升了用户体验的连贯性和流畅性。</p><hr><h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a class="hash-link" href="#总结" title="标题的直接链接">​</a></h2><p>Metad Analytics Cloud 2.5 版本通过这些创新功能，进一步加强了数据分析的智能化和便捷性。无论是通过 ChatBI 进行自然语言交互分析，还是通过故事多智能体命令高效配置仪表板，我们都致力于帮助用户更好地理解和利用数据。欢迎大家立即体验最新版本，开启全新的智能数据分析之旅！</p>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="Copilot" term="Copilot"/>
        <category label="Agent" term="Agent"/>
        <category label="Release" term="Release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[SAP S4HANA 嵌入式实时分析 - 3/4 指标管理]]></title>
        <id>s4h-embedded-analytics-indicator</id>
        <link href="https://xpertai.cn/blog/s4h-embedded-analytics-indicator"/>
        <updated>2024-07-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[我们前两篇已经介绍了：]]></summary>
        <content type="html"><![CDATA[<p>我们前两篇已经介绍了：</p><ul><li><a href="/blog/s4h-embedded-analytics-modelling">SAP S4HANA 嵌入式实时分析 - 1/4 语义模型</a> 基于 S4 系统 CDS Views 创建语义模型进行增强和计算度量的创建。</li><li><a href="/blog/s4h-embedded-analytics-story">SAP S4HANA 嵌入式实时分析 - 2/4 故事仪表板</a> 基于 CDS 的语义模型创建故事仪表板进行 S4 系统数据的实时分析。</li></ul><p>本篇文章将探讨如何对 S4 系统中的 CDS View 等模型进行指标管理，构建完整的业务指标体系。</p><p>元数分析云依托语义模型拥有强大的 <a href="/docs/indicators/">指标管理功能</a>，旨在帮助用户有效地管理和监控数据模型中的指标。元数分析云通过基于核心的 OLAP 引擎建立对企业数据的统一语义建模, 无需繁琐的数据转换和 ETL，并经过统一口径的指标定义功能对企业经营数据进行统一的管理和认证。
最终通过元数分析云提供的指标应用程序和故事仪表板，将指标用于分析和评估公司业务和财务数据。</p><figure class="Large"><img loading="lazy" src="/img/blog/s4h-embedded/sap-cds-indicators.png" alt="指标应用" class="rounded-xl img_ev3q"><figcaption>指标应用</figcaption></figure><p><strong>指标体系</strong>（Key Performance Indicator System，KPI System）是一组用于衡量和监控业务绩效的指标。这些指标帮助企业评估其战略目标的实现情况和业务流程的效率，进而指导管理决策。</p><figure class="Large"><iframe src="//player.bilibili.com/player.html?isOutside=true&amp;aid=1556260248&amp;bvid=BV1g142187Mi&amp;cid=1626588657&amp;p=1" width="100%" height="500px" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe><figcaption>视频讲解</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="背景回顾">背景回顾<a class="hash-link" href="#背景回顾" title="标题的直接链接">​</a></h2><p>SAP S/4HANA 系统开发包 <code>VDM_SD_ANALYTICS</code> 中的 CDS Views 是 SAP 提供的销售分析标准视图。我们选择了 <em>销售量和未清销售</em> 这个查询视图进行分析，相关 CDS views:</p><ul><li>分析 Catalog：<code>2CISDSLSANACUBE1</code> 分析 - 销售量和未清销售</li><li>Query <code>2CISDSLSANACUBE1/2CCSDSLSANALYTICQ1</code> 分析 - 销售量和未清销售</li></ul><div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">CDS Query</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token variable" style="color:#36acaa">@Analytics.query</span><span class="token plain">: </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">@AbapCatalog.sqlViewName</span><span class="token plain">: </span><span class="token string" style="color:#e3116c">'CSDSLSANALYTICQ1'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">define </span><span class="token keyword" style="color:#00009f">view</span><span class="token plain"> C_SalesAnalyticsQry_1</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">CDS Cube</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token variable" style="color:#36acaa">@Analytics.dataCategory</span><span class="token plain">: </span><span class="token comment" style="color:#999988;font-style:italic">#CUBE</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">@AbapCatalog.sqlViewName</span><span class="token plain">: </span><span class="token string" style="color:#e3116c">'ISDSLSANACUBE1'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">define </span><span class="token keyword" style="color:#00009f">view</span><span class="token plain"> I_SalesAnalyticsCube_1</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>并为其创建了对应的语义模型和增强。接下来我们要用该 <em>销售量和未清销售</em> 语义模型创建完整的一套指标体系。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="指标设计">指标设计<a class="hash-link" href="#指标设计" title="标题的直接链接">​</a></h2><p>针对 SAP S4 CDS 模型进行指标设计有以下方法:</p><ul><li>在 CDS 中定义基本的 Measures，这些是直接从数据源提取的度量数据，例如销售金额、库存数量等。</li><li>设计计算度量，这些是基于基本度量进行计算得到的指标，例如同比增长率、平均库存周转率等。</li><li>使用 Restricted Measures，根据特定的条件或维度限制度量数据，例如特定时间段的销售额、某个区域的库存量等。</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="维度成员检索">维度成员检索<a class="hash-link" href="#维度成员检索" title="标题的直接链接">​</a></h2><p>Dimension Members Retriever 是 Copilot Command Agents 中的一个关键功能, 它通过动态同步和量化的维度成员信息，为数据分析提供了更为精准和高效的支持。
在语义模型中对 CDS View 的维度成员进行检索和向量化，以便后续 AI 命令智能体准确索引到维度成员的关键信息。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="指标注册">指标注册<a class="hash-link" href="#指标注册" title="标题的直接链接">​</a></h2><p>在项目界面中为 CDS View 注册相应的指标。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="indicator-architect-指标架构师">/indicator-architect 指标架构师<a class="hash-link" href="#indicator-architect-指标架构师" title="标题的直接链接">​</a></h3><p>指标体系架构师命令，根据用户提示和模型信息，参考业务角色示例，可以构建分析的指标体系，并逐个创建指标。使用下面的命令创建一套指标：</p><p><code>/indicator-architect @2CISDSLSANACUBE1/2CCSDSLSANALYTICQ1 为此模型创建一套数据分析的完整指标体系</code></p><p>命令会建议构建哪些指标，等到确认后会一个个进行创建。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="indicator-单个指标">/indicator 单个指标<a class="hash-link" href="#indicator-单个指标" title="标题的直接链接">​</a></h3><p>除了使用指标架构师命令来创建一套完整的指标体系，也可以直接在项目界面中为 CDS View 创建单个指标。
使用界面中的快速AI生成按钮， 或者在副驾对话框中使用 <code>/indicator</code> 命令来创建单个指标。</p><p><code>/indicator @2CISDSLSANACUBE1/2CCSDSLSANALYTICQ1 为产品组“XXX”创建销售量指标</code></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="指标应用">指标应用<a class="hash-link" href="#指标应用" title="标题的直接链接">​</a></h2><p>创建好了指标之后，就可以在指标应用中查看相应的指标列表了，也可以在故事仪表板制作时使用到这些指标。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a class="hash-link" href="#总结" title="标题的直接链接">​</a></h2><p>SAP S4HANA 嵌入式实时分析为企业提供了强大的数据分析和指标管理功能。基于 CDS Views 的语义模型，可以构建灵活的分析模型和业务指标体系。通过元数分析云的指标管理功能，企业能够高效管理和监控数据模型中的指标，并应用于实际业务分析和决策。</p>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="Copilot" term="Copilot"/>
        <category label="Agent" term="Agent"/>
        <category label="SAP" term="SAP"/>
        <category label="S4H" term="S4H"/>
        <category label="BW" term="BW"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[SAP S4HANA 嵌入式实时分析 - 2/4 故事仪表板]]></title>
        <id>s4h-embedded-analytics-story</id>
        <link href="https://xpertai.cn/blog/s4h-embedded-analytics-story"/>
        <updated>2024-07-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[在 第一篇文章 中，我们介绍了如何利用 元数分析云 的语义模型功能对 CDS 模型进行增强。]]></summary>
        <content type="html"><![CDATA[<p>在 <a href="/blog/s4h-embedded-analytics-modelling">第一篇文章</a> 中，我们介绍了如何利用 元数分析云 的语义模型功能对 CDS 模型进行增强。
本篇文章将探讨如何使用这些增强后的 CDS 模型创建可视化的故事仪表板，以便更好地进行数据分析和业务洞察。</p><p>故事仪表板是元数分析云嵌入式分析的重要组件，通过丰富的可视化功能和交互操作，帮助用户从多维度、多层次上全面了解业务情况。
本文将介绍创建故事仪表板的关键功能，包括计算度量、过滤器栏微件、输入控制器、关键指标微件、图形微件和多维表格微件。通过这些功能组合起来便可得到一个如下的故事仪表板：</p><figure class="Large"><img loading="lazy" src="/img/blog/s4h-embedded/dashboard-1.png" alt="未清分析" class="rounded-xl img_ev3q"><figcaption>未清分析</figcaption></figure><p>本系列 SAP S/4HANA 嵌入式分析功能介绍，我们将分为三篇进行讲解：</p><ol><li><a href="/blog/s4h-embedded-analytics-modelling"><strong>语义模型</strong></a>，探讨如何利用元数分析云的语义模型功能，对 CDS 模型进行增强，包括定义日历语义和使用 MDX 语句创建计算度量，为后续的故事仪表板和指标管理做好基础。</li><li><strong>故事仪表板</strong>，介绍如何创建可视化仪表板，利用增强过的 CDS 模型制作丰富多样的故事和计算度量功能。</li><li><strong>指标管理</strong>，探讨如何对 CDS 模型定义一系列指标，形成系统化的指标管理功能，便于企业内管理者订阅和分析指标，实时监控企业经营数据。</li></ol><iframe src="//player.bilibili.com/player.html?isOutside=true&amp;aid=1306129576&amp;bvid=BV1jM4m127cD&amp;cid=1618274147&amp;p=1" width="100%" height="500px" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe><h2 class="anchor anchorWithStickyNavbar_LWe7" id="背景回顾">背景回顾<a class="hash-link" href="#背景回顾" title="标题的直接链接">​</a></h2><p>SAP S/4HANA 系统开发包 <code>VDM_SD_ANALYTICS</code> 中的 CDS Views 是 SAP 提供的销售分析标准视图。我们选择了 <em>销售量和未清销售</em> 这个查询视图进行分析，相关 CDS views:</p><ul><li>分析 Catalog：<code>2CISDSLSANACUBE1</code> 分析 - 销售量和未清销售</li><li>Query <code>2CISDSLSANACUBE1/2CCSDSLSANALYTICQ1</code> 分析 - 销售量和未清销售</li></ul><div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">CDS Query</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token variable" style="color:#36acaa">@Analytics.query</span><span class="token plain">: </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">@AbapCatalog.sqlViewName</span><span class="token plain">: </span><span class="token string" style="color:#e3116c">'CSDSLSANALYTICQ1'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">define </span><span class="token keyword" style="color:#00009f">view</span><span class="token plain"> C_SalesAnalyticsQry_1</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">CDS Cube</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token variable" style="color:#36acaa">@Analytics.dataCategory</span><span class="token plain">: </span><span class="token comment" style="color:#999988;font-style:italic">#CUBE</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">@AbapCatalog.sqlViewName</span><span class="token plain">: </span><span class="token string" style="color:#e3116c">'ISDSLSANACUBE1'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">define </span><span class="token keyword" style="color:#00009f">view</span><span class="token plain"> I_SalesAnalyticsCube_1</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>并为其创建了对应的语义模型和增强。接下来我们要用该 <em>销售量和未清销售</em> 语义模型创建用于分析的故事仪表板。</p><p>以下步骤假设我们已经创建了基础的故事仪表板面板。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="计算度量">计算度量<a class="hash-link" href="#计算度量" title="标题的直接链接">​</a></h2><p>计算度量是基于现有数据通过公式计算得出的新的度量，能够灵活地适应不同的业务需求。在故事仪表板中，计算度量可以与参数结合使用，以便在不同的上下文中动态计算。
详细文档参见 <a href="/docs/stories/calculations/">如何创建计算度量</a>.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="创建计算度量">创建计算度量<a class="hash-link" href="#创建计算度量" title="标题的直接链接">​</a></h3><p>例如我们要分析销售头部百分之多少的产品的销售数量和总的销售数量的对比，那么这种非常细化的计算需求适合在元数分析云的故事仪表板中创建计算度量来满足。
在故事仪表板中的计算度量还可以与参数结合使用达到更加灵活多变的数据分析效果。</p><p>在故事工具栏中点击首选项，打开首选项工具栏，再打开其中的计算成员按钮，转到计算成员界面：</p><p>点击 <em>创建计算成员</em> 或者 <em>使用 AI 生成</em> 按钮新建一个计算度量。</p><figure class="Large"><img loading="lazy" src="/img/blog/s4h-embedded/calculation-top-percent.png" alt="Calculation Measure" class="rounded-xl shadow-lg img_ev3q"><figcaption>条件聚合：头部百分之多少的产品的销售数量</figcaption></figure><p>AI: 选择数据集并描述计算公式的业务逻辑，副驾便会帮您创建相应类型的计算度量。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="使用参数">使用参数<a class="hash-link" href="#使用参数" title="标题的直接链接">​</a></h3><p>在计算度量中使用参数，可以使度量计算更加灵活。例如，可以根据用户选择的百分比来控制 Top Percent 的产品。
创建参数后，故事会自动在当前页面为此参数添加相应的输入控制器来控制参数的值。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="故事微件">故事微件<a class="hash-link" href="#故事微件" title="标题的直接链接">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="过滤器栏微件">过滤器栏微件<a class="hash-link" href="#过滤器栏微件" title="标题的直接链接">​</a></h3><p><a href="/docs/widgets/filter-bar/">过滤器栏微件</a> 是一个页面全局过滤工具，可以在仪表板上设置一组过滤器，影响所有相关微件的显示数据。通过全局过滤器，用户可以轻松地在维度不同成员之间切换，查看不同角度的业务数据。</p><ol><li>打开仪表板工具栏，选择 “添加过滤器微件”。</li><li>选择 “过滤器栏” 微件，拖放到仪表板上。</li><li>配置过滤器条件，例如按地区、时间范围或产品类别进行过滤。</li><li>点击查询，过滤器的切片器将自动应用到所有相关微件中。</li></ol><h3 class="anchor anchorWithStickyNavbar_LWe7" id="输入控制器">输入控制器<a class="hash-link" href="#输入控制器" title="标题的直接链接">​</a></h3><p><a href="/docs/widgets/input-control/">输入控制器</a> 用于控制单个维度成员的选择，并联动其他微件的筛选和过滤功能。例如，可以通过输入控制器选择特定的产品类别，进而更新仪表板中所有相关图表和表格的数据。</p><ol><li>打开仪表板编辑器，选择 “添加微件”。</li><li>选择 “输入控制器” 微件，拖放到仪表板上。</li><li>配置输入控制器的选项，例如选择产品类别或时间段。</li><li>改变选择，输入控制器的切片器将与其他微件联动。</li></ol><figure class="Small"><img loading="lazy" src="/img/blog/s4h-embedded/input-control.png" alt="Input Control Widget" class="rounded-xl img_ev3q"><figcaption>输入控制器微件</figcaption></figure><figure class="Small"><img loading="lazy" src="/img/blog/s4h-embedded/parameters.png" alt="Parameter Widget" class="rounded-xl img_ev3q"><figcaption>参数输入微件</figcaption></figure><h3 class="anchor anchorWithStickyNavbar_LWe7" id="关键指标微件">关键指标微件<a class="hash-link" href="#关键指标微件" title="标题的直接链接">​</a></h3><p>关键指标微件用于展示单个指标或指标对比，帮助用户快速了解业务的关键数据。例如，可以使用关键指标微件展示当前季度的销售额、利润率或客户满意度。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="图形微件">图形微件<a class="hash-link" href="#图形微件" title="标题的直接链接">​</a></h3><p>图形微件支持丰富的图形类型和多维度多度量展示，帮助用户以更直观的方式理解数据。例如，可以使用柱状图、折线图或饼图展示销售趋势、市场份额或利润构成。</p><ol><li>打开仪表板编辑器，选择 “添加微件”。</li><li>选择 “图形” 微件，拖放到仪表板上。</li><li>选择图形类型，例如柱状图、折线图或饼图。</li><li>配置图形的数据源和显示维度。</li><li>保存配置，图形微件将显示在仪表板上。</li></ol><figure class="Large"><img loading="lazy" src="/img/blog/s4h-embedded/charts.png" alt="Chart Widget" class="rounded-xl img_ev3q"><figcaption>图形微件</figcaption></figure><h3 class="anchor anchorWithStickyNavbar_LWe7" id="多维表格微件">多维表格微件<a class="hash-link" href="#多维表格微件" title="标题的直接链接">​</a></h3><p>多维表格微件以表格形式展示多维度多度量的数据，并且可以设置单元格样式，以便更清晰地展示数据。例如，可以使用多维表格微件展示不同地区、产品和时间段的销售数据，并通过条件格式高亮特定数据。</p><ol><li>打开仪表板编辑器，选择 “添加微件”。</li><li>选择 “多维表格” 微件，拖放到仪表板上。</li><li>配置表格的数据源和显示维度。</li><li>设置单元格样式和条件格式，例如高亮显示高于目标值的销售数据。</li><li>保存配置，多维表格微件将显示在仪表板上。</li></ol><figure class="Middle"><img loading="lazy" src="/img/blog/s4h-embedded/grid-table.png" alt="Table Widget" class="rounded-xl img_ev3q"><figcaption>表格微件</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="ai-副驾命令">AI 副驾命令<a class="hash-link" href="#ai-副驾命令" title="标题的直接链接">​</a></h2><p>在故事仪表板设计器中可以使用 <a href="/docs/stories/copilot/">多种副驾命令</a> 来帮助用户创建可视化仪表板。</p><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_S0QG"><p>故事仪表板中的副驾命令还处在研发阶段，请谨慎使用。</p></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="故事命令">故事命令<a class="hash-link" href="#故事命令" title="标题的直接链接">​</a></h3><p><a href="/docs/stories/copilot/#story">故事命令</a> 作为超级智能体，可以协调调用其他各类子命令智能体，来完成更加复杂的任务。</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">/story @2CISDSLSANACUBE1/2CCSDSLSANALYTICQ1 如何分析模型中产品的销售情况</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><figure class="Large"><img loading="lazy" src="/img/blog/s4h-embedded/story-command.png" alt="Story Command" class="rounded-xl shadow-lg img_ev3q"><figcaption>故事命令</figcaption></figure><h3 class="anchor anchorWithStickyNavbar_LWe7" id="计算度量命令">计算度量命令<a class="hash-link" href="#计算度量命令" title="标题的直接链接">​</a></h3><p><a href="/docs/stories/copilot/#calculation">计算度量命令</a> 可以用来在故事仪表板中创建和修改计算度量。</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">/cc @2CISDSLSANACUBE1/2CCSDSLSANALYTICQ1 创建退货率：贷项凭证数量/总销售量</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="嵌入式故事预览">嵌入式故事预览<a class="hash-link" href="#嵌入式故事预览" title="标题的直接链接">​</a></h2><iframe src="//app.xpertai.cn/public/story/aababf63-9d79-41b3-ab42-7c326ccd9281?pageKey=eVsNPFVLMw" width="1000px" height="600px" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe><h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a class="hash-link" href="#总结" title="标题的直接链接">​</a></h2><p>通过本文介绍，您可以使用增强后的 CDS 模型在 元数分析云 中创建丰富多样的故事仪表板。通过计算度量、过滤器栏微件、输入控制器、关键指标微件、图形微件和多维表格微件，您可以灵活地展示和分析业务数据。
在下一篇文章中，我们将探讨如何对 CDS 模型定义一系列指标，形成系统化的指标管理功能。</p>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="Copilot" term="Copilot"/>
        <category label="Agent" term="Agent"/>
        <category label="SAP" term="SAP"/>
        <category label="S4H" term="S4H"/>
        <category label="BW" term="BW"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[SAP S4HANA 嵌入式实时分析 - 1/4 语义模型]]></title>
        <id>s4h-embedded-analytics-modelling</id>
        <link href="https://xpertai.cn/blog/s4h-embedded-analytics-modelling"/>
        <updated>2024-07-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[嵌入式分析介绍]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="嵌入式分析介绍">嵌入式分析介绍<a class="hash-link" href="#嵌入式分析介绍" title="标题的直接链接">​</a></h2><p>元数分析云是一款强大的数据分析工具，能够直接连接到 SAP S/4HANA 系统，利用 CDS (Core Data Services) 视图生成的 Transient Analytical Queries，实现嵌入式实时数据分析。
它利用 SAP HANA 数据库的内存计算能力，提供实时的数据分析和报告功能，使用户能够在业务操作中直接获取洞察。</p><p>本系列 SAP S/4HANA 嵌入式分析功能介绍，我们将分为三篇进行讲解：</p><ol><li><strong>语义模型</strong>，探讨如何利用元数分析云的语义模型功能，对 CDS 模型进行增强，包括定义日历语义和使用 MDX 语句创建计算度量，为后续的故事仪表板和指标管理做好基础。</li><li><strong>故事仪表板</strong>，介绍如何创建可视化仪表板，利用增强过的 CDS 模型制作丰富多样的故事和计算度量功能。</li><li><strong>指标管理</strong>，探讨如何对 CDS 模型定义一系列指标，形成系统化的指标管理功能，便于企业内管理者订阅和分析指标，实时监控企业经营数据。</li></ol><figure class="Large"><img loading="lazy" src="/img/blog/s4h-embedded/s4hana-architecture.png" alt="SAP S/4HANA On-Premise Embedded Analytics" class="rounded-xl img_ev3q"><figcaption>SAP S/4HANA On-Premise Embedded Analytics</figcaption></figure><p>本篇文章将介绍如何通过元数分析云的语义模型功能，对 CDS 模型进行增强，包括日历语义定义、计算度量等内容。</p><iframe src="//player.bilibili.com/player.html?isOutside=true&amp;aid=1706176524&amp;bvid=BV14T421k7ZT&amp;cid=1616790267&amp;p=1" width="100%" height="500px" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe><iframe src="//player.bilibili.com/player.html?isOutside=true&amp;aid=1906391823&amp;bvid=BV19U411U7cw&amp;cid=1619946302&amp;p=1" width="100%" height="500px" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe><h2 class="anchor anchorWithStickyNavbar_LWe7" id="环境前提">环境前提<a class="hash-link" href="#环境前提" title="标题的直接链接">​</a></h2><p>在开始之前，请确保已经准备好以下环境，二选一：</p><ul><li>公有云 SAP S/4HANA 系统与元数分析云。</li><li>On-Premise SAP S/4HANA 系统与私有化部署的元数分析系统。</li></ul><p>我们要演示的 CDS Views 属于 S4 系统提供的 SD 模块分析的标准视图, 你可以在 ADT 中通过搜索 “vdm_sd” 并添加 <code>VDM_SD_ANALYTICS</code> 包，该包中包含 SAP 提供的销售分析标准内容的包。</p><p>我们选择 <em>销售量和未清销售</em> 这个查询视图进行分析，相关 CDS views:</p><ul><li>分析 Catalog：<code>2CISDSLSANACUBE1</code> 分析 - 销售量和未清销售</li><li>Query <code>2CISDSLSANACUBE1/2CCSDSLSANALYTICQ1</code> 分析 - 销售量和未清销售</li></ul><div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">CDS Query</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token variable" style="color:#36acaa">@Analytics.query</span><span class="token plain">: </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">@AbapCatalog.sqlViewName</span><span class="token plain">: </span><span class="token string" style="color:#e3116c">'CSDSLSANALYTICQ1'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">define </span><span class="token keyword" style="color:#00009f">view</span><span class="token plain"> C_SalesAnalyticsQry_1</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">CDS Cube</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token variable" style="color:#36acaa">@Analytics.dataCategory</span><span class="token plain">: </span><span class="token comment" style="color:#999988;font-style:italic">#CUBE</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">@AbapCatalog.sqlViewName</span><span class="token plain">: </span><span class="token string" style="color:#e3116c">'ISDSLSANACUBE1'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">define </span><span class="token keyword" style="color:#00009f">view</span><span class="token plain"> I_SalesAnalyticsCube_1</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>CDS View 对应的 BW Query 可以在事务代码 <strong>RSRT</strong> 中查看 (格式为 <code>2C&lt;CUBE_SQL_VIEW&gt;/2C&lt;QUERY_SQL_VIEW&gt;</code>)，其结果类似于 ‘Easy Query’。</p><figure class="Large"><img loading="lazy" src="/img/blog/s4h-embedded/sap-query-monitor.jpeg" alt="SAP Query Monitor" class="rounded-xl shadow-lg img_ev3q"><figcaption>SAP Query Monitor</figcaption></figure><p>SAP S/4 系统环境准备好后，我们接下来在元数分析云中为其创建语义模型进行增强。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="配置分析环境">配置分析环境<a class="hash-link" href="#配置分析环境" title="标题的直接链接">​</a></h2><ol><li>连接 S4HANA 系统为数据源。</li><li>创建语义模型作为模型增强的工作空间。</li></ol><h3 class="anchor anchorWithStickyNavbar_LWe7" id="基于-cube">基于 Cube<a class="hash-link" href="#基于-cube" title="标题的直接链接">​</a></h3><p>选择目录 <code>$INFOCUBE</code> 创建语义模型，然后可以在源数据表找到名为 <code>$2CISDSLSANACUBE1</code> 的多维数据集。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="基于-query">基于 Query<a class="hash-link" href="#基于-query" title="标题的直接链接">​</a></h3><p>选择目录 <code>2CISDSLSANACUBE1</code> 创建语义模型，然后可以在源数据表找到名为 <code>2CISDSLSANACUBE1/2CCSDSLSANALYTICQ1</code> 的查询数据集。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="语义模型">语义模型<a class="hash-link" href="#语义模型" title="标题的直接链接">​</a></h2><p>对于 SAP S/4HANA 系统嵌入式分析的 CDS Views 模型场景，基础模型已经在 CDS Views 中构建好了，元数分析云中的语义模型可以在 CDS 模型基础上其进行增强，
包括维度语义的定义，度量格式的定义和计算度量的定义。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="语义增强">语义增强<a class="hash-link" href="#语义增强" title="标题的直接链接">​</a></h3><p>在元数分析云系统中，数据可视化和指标管理功能中很多地方都需要对维度和度量的语义进行定义，包括日历维度格式，地理维度的性质，度量的格式化方式等。
在语义模型模型中对 CDS 模型进行语义增强，便于后续展示。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="计算成员">计算成员<a class="hash-link" href="#计算成员" title="标题的直接链接">​</a></h3><p>在数据分析中，计算成员（Calculated Members）是一种强大的功能，它可以定义和创建基于现有数据的计算度量。这些计算成员可以用于各种分析和报告，提供更灵活和动态的数据分析能力。语义模型中的计算成员可以很好地替代 CDS 视图中的公式计算度量字段，以下是详细的介绍。</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="计算成员的优势">计算成员的优势<a class="hash-link" href="#计算成员的优势" title="标题的直接链接">​</a></h4><ol><li><p><strong>灵活性</strong>：
计算成员允许用户在语义模型层定义复杂的度量，而不需要修改底层 CDS 视图。这种灵活性使得用户可以根据需求快速调整和创建新的计算度量，而不必涉及到底层数据库或数据模型的变更。</p></li><li><p><strong>动态性</strong>：
计算成员可以根据用户的交互和数据过滤动态计算结果。例如，可以根据不同的时间范围、地理区域或产品类别来计算特定的度量值，这在 CDS 视图中可能需要复杂的公式和条件才能实现。</p></li><li><p><strong>易用性</strong>：
通过语义模型界面，用户可以使用简单的拖放操作和直观的公式编辑器来创建计算成员，而不需要深入了解 SQL 或 CDS 视图的语法。这大大降低了创建和管理计算度量的门槛，使得更多的业务用户能够参与数据分析。</p></li><li><p><strong>维护简便</strong>：
计算成员集中在语义模型中管理，使得维护和更新更加便捷。用户可以在一个地方查看和修改所有的计算度量，而不需要在多个 CDS 视图中寻找和更新公式。</p></li><li><p><strong>增强的计算能力</strong>：
语义模型支持更复杂的计算逻辑和函数，如 MDX (Multidimensional Expressions) 语句，可以实现一些 CDS 视图中难以实现的高级计算功能。这些功能包括复杂的时间序列分析、累计和移动平均计算等。</p></li></ol><figure class="Large"><img loading="lazy" src="/img/blog/s4h-embedded/calculated-members.png" alt="Calculated Members" class="rounded-xl shadow-lg img_ev3q"><figcaption>Calculated Members in Semantic Model</figcaption></figure><h4 class="anchor anchorWithStickyNavbar_LWe7" id="替代-cds-视图中的公式计算字段">替代 CDS 视图中的公式计算字段<a class="hash-link" href="#替代-cds-视图中的公式计算字段" title="标题的直接链接">​</a></h4><p>CDS 视图中的公式计算度量字段通常用于定义业务关键指标（如销售额、利润率等）的计算逻辑。这些公式在视图定义时就固定下来，缺乏灵活性和动态调整能力。以下是如何使用语义模型中的计算成员替代这些功能的步骤：</p><ol><li><p><strong>创建计算成员</strong>：
在语义模型中，选择需要增强的维度或度量，使用计算成员功能定义新的度量。例如，可以定义一个计算成员来计算年度销售增长率：</p><div class="language-mdx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-mdx codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[Measures].[Annual Sales Growth] =</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">([Measures].[Sales Amount], [Time].[Year].CurrentMember) -</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">([Measures].[Sales Amount], [Time].[Year].CurrentMember.PrevMember)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></li><li><p><strong>应用动态计算</strong>：
根据分析需求，计算成员可以根据用户选择的不同维度和过滤条件动态计算。例如，基于不同的时间范围（如季度、月份）计算销售增长率，而无需修改底层数据模型。</p></li><li><p><strong>整合现有度量</strong>：
计算成员可以基于现有的度量进行扩展和计算。例如，基于现有的销售额和成本度量，计算利润率：</p><div class="language-mdx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-mdx codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[Measures].[Profit Margin] =</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">([Measures].[Sales Amount] - [Measures].[Cost Amount]) /</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[Measures].[Sales Amount]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></li><li><p><strong>优化性能</strong>：
语义模型中的计算成员通常在分析层进行计算，可以利用内存计算技术和优化的查询引擎，提高计算性能，减少对数据库的负载。</p></li></ol><h4 class="anchor anchorWithStickyNavbar_LWe7" id="ai-生成计算公式">AI 生成计算公式<a class="hash-link" href="#ai-生成计算公式" title="标题的直接链接">​</a></h4><p>随着 AI（人工智能）技术的应用越来越广泛，元数分析云副驾中的 <a href="/docs/models/copilot/">计算公式命令 (<code>/calculated</code>)</a> 利用 AI 技术，提供了一种智能化的计算公式生成功能，帮助用户更快速、更准确地创建计算度量和指标。
用户点击计算成员工具栏中的 AI 生成按钮，输入需要创建的计算公式的自然语言描述，便可以得到语义模型中的计算成员，大步改进了在 CDS View 中创建计算公式的速度。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="数据预览">数据预览<a class="hash-link" href="#数据预览" title="标题的直接链接">​</a></h3><p>模型创建好后，可以在预览界面对模型数据进行预览.</p><figure class="Large"><img loading="lazy" src="/img/blog/s4h-embedded/data-preview.png" alt="Data Preview" class="rounded-xl shadow-lg img_ev3q"><figcaption>Data Preview in Semantic Model</figcaption></figure><h4 class="anchor anchorWithStickyNavbar_LWe7" id="cds-参数">CDS 参数<a class="hash-link" href="#cds-参数" title="标题的直接链接">​</a></h4><p>对于有输入参数的 CDS View 如下：</p><div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">CDS View with parameters</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">define </span><span class="token keyword" style="color:#00009f">view</span><span class="token plain"> C_SalesAnalyticsQry_1 </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">with</span><span class="token plain"> parameters</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token variable" style="color:#36acaa">@Consumption.defaultValue</span><span class="token plain">: </span><span class="token string" style="color:#e3116c">'M'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    P_ExchangeRateType : kurst</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    P_DisplayCurrency  : vdm_v_display_currency</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">select</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> I_SalesAnalyticsCube_1</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">P_ExchangeRateType:$parameters</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">P_ExchangeRateType</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> P_DisplayCurrency: $parameters</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">P_DisplayCurrency</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> SAC</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>在预览界面中 CDS 参数有默认值的会自动填入，没有默认值且必输的参数需要手动选择或输入。</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="模型查询语句">模型查询语句<a class="hash-link" href="#模型查询语句" title="标题的直接链接">​</a></h4><p>你还可以在查询界面使用 MDX 查询语句（或由 AI 辅助生成查询语句）进行更灵活的查询数据，还可以导出查询结果。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a class="hash-link" href="#总结" title="标题的直接链接">​</a></h2><p>通过本文介绍，您可以充分利用元数分析云的语义模型功能，对 CDS 视图进行增强和优化，实现更加灵活和高效的数据分析。
在下一篇文章中，我们将介绍如何使用增强过的 CDS 模型制作可视化仪表板，创建丰富多样的故事和计算度量功能。</p>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="Copilot" term="Copilot"/>
        <category label="Agent" term="Agent"/>
        <category label="SAP" term="SAP"/>
        <category label="S4H" term="S4H"/>
        <category label="BW" term="BW"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[新版本 2.4 - 副驾多智能体命令]]></title>
        <id>releases-2-4-copilot-multi-agent</id>
        <link href="https://xpertai.cn/blog/releases-2-4-copilot-multi-agent"/>
        <updated>2024-07-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[我们很高兴地宣布，元数分析平台最新版本 2.4 现已推出！作为一款基于云计算的敏捷 AI 数据分析平台，平台集多维建模、指标管理和 BI 可视化于一体，为用户提供了一站式的数据分析解决方案。此次更新带来了革新性的“副驾多智能体命令”（Copilot Multi-Agent Command）功能，进一步提升了平台的智能化和用户体验。]]></summary>
        <content type="html"><![CDATA[<p>我们很高兴地宣布，元数分析平台最新版本 2.4 现已推出！作为一款基于云计算的敏捷 AI 数据分析平台，平台集多维建模、指标管理和 BI 可视化于一体，为用户提供了一站式的数据分析解决方案。此次更新带来了革新性的“副驾多智能体命令”（Copilot Multi-Agent Command）功能，进一步提升了平台的智能化和用户体验。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="ai-数字业务专家">AI 数字业务专家<a class="hash-link" href="#ai-数字业务专家" title="标题的直接链接">​</a></h2><p>在元数分析平台 2.4 中，我们引入了一项革命性的功能——AI 数字业务专家平台。这一功能旨在将各行业领域的专业知识和经验进行向量数字化，使用户能够快速获取和应用这些宝贵的资源，构建属于自己的企业数据分析体系。
无论是初创企业还是大型企业，都可以通过这一功能，快速搭建适合自身业务需求的数据分析框架，提升决策效率和精度。
平台不仅为用户提供现成的数字化业务专家资源，还支持各行业业务专家将自己的经验数字化并共享给有需要的用户。这种共享与协作机制，促进了知识的传播和应用，有助于各行业共同进步。</p><p>您可以在 <a href="/pricing/#digital_expert_market">AI 数字业务专家</a> 页面浏览更多关于 AI 数字业务专家的信息。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="主要更新功能">主要更新功能<a class="hash-link" href="#主要更新功能" title="标题的直接链接">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-langgraph-框架">1. LangGraph 框架<a class="hash-link" href="#1-langgraph-框架" title="标题的直接链接">​</a></h3><p>利用 LangGraph 框架，我们为副驾命令创建了带有状态的可控循环流程的 LLM 智能体。这意味着一次命令执行可以调用一次或多次、一个或多个 LLM 智能体。有状态的可控循环智能体能够使用交互模式执行命令，使用户可以介入执行过程，控制命令执行的走向，从而确保分析过程的精确和灵活。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-多维模型的维度成员向量化">2. 多维模型的维度成员向量化<a class="hash-link" href="#2-多维模型的维度成员向量化" title="标题的直接链接">​</a></h3><p>我们增加了多维模型的维度成员向量化功能，使副驾命令智能体可以获取维度成员的准确信息。这一功能提升了智能体在数据分析过程中的准确性和效率，确保用户能够得到高质量的分析结果。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-fewshot-获取相似样例能力">3. Fewshot 获取相似样例能力<a class="hash-link" href="#3-fewshot-获取相似样例能力" title="标题的直接链接">​</a></h3><p>在主要命令智能体的多个节点，我们增加了 fewshot 获取相似样例的能力。通过切换不同的业务角色，同一命令在不同业务场景下可以产生不同的应用效果，满足用户多样化的需求。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="4-副驾命令快捷窗口">4. 副驾命令快捷窗口<a class="hash-link" href="#4-副驾命令快捷窗口" title="标题的直接链接">​</a></h3><p>我们在主要命令对应的功能界面增加了执行命令的快捷窗口按钮，用户可以快速定位并使用相应命令执行所需功能，大大提升了操作的便捷性和效率。</p><figure class="Large"><img loading="lazy" src="/img/copilot/copilot-command-quick-dialog.png" alt="Command Quick Dialog" class="rounded-xl shadow-lg img_ev3q"><figcaption>副驾命令快捷窗口</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="新增主要命令">新增主要命令<a class="hash-link" href="#新增主要命令" title="标题的直接链接">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-modeler-数据建模员">1. Modeler 数据建模员<a class="hash-link" href="#1-modeler-数据建模员" title="标题的直接链接">​</a></h3><p>根据用户提示和表信息，参考业务角色示例，<a href="/docs/models/copilot/#modeler"><code>/modeler</code> 数据建模员</a>可以创建共享维度和多维数据集。这一命令使得数据建模过程更加自动化和高效，用户可以专注于数据分析和决策。</p><figure class="Middle"><img loading="lazy" src="/img/copilot/command-modeler.png" alt="Modeler Command" class="rounded-lg img_ev3q"><figcaption>建模员命令架构</figcaption></figure><h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-indicator-system-architect-指标体系架构师">2. Indicator System Architect 指标体系架构师<a class="hash-link" href="#2-indicator-system-architect-指标体系架构师" title="标题的直接链接">​</a></h3><p>根据用户提示和模型信息，参考业务角色示例，<a href="/docs/indicators/copilot/#indicator-architect"><code>/indicator-architect</code> 指标体系架构师</a> 可以构建分析的指标体系，并逐个创建指标。用户可以轻松定义和管理关键业务指标，实现对业务绩效的全面监控和分析。</p><figure class="Middle"><img loading="lazy" src="/img/copilot/command-indicator-architect.png" alt="Indicator Architect Command" class="rounded-lg img_ev3q"><figcaption>指标体系架构师</figcaption></figure><h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-calculation-计算度量">3. Calculation 计算度量<a class="hash-link" href="#3-calculation-计算度量" title="标题的直接链接">​</a></h3><p>根据用户提示和模型信息，参考业务角色示例，<a href="/docs/stories/copilot/#calculation"><code>calculation</code> 计算度量命令</a> 可以创建不同类型的计算度量，以满足故事仪表板展示的需要。这一命令帮助用户快速生成所需的计算结果，支持决策过程。</p><figure class="Middle"><img loading="lazy" src="/img/copilot/command-calculation-architect.png" alt="Calculation Command" class="rounded-lg img_ev3q"><figcaption>计算度量命令架构</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="命令合集">命令合集<a class="hash-link" href="#命令合集" title="标题的直接链接">​</a></h2><p>元数分析平台目前可用的命令合集请参考：
<a href="https://iwk3znqmad.feishu.cn/slides/X27ds9ZK4l0kqDdRhKgcFVMcnce" target="_blank" rel="noopener noreferrer">https://iwk3znqmad.feishu.cn/slides/X27ds9ZK4l0kqDdRhKgcFVMcnce</a></p><iframe src="https://iwk3znqmad.feishu.cn/slides/X27ds9ZK4l0kqDdRhKgcFVMcnce" width="100%" height="500" frameborder="0"></iframe><h2 class="anchor anchorWithStickyNavbar_LWe7" id="结语">结语<a class="hash-link" href="#结语" title="标题的直接链接">​</a></h2><p>元数分析平台 2.4 的发布标志着数据分析平台智能化水平的新高度。通过引入副驾多智能体命令，我们为用户提供了更强大的工具和更灵活的操作体验。无论您是数据分析新手还是专家，都可以通过这套系统轻松构建和管理您的数据分析体系。快来体验 <a href="https://app.xpertai.cn/" target="_blank" rel="noopener noreferrer">元数分析平台 2.4</a>，感受智能数据分析的魅力吧！</p>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="Copilot" term="Copilot"/>
        <category label="Agent" term="Agent"/>
        <category label="Release" term="Release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[新版本 2.3 - 副驾驶智能体与业务角色]]></title>
        <id>releases-2-3-copilot-agents-roles</id>
        <link href="https://xpertai.cn/blog/releases-2-3-copilot-agents-roles"/>
        <updated>2024-05-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[元数（Metad）分析云作为一款基于云计算的敏捷数据分析平台，集多维建模、指标管理和 BI 展示于一体，致力于为用户提供高效、便捷的数据分析体验。]]></summary>
        <content type="html"><![CDATA[<p>元数（Metad）分析云作为一款基于云计算的敏捷数据分析平台，集多维建模、指标管理和 BI 展示于一体，致力于为用户提供高效、便捷的数据分析体验。
我们很高兴地宣布，元数分析云最新版本 2.3 现已正式发布。此次更新不仅优化了平台性能，还带来了多项激动人心的新功能，尤其是对 <a href="/docs/ai/copilot/#%E5%91%BD%E4%BB%A4"><strong>副驾驶命令</strong>（Copilot Command）</a>和 <a href="/docs/ai/copilot/#%E4%B8%9A%E5%8A%A1%E8%A7%92%E8%89%B2"><strong>角色</strong> （Role）</a>的全面升级。</p><figure class="Middle"><img loading="lazy" src="/img/copilot/copilot-architecture.png" alt="Copilot Architecture" class="rounded-lg img_ev3q"><figcaption>副驾驶架构</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="副驾驶的全新突破">副驾驶的全新突破<a class="hash-link" href="#副驾驶的全新突破" title="标题的直接链接">​</a></h2><p>副驾驶命令（Copilot Command）是用户执行 AI 功能的一种创新方式。用户通过输入命令并加上相应的提示（prompt），Copilot Agent 会调用大语言模型（LLM）并运行相关函数，从而完成各种数据分析任务。元数分析平台新版本 2.3 在这一功能上进行了显著的改进：</p><figure class="Large"><img loading="lazy" src="/img/copilot/roles-in-copilot-chat.png" alt="Roles in Copilot" class="shadow-md rounded-lg img_ev3q"><figcaption>副驾驶的业务角色</figcaption></figure><ol><li><p><strong>引入 LangChain Agents 支持</strong><br>
<!-- -->元数分析云逐步将所有 Copilot Commands 的实现切换至 LangChain Agent 方式，使得命令执行更加智能和灵活。LangChain Agents 的加入，使得数据处理和分析更加高效、精准。</p></li><li><p><strong>增强的 Copilot Command Agents 功能</strong><br>
<!-- -->新版本对 Copilot Command Agents 进行了多方面的增强：</p><ul><li><a href="/docs/models/member-retriever"><strong>维度成员检索器</strong>（Dimension Members Retriever）</a>：这一功能可以动态检索并获取维度成员的关键信息，帮助用户更好地理解数据维度。</li><li><strong>少量样本</strong>（Few Shot）：通过检索相似 <a href="/docs/server/organization/copilot/#%E6%A0%B7%E4%BE%8B">样例</a>，提供更加精准的模板，使得数据分析更加贴近实际需求。</li><li><strong>提示语建议</strong>（Suggestion）：提供动态提示补全功能，帮助用户快速生成高质量的分析命令。</li></ul></li></ol><h2 class="anchor anchorWithStickyNavbar_LWe7" id="引入业务角色功能">引入业务角色功能<a class="hash-link" href="#引入业务角色功能" title="标题的直接链接">​</a></h2><p>新版本还为 AI Copilot 添加了 <strong>Business Roles</strong> 业务功能。用户可以在使用过程中切换业务角色，从而在不同的场景下进行更为精准的业务分析。无论是市场分析、财务报告，还是运营管理，不同的业务角色将帮助用户实现个性化的数据分析体验。</p><p>每个业务角色都有对应的 <a href="/docs/server/organization/copilot/#%E6%A0%B7%E4%BE%8B"><strong>样例</strong></a>。在 Copilot 执行 Agent 时，会选中与当前任务相关度较高的样例发送至 LLM，以便生成更加精准的结果。这一功能确保了分析的针对性和实用性，大大提升了用户的工作效率和数据洞察力。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="常见角色">常见角色<a class="hash-link" href="#常见角色" title="标题的直接链接">​</a></h3><p>以下是按照不同技术领域划分的常见业务角色列表：</p><table><thead><tr><th>Name</th><th>Title</th><th>Title (CN)</th><th>Responsibility Description</th></tr></thead><tbody><tr><td>financial_analyst</td><td>Financial Analyst</td><td>财务分析师</td><td>Analyzing financial data, forecasting, budgeting, and financial reporting.</td></tr><tr><td>supply_chain_manager</td><td>Supply Chain Manager</td><td>供应链经理</td><td>Overseeing supply chain operations, logistics, inventory management, and supplier relationships.</td></tr><tr><td>marketing_specialist</td><td>Marketing Specialist</td><td>营销专员</td><td>Developing marketing strategies, executing campaigns, and analyzing market trends.</td></tr><tr><td>data_scientist</td><td>Data Scientist</td><td>数据科学家</td><td>Analyzing complex data sets, developing machine learning models, and deriving insights.</td></tr><tr><td>it_support_manager</td><td>IT Support Manager</td><td>IT 支持经理</td><td>Managing IT support teams, resolving technical issues, and ensuring IT infrastructure stability.</td></tr><tr><td>hr_specialist</td><td>Human Resources Specialist</td><td>人力资源专员</td><td>Managing recruitment, employee relations, training programs, and HR policies.</td></tr><tr><td>operations_manager</td><td>Operations Manager</td><td>运营经理</td><td>Overseeing daily operations, process improvement, and operational efficiency.</td></tr><tr><td>product_manager</td><td>Product Manager</td><td>产品经理</td><td>Planning and overseeing product development, market research, and user experience.</td></tr><tr><td>customer_service_manager</td><td>Customer Service Manager</td><td>客户服务经理</td><td>Managing customer support teams, ensuring customer satisfaction, and handling complaints.</td></tr><tr><td>compliance_officer</td><td>Compliance Officer</td><td>合规专员</td><td>Ensuring compliance with laws and regulations, conducting audits, and implementing compliance programs.</td></tr></tbody></table><p>这些角色涵盖了企业在财务、供应链、营销、数据科学、信息技术、人力资源、运营、产品管理、客户服务和合规等不同技术领域中的常见职位，为企业在各个方面提供专业的支持和管理。每个角色的职责描述都有助于明确其在业务分析和决策过程中的具体作用。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="其他更新">其他更新<a class="hash-link" href="#其他更新" title="标题的直接链接">​</a></h2><ul><li><a href="https://openai.com/index/hello-gpt-4o/" target="_blank" rel="noopener noreferrer"><strong>GPT-4o</strong></a> 支持最新的 GPT-4 Omni 模型，提供更快更强的自然语言处理能力。</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="架构规划">架构规划<a class="hash-link" href="#架构规划" title="标题的直接链接">​</a></h2><p>对于副驾驶的智能体架构规划，我们将智能体分为三个层次： <strong>命令智能体</strong>， <strong>业务角色</strong> 和 <strong>多智能体协作</strong>。</p><ul><li>命令智能体负责执行用户输入的命令针对单一任务进行操作系统</li><li>业务角色负责根据用户的业务需求提供相应的样例和提示</li><li>多智能体协作则负责协调不同命令智能体之间的工作，实现更加智能、高效的数据分析。</li></ul><figure class="Middle"><img loading="lazy" src="/img/copilot/copilot-agent-architecture.png" alt="Agents in Copilot" class="shadow-md rounded-lg img_ev3q"><figcaption>副驾驶的智能体架构</figcaption></figure><p>目前我们已经完成了部分命令智能体的升级和业务角色的功能，多智能体协作功能正在紧锣密鼓地开发中，敬请期待。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="结语">结语<a class="hash-link" href="#结语" title="标题的直接链接">​</a></h2><p>元数分析云 2.3 版本的发布，标志着数据分析进入了一个新的阶段。通过引入 LangChain Agents 和 Business Roles 等功能，我们致力于为用户提供更加智能、高效和个性化的分析工具。无论您是数据分析专家，还是业务决策者，元数分析云都将成为您不可或缺的得力助手。</p><p>立即升级至元数分析云 2.3 版本，体验全新的数据分析方式，共同开启数据驱动决策的新篇章。</p>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="Copilot" term="Copilot"/>
        <category label="Agent" term="Agent"/>
        <category label="Release" term="Release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[发布新版本 2.2]]></title>
        <id>releases-2-2</id>
        <link href="https://xpertai.cn/blog/releases-2-2"/>
        <updated>2024-05-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[我们很高兴地宣布发布 元数分析云 2.2！这是一个重要的里程碑，我们自豪地与全球开发者社区合作，推动数据分析领域的创新。]]></summary>
        <content type="html"><![CDATA[<p>我们发布了新版本 <a href="https://github.com/meta-d/ocap/releases/tag/2.2.0" target="_blank" rel="noopener noreferrer">2.2.0</a> ，有以下主要更新：</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="1-多维数据集设计器-er-图">1. 多维数据集设计器 ER 图<a class="hash-link" href="#1-多维数据集设计器-er-图" title="标题的直接链接">​</a></h2><p>我们新增了多维数据集设计器的 ER 关系图功能，您可以通过 ER 关系图来查看多维数据集的数据关系模型，包括事实数据表、维度、度量以及关系等，这样您可以更直观地了解多维数据集的数据结构，方便您进行数据建模和分析。</p><figure class="Large"><img loading="lazy" src="/img/blog/v2.2/cube-er.png" alt="Cube ER Diagram" class="shadow-md rounded-lg img_ev3q"><figcaption>数据集 ER 图</figcaption></figure><p>详情参考 <a href="/docs/models/cube-designer/#%E7%BB%93%E6%9E%84">多维数据集设计器</a></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="2-支持-sap-hana-数据库">2. 支持 SAP HANA 数据库<a class="hash-link" href="#2-支持-sap-hana-数据库" title="标题的直接链接">​</a></h2><p>我们在此版本中增加了对 SAP HANA 数据库的支持，您可以通过配置 HANA 数据源来连接 HANA 数据库，并创建 HANA 语义模型，从而在元数分析平台中直连 HANA 数据库的数据进行多维数据分析。</p><div class="flex items-center gap-2"><figure class="Middle"><img loading="lazy" src="/img/blog/v2.2/create-hana-datasource.jpeg" alt="Create HANA Data Source" class="shadow-xl rounded-xl img_ev3q"><figcaption>创建 HANA 数据源</figcaption></figure><figure class="Middle"><img loading="lazy" src="/img/blog/v2.2/create-model.png" alt="Create HANA Model" class="shadow-xl rounded-xl img_ev3q"><figcaption>创建 HANA 语义模型</figcaption></figure></div><p>详情参考 <a href="/docs/server/datasources/hana">SAP HANA 数据库</a></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="3-增加-langchain-框架的支持">3. 增加 LangChain 框架的支持<a class="hash-link" href="#3-增加-langchain-框架的支持" title="标题的直接链接">​</a></h2><p>我们在此版本中首次引入了 <a href="https://www.langchain.com/" target="_blank" rel="noopener noreferrer">LangChain</a> 作为 AI Copilot Commands 的代理实现，当我们输入命令时，副驾驶会解析命令并使用 LangChain Agent 来执行相应的操作，
因为支持 LangChain 命令的背后都有相应的 Agent 实现，所以我们可以通过配置不同的 Agent 来支持不同的命令，这样我们就赋予命令更加智能的决策能力。
详情参考 <a href="/docs/stories/copilot/#%E5%88%9B%E5%BB%BA%E5%92%8C%E4%BF%AE%E6%94%B9%E5%BE%AE%E4%BB%B6">创建和修改微件 - 故事 AI 副驾驶</a></p><figure class="Large"><img loading="lazy" src="/img/story/copilot-create-widget.png" alt="Create Widget using Copilot Command" class="shadow-xl rounded-xl img_ev3q"><figcaption>使用 AI 副驾驶命令创建微件</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="4-其他优化项">4. 其他优化项<a class="hash-link" href="#4-其他优化项" title="标题的直接链接">​</a></h2><ul><li>更新了 <a href="/docs/getting-started/k8s/">k8s 部署文档</a></li></ul><p>详情参见代码 <a href="https://github.com/meta-d/ocap/compare/2.1.2...2.2.0" target="_blank" rel="noopener noreferrer">Comparing changes</a></p>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="metad" term="metad"/>
        <category label="Open Source" term="Open Source"/>
        <category label="Release" term="Release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[发布版本 2.1]]></title>
        <id>releases-2-1</id>
        <link href="https://xpertai.cn/blog/releases-2-1"/>
        <updated>2024-04-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[我们很高兴地宣布发布 元数分析云 2.1！这是一个重要的里程碑，我们自豪地与全球开发者社区合作，推动数据分析领域的创新。]]></summary>
        <content type="html"><![CDATA[<p>我们发布了版本 2.1.0 ，有以下主要更新：</p><ol><li>升级了状态管理框架，采用 <code>@ngneat/elf</code> 一个响应式的不可变状态管理解决方案。<ol><li>升级了语义模型模块的状态管理框架，语义模型操作更加稳定，支持 State History 和 Undo/Redo 功能。参考 <a href="/docs/models/modeling-workspace/#%E5%BF%AB%E6%8D%B7%E9%94%AE">快捷键 - 语义建模工作空间</a></li><li>升级了故事模块的状态管理框架， 支持 State History 和 Undo/Redo 功能。参考 <a href="/docs/stories/preferences/#%E5%BF%AB%E6%8D%B7%E9%94%AE">快捷键 - 故事首选项</a></li></ol></li><li>将 olap 数据请求方式由 Http 请求改为 Websocket 请求，提高了数据并发查询的效率。参考 <a href="/docs/server/agent/server-agent#websocket-%E8%AF%B7%E6%B1%82">WebSocket 请求 - 服务器代理</a></li><li>维度设计器数据预览界面支持树形结构展示。参考 <a href="/docs/models/dimension-designer/#%E6%A0%91%E5%BD%A2%E9%A2%84%E8%A7%88">树形预览 - 维度设计器</a></li><li>故事设计器界面更新：<ol><li>支持固定 Toolbar 至侧边栏: 参考 <a href="/docs/stories/workspace/#%E5%B7%A5%E5%85%B7%E6%A0%8F">工具栏 - 故事仪表板工作空间</a></li><li>优化了 Zoom in / Zoom out 的模式，可以单独对单个页面进行缩放和平移。参考 <a href="/docs/stories/preferences/#%E5%BF%AB%E6%8D%B7%E9%94%AE">快捷键 - 故事首选项</a></li><li>打开故事进入全屏模式时，只在网页内全屏，不再全屏浏览器。</li></ol></li><li>指标注册页面支持对指标进行实时数据走势预览。参考 <a href="/docs/indicators/register#%E9%A2%84%E8%A7%88">预览 - 指标注册</a></li><li>维度/度量选择器组件升级：<ol><li>支持加载实体类型的状态和错误信息展示。</li><li>支持自定义成员标签字段为层级属性或成员固有属性。参考 <a href="/docs/stories/dimension-selector/#%E6%88%90%E5%91%98%E6%A0%87%E7%AD%BE">成员标签 - 维度选择器</a></li></ol></li><li>指标应用中下钻图形展示当前层级的名称为标题。</li></ol><figure class="Middle"><img loading="lazy" src="/img/blog/v2.1/indicator-app-drilldown-chart-title.png" alt="Drilldown Title" class="shadow-md rounded-lg img_ev3q"><figcaption>下钻图形标题</figcaption></figure>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="metad" term="metad"/>
        <category label="Open Source" term="Open Source"/>
        <category label="Release" term="Release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[宣布元数分析云 2.0]]></title>
        <id>releases-2-0</id>
        <link href="https://xpertai.cn/blog/releases-2-0"/>
        <updated>2024-03-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[我们很高兴地宣布发布 元数分析云 2.0！这是一个重要的里程碑，我们自豪地与全球开发者社区合作，推动数据分析领域的创新。]]></summary>
        <content type="html"><![CDATA[<p>我们很高兴地宣布 元数分析云 2.0 的发布。</p><p>我们相信 元数分析云 将帮助您以最少的努力分析您的大数据，让您专注于真正重要的事情：指标。</p><p>这是 元数分析云 的新主要版本，带来了令人振奋的新功能和新体验。</p><figure class="Large"><img loading="lazy" src="/img/blog/v2.0/indicator-app.png" alt="Indicator Application" class="Shadow img_ev3q"><figcaption>指标应用与 AI 副驾驶</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="亮点">亮点<a class="hash-link" href="#亮点" title="标题的直接链接">​</a></h2><p>以下是此新版本带来的一些有用功能的简要列表。</p><ol><li><p><strong>新的 AI 副驾驶</strong>：我们的新 AI 副驾驶功能帮助您发现隐藏在数据中的洞察力和趋势。它使用自定义命令为您提供有价值的建议和操作。更多详情，请参阅<a href="/docs/ai/copilot/">AI 副驾驶</a>。</p><ul><li>在不同页面添加自定义命令</li><li>支持<a href="https://help.aliyun.com/zh/dashscope/" target="_blank" rel="noopener noreferrer"><strong>DashScope</strong></a>提供程序</li><li>支持配置默认模型</li><li>支持显示或隐藏分词器</li></ul></li><li><p><strong>新的主题和布局</strong>：我们添加了新的暗色主题和新的布局，使网站更吸引人和用户友好。您现在可以根据自己的喜好自定义您的网站。</p><ul><li>暗色主题</li><li>固定侧边菜单栏</li><li>侧边抽屉触发器</li><li>将底部工具栏移动到侧边菜单</li></ul></li><li><p><strong>新的指标应用</strong>：我们升级了指标应用，使您能够查看您的指标。更多详情，请参阅<a href="/docs/indicators/app/">指标应用</a>。</p><ul><li>提高了指标列表的性能</li><li>在用户设置中存储时间粒度和回顾期</li><li><code>/analysis</code> AI 副驾驶命令帮助用户了解指标</li></ul></li><li><p><strong>租户设置</strong>：我们添加了新的租户设置，允许您自定义您的租户。更多详情，请参阅<a href="/docs/server/tenant/manage">租户设置</a>。</p><ul><li>自定义租户标题</li><li>自定义文件存储提供程序和关键设置</li></ul></li><li><p><strong>系统启动向导</strong>：我们添加了一个新的系统启动向导，帮助您开始使用 元数分析云。更多详情，请参阅<a href="/docs/getting-started/onboarding/">入门指南</a>。</p><ul><li>创建超级管理员用户</li><li>导入演示数据</li><li>连接您的数据源</li></ul></li></ol><figure class="Large"><img loading="lazy" src="/img/blog/v2.0/story-viewer.png" alt="Story Viewer" class="Shadow img_ev3q"><figcaption>故事视图</figcaption></figure><figure class="Large"><img loading="lazy" src="/img/blog/v2.0/ai-insight.png" alt="AI Insight" class="Shadow img_ev3q"><figcaption>AI 洞察</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="快速开始">快速开始<a class="hash-link" href="#快速开始" title="标题的直接链接">​</a></h2><ul><li>您可以注册 <a href="https://app.xpertai.cn/" target="_blank" rel="noopener noreferrer">我们的分析云网站</a> 尝试 元数分析云 2.0</li><li>或者您可以按照 <a href="/docs/getting-started/">部署指南</a> 部署您自己的实例，或者 <a href="https://github.com/meta-d/ocap/" target="_blank" rel="noopener noreferrer">下载</a> 源代码在本地编译安装</li><li>对于商业用户，您可以 <a href="/pricing/#contact_us">联系我们</a> 获取专业支持和服务</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="结论">结论<a class="hash-link" href="#结论" title="标题的直接链接">​</a></h2><p>我们相信新的 元数分析云 将帮助您以最少的努力分析您的大数据。我们很期待看到您如何在您的公司中使用它推动数据分析领域的创新。</p><p>感谢您多年来使用 元数分析云。我们将尽力确保该平台保持竞争力，以其出色的灵活性脱颖而出。</p><p>希望您喜欢这个新版本的 元数分析云。如果您有任何反馈或建议，请告诉我们。</p>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="metad" term="metad"/>
        <category label="Open Source" term="Open Source"/>
        <category label="Release" term="Release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Metad Analytics Cloud 现已开源！加入我们，共同打造强大的 SaaS 数据分析平台]]></title>
        <id>open-source-get-started</id>
        <link href="https://xpertai.cn/blog/open-source-get-started"/>
        <updated>2023-09-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[我们激动地宣布，元数分析云团队的 SaaS 数据分析平台 Metad Analytics Cloud 现已开源！这是一个重大的里程碑，我们为能够与全球的开发者社区合作，共同推动数据分析领域的创新而感到自豪。]]></summary>
        <content type="html"><![CDATA[<p>大家好！</p><p>我们激动地宣布，元数分析云团队的 SaaS 数据分析平台 Metad Analytics Cloud 现已开源！这是一个重大的里程碑，我们为能够与全球的开发者社区合作，共同推动数据分析领域的创新而感到自豪。</p><p>本文主要介绍一些关于 Metad Analytics Cloud 的基本信息，以及如何加入我们的社区，一起为数据分析领域的发展做出贡献。</p><figure class="Large"><img loading="lazy" src="/img/blog/os/story-workspace.png" alt="故事工作空间" class="Shadow img_ev3q"><figcaption>故事工作空间</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="开源代码仓库">开源代码仓库<a class="hash-link" href="#开源代码仓库" title="标题的直接链接">​</a></h2><p>Metad Analytics Cloud 的开源代码仓库位于 <a href="https://github.com/meta-d/ocap" target="_blank" rel="noopener noreferrer">GitHub</a> <iframe src="https://ghbtns.com/github-btn.html?user=meta-d&amp;repo=ocap&amp;type=star&amp;count=true" frameborder="0" scrolling="0" width="150" height="20" title="GitHub"></iframe>上，代码仓库里有更加详细的信息和文档。我们欢迎您克隆、探索、贡献和分享这个令人兴奋的项目。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="主要功能">主要功能<a class="hash-link" href="#主要功能" title="标题的直接链接">​</a></h2><p>Metad Analytics Cloud 提供了一系列强大的功能，包括但不限于：</p><ol><li><p><strong>多数据源支持</strong>：轻松连接不同数据源，包括数据库如 Postgres、MySQL等，MPP 数据库如 <a href="https://doris.apache.org/" target="_blank" rel="noopener noreferrer">Apache Doris</a>、<a href="https://github.com/StarRocks/starrocks" target="_blank" rel="noopener noreferrer">StarRocks</a>、<a href="https://clickhouse.com/" target="_blank" rel="noopener noreferrer">ClickHouse</a>等，多维数据源如 SAP BW/BPC，SASS等，以获取全面的数据洞察。</p></li><li><p><strong>语义模型</strong>：通过强大的语义分析，将数据转化为易于理解的信息，帮助用户快速洞察数据背后的故事。</p></li><li><p><strong>故事仪表板</strong>：创建引人入胜的仪表板，以直观地呈现数据，让数据讲述您想要的故事。</p></li><li><p><strong>指标管理</strong>：轻松定义、跟踪和管理关键业务指标，确保数据分析与业务目标紧密对齐。</p></li><li><p><strong>AI 副驾驶</strong>：利用先进的人工智能技术，自动发现隐藏在数据中的见解和趋势。</p></li><li><p><strong>多租户和多组织支持</strong>：适用于不同组织和租户的灵活性，确保数据分析能够满足多种需求。</p></li></ol><h2 class="anchor anchorWithStickyNavbar_LWe7" id="演示地址">演示地址<a class="hash-link" href="#演示地址" title="标题的直接链接">​</a></h2><p>您可以在 <a href="https://app.xpertai.cn" target="_blank" rel="noopener noreferrer">Metad Analytics Cloud 演示网站</a> 上亲自体验这些功能。请随时登录并探索我们的平台，了解它如何满足您的数据分析需求。您还可以无需登录直接浏览网站公开的仪表板 <a href="https://app.xpertai.cn/public/trending" target="_blank" rel="noopener noreferrer">https://app.xpertai.cn/public/trending</a> 。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="技术栈">技术栈<a class="hash-link" href="#技术栈" title="标题的直接链接">​</a></h2><p>Metad Analytics Cloud 构建于强大的技术栈之上，包括：</p><ul><li><p><strong>TypeScript</strong>：强大的类型安全性和现代化的语言特性。</p></li><li><p><strong>Node.js / Nest.js</strong>：用于构建高性能、可扩展的服务器端应用程序。</p></li><li><p><strong>Nx</strong>：帮助管理大型代码库的工具。</p></li><li><p><strong>Angular</strong>：用于构建现代 Web 应用程序的前端框架。</p></li><li><p><strong>RxJS</strong>：用于处理异步数据流的库，支持响应式编程。</p></li><li><p><strong>TypeORM</strong>：一个强大的对象关系映射（ORM）库，用于管理数据库。</p></li><li><p><strong>ECharts</strong>：用于创建交互式数据可视化的库。</p></li><li><p><strong>Java / Mondrian</strong>：用于处理多维数据 OLAP 引擎的技术和工具。</p></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="快速开始">快速开始<a class="hash-link" href="#快速开始" title="标题的直接链接">​</a></h2><p>如果您希望快速开始使用 Metad Analytics Cloud，我们为您提供了使用 Docker Compose 的简便方式。您可以在我们的仓库中找到相应的 <a href="https://github.com/meta-d/ocap#-quick-start" target="_blank" rel="noopener noreferrer">文档和示例</a>，以帮助您立即启动和运行该平台。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="加入我们">加入我们<a class="hash-link" href="#加入我们" title="标题的直接链接">​</a></h2><p>Metad Analytics Cloud 的开源化不仅仅是发布代码，更是一个邀请。我们诚挚地邀请您加入我们的社区，一起为数据分析领域的创新做出贡献。您可以：</p><ul><li><p>给我们的仓库加星，以展示您对这个项目的支持<iframe src="https://ghbtns.com/github-btn.html?user=meta-d&amp;repo=ocap&amp;type=star&amp;count=true" frameborder="0" scrolling="0" width="150" height="20" title="GitHub"></iframe>。</p></li><li><p>在我们的 issue 页面提出您的特性请求或报告 bug。</p></li><li><p>提交 Pull Request，共同改进项目，推动它的发展。</p></li></ul><p>感谢您的关注和支持！Metad Analytics Cloud 的开源之路才刚刚开始，我们期待与您一同开创数据分析的新篇章。如果您有任何疑问或意见，随时与我们联系。让我们一起努力，共同建立一个更智能、更强大的数据分析世界！</p>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="metad" term="metad"/>
        <category label="Open Source" term="Open Source"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[AI 副驾驶：1.提升数据查询的智能化体验]]></title>
        <id>copilot-1-assist-data-query</id>
        <link href="https://xpertai.cn/blog/copilot-1-assist-data-query"/>
        <updated>2023-08-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[在当今数据驱动的商业环境中，数据分析已经成为了企业决策的关键一环。元数分析云为您提供了一种智能化的数据查询体验，通过其基于 ChatGPT 的强大的 AI 副驾驶功能，您可以更加高效地进行数据查询、优化和解释。本篇文章将为您详细介绍如何在元数分析云中开启和配置AI副驾驶，以及如何在查询实验室中利用AI副驾驶提升数据查询的效率。]]></summary>
        <content type="html"><![CDATA[<p>在当今数据驱动的商业环境中，数据分析已经成为了企业决策的关键一环。元数分析云为您提供了一种智能化的数据查询体验，通过其基于 ChatGPT 的强大的 AI 副驾驶功能，您可以更加高效地进行数据查询、优化和解释。本篇文章将为您详细介绍如何在元数分析云中开启和配置AI副驾驶，以及如何在查询实验室中利用AI副驾驶提升数据查询的效率。</p><p><a href="/docs/models/query-lab/">查询实验室</a> 提供了使用 SQL 查询语句灵活操作数据源实体(物理表视图或者多维数据集)的功能, 帮助用户进行日常的数据运维工作.
查询实验室内置在语义模型工作空间内，通过语义模型连接的 <a href="/docs/server/datasources/">数据源</a> 来操作和查询数据。如果用户的数据源是公网访问的，
可以直接在元数分析云中创建数据源进行连接查询。如果用户的数据源是在内网私有化部署的，可以通过 <a href="/docs/server/agent/local-agent/">桌面代理</a> 进行连接查询。</p><figure class="Large"><img loading="lazy" src="/img/copilot/query-lab-copilot.png" alt="查询实验室AI副驾驶" class="Shadow img_ev3q"><figcaption>查询实验室AI副驾驶</figcaption></figure><p>接下来本文将介绍如何开启和配置 AI 副驾驶并使用其来辅助查询实验室中的数据 sql 查询、优化和解释。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="开启和配置ai副驾驶">开启和配置AI副驾驶<a class="hash-link" href="#开启和配置ai副驾驶" title="标题的直接链接">​</a></h2><p>元数分析云的 <a href="/docs/server/organization/copilot/">AI 副驾驶</a> 功能可以在网站配置里启用并配置相应的 openai key 或其他 AI 服务的 key。</p><p>用户通过第三方服务商获取的 AI 服务的 key，也可以配置在 AI 副驾驶中，并通过配置 API 主机地址来调用 OpenAI 的 api 服务。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="查询实验室中的-ai-智能">查询实验室中的 AI 智能<a class="hash-link" href="#查询实验室中的-ai-智能" title="标题的直接链接">​</a></h2><p>现在，让我们看看在查询实验室中如何使用 AI 副驾驶来辅助编写、优化和解释查询语句。查询实验室中的 AI 副驾驶包含一系列基于 ChatGPT 的 AI SQL 使用功能，主要包括自然语言转 SQL、SQL 解释、SQL 优化和 SQL 转换。 使用这些 AI 功能，可以将自然语言转换成本地查询 SQL，而不仅仅是 SQL 查询伪代码；可以将 SQL 解释成自然语言，帮助用户理解复杂的 SQL；可以针对慢 SQL 提供全方位的优化建议，提升查询效率；可以转换不同数据库类型的 SQL 语言，降低数据库迁移难度等等。</p><p>在查询实验室中每一个查询界面就是一个 AI 副驾驶的会话，在查询保存时将会保存当前的会话记录，方便用户下次继续使用或查询历史对话。</p><p>可以将数据表区域里众多的表选取需要的表拖至查询的表结构区域，作为 AI 副驾驶会话的上下文信息，这样 AI 副驾驶就可以根据上下文信息来进行智能化的建议。</p><p>在查询实验室中，使用 AI 副驾驶有三种方式：</p><ol><li>打开语义模型的 AI 副驾驶界面，在查询实验室界面时，AI 会话将会切换到查询实验室模式。用户可以基于当前上下文进行询问，AI 副驾驶将会根据上下文信息给出相应的 SQL 语句。</li><li>在查询编辑器中使用 AI 菜单，在编辑器中点击右键打开菜单，会看到 <strong>优化</strong>，<strong>自然语言转SQL</strong> 和 <strong>解释</strong> 三个 AI 菜单项，用户可以对当前编辑器中全部的或选中的 SQL 语句进行优化、转换和解释。</li><li>在编辑器工具栏中点击 AI 结对程序员🧑‍💻按钮打开输入框，输入任意提问或建议，AI 副驾驶将会根据上下文信息给出相应的 SQL 语句或优化结果，并将结果直接输出到编辑器中。</li></ol><h3 class="anchor anchorWithStickyNavbar_LWe7" id="一自然语言转sql语句">一：自然语言转SQL语句<a class="hash-link" href="#一自然语言转sql语句" title="标题的直接链接">​</a></h3><p>在查询实验室中，您可以开始编写您的查询语句，无论是 SQL 查询还是自然语言描述。</p><figure class="Large"><img loading="lazy" src="/img/blog/copilot/query-lab-editor-context-menu.png" alt="查询实验室编辑器 AI 菜单" class="img_ev3q"><figcaption>查询实验室编辑器 AI 菜单</figcaption></figure><ul><li>输入样例：关联 adv_reseller 和 adv_sales 和 adv_date 表并查询  'FY2020'  财年销售额最多的 reseller (排除 '<!-- -->[Not Applicable]<!-- -->')</li><li>输出样例：</li></ul><div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> reseller</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">reseller_id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">SUM</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sales</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sales_amount</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> total_sales</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">FROM</span><span class="token plain"> adv_sales </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> sales</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">JOIN</span><span class="token plain"> adv_reseller </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> reseller </span><span class="token keyword" style="color:#00009f">ON</span><span class="token plain"> sales</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">reseller_key </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> reseller</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">reseller_key</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">JOIN</span><span class="token plain"> adv_date </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">date</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">ON</span><span class="token plain"> sales</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">order_date_key </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">date</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">date_key</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">WHERE</span><span class="token plain"> reseller</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">reseller_id </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'[Not Applicable]'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">AND</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">date</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">fiscal_year </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'FY2020'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">GROUP</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">BY</span><span class="token plain"> reseller</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">reseller_id</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">ORDER</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">BY</span><span class="token plain"> total_sales </span><span class="token keyword" style="color:#00009f">DESC</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">LIMIT</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>鉴于一些细节的信息，用户可以自行调整结果语句，或者细化提问问题，以获得更精确的结果。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="二sql优化建议">二：SQL优化建议<a class="hash-link" href="#二sql优化建议" title="标题的直接链接">​</a></h3><p>在编辑器中输入 SQL 语句或者选中已有的语句，点击编辑器右键菜单中的 <strong>优化</strong>，AI 副驾驶将会根据上下文信息给出相应的 SQL 语句优化建议并替换原语句。</p><figure class="Large"><img loading="lazy" src="/img/blog/copilot/query-lab-ai-optimize.png" alt="查询语句 AI 优化" class="img_ev3q"><figcaption>查询语句 AI 优化</figcaption></figure><p>AI副驾驶将根据最佳实践提供查询优化建议，以确保查询的性能最佳。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="三sql解释">三：SQL解释<a class="hash-link" href="#三sql解释" title="标题的直接链接">​</a></h3><p>在编辑器中输入 SQL 语句或者选中已有的语句，点击编辑器右键菜单中的 <strong>解释</strong>，AI 副驾驶将会根据上下文信息给出相应的 SQL 语句解释并作为注释插入原语句上方。</p><figure class="Large"><img loading="lazy" src="/img/blog/copilot/query-lab-ai-explain.png" alt="查询语句 AI 解释" class="img_ev3q"><figcaption>查询语句 AI 解释</figcaption></figure><h3 class="anchor anchorWithStickyNavbar_LWe7" id="四自由提问">四：自由提问<a class="hash-link" href="#四自由提问" title="标题的直接链接">​</a></h3><p>在查询的编辑器工具栏中打开 AI 结对程序员🧑‍💻按钮可以在输入框中输入任意提问或建议，AI 副驾驶将会根据上下文信息给出相应的 SQL 语句或优化结果，并将结果直接输出到编辑器中。</p><figure class="Large"><img loading="lazy" src="/img/blog/copilot/query-lab-ai-free-ask.png" alt="AI 自由提问" class="img_ev3q"><figcaption>AI 自由提问</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="ai-副驾驶对话模式">AI 副驾驶对话模式<a class="hash-link" href="#ai-副驾驶对话模式" title="标题的直接链接">​</a></h2><p>查询实验室的 AI 副驾驶侧边栏对话框为对话模式，可以基于当前会话上下文对用户提出的问题做出智能的回答，相对于编辑器中的按钮菜单会话对话框可以使用持续对话的方式对一个问题进行连续的提问和回答，以便更好地理解用户的意图。</p><p>如下图如果对 AI 副驾驶的回答不够满意可以继续提问，增加对问题的描述和补充从而完善问题</p><figure class="Large"><img loading="lazy" src="/img/blog/copilot/query-lab-ai-copilot.png" alt="AI 副驾驶对话模式" class="img_ev3q"><figcaption>AI 副驾驶对话模式</figcaption></figure><p>要验证 AI 副驾驶的回答是否正确，可以复制 SQL 语句到编辑器中执行来查看结果正确性。</p><p>在对话框中点击某个问题可以重新编辑，然后重新提交问题。也可以删除某些对话内容，然后重新继续对话内容。</p><p>在查询保存时会将 AI 副驾驶的对话记录进行保存，以便用户下次继续使用或查询历史对话。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="实际应用在线数据分析">实际应用在线数据分析<a class="hash-link" href="#实际应用在线数据分析" title="标题的直接链接">​</a></h2><p>为了更好地演示AI副驾驶的功能，让我们通过一个在线数据分析的实例来说明。</p><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>信息</div><div class="admonitionContent_S0QG"><p>在线数据分析可以通过 <a href="/docs/models/sql-modeling/wasm-model/">WASM 语义模型</a> 来实现。WASM 模式的详细使用案例可以参考 <a href="/docs/tutorials/wasm-db/">使用 WASM 数据库做分析</a> 一文。</p></div></div><p>本文我们使用 <a href="https://www.kaggle.com/datasets/nelgiriyewithana/global-youtube-statistics-2023" target="_blank" rel="noopener noreferrer">Global YouTube Statistics 2023</a> (A collection of YouTube giants) 数据集来做演示。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="示例最受欢迎的视频频道">示例：最受欢迎的视频频道<a class="hash-link" href="#示例最受欢迎的视频频道" title="标题的直接链接">​</a></h3><p><strong>提问</strong>：<strong>global_youtube_statistics 请给出此表的分析建议：</strong></p><p><strong>回答</strong>：</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">对于表 "global_youtube_statistics" 的分析建议如下：</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">分析流量数据：使用"video views"字段和"video_views_for_the_last_30_days"字段，可以分析视频观看量和最近30天视频观看量的变化趋势，找出受欢迎的视频和频道。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">比较订阅量：使用"subscribers"字段和"subscribers_for_last_30_days"字段，可以比较总订阅数和最近30天的订阅增长情况，找出有潜力的频道。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">地理位置分析：使用"Country"字段、"Abbreviation"字段、"country_rank"字段和地理坐标字段"Latitude"和"Longitude"，可以分析不同国家的频道数量和流量排名情况，找出受欢迎的国家和地区。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">频道类型分析：使用"channel_type"字段和"channel_type_rank"字段，可以分析不同类型的频道数量和受欢迎程度，找出热门的频道类型。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">受众分析：使用"Population"字段、"Gross tertiary education enrollment (%)"字段、"Unemployment rate"字段和"Urban_population"字段，可以分析不同国家/地区的人口情况、教育程度、失业率和城市人口比例，帮助定位目标受众。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">收益分析：使用"lowest_monthly_earnings"字段、"highest_monthly_earnings"字段、"lowest_yearly_earnings"字段和"highest_yearly_earnings"字段，可以分析频道的最低和最高月收入以及最低和最高年收入的范围，了解频道的盈利能力。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">根据具体分析需求，结合以上字段和相应的分析函数，可以编写相应的 SQL 查询语句来进行数据分析。</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p><strong>继续提问</strong>：<strong>使用"video views"字段和"video_views_for_the_last_30_days"字段，可以分析视频观看量和最近30天视频观看量的变化趋势，找出受欢迎的视频和频道:</strong></p><p><strong>回答</strong>：</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">要分析视频观看量和最近30天视频观看量的变化趋势，并找出受欢迎的视频和频道，可以使用以下 SQL 查询语句：</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">SELECT "Title", "Youtuber", "video views", "video_views_for_the_last_30_days"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">FROM "global_youtube_statistics"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ORDER BY "video_views_for_the_last_30_days" DESC</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LIMIT 10;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">以上查询语句将从 "global_youtube_statistics" 表中选取 "Title"、"Youtuber"、"video views" 和 "video_views_for_the_last_30_days" 字段，并按照 "video_views_for_the_last_30_days" 字段降序排序，最后限制返回前10个结果。这将展示出最近30天内视频观看量最高的视频和对应的频道信息。</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>执行以上 SQL 查询语句，可以得到如下结果：</p><table><thead><tr><th align="center">Title</th><th align="center">Youtuber</th><th align="center">video views</th><th align="center">video_views_for_the_last_30_days</th></tr></thead><tbody><tr><td align="center">Music</td><td align="center">Music</td><td align="center">0</td><td align="center">NaN</td></tr><tr><td align="center">Gaming</td><td align="center">Gaming</td><td align="center">0</td><td align="center">NaN</td></tr><tr><td align="center">brightside</td><td align="center">BRIGHT SIDE</td><td align="center">10708532224</td><td align="center">NaN</td></tr><tr><td align="center">Luis Arturo Villar Sudek</td><td align="center">Luisito Comunica</td><td align="center">8670473216</td><td align="center">NaN</td></tr><tr><td align="center">News</td><td align="center">News</td><td align="center">0</td><td align="center">NaN</td></tr></tbody></table><p>...</p><p><strong>继续提问</strong>：<strong>排除 video_views_for_the_last_30_days 等于 NaN 的记录</strong></p><p><strong>回答</strong>：</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">要在排除 "video_views_for_the_last_30_days" 字段等于 NaN 的记录的基础上进行分析，请使用以下 SQL 查询语句：</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">SELECT "Title", "Youtuber", "video views", "video_views_for_the_last_30_days"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">FROM "global_youtube_statistics"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WHERE NOT("video_views_for_the_last_30_days" = 'NaN')</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ORDER BY "video_views_for_the_last_30_days" DESC</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LIMIT 10;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">以上查询语句添加了一个条件，使用 NOT 运算符来排除 "video_views_for_the_last_30_days" 字段等于 NaN 的记录。其他部分与之前的查询语句相同，将返回最近30天内视频观看量最高的视频和对应的频道信息，同时排除了 NaN 值的记录。</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>执行以上 SQL 查询语句，可以得到如下结果：</p><table><thead><tr><th align="center">Title</th><th align="center">Youtuber</th><th align="center">video views</th><th align="center">video_views_for_the_last_30_days</th></tr></thead><tbody><tr><td align="center">Happy Lives</td><td align="center">Happy Lives</td><td align="center">2634</td><td align="center">6589000192</td></tr><tr><td align="center">Dan-Sa / Daniel Saboya</td><td align="center">Dan-Sa / Daniel Saboya</td><td align="center">2908120832</td><td align="center">6147999744</td></tr><tr><td align="center">��������� KIMPRO</td><td align="center">��������� KIMPRO</td><td align="center">19206701056</td><td align="center">3404000000</td></tr><tr><td align="center">DaFuq!?Boom!</td><td align="center">DaFuq!?Boom!</td><td align="center">7906181632</td><td align="center">2304000000</td></tr><tr><td align="center">Calon Sarjana</td><td align="center">Calon Sarjana</td><td align="center">10664585</td><td align="center">2292000000</td></tr><tr><td align="center">T-Series</td><td align="center">T-Series</td><td align="center">228000006144</td><td align="center">2257999872</td></tr></tbody></table><p>...</p><p>我们看到虽然按 video_views_for_the_last_30_days 字段降序排序，但是结果中的第一条记录的 video views 字段值却是很小，那么我们继续</p><p><strong>继续提问</strong>：<strong>要通过计算 "video views"字段和"video_views_for_the_last_30_days"字段值的相关性综合考虑找出最受欢迎的视频和频道：</strong></p><p><strong>回答</strong>：</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">要通过计算 "video views" 字段和 "video_views_for_the_last_30_days" 字段值的相关性来综合考虑找出最受欢迎的视频和频道，可以使用以下 SQL 查询语句：</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">SELECT "Title", "Youtuber", "video views", "video_views_for_the_last_30_days"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">FROM "global_youtube_statistics"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WHERE NOT("video_views_for_the_last_30_days" = 'NaN')</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ORDER BY ("video views" * "video_views_for_the_last_30_days") DESC</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LIMIT 10;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">以上查询语句在之前的基础上，通过将 "video views" 字段和 "video_views_for_the_last_30_days" 字段值相乘，得到一个综合考虑了两者关系的排序依据。通过将乘积结果降序排序，并限制返回前10个结果，可以找出最受欢迎的视频和对应的频道信息。注意，同样地，NaN 值的记录会被排除在结果之外。</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>执行以上 SQL 查询语句，可以得到如下结果：</p><table><thead><tr><th align="center">Title</th><th align="center">Youtuber</th><th align="center">video views</th><th align="center">video_views_for_the_last_30_days</th></tr></thead><tbody><tr><td align="center">T-Series</td><td align="center">T-Series</td><td align="center">228000006144</td><td align="center">2257999872</td></tr><tr><td align="center">Cocomelon - Nursery Rhymes</td><td align="center">Cocomelon - Nursery Rhymes</td><td align="center">164000006144</td><td align="center">1975000064</td></tr><tr><td align="center">SET India</td><td align="center">SET India</td><td align="center">147999997952</td><td align="center">1824000000</td></tr><tr><td align="center">Sony SAB</td><td align="center">Sony SAB</td><td align="center">101000003584</td><td align="center">1656999936</td></tr><tr><td align="center">Zee TV</td><td align="center">Zee TV</td><td align="center">73139052544</td><td align="center">1707000064</td></tr><tr><td align="center">Colors TV</td><td align="center">Colors TV</td><td align="center">61510905856</td><td align="center">1188000000</td></tr></tbody></table><p>那么我们看到这样得到的结果将更加合理。</p><p>在这个过程中，AI 副驾驶提供了建议，帮助您优化查询，并解释结果，以便您更好地理解销售数据的含义。您还可以在查询编辑器中编辑查询语句，使用 AI 菜单对查询语句进行优化、解释和转换，以便更好地理解查询语句的含义。点击保存可以将整个查询过程记录下来，方便下次继续使用或查询历史对话。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a class="hash-link" href="#总结" title="标题的直接链接">​</a></h2><p>通过一个简单的在线数据示例，您可以看到 AI 副驾驶如何在查询实验室中为您提供智能化的支持，使您能够更快速、更精确地进行数据分析。除了在线数据分析，您还可以连接公网数据源或通过桌面代理连接内网数据源，对数据库中的数据进行智能化的查询分析。</p><p>在接下来的文章中，我们将更深入地探讨元数分析云的AI副驾驶功能，包括更多高级功能和用例。敬请期待！</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="附录">附录<a class="hash-link" href="#附录" title="标题的直接链接">​</a></h2><iframe src="//player.bilibili.com/player.html?aid=958113194&amp;bvid=BV1Dp4y177tT&amp;cid=1257149870&amp;p=1" width="100%" height="500px" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="metad" term="metad"/>
        <category label="ChatGPT" term="ChatGPT"/>
        <category label="Copilot" term="Copilot"/>
        <category label="WASM" term="WASM"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[范例：AdventureWorks Sales - 9. 故事主题模版]]></title>
        <id>sample-adv-9-template</id>
        <link href="https://xpertai.cn/blog/sample-adv-9-template"/>
        <updated>2023-08-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[我们将继续探索这款强大的 BI 软件，聚焦于主题模版功能。通过主题模版，您可以更加高效地创建、共享和应用故事仪表板模版，从而快速揭示数据中的见解。]]></summary>
        <content type="html"><![CDATA[<p>欢迎回到《范例：AdventureWorks Sales》系列！今天，我们将继续探索这款强大的 BI 软件，聚焦于主题模版功能。通过主题模版，您可以更加高效地创建、共享和应用故事仪表板模版，从而快速揭示数据中的见解。</p><p>仪表板主题模板的功能通常涵盖了多个方面，旨在为用户提供一种便捷且高效的方式来创建具有一致性和专业性的数据分析仪表板。以下是仪表板主题模板可能包含的一些常见内容：</p><ol><li><strong>颜色和样式设置：</strong> 提供预定义的配色方案和样式，使用户能够轻松选择适合他们分析主题的颜色和样式。</li><li><strong>字体和文本风格：</strong> 允许用户选择不同字体、大小和样式，以确保报告内容易于阅读且符合企业品牌。</li><li><strong>图表模板：</strong> 提供不同类型的图表模板，如柱状图、折线图、饼图等，用户可以直接插入这些图表，并根据需求调整数据源。</li><li><strong>图表样式：</strong> 允许用户选择不同的图表样式，如立体、平面、渐变等，以呈现数据更具吸引力和可读性。</li><li><strong>背景和边框：</strong> 提供背景图像、颜色或纹理选项，同时可以调整边框和填充，以增加仪表板的视觉吸引力。</li><li><strong>标志和水印：</strong> 允许用户添加公司标志、水印或版权信息，以保护内容并提升专业性。</li><li><strong>数据表格样式：</strong> 定义数据表格的外观，包括表头、单元格颜色、边框等，使表格更易于阅读和理解。</li><li><strong>交互元素：</strong> 预定义交互式元素，如下拉菜单、按钮等，使用户能够自定义仪表板的交互体验。</li><li><strong>设备适配：</strong> 提供不同设备上的适配选项，以确保仪表板在不同屏幕尺寸上的可视化效果。</li><li><strong>模板库管理：</strong> 故事仪表板模板库，用户可以浏览、搜索和选择适合他们分析场景的模板。</li></ol><figure class="Large"><img loading="lazy" src="/img/blog/adv/story-theme-template.png" alt="故事主题与模版" class="Shadow img_ev3q"><figcaption>故事主题与模版</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="创建故事主题模版">创建故事主题模版<a class="hash-link" href="#创建故事主题模版" title="标题的直接链接">​</a></h2><p><a href="/docs/stories/template/">主题模版</a> 是故事仪表板的进一步创新，它允许您将已创作的故事仪表板保存为共享主题或包含微件布局的模版，从而节省时间，确保一致性，以及促进团队合作。</p><p>首先，打开您想要保存为主题模版的故事仪表板。然后，在工具栏中点击 “首选项” -&gt; "编辑" -&gt; "另存为模版" 按钮。您可以选择将故事仪表板保存为共享主题，供团队中的其他成员使用；或者您还可以保存包含微件布局的模版，以便在将来的项目中快速创建多样的仪表板。</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/story-save-as-theme-template.png" alt="另存为故事主题或模版" class="Shadow img_ev3q"><figcaption>另存为故事主题或模版</figcaption></figure><p>其中属性：</p><ul><li>类型（主题或模版）：主题类型指仅保存故事仪表板中的样式作为模版，而模版类型指保存故事仪表板中的样式和微件布局作为模版。</li><li>公开：指另存为的模版是否为公开模版，公开模版可以在模版库中被其他用户搜索到并使用，否则只在自己或项目的模版库中可见。</li></ul><p>在对话框的右侧上传主题模版的预览图，方便在模版库中展示实际效果。最后点击 <em>保存</em> 进行创建。</p><p>故事仪表板实际效果：</p><iframe src="https://app.xpertai.cn/public/story/a58112aa-fc9c-4b5b-a04e-4ea9b57ebba9?pageKey=nrEZxh1aqp" width="100%" height="600px" frameborder="0" scrolling="no" allowfullscreen=""> </iframe><h2 class="anchor anchorWithStickyNavbar_LWe7" id="应用故事模版">应用故事模版<a class="hash-link" href="#应用故事模版" title="标题的直接链接">​</a></h2><p>现在，让我们来看看如何从故事模版库中浏览并应用模版，以便快速创建多样的仪表板。</p><p>进入模版库，您将看到各种各样的主题模版，涵盖了不同类型的数据分析需求。您可以选择一个适合您当前项目或任务的模版，并将其应用到您的故事仪表板中。这将迅速创建一个具备优美布局和设计的仪表板框架，您只需填充数据和调整细节，就能得到符合您需求的仪表板。</p><p>应用故事模版有两种方式：</p><ol><li>在项目首页中选择从模版创建故事，然后在模版库中选择一个模版进行创建。</li><li>创建一个空的故事，然后在编辑模式的工具栏中“首选项”中的模版库中选择一个模版进行应用到当前故事仪表板。如果当前故事仪表板中已经有了页面，那么应用模版类型是将会覆盖当前故事仪表板中的页面和微件。如果选择的是主题类型，则只会覆盖当前故事仪表板中的样式。</li></ol><p>如下图所示， 在应用模版后用户只需要为故事微件设置相应的语义模型和实体并选择合适的维度和度量即可。</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/story-theme-template-apply.png" alt="应用故事主题或模版" class="Shadow img_ev3q"><figcaption>应用故事主题或模版</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a class="hash-link" href="#总结" title="标题的直接链接">​</a></h2><p>通过将上述功能结合在一起，仪表板主题模板能够帮助用户快速构建具有统一外观和风格的仪表板，从而节省时间、提高效率，并提供更具专业性的数据分析报告。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="附录">附录<a class="hash-link" href="#附录" title="标题的直接链接">​</a></h2><iframe src="//player.bilibili.com/player.html?aid=872759692&amp;bvid=BV1fN4y197QU&amp;cid=1250664550&amp;page=1" width="100%" height="500px" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="metad" term="metad"/>
        <category label="BI" term="BI"/>
        <category label="AdventureWorks Sales" term="AdventureWorks Sales"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[范例：AdventureWorks Sales - 8. 动态参数与联动分析]]></title>
        <id>sample-adv-8-parameter</id>
        <link href="https://xpertai.cn/blog/sample-adv-8-parameter"/>
        <updated>2023-08-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[在本文中，我们将深入探讨如何利用动态参数实现帕累托分析以及如何通过关联切片器实现多维联动分析，让您更灵活地挖掘数据洞察，精准决策。]]></summary>
        <content type="html"><![CDATA[<p>欢迎大家回到《元数分析云》范例：AdventureWorks Sales 系列！今天，我们将继续探索故事仪表板的高级功能，着重介绍动态 <a href="/docs/stories/parameter/">参数</a> 功能和组件之间的联动分析。这些功能将使您能够更深入地探索数据，发现隐藏的洞察，并将您的分析提升到一个全新的水平。</p><p>在许多情况下，我们需要关注销售额最高的前 N 个产品，以便重点关注最具价值的产品。通过元数分析云的参数功能，您可以轻松地实现动态 <a href="https://baike.baidu.com/item/%E5%B8%95%E7%B4%AF%E6%89%98%E5%9B%BE/8735273" target="_blank" rel="noopener noreferrer">帕累托分析</a>。</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/product-pareto-analysis.png" alt="产品帕累托分析" class="Shadow img_ev3q"><figcaption>产品帕累托分析</figcaption></figure><p>通过元数分析云的关联切片器功能，您可以将不同组件之间的筛选条件关联起来。</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/profit-margin-analysis.jpg" alt="产品利润率分析" class="Shadow img_ev3q"><figcaption>产品利润率分析</figcaption></figure><p>故事仪表板实际效果：</p><iframe src="https://app.xpertai.cn/public/story/892690e5-66ab-4649-9bf5-c1a9c432c01b?pageKey=bsZ0sjxnxI" width="100%" height="600px" frameborder="0" scrolling="no" allowfullscreen=""> </iframe><h2 class="anchor anchorWithStickyNavbar_LWe7" id="帕累托分析">帕累托分析<a class="hash-link" href="#帕累托分析" title="标题的直接链接">​</a></h2><p><strong>帕累托图（Pareto Chart）</strong> 又称<strong>排列图法</strong>、<strong>主次因素分析法</strong>，是一种条形图和折线图的组合，为品质管理上经常使用的一种图表方法。</p><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>信息</div><div class="admonitionContent_S0QG"><p>帕雷托根据“关键的少数和次要的多数”的原理而制作，其结构为两个纵坐标和一个横坐标，合并长条图及折线图所构成。左侧纵坐标表示频率，右侧纵坐标则表示累计频率（以百分比表示），横坐标表示影响质量的各种因素之名称，按影响大小顺序排列，直方形高度表示相应的因素的影响程度（即出现频率为多少），上方之折线则表示累计频率线（又称帕雷托曲线）。这些图表基于“80/20”法则。即：大约 80% 的问题是由 20% 的原因导致的。“80/20”法则也被称为“至关重要的少数和微不足道的多数”。也就是说，您可以关注导致问题发生的少数至关重要的根本原因，忽略微不足道的多数原因。</p></div></div><p>在我们对 AdventureWorks Sales 模型数据分析中，了解哪些产品对销售额做出了最大贡献是至关重要的。通过使用帕累托图，可以更好地识别那些具有显著销售额的顶尖产品，从而指导战略决策。想要计算帕累托分析需要提供以下几个因素：</p><ul><li><strong>影响因素</strong>（横坐标） 使用 <strong>产品</strong> <code>Product</code> 维度</li><li><strong>影响程度</strong>（直方形高度） 使用 <strong>销售额</strong> <code>Sales Amount</code> 度量</li><li><strong>累计影响程度</strong>（折线） 使用 累计销售额除以总销售额 <code>Sum(Sales Amount)</code></li><li><strong>基准线</strong> （标记线）使用动态参数 <code>ParetoBenchmark</code>，默认值为 <code>80</code></li></ul><p>接下来看一下如何在故事仪表板中实现以上因素的帕累托图形。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="图形配置">图形配置<a class="hash-link" href="#图形配置" title="标题的直接链接">​</a></h3><p>首先我们创建一个图形组件，选择自定义图形类型（因为我们将使用自定义逻辑脚本计算累计销售额占比），并配置三个度量字段和一个维度产品。</p><ol><li>销售额</li><li>全部产品总销售额，用于计算累计销售额占比</li><li>基准线，用于绘制标记线</li><li>产品维度，使用产品维度的<strong>产品分类</strong>层次结构下的<strong>制程</strong>层级</li></ol><figure class="Small"><img loading="lazy" src="/img/blog/adv/pareto-chart-config.png" alt="帕累托图配置" class="img_ev3q"><figcaption>帕累托图配置</figcaption></figure><p>其中全部产品总销售额使用 <a href="/docs/stories/calculations/#2-%E5%8F%97%E9%99%90%E5%BA%A6%E9%87%8F-restricted-measure"><strong>受限度量</strong></a> 类型的计算度量，使用了产品分类为度的 All 成员去限定了销售额度量，
配置如下图</p><figure class="Middle"><img loading="lazy" src="/img/blog/adv/product-total-sales-amount.png" alt="产品总销售额计算度量" class="Shadow img_ev3q"><figcaption>产品总销售额计算度量</figcaption></figure><h3 class="anchor anchorWithStickyNavbar_LWe7" id="参数配置">参数配置<a class="hash-link" href="#参数配置" title="标题的直接链接">​</a></h3><p>对于需要动态设置的基准线，我们需要创建一个 <a href="/docs/stories/calculations/#3-%E8%AE%A1%E7%AE%97%E5%85%AC%E5%BC%8F-calculated-measure"><strong>计算公式</strong></a> 类型的计算度量，并且使用一个数字参数作为计算表达式。如下图所示</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/pareto-benchmark-line.png" alt="基准线计算度量" class="Shadow img_ev3q"><figcaption>基准线计算度量</figcaption></figure><p>点击参数中的创建按钮新建一个基准线 <a href="/docs/stories/parameter/#%E5%88%9B%E5%BB%BA%E5%8F%82%E6%95%B0">参数</a>，用于设置基准线的数值，这里我们设置默认值为 80。</p><figure class="Middle"><img loading="lazy" src="/img/blog/adv/pareto-parameter-benchmark.png" alt="基准线参数" class="Shadow img_ev3q"><figcaption>基准线参数</figcaption></figure><p>然后将参数拖至计算编辑器中使用，这样在使用此计算度量时将直接得到此参数的常量值。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="前多少的产品">前多少的产品<a class="hash-link" href="#前多少的产品" title="标题的直接链接">​</a></h3><p>想要计算所有产品中的前多少名的产品，需要用到组件选择条件中的 <a href="/docs/stories/advanced-slicer/">高级切片器</a> 功能。在组件选择条件中添加高级切片器。</p><figure class="Small"><img loading="lazy" src="/img/blog/adv/chart-selection-advanced-slicer.png" alt="图形选择条件" class="img_ev3q"><figcaption>图形选择条件</figcaption></figure><p>高级切片器配置如下，其中上下文条件应该选择与图形维度一致的产品分类层次结构。</p><p>操作符使用 <strong>前 N 的</strong> 即 <code>TopCount</code> 函数, 并且设置 N 的值为参数 <code>TopNSales</code> (创建方式同上述参数的方式)，这样就可以动态的设置前多少名的产品。</p><figure class="Small"><img loading="lazy" src="/img/blog/adv/pareto-topn-adv-slicer.png" alt="TopN高级切片器" class="Shadow img_ev3q"><figcaption>TopN 高级切片器</figcaption></figure><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_S0QG"><p>这里 <strong>汇总其他项</strong> 指是否将 Top N 之外的其他数据项汇总为一个 Other 项，如果开启在后续处理数据时需要注意它。</p></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="参数输入控制器">参数输入控制器<a class="hash-link" href="#参数输入控制器" title="标题的直接链接">​</a></h3><p>每当新增参数时故事都会自动创建相应的参数输入控制器组件以绑定此参数进行输入控制。对于我们的类型为数字的参数，可以使用数字输入控制器或者滑杆输入控制器，如下图所示</p><div class="flex gap-4"><figure class="Small"><img loading="lazy" src="/img/blog/adv/parameter-input.png" alt="参数输入框" class="img_ev3q"><figcaption>参数输入框</figcaption></figure><figure class="Small"><img loading="lazy" src="/img/blog/adv/parameter-slider.png" alt="参数滑杆输入" class="img_ev3q"><figcaption>参数滑杆输入</figcaption></figure></div><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_S0QG"><p>用户还可以手动创建输入控制器，并选择控制器的字段为相应参数即可。注意同一故事仪表板中不能为同一个参数创建多个输入控制器。</p></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="自定义逻辑">自定义逻辑<a class="hash-link" href="#自定义逻辑" title="标题的直接链接">​</a></h3><p>对于累计值的比例计算和图形绘制我们使用自定义逻辑脚本的方式，代码如下</p><div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// queryResult: QueryReturn&lt;any&gt;, chartAnnotation: ChartAnnotation, entityType: EntityType, locale: string, chartsInstance: ECharts</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> measure </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> chartAnnotation</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">measures</span><span class="token operator" style="color:#393A34">?.</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> pareto </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> chartAnnotation</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">measures</span><span class="token operator" style="color:#393A34">?.</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> benchmark </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> chartAnnotation</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">measures</span><span class="token operator" style="color:#393A34">?.</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> dimension </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> chartAnnotation</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">dimensions</span><span class="token operator" style="color:#393A34">?.</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  echarts</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  getEntityHierarchy</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  getPropertyCaption</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  assignDeepOmitBlank</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  formatting</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> utils</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">dimension </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token plain">measure</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 获取维度的层次结构字段信息</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> hierarchy </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getEntityHierarchy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">entityType</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> dimension</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 获取维度成员的显示名称字段名</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> caption </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getPropertyCaption</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">hierarchy</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> source </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">queryResult</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">data</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">source</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">sort</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">a</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> b</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> b</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">measure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">measure</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> a</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">measure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">measure</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 计算度量值范围</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> min </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> source</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">source</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">length</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">measure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">measure</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> max </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> source</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">measure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">measure</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> options </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">dataset</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">source</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> source</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">item</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> index</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">item</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">pareto</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">source</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">slice</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> index </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">reduce</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">acc</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> item</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> acc </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> item</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">measure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">measure</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            item</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">pareto</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">measure</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">visualMap</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    min</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    max</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">calculable</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"piecewise"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">orient</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"horizontal"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">left</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"center"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">bottom</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"10"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">precision</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">dimension</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> measure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">measure</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Measure palette colors as visualMap color</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">inRange</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> measure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">palette</span><span class="token operator" style="color:#393A34">?.</span><span class="token plain">colors</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">color</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> measure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">palette</span><span class="token operator" style="color:#393A34">?.</span><span class="token plain">colors</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword null nil" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function-variable function" style="color:#d73a49">formatter</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">low</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> high</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">formatting</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">low</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> measure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">formatting</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">' ~ '</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">formatting</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">high</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> measure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">formatting</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">grid</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">containLabel</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">bottom</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">series</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">assignDeepOmitBlank</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">id</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> measure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">measure</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"销售额"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"bar"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">measure</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> measure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">measure</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">datasetIndex</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">selectedMode</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"single"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">yAxisIndex</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">encode</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">x</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> caption</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">y</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> measure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">measure</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">tooltip</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">tooltip</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">xAxisIndex</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      measure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">chartOptions</span><span class="token operator" style="color:#393A34">?.</span><span class="token plain">seriesStyle</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token number" style="color:#36acaa">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">id</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"pareto"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"销售额累计%"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"line"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">measure</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"pareto"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">datasetIndex</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">selectedMode</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"single"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">yAxisIndex</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">encode</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">x</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> caption</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">y</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"pareto"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">tooltip</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">tooltip</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">xAxisIndex</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">markLine</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">data</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">yAxis</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> source</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">benchmark</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">measure</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Benchmark"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">lineStyle</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> benchmark</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">chartOptions</span><span class="token operator" style="color:#393A34">?.</span><span class="token plain">seriesStyle</span><span class="token operator" style="color:#393A34">?.</span><span class="token plain">lineStyle</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token spread operator" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pareto</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">chartOptions</span><span class="token operator" style="color:#393A34">?.</span><span class="token plain">seriesStyle </span><span class="token operator" style="color:#393A34">??</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">tooltip</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">trigger</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"axis"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token function-variable function" style="color:#d73a49">valueFormatter</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">value</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">formatting</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> measure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">formatting</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> locale</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">legend</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">show</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">dataZoom</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">xAxis</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">assignDeepOmitBlank</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"category"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">axisPointer</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">label</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">axisLabel</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function-variable function" style="color:#d73a49">formatter</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">value</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> index</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> source</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">index</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">caption</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">orient</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"xAxis"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">gridIndex</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> dimension</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">chartOptions</span><span class="token operator" style="color:#393A34">?.</span><span class="token plain">axis</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">yAxis</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"value"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">axisLabel</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">gridIndex</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">axisLabel</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function-variable function" style="color:#d73a49">formatter</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">value</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">formatting</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> measure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">formatting</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> locale</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"value"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">axisLabel</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">gridIndex</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">axisLabel</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">formatter</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{value}%"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  options</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_S0QG"><p>有关自定义图形逻辑的更多信息，请参阅之前的博文 <a href="/blog/2023/07/08/sample-adv-5-custom-chart">范例：AdventureWorks Sales - 5. 故事自定义图形</a>。</p></div></div><p>帕累托分析图形微件最终效果：</p><iframe src="https://app.xpertai.cn/public/story/widget/3101a7dc-340c-4368-90d0-ab71ac3ecf4c" width="100%" height="400px" frameborder="0" scrolling="no" allowfullscreen=""> </iframe><h2 class="anchor anchorWithStickyNavbar_LWe7" id="在文本中使用参数度量和指标">在文本中使用参数度量和指标<a class="hash-link" href="#在文本中使用参数度量和指标" title="标题的直接链接">​</a></h2><p>接下来，我们将在文本组件和组件标题文本中使用参数、度量和指标，以更生动的方式呈现数据的计算结果。如下图所示在文本组件中使用参数和度量，参数格式为 <code>[@name]</code> 度量(同指标)格式为 <code>[#name]</code></p><figure class="Large"><img loading="lazy" src="/img/blog/adv/document-parameter-measure.png" alt="富文本组件中使用参数和度量" class="img_ev3q"><figcaption>富文本组件中使用参数和度量</figcaption></figure><p>用户可以手动插入参数和度量，也可以使用右侧的参数和度量列表进行拖拽插入。参数和度量的计算结果将在预览或查看模式下展示。</p><p>除了文本组件和富文本组件外，图形组件、表格组件、关键指标组件的标题文本内容也可以使用参数和度量，使用方式与文本组件相同。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="关联分析">关联分析<a class="hash-link" href="#关联分析" title="标题的直接链接">​</a></h2><p><a href="/docs/stories/linked-analysis/">关联分析</a> 是故事仪表板单个页面内组件之间使用切片器相互过滤的联动分析功能。除了通常的过滤器栏和输入控制器组件能够实现对其他组件的联动分析外，各组件之间也可以进行联动分析。</p><p>对于图形组件来说，用户点击图形的数据点会弹出菜单：联动筛选、层级下钻和下钻，用户选择联动筛选后将使用此数据点对应的切片器对其他组件进行联动过滤。</p><figure class="Small"><img loading="lazy" src="/img/blog/adv/analytical-chart-linked-analysis.png" alt="图形的联动分析菜单" class="img_ev3q"><figcaption>图形的联动分析菜单</figcaption></figure><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_S0QG"><p>还可以通过设置图形卡片组件选项中的 <strong>实时联动分析</strong> 和 <strong>禁用上下文菜单</strong> 做到无需弹出菜单而是点击图形实时进行联动分析。</p></div></div><p>对于表格组件来说，选中某个单元格后将使用此单元格对应的维度成员对其他组件进行联动过滤，如果此单元格是度量值，那么将使用当前行上对应的所有维度成员去联动过滤其他组件。</p><figure class="Middle"><img loading="lazy" src="/img/blog/adv/analytical-grid-linked-analysis.png" alt="表格的联动分析" class="img_ev3q"><figcaption>表格的联动分析</figcaption></figure><p>用户可以在图形和表格组件的工具栏中找到切片器按钮，打开切片器面板，可以看到影响当前组件的所有切片器，用户还可以在临时添加更多切片器，但这里添加的切片器不会被保存。</p><figure class="Small"><img loading="lazy" src="/img/blog/adv/widget-slicers.png" alt="影响组件的过滤器" class="img_ev3q"><figcaption>影响组件的过滤器</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a class="hash-link" href="#总结" title="标题的直接链接">​</a></h2><p>总结一下，元数分析云的动态参数和关联切片器功能为您提供了更灵活和深入的数据探索方式。您可以根据不同的参数和选择，快速生成洞察，展示结果，并在不同组件之间进行有意义的联动分析。故事仪表板将成为您的数据驱动决策的有力工具，帮助您更好地了解业务情况，制定有效的战略。</p><p>感谢您继续关注我们的《元数分析云》系列博文！敬请期待下一篇文章，我们将继续分享更多关于高级功能的实用技巧。如果您有任何问题或建议，请随时与我们联系。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="附录">附录<a class="hash-link" href="#附录" title="标题的直接链接">​</a></h2><iframe src="//player.bilibili.com/player.html?aid=574988558&amp;bvid=BV1hz4y1u7J6&amp;cid=1238796528&amp;page=1" width="100%" height="500px" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="metad" term="metad"/>
        <category label="BI" term="BI"/>
        <category label="AdventureWorks Sales" term="AdventureWorks Sales"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[元数分析云 2023 Q3 版本发布：全新功能与升级一览]]></title>
        <id>release-2023Q3-milestone</id>
        <link href="https://xpertai.cn/blog/release-2023Q3-milestone"/>
        <updated>2023-08-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Metad Analytics Cloud 2023 Q3 版本的发布带来了令人兴奋的新功能和重要的架构升级。从 UI 设计的现代化到强化的 Story 功能，以及对多个语义模型的支持，这个版本将为用户提供更加强大、灵活和愉悦的数据分析体验]]></summary>
        <content type="html"><![CDATA[<p>随着 2023 年第三季度的到来，元数分析云再次迈向了一个崭新的版本，带来了一系列令人振奋的功能和架构升级。在本篇博客中，我们将重点介绍元数分析云 2023 Q3版本的最新功能，以及软件基础架构的升级。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="1-软件基础架构升级">1. 软件基础架构升级<a class="hash-link" href="#1-软件基础架构升级" title="标题的直接链接">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="11-angular-16-与-signal-状态管理">1.1 Angular 16 与 Signal 状态管理<a class="hash-link" href="#11-angular-16-与-signal-状态管理" title="标题的直接链接">​</a></h3><p>元数分析云已成功升级到全新的 Angular 16 版本，为用户带来更快、更流畅的用户体验。而在 UI 组件的状态管理方面，我们迈出了重要的一步，开始逐步采用全新的方式 Signal 进行重写。这不仅将提升系统的稳定性和性能，还将使开发过程更加高效。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="12-使用-tailwind-css-进行-ui-设计">1.2 使用 Tailwind CSS 进行 UI 设计<a class="hash-link" href="#12-使用-tailwind-css-进行-ui-设计" title="标题的直接链接">​</a></h3><p>在 UI 设计方面，元数分析云 2023 Q3 版本迎来了一次革命性的变化。我们全面采用了 Tailwind CSS 来重新设计 UI 组件的样式，为用户呈现出更加现代、美观的界面，同时也提升了操作便捷性。</p><figure class="Large"><img loading="lazy" src="/img/blog/version-2023Q3/new-ui.png" alt="新界面" class="Shadow img_ev3q"><figcaption>新界面整体效果</figcaption></figure><h4 class="anchor anchorWithStickyNavbar_LWe7" id="121-material-design-组件升级">1.2.1 Material Design 组件升级<a class="hash-link" href="#121-material-design-组件升级" title="标题的直接链接">​</a></h4><p>跟随 Angular 16 版本的升级，我们同时将 Material Design 组件升级到了最新的 16 版本。这意味着用户将享受到更多新颖的、符合最新设计趋势的 UI 元素，从而为用户带来更高品质的体验。</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="122-使用原生-html-元素和-tailwind-css-表单字段">1.2.2 使用原生 HTML 元素和 Tailwind CSS 表单字段<a class="hash-link" href="#122-使用原生-html-元素和-tailwind-css-表单字段" title="标题的直接链接">​</a></h4><p>除了升级 Material Design 组件，元数分析云还采用了原生的 HTML 元素和 Tailwind CSS 组合设计来替代原有的 Material Design 表单字段。这一变化不仅让整个界面更加简洁和高效，同时也减少了额外的依赖，从而提高了系统的性能。</p><p>例如下图所示，维度选择器升级前后的对比，功能按钮并没有改变，但用户使用体验会有质的提升。</p><div class="flex justify-center items-center gap-4"><figure class="Small"><img loading="lazy" src="/img/story/dimension/old-dimension-selector.png" alt="维度选择器" class="img_ev3q"><figcaption>升级前</figcaption></figure><figure class="Small"><img loading="lazy" src="/img/story/dimension/dimension-selector.jpg" alt="维度选择器" class="img_ev3q"><figcaption>升级后</figcaption></figure></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="2-新功能亮点">2. 新功能亮点<a class="hash-link" href="#2-新功能亮点" title="标题的直接链接">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="21-story-支持多个模型">2.1 Story 支持多个模型<a class="hash-link" href="#21-story-支持多个模型" title="标题的直接链接">​</a></h3><p>元数分析云 2023 Q3 版本引入了一个备受期待的新功能：现在，用户可以在单个故事仪表板（Story）中支持多个语义模型。这意味着您可以更加灵活地分析和比较不同模型的结果，从而为业务决策提供更多角度的支持。</p><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_S0QG"><p>这里所说的多个模型是指多个语义模型，即模型实体的工作空间。原来的故事仪表板就可以通过模型实体的选择支持同一个语义模型中的不同模型实体，那么现在通过支持多个语义模型可以将来源于不同数据源的模型实体进行数据比较。</p><p>例如企业同时有来自商业数仓软件 SAP BW 的模型和来源于自研数仓系统（Doris）的模型，现在可以在同一个故事仪表板中同时展示这两个数据源的模型，从而进行数据比较。</p><p>需要注意的是，这两个数据源都是通过直连的方式查询数据，并不存在数据拷贝造成性能和数据冗余的问题。</p></div></div><figure class="Small"><img loading="lazy" src="/img/blog/version-2023Q3/multiple-models.jpg" alt="多个模型工作空间" class="img_ev3q"><figcaption>故事仪表板支持多个语义模型</figcaption></figure><p>用户通过故事组件属性编辑面板中语义模型属性选择切换模型工作空间，然后再选择其中的模型实体，即可在同一个故事仪表板中展示不同模型的数据。</p><p>用户还可以在模型选择列表每一个模型的前面点击打开按钮转到相应的语义模型工作空间进行查看或编辑。</p><p>要使用多个模型，您需要在故事仪表板中添加多个模型组件，可以通过 <a href="/docs/stories/story-details/">故事详情</a> 中的 <em>模型</em> 属性添加，可选的模型是故事所在项目中关联的语义模型。</p><figure class="Middle"><img loading="lazy" src="/img/blog/version-2023Q3/story-add-models.jpg" alt="添加多个模型" class="Shadow img_ev3q"><figcaption>添加多个模型</figcaption></figure><h3 class="anchor anchorWithStickyNavbar_LWe7" id="22-平移和缩放功能">2.2 平移和缩放功能<a class="hash-link" href="#22-平移和缩放功能" title="标题的直接链接">​</a></h3><p>我们听到了用户的声音，针对故事仪表板功能进行了进一步的增强。在这个版本中，我们为故事仪表板添加了平移和缩放功能，使您能够更好地探索数据，将关键信息放大展示，以及快速切换到全局视图，从而更好地理解数据背后的故事。</p><figure class="Large"><img loading="lazy" src="/img/blog/version-2023Q3/pan-and-scale.jpg" alt="平移和缩放" class="Shadow img_ev3q"><figcaption>平移和缩放</figcaption></figure><p>点击平移按钮，在平移模式下，可以通过鼠标拖拽的方式平移画布。用户可以按住 <code>Alt</code> 键，然后用鼠标拖动画布。</p><p>缩放模式下，可以通过点击放大缩小按钮对画布进行缩放，也可以直接使用菜单中的缩放级别直接缩放。也可以使用快捷键：</p><ol><li><strong>Alt</strong> + <strong>+</strong> 放大 10%</li><li><strong>Alt</strong> + <strong>-</strong> 缩小 10%</li><li><strong>Alt</strong> + <strong>Esc</strong> 恢复初始状态</li></ol><h3 class="anchor anchorWithStickyNavbar_LWe7" id="23-自定义维度标签">2.3 自定义维度标签<a class="hash-link" href="#23-自定义维度标签" title="标题的直接链接">​</a></h3><p>元数分析云现在支持自定义维度选择的标签（Caption），这将使用户在创建报表和可视化时能够更加清晰地标识所选维度，从而避免混淆和误解。</p><figure class="Small"><img loading="lazy" src="/img/blog/version-2023Q3/custom-caption.jpg" alt="自定义标签" class="img_ev3q"><figcaption>自定义标签</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a class="hash-link" href="#总结" title="标题的直接链接">​</a></h2><p>Metad Analytics Cloud 2023 Q3 版本的发布带来了令人兴奋的新功能和重要的架构升级。从 UI 设计的现代化到强化的 Story 功能，以及对多个语义模型的支持，这个版本将为用户提供更加强大、灵活和愉悦的数据分析体验。我们鼓励用户尽快体验这些新功能带来的无限可能性。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="附录">附录<a class="hash-link" href="#附录" title="标题的直接链接">​</a></h2><iframe src="//player.bilibili.com/player.html?aid=489644033&amp;bvid=BV12N41187oZ&amp;cid=1233509853&amp;page=1" width="100%" height="500px" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="metad" term="metad"/>
        <category label="Data Source" term="Data Source"/>
        <category label="StarRocks" term="StarRocks"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[数据源：StarRocks]]></title>
        <id>/2023/07/27/data-source-starrocks</id>
        <link href="https://xpertai.cn/blog/2023/07/27/data-source-starrocks"/>
        <updated>2023-07-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了如何使用 Docker Compose 容器化技术部署运行元数分析云如何与 Starrocks 数据库集成场景，以及如何使用元数分析云的指标应用程序和故事仪表板对 Starrocks 数据进行分析。]]></summary>
        <content type="html"><![CDATA[<p>本文将介绍如何私有化部署元数分析云，并且与 StarRocks 数据源进行集成，为企业和数据分析团队提供强大的多维数据指标分析能力。在这篇文章中，我们将用到 Docker Compose 等工具来构建和运行这个私有化部署程序。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="简介">简介<a class="hash-link" href="#简介" title="标题的直接链接">​</a></h2><p>元数分析云是一款先进的数据分析平台，可以帮助用户从各种数据源中获取数据并进行高效的数据探索和可视化分析。StarRocks 是一个快速、可扩展的分布式 OLAP 数据库，特别适合多维数据分析。将这两个工具集成在一起，可以加强数据分析的能力，提高数据洞察力。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="准备工作">准备工作<a class="hash-link" href="#准备工作" title="标题的直接链接">​</a></h2><p>在开始部署之前，确保您已经安装了 Docker 和 Docker Compose。您可以从官方网站下载和安装这些工具，并确保它们在您的系统上正常运行。</p><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>源代码</div><div class="admonitionContent_S0QG"><p>本文的源代码可以在 GitHub 上找到：
<a href="https://github.com/meta-d/installer/" target="_blank" rel="noopener noreferrer">https://github.com/meta-d/installer/</a></p></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="构建-starrocks-docker-镜像">构建 StarRocks Docker 镜像<a class="hash-link" href="#构建-starrocks-docker-镜像" title="标题的直接链接">​</a></h2><p>如果你的企业已经有了自己的 StarRocks 集群，可以跳过这一步。如果没有，可以通过构建 StarRocks docker 镜像与元数分析云程序一起部署，以便于测试和演示。</p><p>用于构建 StarRocks docker 镜像的 Dockerfile 文件可以在本文源代码的 <em>docker/starrocks</em> 文件夹中找到。此 StarRocks 镜像是将 fe 和 be 服务运行在了同一容器中，方便运行和测试，正式环境中不建议这样做。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="docker-compose-文件">Docker Compose 文件<a class="hash-link" href="#docker-compose-文件" title="标题的直接链接">​</a></h3><p>接下来，我们将编写一个 Docker Compose 文件来定义整个集成部署环境。在项目 docker 目录下创建一个名为 docker-compose-with-starrocks.yml 的文件（此文件即为源代码中的内容），并使用以下内容：</p><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">docker-compose-with-starrocks.yml</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'3'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">overlay</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">driver</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> bridge</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">starrocks_net</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ipam</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">config</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">subnet</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 172.20.80.0/16</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">volumes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">postgres_data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">services</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">starrocks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">build</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">context</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ./starrocks</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">container_name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"metad-starrocks"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">hostname</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"fe"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> 8030</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">8030</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> 9030</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">9030</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> 8040</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">8040</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">volumes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ./starrocks/fe/meta</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/opt/apache</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">doris/fe/meta</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ./starrocks/fe/log</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/data/deploy/starrocks/fe/log</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ./starrocks/be/storage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/data/deploy/starrocks/be/storage</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ./starrocks/be/log</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/data/deploy/starrocks/be/log</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ./initdb.d/</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/docker</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">entrypoint</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">initdb.d/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> starrocks_net</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">...</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>文件中启动了一个 StarRocks 服务来模拟正式的集群环境，其他的元数分析云服务没有列出，请参考标准版的安装配置。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="标准版部署">标准版部署<a class="hash-link" href="#标准版部署" title="标题的直接链接">​</a></h2><p>元数分析云标准版部署文件只包含元数分析云本身的容器服务，不包含 StarRocks 等第三方数据库或数据仓库服务。这样用户在启动元数分析云后可以连接自己的 StarRocks 集群进行数据分析。</p><p>关于元数分析云标准版的部署，请参考<a href="/docs/getting-started/docker">安装部署 Docker 集群</a>。</p><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">docker-compose.yml</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'3'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'metad-analytics-cloud'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">overlay</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">driver</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> bridge</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">volumes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">postgres_data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">services</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">db</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> postgres</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">12</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">alpine</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">container_name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> metad</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">db</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">restart</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> always</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">POSTGRES_DB</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">DB_NAME</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">postgres</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">POSTGRES_USER</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">DB_USER</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">postgres</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">POSTGRES_PASSWORD</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">DB_PASS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">root</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">healthcheck</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">test</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token string" style="color:#e3116c">"CMD-SHELL"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token string" style="color:#e3116c">"psql postgres://$${POSTGRES_USER}:$${POSTGRES_PASSWORD}@localhost:5432/$${POSTGRES_DB} || exit 1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">volumes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> postgres_data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/var/lib/postgresql/data</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ./initdb.d/</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/docker</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">entrypoint</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">initdb.d/</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">ro</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> overlay</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">redis</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> redis</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">6</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">alpine</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">container_name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> metad</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">redis</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">mem_limit</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 100m</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">restart</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">stopped</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">command</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"sh"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"-c"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"redis-server --requirepass $${REDIS_PASSWORD}"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">REDIS_PASSWORD</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">REDIS_PASSWORD</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> overlay</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">olap</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> metadc/metad</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">olap</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">1.0.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">container_name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> metad</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">olap</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">restart</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> unless</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">stopped</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">healthcheck</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">test</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> curl </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">m 5 </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">silent </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">fail </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">request GET http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//localhost</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">8080/ </span><span class="token punctuation" style="color:#393A34">|</span><span class="token plain"> jq </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">exit</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">status </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">n 'inputs </span><span class="token punctuation" style="color:#393A34">|</span><span class="token plain"> if has("status") then .status=="UP" else false end' </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain"> /dev/null </span><span class="token punctuation" style="color:#393A34">|</span><span class="token punctuation" style="color:#393A34">|</span><span class="token plain"> exit 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">interval</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 10s</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">timeout</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 2s</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">retries</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">links</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> db</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">$</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">DB_HOST</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">db</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">OLAP_REDIS_DATABASE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">OLAP_REDIS_HOST</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"redis"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">OLAP_REDIS_PORT</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">6379</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">OLAP_REDIS_PASSWORD</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">REDIS_PASSWORD</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> overlay</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">api</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> registry.cn</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">hangzhou.aliyuncs.com/metad/metad</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">api</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">1.5.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">container_name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> metad</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">api</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">INSTALLATION_MODE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">INSTALLATION_MODE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">standalone</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">HOST</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">API_HOST</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">api</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">PORT</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">NODE_ENV</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">NODE_ENV</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">development</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">DB_HOST</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> db</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">REDIS_HOST</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> redis</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">REDIS_PORT</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">6379</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">OLAP_HOST</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> olap</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">OLAP_PORT</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8080</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">API_BASE_URL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">API_BASE_URL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//localhost</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">3000</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">DEMO</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">DEMO</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">-</span><span class="token boolean important" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">STARROCKS_VERSION</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">STARROCKS_HOST</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">STARROCKS_HOST</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">STARROCKS_PORT</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">STARROCKS_PORT</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">STARROCKS_USER</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">STARROCKS_USER</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">STARROCKS_PASS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">STARROCKS_PASS</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">STARROCKS_API_PORT</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">STARROCKS_API_PORT</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">SENTRY_DSN</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">SENTRY_DSN</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">LOGGER_LEVEL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">LOGGER_LEVEL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">info</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">env_file</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> .env</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">command</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"node"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"main.js"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">restart</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> on</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">failure</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">depends_on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> db</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> redis</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">links</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> db</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">$</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">DB_HOST</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">db</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">API_PORT</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">-3000</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">3000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">volumes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ./public</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">/srv/pangolin/apps/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> overlay</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">webapp</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> registry.cn</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">hangzhou.aliyuncs.com/metad/metad</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">webapp</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">1.5.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">container_name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> metad</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">webapp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">HOST</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">WEB_HOST</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">webapp</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">PORT</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4200</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">NODE_ENV</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">NODE_ENV</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">development</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">API_BASE_URL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">API_BASE_URL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//localhost</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">3000</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">CLIENT_BASE_URL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">CLIENT_BASE_URL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//localhost</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">4200</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">SENTRY_DSN</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">SENTRY_DSN</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">DEFAULT_LATITUDE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">DEFAULT_LATITUDE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">-42.6459136</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">DEFAULT_LONGITUDE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">DEFAULT_LONGITUDE</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">-23.3332736</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">DEFAULT_CURRENCY</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">DEFAULT_CURRENCY</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">USD</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">API_HOST</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">API_HOST</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">api</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">API_PORT</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">API_PORT</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">-3000</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">env_file</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> .env</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">restart</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> on</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">failure</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">links</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> api</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">$</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">API_HOST</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">api</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">depends_on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> api</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">WEBAPP_PORT</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">-80</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">4200</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">networks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> overlay</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>需要特别配置的是一下几个环境变量（其他的变量按标准版进行配置）：</p><ul><li><code>INSTALLATION_MODE=with-starrocks</code> 配置安装模式为 <code>with-starrocks</code>，这样元数分析云在创建演示数据时会创建 StarRocks 数据源和导入数据。</li><li><code>DEMO=true</code> 配置为演示模式，这样元数分析云在创建演示数据时会导入演示数据。</li><li>StarRocks 连接信息相关环境变量：<ul><li>STARROCKS_VERSION=2.5</li><li>STARROCKS_HOST=</li><li>STARROCKS_PORT=9030</li><li>STARROCKS_USER=</li><li>STARROCKS_PASS=</li></ul></li></ul><p>将 StarRocks 连接信息配置成您的 StarRocks 集群的连接信息。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="运行标准版程序">运行标准版程序<a class="hash-link" href="#运行标准版程序" title="标题的直接链接">​</a></h3><p>执行 Docker 启动命令：</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">docker-compose</span><span class="token plain"> up -d</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>这将根据 Compose 文件中的定义，启动元数分析云服务，并进行系统数据初始化后便可以登录系统。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="生成演示数据">生成演示数据<a class="hash-link" href="#生成演示数据" title="标题的直接链接">​</a></h2><p>通过 <em>http://localhost/</em> 地址或你自己的域名访问元数分析云，使用 <em><a href="mailto:local.admin@xpertai.cn" target="_blank" rel="noopener noreferrer">local.admin@xpertai.cn</a></em> 管理员账号登录后，在首页点击 <em>🔘生成演示样例</em> 便可以生成演示数据，演示数据包括创建 StarRocks 数据源、导入数据、创建指标和故事仪表板等。在元数分析云中，您可以通过创建不同的仪表板、图表和查询来进行多维数据指标分析。使用元数分析云的丰富功能和直观界面，您可以轻松地对StarRocks数据源中的数据进行探索、过滤和可视化。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a class="hash-link" href="#总结" title="标题的直接链接">​</a></h2><p>通过使用 Docker Compose 和容器化技术，我们成功地集成了元数分析云和 StarRocks 数据源，为数据分析带来了更强大的多维数据指标分析能力。这样的集成可以帮助企业和数据团队更好地理解数据，做出明智的决策，并从数据中获取更深刻的洞察。同时，Docker 化的部署方式也简化了集成过程，使得部署和管理更加灵活和高效。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="附录">附录<a class="hash-link" href="#附录" title="标题的直接链接">​</a></h2><iframe src="//player.bilibili.com/player.html?aid=231502442&amp;bvid=BV1D841117iU&amp;cid=1215730411&amp;page=1" width="100%" height="500px" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="metad" term="metad"/>
        <category label="Data Source" term="Data Source"/>
        <category label="StarRocks" term="StarRocks"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[范例：AdventureWorks Sales - 7. 指标应用]]></title>
        <id>/2023/07/24/sample-adv-7-indicator-app</id>
        <link href="https://xpertai.cn/blog/2023/07/24/sample-adv-7-indicator-app"/>
        <updated>2023-07-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了元数分析云中指标应用程序的使用，以及如何与飞书等办公软件集成使得企业用户更方便地查看指标。]]></summary>
        <content type="html"><![CDATA[<p>指标管理系统是一种用于收集、分析和监控企业经营数据的工具。企业需要一个指标管理系统，因为它可以帮助企业了解自己的业务状况、评估其绩效和制定有效的战略计划。</p><p>元数分析云通过基于核心的 OLAP 引擎建立对企业数据的统一语义建模, 无需繁琐的数据转换和 ETL, 并经过统一口径的指标定义功能对企业经营数据进行统一的管理和认证. 最终通过元数分析云提供的指标应用程序，将指标用于分析和评估公司业务和财务数据。</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/indicator-application.png" alt="指标应用程序" class="Shadow img_ev3q"><figcaption>指标应用程序</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="指标管理">指标管理<a class="hash-link" href="#指标管理" title="标题的直接链接">​</a></h2><p>接着之前文章 <a href="/blog/2023/06/25/sample-adv-3-indicators">范例：AdventureWorks Sales - 3. 指标管理</a> 中创建的指标体系，本篇将介绍如何申请和使用指标应用程序查看和分析指标数据。</p><p>如下图所示我们已经创建了多个业务域一系列指标，当这些指标激活时，用户就可以在指标市场中查看并申请到这些指标。</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/indicator-list.png" alt="指标管理列表" class="Shadow img_ev3q"><figcaption>指标管理列表</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="指标市场">指标市场<a class="hash-link" href="#指标市场" title="标题的直接链接">​</a></h2><p>在指标市场页面左侧栏内可以使用过滤条件和查找需要浏览的业务域，指标市场的查询条件有如下几种:</p><ul><li>类型：基础指标、衍生指标</li><li>标签：所有指标的标签列表，可以多选进行指标过滤</li><li>业务域：系统业务域，并带有业务域层次结构和相应下属的指标数量，选中某个业务域后在右侧栏内浏览此业务域内的指标信息</li></ul><figure class="Large"><img loading="lazy" src="/img/blog/adv/indicator-market.png" alt="指标市场" class="Shadow img_ev3q"><figcaption>指标市场</figcaption></figure><p>用户可以点击指标上的申请按钮来申请指标查看权限，也可以点击申请业务域来申请整个业务内指标的授权。当前用户自己创建的指标不需要申请，系统自动授予权限。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="指标应用程序">指标应用程序<a class="hash-link" href="#指标应用程序" title="标题的直接链接">​</a></h2><p><a href="/docs/indicators/app/">指标应用</a> 是一款用于展示指标数据的应用程序页面，用户可以使用该应用程序来查看、比较和分析不同指标的数据。用户在指标市场中申请到的指标，都可以在指标应用程序中查看。
通过指标应用用户不仅可以实时监控企业的业务状况，还可以对指标进行详细分析，从而更好地制定战略计划。</p><p>通过搜索框可以根据指标编码或名称查找相关指标，点击指标可以打开指标详细页面进行查看，点击收藏按钮可以将指标收藏并展示在列表最上方方便快速查看。</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/indicator-application.png" alt="指标应用程序" class="Shadow img_ev3q"><figcaption>指标应用程序</figcaption></figure><h3 class="anchor anchorWithStickyNavbar_LWe7" id="自由维度">自由维度<a class="hash-link" href="#自由维度" title="标题的直接链接">​</a></h3><p><a href="/docs/indicators/app/#%E8%87%AA%E7%94%B1%E7%BB%B4%E5%BA%A6"><em>自由维度</em></a> 可以设定自由维度的过滤条件，以便分析除指标本身的限定条件外其他的因素影响。自由维度是来自于指标注册时设定的自由维度列表。</p><ul><li>维度成员选择器支持搜索功能，可以根据维度成员的名称或键值进行搜索</li><li>目前仅支持单选维度成员</li><li>支持切换维度的层次结构（如果有多个的话）</li></ul><figure class="Large"><img loading="lazy" src="/img/blog/adv/indicator-app-free-dimensions.png" alt="指标应用自由维度" class="Shadow img_ev3q"><figcaption>指标应用自由维度</figcaption></figure><h3 class="anchor anchorWithStickyNavbar_LWe7" id="下钻">下钻<a class="hash-link" href="#下钻" title="标题的直接链接">​</a></h3><p>指标详情中自由维度代表当前指标除了限定条件外还可以进一步分析的维度，用户可以根据自己的需求选择不同的维度进行分析。下钻区域表示了当前指标的限定条件的组成，即当前限定条件的下一级成员的数据组成情况，有利于用户分析当前指标的数据来源。</p><ul><li>在指标趋势图中选择不同的时间期间可以筛选下钻图形数据</li><li>下钻图形有柱形图和饼图两种，可以切换图形对比数据时间的关系和排名</li><li>点击图形数据项可以进一步下钻到下一级数据（如果还有下一级的话）</li></ul><figure class="Large"><img loading="lazy" src="/img/blog/adv/indicator-app-drill-down.png" alt="指标应用下钻" class="Shadow img_ev3q"><figcaption>指标应用下钻</figcaption></figure><h3 class="anchor anchorWithStickyNavbar_LWe7" id="评论">评论<a class="hash-link" href="#评论" title="标题的直接链接">​</a></h3><p>指标评论功能是一种协作和交流工具，它可以促进用户之间在数据和指标分析方面的互动、讨论和合作。通过评论功能，用户可以更好地理解数据的含义，分享见解和经验，并及时纠正错误，从而更好地利用数据为决策和业务提供支持。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="ai-副驾驶">AI 副驾驶<a class="hash-link" href="#ai-副驾驶" title="标题的直接链接">​</a></h3><p><a href="/docs/indicators/app/#ai-%E5%89%AF%E9%A9%BE%E9%A9%B6">AI 副驾驶</a> 是一种用于指标数据分析的人工智能工具，它可以帮助用户分析当前指标的数据情况，让人工智能给出你提出的问题的答案。</p><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>前提</div><div class="admonitionContent_S0QG"><p>参考文档 <a href="/docs/server/organization/copilot/">Metad Copilot</a> 开启 AI 副驾驶功能。</p></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="飞书集成">飞书集成<a class="hash-link" href="#飞书集成" title="标题的直接链接">​</a></h2><p>将指标应用集成到飞书等 OA（办公自动化）软件中可以增强团队的协作效率和决策能力，提高工作效率，以及使数据驱动的决策更加便捷和准确。</p><p>转到 <a href="https://open.feishu.cn/app/" target="_blank" rel="noopener noreferrer">飞书开发者后台</a> ，新建一个 <em>企业自建应用</em> 填写好应用的基础信息后，在网页应用功能里填写网页应用配置，填入桌面端和移动端首页的网址。创建好应用后发布即可。</p><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_S0QG"><p>如果是企业私有化部署的元数分析云，将域名替换为私有化部署的域名即可。</p></div></div><figure class="Large"><img loading="lazy" src="/img/blog/adv/indicator-app-feishu.png" alt="飞书指标应用" class="Shadow img_ev3q"><figcaption>飞书指标应用</figcaption></figure><p>发布并分配给飞书用户权限后，用户就可以在飞书工作台中看到指标应用了。</p><figure class="Small"><img loading="lazy" src="/img/blog/adv/indicator-app-feishu-workspace.jpg" alt="飞书指标应用" class="Shadow img_ev3q"><figcaption>飞书指标应用</figcaption></figure><p>打开飞书指标应用，登录元数分析云账号后就可以在飞书中查看指标数据了。</p><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_S0QG"><p>关于元数分析云与飞书等办公软件的集成功能后续会做详细介绍。</p></div></div><div class="flex justify-center gap-4"><figure class="Small"><img loading="lazy" src="/img/blog/adv/indicator-app-mobile.jpg" alt="飞书指标应用" class="Shadow img_ev3q"><figcaption>飞书指标应用</figcaption></figure><figure class="Small"><img loading="lazy" src="/img/blog/adv/indicator-app-mobile2.jpg" alt="飞书指标应用" class="Shadow img_ev3q"><figcaption>飞书指标应用</figcaption></figure></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a class="hash-link" href="#总结" title="标题的直接链接">​</a></h2><p>本文介绍了元数分析云中指标应用程序的使用，指标应用程序是一款用于展示指标数据的应用程序页面，用户可以使用该应用程序来查看、比较和分析不同指标的数据。用户在指标市场中申请到的指标，都可以在指标应用程序中查看。</p><p>企业还可以将指标应用集成到飞书等 OA（办公自动化）软件中，以便更好地协作和决策。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="附录">附录<a class="hash-link" href="#附录" title="标题的直接链接">​</a></h2><iframe src="//player.bilibili.com/player.html?aid=446533554&amp;bvid=BV1nj41197gR&amp;cid=1214988521&amp;page=1" width="100%" height="500px" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="metad" term="metad"/>
        <category label="BI" term="BI"/>
        <category label="AdventureWorks Sales" term="AdventureWorks Sales"/>
        <category label="Feishu" term="Feishu"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[范例：AdventureWorks Sales - 6. 故事大屏]]></title>
        <id>/2023/07/17/sample-adv-6-bigview</id>
        <link href="https://xpertai.cn/blog/2023/07/17/sample-adv-6-bigview"/>
        <updated>2023-07-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了元数分析云中故事仪表板的大屏制作功能，]]></summary>
        <content type="html"><![CDATA[<p>元数分析云故事仪表板是一款功能强大的大屏展示工具，旨在帮助用户以可视化的方式展示数据和信息。它提供了多种令人印象深刻的功能，包括单独设置组件样式和统一设置全局组件样式，让用户能够根据自己的需求设计独特的组件样式。此外，用户还可以利用高级样式功能自定义 CSS，实现更精细和个性化的大屏样式效果。滑动部件功能让大屏呈现出动态和交互性，而自定义数据刷新事件和自动翻页功能确保数据及时更新，并自动切换页面。不仅如此，该仪表板还提供了灵活的大屏页面尺寸设置，可以全屏适应或固定屏幕大小，以满足各种展示需求。元数分析云故事仪表板让用户能够轻松创建出精美、互动且个性化的大屏展示，为观众带来视觉上的震撼和愉悦体验。</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/bigview-supermart-sales.png" alt="大屏效果图" class="Shadow img_ev3q"><figcaption>大屏效果图</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="故事大屏设计">故事大屏设计<a class="hash-link" href="#故事大屏设计" title="标题的直接链接">​</a></h2><p>接着我们之前创建的 AdventureWorks Sales 语义模型，来设计一个销售指标大屏故事仪表板。首先确定所需指标，例如销售额、销售增长率、销售渠道分布等。了解用户想要了解的特定业务需求，例如按地区、时间范围或产品类别进行过滤等。</p><p>根据需求和关键指标，设计大屏页面的布局和组件。使用图表、数字指标、仪表盘等组件来呈现数据。考虑使用地图组件展示销售地区分布、趋势图显示销售增长率等。确保布局清晰简洁，使关键指标易于理解。</p><p>除了展示当前的销售指标，考虑在大屏页面中添加趋势图和比较数据。使用 AdventureWorks Sales 模型中的历史数据，绘制趋势图展示销售增长趋势，这有助于用户更好地理解销售业绩并做出相应的决策。</p><p>还要确保大屏页面上的数据能够实时刷新。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="大屏尺寸">大屏尺寸<a class="hash-link" href="#大屏尺寸" title="标题的直接链接">​</a></h2><p>元数分析云故事仪表板提供了多种选项来满足不同的大屏展示需求。用户可以根据实际情况选择大屏页面的尺寸，以确保最佳的展示效果。仪表板支持全屏适应，使内容能够充分利用整个屏幕空间，也支持固定屏幕大小，以满足特定场景下的展示要求。</p><ul><li>适应屏幕大小</li><li>固定仪表板大小</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="适应屏幕大小">适应屏幕大小<a class="hash-link" href="#适应屏幕大小" title="标题的直接链接">​</a></h3><p>在这种模式下，故事仪表板会根据屏幕的大小进行适应性调整，以确保仪表板内容按比例缩放长度和宽度，但像素大小不变。这意味着不管在何种尺寸的屏幕上查看，故事仪表板的布局和组件将自动调整，保持相同的相对位置和比例。这样的适应性设计使得故事仪表板在不同大小的显示设备上都能获得最佳的视觉效果，且内容可能会变形。</p><p>创建适应屏幕大小的故事仪表板，可以参考 <a href="/docs/stories/workspace/#%E6%96%B0%E7%94%BB%E5%B8%83%E9%A1%B5%E9%9D%A2">新画布页面</a> 选择 <strong>适应屏幕</strong> 类型的网页布局。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="固定故事大小">固定故事大小<a class="hash-link" href="#固定故事大小" title="标题的直接链接">​</a></h3><p>在这种模式下，故事仪表板的大小是固定的，无论在何种尺寸的屏幕上查看，仪表板会根据屏幕大小进行像素级缩放。这意味着在不同大小的屏幕上，仪表板会按照设备的像素密度进行缩放，以确保图像和文本的清晰度和细节。由于仪表板大小是固定的，可能会导致在较小屏幕上内容显示较小或在较大屏幕上内容显示较大。</p><p>创建固定大小的故事仪表板，可以通过全局样式中的故事的宽度、高度：</p><figure class="Small"><img loading="lazy" src="/img/blog/adv/bigview-fixed-size.png" alt="故事固定大小" class="Shadow img_ev3q"><figcaption>故事固定大小</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="大屏背景">大屏背景<a class="hash-link" href="#大屏背景" title="标题的直接链接">​</a></h2><p>设计一个与仪表板主题和内容相符并且吸引人视觉效果的背景图片。背景图片的颜色应与故事仪表板中使用的色彩调色板相一致，以确保整体风格的统一性。可以考虑使用渐变、纹理或花纹等元素，以增加视觉效果和层次感。确保背景图片简洁和清晰，避免过多的细节和干扰性元素。背景应该是一种支持内容展示的背景，而不是分散观众注意力的主角。</p><ul><li>使用纯色或渐变色或以 svg 格式设置为背景图片</li><li>上传设计过的背景图片</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="svg-背景和模式">svg 背景和模式<a class="hash-link" href="#svg-背景和模式" title="标题的直接链接">​</a></h3><ul><li>如下面 css background 配置所示，可以使用 svg 格式的背景图片</li></ul><div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token property" style="color:#36acaa">background-color</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token hexcode color">#330055</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token property" style="color:#36acaa">background-image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token url function" style="color:#d73a49">url</span><span class="token url punctuation" style="color:#393A34">(</span><span class="token url string url" style="color:#36acaa">"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 1000'%3E%3Cg %3E%3Ccircle fill='%23330055' cx='50' cy='0' r='50'/%3E%3Cg fill='%233a015d' %3E%3Ccircle cx='0' cy='50' r='50'/%3E%3Ccircle cx='100' cy='50' r='50'/%3E%3C/g%3E%3Ccircle fill='%23410165' cx='50' cy='100' r='50'/%3E%3Cg fill='%2348026e' %3E%3Ccircle cx='0' cy='150' r='50'/%3E%3Ccircle cx='100' cy='150' r='50'/%3E%3C/g%3E%3Ccircle fill='%23500376' cx='50' cy='200' r='50'/%3E%3Cg fill='%2357047e' %3E%3Ccircle cx='0' cy='250' r='50'/%3E%3Ccircle cx='100' cy='250' r='50'/%3E%3C/g%3E%3Ccircle fill='%235f0587' cx='50' cy='300' r='50'/%3E%3Cg fill='%2367068f' %3E%3Ccircle cx='0' cy='350' r='50'/%3E%3Ccircle cx='100' cy='350' r='50'/%3E%3C/g%3E%3Ccircle fill='%236f0798' cx='50' cy='400' r='50'/%3E%3Cg fill='%237707a0' %3E%3Ccircle cx='0' cy='450' r='50'/%3E%3Ccircle cx='100' cy='450' r='50'/%3E%3C/g%3E%3Ccircle fill='%238008a9' cx='50' cy='500' r='50'/%3E%3Cg fill='%238909b1' %3E%3Ccircle cx='0' cy='550' r='50'/%3E%3Ccircle cx='100' cy='550' r='50'/%3E%3C/g%3E%3Ccircle fill='%239109ba' cx='50' cy='600' r='50'/%3E%3Cg fill='%239a09c3' %3E%3Ccircle cx='0' cy='650' r='50'/%3E%3Ccircle cx='100' cy='650' r='50'/%3E%3C/g%3E%3Ccircle fill='%23a309cb' cx='50' cy='700' r='50'/%3E%3Cg fill='%23ad09d4' %3E%3Ccircle cx='0' cy='750' r='50'/%3E%3Ccircle cx='100' cy='750' r='50'/%3E%3C/g%3E%3Ccircle fill='%23b608dc' cx='50' cy='800' r='50'/%3E%3Cg fill='%23c007e5' %3E%3Ccircle cx='0' cy='850' r='50'/%3E%3Ccircle cx='100' cy='850' r='50'/%3E%3C/g%3E%3Ccircle fill='%23c905ee' cx='50' cy='900' r='50'/%3E%3Cg fill='%23d303f6' %3E%3Ccircle cx='0' cy='950' r='50'/%3E%3Ccircle cx='100' cy='950' r='50'/%3E%3C/g%3E%3Ccircle fill='%23D0F' cx='50' cy='1000' r='50'/%3E%3C/g%3E%3C/svg%3E"</span><span class="token url punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token property" style="color:#36acaa">background-attachment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> local</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token property" style="color:#36acaa">background-size</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> contain</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><ul><li>对应的背景效果</li></ul><div class="w-full h-64 rounded-lg" style="background-color:#330055;background-attachment:local;background-size:contain;background-image:url(&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 1000'%3E%3Cg %3E%3Ccircle fill='%23330055' cx='50' cy='0' r='50'/%3E%3Cg fill='%233a015d' %3E%3Ccircle cx='0' cy='50' r='50'/%3E%3Ccircle cx='100' cy='50' r='50'/%3E%3C/g%3E%3Ccircle fill='%23410165' cx='50' cy='100' r='50'/%3E%3Cg fill='%2348026e' %3E%3Ccircle cx='0' cy='150' r='50'/%3E%3Ccircle cx='100' cy='150' r='50'/%3E%3C/g%3E%3Ccircle fill='%23500376' cx='50' cy='200' r='50'/%3E%3Cg fill='%2357047e' %3E%3Ccircle cx='0' cy='250' r='50'/%3E%3Ccircle cx='100' cy='250' r='50'/%3E%3C/g%3E%3Ccircle fill='%235f0587' cx='50' cy='300' r='50'/%3E%3Cg fill='%2367068f' %3E%3Ccircle cx='0' cy='350' r='50'/%3E%3Ccircle cx='100' cy='350' r='50'/%3E%3C/g%3E%3Ccircle fill='%236f0798' cx='50' cy='400' r='50'/%3E%3Cg fill='%237707a0' %3E%3Ccircle cx='0' cy='450' r='50'/%3E%3Ccircle cx='100' cy='450' r='50'/%3E%3C/g%3E%3Ccircle fill='%238008a9' cx='50' cy='500' r='50'/%3E%3Cg fill='%238909b1' %3E%3Ccircle cx='0' cy='550' r='50'/%3E%3Ccircle cx='100' cy='550' r='50'/%3E%3C/g%3E%3Ccircle fill='%239109ba' cx='50' cy='600' r='50'/%3E%3Cg fill='%239a09c3' %3E%3Ccircle cx='0' cy='650' r='50'/%3E%3Ccircle cx='100' cy='650' r='50'/%3E%3C/g%3E%3Ccircle fill='%23a309cb' cx='50' cy='700' r='50'/%3E%3Cg fill='%23ad09d4' %3E%3Ccircle cx='0' cy='750' r='50'/%3E%3Ccircle cx='100' cy='750' r='50'/%3E%3C/g%3E%3Ccircle fill='%23b608dc' cx='50' cy='800' r='50'/%3E%3Cg fill='%23c007e5' %3E%3Ccircle cx='0' cy='850' r='50'/%3E%3Ccircle cx='100' cy='850' r='50'/%3E%3C/g%3E%3Ccircle fill='%23c905ee' cx='50' cy='900' r='50'/%3E%3Cg fill='%23d303f6' %3E%3Ccircle cx='0' cy='950' r='50'/%3E%3Ccircle cx='100' cy='950' r='50'/%3E%3C/g%3E%3Ccircle fill='%23D0F' cx='50' cy='1000' r='50'/%3E%3C/g%3E%3C/svg%3E&quot;)"></div><ul><li>实际仪表板应用效果</li></ul><figure class="Large"><img loading="lazy" src="/img/blog/adv/bigview-background-image-svg.png" alt="故事仪表板背景设置" class="Shadow img_ev3q"><figcaption>故事仪表板背景设置</figcaption></figure><h3 class="anchor anchorWithStickyNavbar_LWe7" id="背景图片">背景图片<a class="hash-link" href="#背景图片" title="标题的直接链接">​</a></h3><p>使用经过设计的图片可以确保背景与故事仪表板的主题相符。设计过的图片可以根据仪表板的内容和目标进行定制，使其在视觉上与数据和信息相协调，提供更加一致的视觉体验。在图片中包含品牌元素或公司标志，可以增加品牌的曝光和识别度。</p><p>背景图片有以下几种配置方式：</p><ul><li>直接配置图片的链接可以设置给 <code>background-image</code> 属性</li><li>切换到背景图片配置界面，选择系统内置的背景图片</li><li>也可以上传自己的图片，点击上传按钮上传图片，然后选择相应的图片</li></ul><figure class="Large"><img loading="lazy" src="/img/blog/adv/bigview-background-image-upload.png" alt="故事仪表板上传背景图片" class="Shadow img_ev3q"><figcaption>故事仪表板上传背景图片</figcaption></figure><h3 class="anchor anchorWithStickyNavbar_LWe7" id="其他组件的背景">其他组件的背景<a class="hash-link" href="#其他组件的背景" title="标题的直接链接">​</a></h3><p>除了故事仪表板的背景，用户还可以对其他组件的背景进行设置。如为故事点页面和部件单独设置背景图片，设置方式与故事背景图片相同。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="组件边框">组件边框<a class="hash-link" href="#组件边框" title="标题的直接链接">​</a></h2><p>设置组件边框和边框图片可以增加大屏的美感、提高视觉吸引力、增强用户体验。</p><p>如下图所示，故事仪表板组件边框可以通过这些属性（对应 css 属性）进行设置：</p><ul><li>边框颜色： <code>border-color</code></li><li>边框宽度： <code>border-width</code></li><li>边框样式： <code>border-style</code></li><li>边框图片： <code>border-image</code><ul><li>预设边框图片</li><li>自定义边框图片（用户上传）</li></ul></li><li>边框切片： <code>border-image-slice</code></li><li>盒子阴影： <code>box-shadow</code></li><li>阴影： <code>box-shadow</code></li></ul><figure class="Large"><img loading="lazy" src="/img/blog/adv/bigview-border-image.png" alt="故事仪表板组件边框图片" class="Shadow img_ev3q"><figcaption>故事仪表板组件边框图片</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="字体样式">字体样式<a class="hash-link" href="#字体样式" title="标题的直接链接">​</a></h2><p>组件字体样式对于大屏的可读性、视觉吸引力和用户体验都有重要影响。通过使用粗体、斜体或不同的字号，可以将关键信息从其他内容中区分开来，吸引观众的注意力，使其更容易理解和记住关键信息。通过选择与主题相符的艺术字体或特殊效果，可以使大屏在视觉上更加引人注目。</p><p>设置组件文本样式可以通过以下属性进行设置：</p><figure class="Small"><img loading="lazy" src="/img/blog/adv/bigview-text.png" alt="故事仪表板文本样式" class="img_ev3q"><figcaption>故事仪表板文本样式</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="三维效果">三维效果<a class="hash-link" href="#三维效果" title="标题的直接链接">​</a></h2><p>在数据可视化方面，3D图形可以更生动地呈现数据，增强数据的立体感和深度感。特别是在展示复杂的关系和趋势时，3D图形可以更好地表达数据间的关联性，使观众更容易理解和解读数据。</p><p>要为大屏仪表板添加三维效果，可以通过以下方式进行设置：</p><ul><li><strong>自定义图形</strong>：通过 ECharts 的 globe 等类型可以实现三维图形效果，并且可以设置自动旋转。</li></ul><figure class="Large"><img loading="lazy" src="/img/blog/adv/bigview-3d-earth.png" alt="故事仪表板 3D" class="Shadow img_ev3q"><figcaption>故事仪表板 3D</figcaption></figure><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>信息</div><div class="admonitionContent_S0QG"><p>关于自定义图形请参考 <a href="/blog/2023/07/08/sample-adv-5-custom-chart">范例：AdventureWorks Sales - 5. 故事自定义图形</a>。</p></div></div><ul><li><strong>视频部件</strong>：如果只是设置一个动态 3D 背景效果，可以考虑使用视频部件，将一个 3D 视频作为背景，可以实现类似的效果。</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="颜色主题">颜色主题<a class="hash-link" href="#颜色主题" title="标题的直接链接">​</a></h2><p>设置故事仪表板的颜色主题，</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="全局颜色主题">全局颜色主题<a class="hash-link" href="#全局颜色主题" title="标题的直接链接">​</a></h3><p>如下图所示可以在<a href="/docs/stories/global-styles/#%E6%95%85%E4%BA%8B%E8%AE%BE%E7%BD%AE">全局设置</a>中设置故事仪表板的颜色模式和颜色序列，主题会应用到故事仪表板的所有部件和图形中。</p><figure class="Small"><img loading="lazy" src="/img/blog/adv/bigview-theme-colors.png" alt="故事仪表板主题颜色" class="Shadow img_ev3q"><figcaption>故事仪表板主题颜色</figcaption></figure><p>除了系统内置的颜色序列，用户还可以自行设计颜色序列，然后将颜色序列复制到故事仪表板的颜色序列组件输入框中即可，如：</p><p><code>#ea698b, #d55d92, #c05299, #ac46a1, #973aa8, #822faf, #6d23b6, #6411ad, #571089, #47126b</code></p><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>信息</div><div class="admonitionContent_S0QG"><p>例如此网站可以生成颜色序列：<a href="https://coolors.co/palettes/popular/gradient" target="_blank" rel="noopener noreferrer">https://coolors.co/palettes/popular/gradient</a></p></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="图形主题-echarts-主题">图形主题： ECharts 主题<a class="hash-link" href="#图形主题-echarts-主题" title="标题的直接链接">​</a></h3><p>对应上面的故事仪表板几种主题，用户可以自定义相应的 ECharts 主题配置。用户可以通过 <a href="https://echarts.apache.org/zh/theme-builder.html" target="_blank" rel="noopener noreferrer">ECharts 主题构建工具</a> 定制好主题，然后将主题配置复制到故事仪表板的 ECharts 主题配置中。</p><figure class="Middle"><img loading="lazy" src="/img/blog/adv/bigview-themes.png" alt="故事仪表板 ECharts 主题" class="Shadow img_ev3q"><figcaption>故事仪表板 ECharts 主题</figcaption></figure><h3 class="anchor anchorWithStickyNavbar_LWe7" id="图形颜色序列">图形颜色序列<a class="hash-link" href="#图形颜色序列" title="标题的直接链接">​</a></h3><p>除了统一设置故事仪表板的颜色序列外，还可以对单独一个图形部件或图形 series 设置颜色序列。这样可以实现不同图形部件或图形 series 的颜色序列不同，从而实现更好的视觉效果。</p><ul><li>为图形属性的全局颜色</li></ul><p>这里的颜色序列会按顺序分配给图形数据元素，如果数据元素超过颜色序列的长度，会循环使用颜色序列中的颜色。</p><figure class="Small"><img loading="lazy" src="/img/blog/adv/bigview-echarts-color.png" alt="图形颜色序列" class="img_ev3q"><figcaption>图形颜色序列</figcaption></figure><ul><li>为度量字段设置颜色序列，图案</li></ul><p>为度量字段单独设置颜色序列，可以实现根据度量值的范围和大小确定颜色变化的效果，从而实现更好的视觉效果。</p><figure class="Small"><img loading="lazy" src="/img/blog/adv/bigview-measure-colors.png" alt="度量颜色序列" class="Shadow img_ev3q"><figcaption>度量颜色序列</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="高级样式">高级样式<a class="hash-link" href="#高级样式" title="标题的直接链接">​</a></h2><p>为了满足更高级的用户需求，元数分析云故事仪表板还支持自定义 CSS 样式。用户可以根据自己的技术水平和设计要求，编写自定义的 CSS 代码，以实现更精细和个性化的大屏样式效果。</p><p><a href="/docs/stories/advanced-styles/">高级样式</a>设置有以下多种应用场景：</p><ul><li>加载新字体。</li><li>设置特定页面元素样式。</li><li>实现更多动态效果</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="滑动部件">滑动部件<a class="hash-link" href="#滑动部件" title="标题的直接链接">​</a></h2><p>为了增加大屏的动态效果和交互性，仪表板提供了 <a href="/docs/widgets/swiper">滑动部件</a> 。用户可以在大屏上添加滑动部件，以展示多个页面或信息板块。这些滑动部件可以自动循环播放，使信息以一定的时间间隔进行切换，为观众呈现出更丰富的内容。</p><div class="flex justify-around items-center"><figure class="Small"><iframe src="https://app.xpertai.cn/public/story/widget/170a7423-a30e-4635-90c7-f2c3895486f0" class="rounded-lg overflow-hidden" width="400px" height="500px" frameborder="0" scrolling="no" allowfullscreen=""> </iframe><figcaption>滑动部件预览</figcaption></figure><figure class="Small"><img loading="lazy" src="/img/blog/adv/bigview-swiper.png" alt="滑动部件属性" class="img_ev3q"><figcaption>滑动部件属性</figcaption></figure></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="自动刷新与自动翻页">自动刷新与自动翻页<a class="hash-link" href="#自动刷新与自动翻页" title="标题的直接链接">​</a></h2><p>为了确保大屏上的数据能够及时更新，元数分析云故事仪表板允许用户设置自定义的数据刷新事件。用户可以指定数据更新的时间间隔或触发条件，以确保大屏上展示的数据保持最新。此外，用户还可以设置自动翻页功能，使大屏内容在设定的时间或条件下自动切换页面。</p><figure class="Small"><img loading="lazy" src="/img/blog/adv/bigview-autorefresh.png" alt="自动刷新设置" class="Shadow img_ev3q"><figcaption>自动刷新设置</figcaption></figure><iframe src="https://app.xpertai.cn/public/story/9c462bea-89f6-44b8-a35e-34b21cd15a36" width="100%" height="600px" frameborder="0" scrolling="no" allowfullscreen=""></iframe><h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a class="hash-link" href="#总结" title="标题的直接链接">​</a></h2><p>通过以上功能点，元数分析云故事仪表板提供了丰富的功能和灵活性，使用户能够创建出精美、互动且具有个性化风格的大屏展示。无论是用于数据报告、业务展示还是其他领域的信息展示，该仪表板都能满足用户的需求，并为用户带来更好的视觉体验。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="附录">附录<a class="hash-link" href="#附录" title="标题的直接链接">​</a></h2><iframe src="//player.bilibili.com/player.html?aid=828833053&amp;bvid=BV1Lu4y1U7bg&amp;cid=1208138805&amp;page=1" width="100%" height="500px" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="metad" term="metad"/>
        <category label="BI" term="BI"/>
        <category label="AdventureWorks Sales" term="AdventureWorks Sales"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[范例：AdventureWorks Sales - 5. 故事自定义图形]]></title>
        <id>/2023/07/08/sample-adv-5-custom-chart</id>
        <link href="https://xpertai.cn/blog/2023/07/08/sample-adv-5-custom-chart"/>
        <updated>2023-07-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了元数分析云中故事仪表板的自定义图形逻辑功能，并以 AdventureWorks Sales 数据集为例进行了说明。通过集成开源图表库 ECharts，用户可以使用自定义图形逻辑功能创建和定制图表，灵活展示和操作数据]]></summary>
        <content type="html"><![CDATA[<p>元数分析云是一种数据可视化分析平台，它提供了强大的故事仪表板功能，其中包括了自定义图形逻辑能力。这种能力允许用户使用常用的开源图形库进行自定义图形的展示和操作。</p><p>ECharts 是一种开源的 JavaScript 图表库，它提供了丰富的可视化图表类型和交互功能，包括折线图、柱状图、饼图、雷达图等等。元数分析云集成了 ECharts，并在故事仪表板功能中提供了自定义图形微件逻辑的能力，使用户能够以更灵活的方式创建和定制图形。</p><p>使用自定义图形逻辑能力，用户可以根据自己的需求和数据特点，通过编写 JavaScript 代码来实现图表的定制和交互。用户可以定义图表的外观样式、数据处理逻辑以及交互行为等等。</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/story-adv-calendar.png" alt="销售日历仪表板" class="Shadow img_ev3q"><figcaption>销售日历仪表板</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="故事仪表板设计">故事仪表板设计<a class="hash-link" href="#故事仪表板设计" title="标题的直接链接">​</a></h2><p>接上一篇 <a href="/blog/2023/06/27/sample-adv-4-story">范例：AdventureWorks Sales - 4. 故事仪表板</a> 我们创建的 <em>销售总览页面</em>，该页面可以提供全面的销售数据分析，包括各项销售核心指标、产品相关总览分析、销售渠道总览分析。本篇我们将更深入分析销售核心指标，使用日历和热力图的方式展示销售数据，以便更好的分析销售数据的变化趋势。另外一个页面将分析互联网销售（B2C Customers）数据指标，以客户所属区域进行分解分析。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="技术点">技术点<a class="hash-link" href="#技术点" title="标题的直接链接">​</a></h2><p>本文我们只着重介绍故事仪表板页面涉及到的技术点，包括不同页面之间的跳转、自定义图形逻辑、联动分析等功能。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="页面跳转">页面跳转<a class="hash-link" href="#页面跳转" title="标题的直接链接">​</a></h3><p>当我们创建了更多的故事仪表板页面后，为了更好的组织页面之间的逻辑关系，我们可以通过页面跳转功能来实现。在故事仪表板页面中，我们可以通过为 <em>关键指标微件</em> 和 <em>文本微件</em> 设置页面跳转来实现。</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/text-intent-navigation.png" alt="文本导航" class="Shadow img_ev3q"><figcaption>文本导航</figcaption></figure><h3 class="anchor anchorWithStickyNavbar_LWe7" id="自定义图形逻辑">自定义图形逻辑<a class="hash-link" href="#自定义图形逻辑" title="标题的直接链接">​</a></h3><p>通过使用自定义 ECharts 图形逻辑，我们可以灵活地定制图表的样式和展示方式。利用日历图，我们可以直观地查看销售数据在不同日期之间的分布和趋势，帮助我们发现销售高峰和低谷，以及与时间相关的销售模式。而热力图则可以将销售数据以颜色深浅的形式展示在月份与月份中第几天的二维坐标系中，帮助我们了解销售数据在月份上的热门和冷门时间日期，进一步挖掘销售机会和问题所在。</p><p>我们以销售日历为例讲解如何编写自定义图形逻辑，此图形逻辑为将具体到天的销售数据按年份进行分组，每一年的销售数据以日历坐标（<a href="https://echarts.apache.org/en/option.html#calendar" target="_blank" rel="noopener noreferrer">Calendar coordinates</a> ）的形式用热力图的效果展示，每一个日历坐标系平均分配在图形区域中。一般情况下要查看一个财年的数据，日历坐标将会有两个，一个是下半年，一个是上半年。</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/custom-chart-sales-calendar.png" alt="销售日历图形" class="Shadow img_ev3q"><figcaption>销售日历图形</figcaption></figure><p>接下来我们逐步介绍代码的编写过程。</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="1-获取元数据信息">1. 获取元数据信息<a class="hash-link" href="#1-获取元数据信息" title="标题的直接链接">​</a></h4><ul><li>自定义脚本函数的输入参数 <code>chartAnnotation</code> 代表了当前图形数据的元数据信息，里面包含维度和度量字段列表。由于我们的图形需要使用时间维度和销售金额度量，所以我们需要获取这两个字段的信息并判断是否存在。</li><li>输入参数 <code>utils</code> 对象拥有一系列工具函数，包括 echarts（包括 time format 工具函数）和 ocap 工具栏函数如 <code>getEntityHierarchy</code></li></ul><div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// queryResult: QueryReturn&lt;any&gt;, chartAnnotation: ChartAnnotation, entityType: EntityType, locale: string, chartsInstance: ECharts, echarts</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> measure </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> chartAnnotation</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">measures</span><span class="token operator" style="color:#393A34">?.</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> dimension </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> chartAnnotation</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">dimensions</span><span class="token operator" style="color:#393A34">?.</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> echarts</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> getEntityHierarchy</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> getPropertyCaption </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> utils</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">dimension </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token plain">measure</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h4 class="anchor anchorWithStickyNavbar_LWe7" id="2-数据处理">2. 数据处理<a class="hash-link" href="#2-数据处理" title="标题的直接链接">​</a></h4><ul><li>函数输入参数 <code>queryResult</code> 代表图形的数据查询结果，里面包含了 data 数据数组，schema 数据结构信息，以及其他一些查询信息。</li><li>函数输入参数 <code>entityType</code> 代表了多维数据集的维度和度量信息，可以用来查询维度的具体层次结构和层级信息。</li><li>循环数据数组将数据按年份进行分组，每一年的数据存储在 <code>yearsData</code> 对象中，每一年的数据是一个数组，数组中的每一项是一个对象，包含了日历坐标和销售金额度量值，还有 slicer 代表当前数据点对应的切片器，用于图形的联动分析。</li></ul><div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> yearsData </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> measureData </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 获取维度的层次结构字段信息</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> hierarchy </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getEntityHierarchy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">entityType</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> dimension</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 获取维度成员的显示名称字段名</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> caption </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getPropertyCaption</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">hierarchy</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Group query result data by year</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">queryResult</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">forEach</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">row</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> datum </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> row</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">caption</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> year </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> datum</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">substring</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    yearsData</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">year</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> yearsData</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">year</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    yearsData</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">year</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">push</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Use dimension member caption as calendar coordinate and measure as value</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">value</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            datum</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            row</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">measure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">measure</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// 计算数据点的切片器，便于点击事件的联动分析</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">slicer</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            dimension</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">members</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token literal-property property" style="color:#36acaa">value</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> row</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">hierarchy</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">name</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token literal-property property" style="color:#36acaa">caption</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> row</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">caption</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// 存储所有度量值数组</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    measureData</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">push</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">row</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">measure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">measure</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 计算度量值范围</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> min </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">min</span><span class="token punctuation" style="color:#393A34">(</span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">measureData</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> max </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">max</span><span class="token punctuation" style="color:#393A34">(</span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">measureData</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h4 class="anchor anchorWithStickyNavbar_LWe7" id="3图形配置">3.图形配置<a class="hash-link" href="#3图形配置" title="标题的直接链接">​</a></h4><p>根据数据计算结果输出 ECharts 图形配置信息</p><ul><li><code>tooltip</code> 自定义图形提示框信息输出的格式</li><li><code>visualMap</code> 热力图的颜色视觉映射配置，包括最大值、最小值、位置等，颜色范围可以根据 measure 的调色板配置的 colors 属性或默认值</li><li><code>calendar</code> 日历坐标系配置，每一年对应一个坐标系，坐标系位置平均分布在图形范围内</li><li><code>series</code> 图形数据，以对应的日历为坐标系，使用 heatmap 展示类型</li></ul><div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> formatUtil </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> echarts</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">format</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> years </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">Object</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">yearsData</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">sort</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> options </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">tooltip</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">position</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'top'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function-variable function" style="color:#d73a49">formatter</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">p</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic">// 提示框信息输出</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">&lt;b&gt;</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">p</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">data</span><span class="token template-string interpolation punctuation" style="color:#393A34">.</span><span class="token template-string interpolation property-access">value</span><span class="token template-string interpolation punctuation" style="color:#393A34">[</span><span class="token template-string interpolation number" style="color:#36acaa">0</span><span class="token template-string interpolation punctuation" style="color:#393A34">]</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">&lt;/b&gt;</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">': '</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> formatUtil</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">addCommas</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">p</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">value</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">?.</span><span class="token method function property-access" style="color:#d73a49">toFixed</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// 热力图的颜色视觉映射配置</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">visualMap</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        min</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        max</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">calculable</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'piecewise'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">orient</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'horizontal'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">left</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'center'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">bottom</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'10'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">precision</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// Measure palette colors as visualMap color</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">inRange</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> measure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">palette</span><span class="token operator" style="color:#393A34">?.</span><span class="token plain">colors </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">color</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> measure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">palette</span><span class="token operator" style="color:#393A34">?.</span><span class="token plain">colors</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword null nil" style="color:#00009f">null</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Calendar coordinate per year</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">calendar</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> years</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">year</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> i</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">range</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> year</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">top</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">i </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">100</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> years</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">length</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">15</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'%'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">left</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">right</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">yearLabel</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token literal-property property" style="color:#36acaa">show</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token literal-property property" style="color:#36acaa">position</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'top'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Heatmap series per year corresponding to calendar coordinate</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">series</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> years</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">year</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> i</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'heatmap'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 热力图类型</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">coordinateSystem</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'calendar'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 日历坐标系</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">calendarIndex</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> i</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 日历坐标系索引</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token literal-property property" style="color:#36acaa">data</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> yearsData</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">year</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 数据序列数组</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h4 class="anchor anchorWithStickyNavbar_LWe7" id="4-响应图形事件">4. 响应图形事件<a class="hash-link" href="#4-响应图形事件" title="标题的直接链接">​</a></h4><p>自定义图形逻辑传入了 ECharts 的图形实例，所以可以通过 ECharts 的事件机制来响应图形的各类事件，下面逻辑响应鼠标 hover 事件以高亮当月数据点，鼠标移出事件取消高亮。</p><div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">chartsInstance</span><span class="token operator" style="color:#393A34">?.</span><span class="token method function property-access" style="color:#d73a49">off</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'mouseover'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">chartsInstance</span><span class="token operator" style="color:#393A34">?.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'mouseover'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">event</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    chartsInstance</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">dispatchAction</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'highlight'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">seriesIndex</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> event</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">seriesIndex</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// 月份相同的数据点高亮</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">dataIndex</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> options</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">series</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">event</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">seriesIndex</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">item</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter">i</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> item</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">value</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">substring</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">7</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain">  event</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">value</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">substring</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">7</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword null nil" style="color:#00009f">null</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">filter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">i</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">!==</span><span class="token plain"> </span><span class="token keyword null nil" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">chartsInstance</span><span class="token operator" style="color:#393A34">?.</span><span class="token method function property-access" style="color:#d73a49">off</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'mouseout'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">chartsInstance</span><span class="token operator" style="color:#393A34">?.</span><span class="token method function property-access" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'mouseout'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">event</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    chartsInstance</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">dispatchAction</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'downplay'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h4 class="anchor anchorWithStickyNavbar_LWe7" id="5-脚本返回结果">5. 脚本返回结果<a class="hash-link" href="#5-脚本返回结果" title="标题的直接链接">​</a></h4><p><code>return</code> 函数最终返回的数据类型为 <code>{options: EChartOption, onClick: (event) =&gt; {...event, slicers: Slicer[]}}</code></p><ul><li><code>options</code> 为 ECharts 图形配置</li><li><code>onClick</code> 为图形点击事件回调函数，返回的 event 对象包含了原始的 ECharts 事件对象，以及 slicers 切片器数组，用于图形的联动分析</li></ul><div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    options</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="图形变体">图形变体<a class="hash-link" href="#图形变体" title="标题的直接链接">​</a></h3><p><a href="/docs/widgets/analytical-card/#%E5%9B%BE%E5%BD%A2%E5%8F%98%E4%BD%93">图形微件的图形变体</a> 可以使得一个图形微件的同一数据展示为不同的表现形式，以便用户可以根据需要自行选择查看的图形类型。</p><figure class="Large"><img loading="lazy" src="/img/story/chart-variants.png" alt="图形变体" class="Shadow img_ev3q"><figcaption>图形变体</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a class="hash-link" href="#总结" title="标题的直接链接">​</a></h2><p>本文介绍了元数分析云中故事仪表板的自定义图形逻辑功能，并以 AdventureWorks Sales 数据集为例进行了说明。通过集成开源图表库 ECharts，用户可以使用自定义图形逻辑功能创建和定制图表，灵活展示和操作数据。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="附录">附录<a class="hash-link" href="#附录" title="标题的直接链接">​</a></h2><iframe src="//player.bilibili.com/player.html?aid=743559903&amp;bvid=BV1Kk4y1574r&amp;cid=1200012991&amp;page=1" width="100%" height="500px" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="metad" term="metad"/>
        <category label="BI" term="BI"/>
        <category label="AdventureWorks Sales" term="AdventureWorks Sales"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[范例：AdventureWorks Sales - 4. 故事仪表板]]></title>
        <id>/2023/06/27/sample-adv-4-story</id>
        <link href="https://xpertai.cn/blog/2023/06/27/sample-adv-4-story"/>
        <updated>2023-06-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了如何使用之前创建的语义模型和指标来制作故事仪表板。元数分析云中的📖故事仪表板功能是一种可视化报告工具，可以帮助用户将数据转化为有含义的叙述。它通常由一系列的页面或幻灯片组成，每个页面或幻灯片都可以包含不同的图表、图像和文本。]]></summary>
        <content type="html"><![CDATA[<p>本文介绍了如何使用之前创建的语义模型和指标来制作故事仪表板。元数分析云中的 <a href="/docs/stories/">📖故事仪表板</a> 功能是一种可视化报告工具，可以帮助用户将数据转化为有含义的叙述。它通常由一系列的页面或幻灯片组成，每个页面或幻灯片都可以包含不同的图表、图像和文本。</p><p>最终效果预览销售总览:</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/story-adv-sales-overview.png" alt="销售总览" class="Shadow img_ev3q"><figcaption>销售总览</figcaption></figure><p>前几篇 <a href="/blog/2023/06/14/sample-adv-1-modeling">范例：AdventureWorks Sales - 1. 建模</a> 创建了 AdventureWorks Sales 多维数据集，包含了维度：</p><ul><li>经销商 Reseller;</li><li>客户 Customer;</li><li>销售区域 Sales Territory;</li><li>日期 Date;</li><li>产品 Product;</li><li>销售订单 Sales Order;</li></ul><p>以及度量：</p><ul><li>销售数量 Sales Quantity;</li><li>销售额 Sales Amount;</li><li>成本 Total Product Cost;</li><li>单价 Unit Price;</li><li>利润 Profit;</li></ul><p>以及在 <a href="/blog/2023/06/21/sample-adv-2-roles">范例：AdventureWorks Sales - 2. 角色 &amp; 访问控制</a> 中创建了多种权限角色对语义模型的数据进行了访问控制。
并且在 <a href="/blog/2023/06/25/sample-adv-3-indicators">范例：AdventureWorks Sales - 3. 指标管理</a> 创建了一套比较完整的指标体系，涵盖了销售、经销商、客户和产品等方面的指标。</p><p>通过本文的指导，读者将能够利用之前创建的语义模型维度，度量和指标，创建出有价值的、个性化的故事仪表板，以便更好地理解和展示数据。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="创建项目">创建项目<a class="hash-link" href="#创建项目" title="标题的直接链接">​</a></h2><p><a href="/docs/stories/project/">🧰项目 (Project)</a> 在元数分析云中是用于管理模型、故事仪表板和指标的集合。这些项目通常由团队或部门使用，旨在提供一个中心位置，使团队成员能够协作开发、管理和共享商业智能解决方案。</p><p>在制作故事仪表板之前我们需要先创建一个项目来作为故事仪表板的平台。在元数分析云中，我们可以通过以下步骤来创建一个项目：</p><ul><li>在元数分析云导航栏中点击 <code>项目</code> 菜单，进入项目管理页面；</li><li>在网站上方导航栏中点击 <code>新建项目</code> 菜单按钮，打开新建项目对话框；</li><li>输入项目名称，例如 <code>Demo - AdventureWorks Sales</code>，描述；</li><li>选择项目中要使用的语义模型，关联进来的语义模型才能被故事仪表板使用到；</li><li>点击 <code>应用</code> 按钮，完成项目创建。</li></ul><p>新项目创建完成后即转到新项目页面，或者手动选择新创建的项目。接下来便可以在此项目中创建故事仪表板了。</p><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_S0QG"><p>在 <a href="/blog/2023/06/25/sample-adv-3-indicators">范例：AdventureWorks Sales - 3. 指标管理</a> 文中的指标管理也应该在同一个项目中进行。</p></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="故事仪表板">故事仪表板<a class="hash-link" href="#故事仪表板" title="标题的直接链接">​</a></h2><p>故事仪表板名称：<code>Demo - AdventureWorks Sales Dashboard</code></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="故事设计">故事设计<a class="hash-link" href="#故事设计" title="标题的直接链接">​</a></h3><p>AdventureWorks Sales Dashboard 故事仪表板旨在提供对销售数据的全面分析，帮助您了解销售绩效、产品趋势以及不同销售渠道的表现。通过可视化图表和指标，您可以发现关键业务见解，并追踪销售目标的实现情况。</p><p>主要部分：</p><ol><li><p>销售总览（Sales Summary）：</p><ul><li>总体销售趋势：展示销售额、销售量和利润等指标的时间趋势，包括总体销售额的月度或季度变化图表。</li><li>销售地域分布：显示不同地区或国家的销售额占比，以地图或柱状图形式呈现。</li></ul></li><li><p>产品分析（Product Analysis）：</p><ul><li>畅销产品排行榜：展示销售额或销售量排名前几的产品，帮助您了解最受欢迎的产品和其贡献度。</li><li>产品分类销售比较：以饼图或堆叠柱状图形式展示不同产品分类的销售额占比，帮助您发现销售额的分布情况。</li></ul></li><li><p>互联网销售（B2C Customers）分析：</p><ul><li>客户分布：以地图或热点图的形式显示互联网销售的客户地理分布情况，帮助您了解核心市场。</li><li>客户购买行为：展示互联网销售客户的购买频率、客单价和购买渠道偏好等信息，以便您优化营销策略。</li></ul></li><li><p>经销商销售（B2B Customers）分析：</p><ul><li>经销商绩效：以柱状图或雷达图形式展示不同经销商的销售额、订单量和利润，帮助您评估合作伙伴的表现。</li><li>经销商地域分布：显示经销商的地理分布情况，以地图或堆叠柱状图形式呈现。</li></ul></li></ol><h3 class="anchor anchorWithStickyNavbar_LWe7" id="创建故事">创建故事<a class="hash-link" href="#创建故事" title="标题的直接链接">​</a></h3><p>如何创建故事仪表板请参考官方文档 <a href="/docs/stories/create-story">创建故事</a>。</p><p>故事页面将采用固定布局网格紧凑型的类型。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="销售总览页面">销售总览页面<a class="hash-link" href="#销售总览页面" title="标题的直接链接">​</a></h2><p>销售总览页面可以提供全面的销售数据分析，我们将销售总览页面分为三个分析区域和一个过滤器栏：</p><ol><li><p>过滤器栏：
在页面的顶部或侧边，设计一个过滤器栏，包含可以选择的过滤器，以便用户根据需要筛选数据。可能的过滤器包括：</p><ul><li>时间范围：允许用户选择特定的时间段，如月度、季度或年度。</li><li>产品：允许用户选择特定的产品类别或产品，以便分析特定产品的销售情况。</li><li>销售区域：允许用户选择特定的地理区域或国家，以便了解不同地区的销售表现。</li></ul></li><li><p>各项销售指标：
在销售总览页面的中心位置，以图表或数字指标的形式展示以下核心销售指标：</p><ul><li>总销售额：以折线图或区域图展示销售额的趋势变化，同时标注出每个时间点的具体销售额数值。</li><li>利润：展示利润和利润率指标数值。</li><li>订单量：以柱状图展示订单数量的变化趋势，同时标注出每个时间点的具体订单数量。</li><li>客户量：以数字指标的形式展示客户数量。</li><li>销售额和销售额同比按财务日历月的走势图。</li><li>订单量按财务日历月的走势图。</li></ul></li><li><p>产品相关总览分析：
在销售总览页面的左侧下方，提供产品相关的总览分析，包括：</p><ul><li>畅销产品占比：以指标值形式展示销售额排名前 20 的产品销售额的占总销售额的比例。</li><li>总体利润率：以指标值形式展示所有产品的总体利润率。</li><li>产品销售比例：以矩阵树图展示不同产品的销售额大小比例。</li><li>产品的销售额，利润，利润率排名明细表。</li></ul></li><li><p>销售渠道总览分析：
在销售总览页面的右侧，提供销售渠道的总览分析，包括：</p><ul><li>互联网渠道销售额占比：以指标形式展示互联网销售渠道的销售额占比。</li><li>渠道销售趋势：以堆积柱形图展示互联网和经销商销售渠道的销售额随时间的变化趋势。</li><li>互联网渠道销售情况<ul><li>互联网销售额</li><li>客户平均客单价</li><li>客户消费排名明细表</li></ul></li><li>经销商渠道销售情况<ul><li>经销商销售额</li><li>经销商平均销售额</li><li>经销商销售额排名明细表</li></ul></li></ul></li></ol><p>实际网页预览：</p><iframe src="https://app.xpertai.cn/public/story/892690e5-66ab-4649-9bf5-c1a9c432c01b" width="100%" height="600px" frameborder="0" scrolling="no" allowfullscreen=""> </iframe><p>故事仪表板的详细创建过程这里就不再赘述，有需要了解的用户可以参考官方文档 <a href="/docs/stories/">故事仪表板</a>。</p><p>下来主要介绍一下创建过程中涉及到的一些技术点。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="同比计算度量">同比计算度量<a class="hash-link" href="#同比计算度量" title="标题的直接链接">​</a></h3><p>在元数分析云中像同比环比这种成员之间差异的计算，我们称之为 <a href="/docs/stories/calculations/#5-%E5%B7%AE%E5%80%BC%E5%BA%A6%E9%87%8F-difference-from">🧮差异计算度量</a>。差异计算度量是一种特殊的计算度量，它的计算公式中包含了两个成员，一个是当前成员，一个是比较成员，这两个成员之间的比较有多种方式。在元数分析云中，我们可以通过创建差异计算度量来实现同比环比的计算。</p><p>如下图所示，为故事微件添加度量，在可选项列表面板中点击 <strong>创建计算</strong> 打开计算成员编辑窗口，选择类型为 <strong>差异度量</strong>：</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/story-calculation-difference-yoy.png" alt="创建差异计算度量" class="Shadow img_ev3q"><figcaption>创建差异计算度量 (YoY)</figcaption></figure><p>需要注意的设置：</p><ul><li>基准维度：选择用于比较的维度，这里选择 <strong>下单日期</strong> 维度，并选择其 <strong>财务日历</strong> 层次结构和 <strong>财年</strong> 层级。</li><li>比 (A): 设置为 <strong>当前成员</strong>，指的是基准维度在上下文中的当前成员。</li><li>较 (B): 设置为 <strong>平行成员</strong> (Parallel)，<strong>第 1 个</strong> 指的是基准维度下单日期维度的上一个财年中对应的成员。</li></ul><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_S0QG"><p>详细配置请参考官方文档 <a href="/docs/stories/calculations/#5-%E5%B7%AE%E5%80%BC%E5%BA%A6%E9%87%8F-difference-from">🧮差异计算度量</a></p></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="top-count-计算度量">Top Count 计算度量<a class="hash-link" href="#top-count-计算度量" title="标题的直接链接">​</a></h3><p>要计算前多少名的产品销售额汇总值，可以使用计算成员中的 <a href="/docs/stories/calculations/#1-%E6%9D%A1%E4%BB%B6%E8%81%9A%E5%90%88-conditional-aggregation">条件聚合类型</a>，如下图所示，在计算编辑器中选择类型为 <strong>条件聚合</strong>，并设选择运算为 <strong>TopCount</strong>，聚合数量为 <strong>20</strong>，聚合维度层级为 <strong>产品分类/产品</strong> （因为 TopCount 函数需要在产品层级成员集上进行排名运算）</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/story-calculation-conditional-aggregation-topcount.png" alt="创建条件聚合度量" class="Shadow img_ev3q"><figcaption>创建条件聚合度量 (TopCount)</figcaption></figure><p>接着创建另一个计算并选择计算编辑器中的 <strong>计算公式</strong> 类型，将 Top 20 Products 计算度量和销售额度量进行除法运算得到占比，如下图所示：</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/story-calculation-formula-topcount.png" alt="创建计算公式度量" class="Shadow img_ev3q"><figcaption>创建计算公式度量 (占比)</figcaption></figure><p>由于此公式为计算百分比的，所以需要设置其格式为百分比符号 <code>%</code> .</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="使用指标">使用指标<a class="hash-link" href="#使用指标" title="标题的直接链接">​</a></h2><p>我们已在 <a href="/blog/2023/06/25/sample-adv-3-indicators">范例：AdventureWorks Sales - 3. 指标管理</a> 文中创建了一套完整的指标体系，涵盖了销售、经销商、客户和产品等方面的指标。这些指标可以直接在故事仪表板中使用，例如图形的度量，表格的字段，关键指标微件等任何需要使用度量的地方都可以使用指标。还有一些专门为指标设计的微件，例如指标卡、指标表格等。</p><p>如下图所示，可以使用特定的指标微件，也可以在普通的微件度量属性上使用指标：</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/story-using-indicator.png" alt="故事中使用指标" class="Shadow img_ev3q"><figcaption>故事中使用指标</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a class="hash-link" href="#总结" title="标题的直接链接">​</a></h2><p>本文主要介绍了如何使用故事仪表板来分析销售总览业绩数据，更多指标数据分析以及故事仪表板丰富功能我们将在后续文章中陆续介绍。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="附录">附录<a class="hash-link" href="#附录" title="标题的直接链接">​</a></h2><iframe src="//player.bilibili.com/player.html?aid=998223852&amp;bvid=BV1Vs4y1r7WV&amp;cid=1188757621&amp;page=1" width="100%" height="500px" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="metad" term="metad"/>
        <category label="BI" term="BI"/>
        <category label="AdventureWorks Sales" term="AdventureWorks Sales"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[范例：AdventureWorks Sales - 3. 指标管理]]></title>
        <id>/2023/06/25/sample-adv-3-indicators</id>
        <link href="https://xpertai.cn/blog/2023/06/25/sample-adv-3-indicators"/>
        <updated>2023-06-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This article demonstrates how to use the indicator management feature of Metad Analytics Cloud to define a complete indicator management system for the AdventureWorks Sales data model.]]></summary>
        <content type="html"><![CDATA[<p>元数分析云依托语义模型拥有强大的指标管理功能，旨在帮助用户有效地管理和监控数据模型中的指标。元数分析云通过基于核心的 OLAP 引擎建立对企业数据的统一语义建模, 无需繁琐的数据转换和 ETL,并经过统一口径的指标定义功能对企业经营数据进行统一的管理和认证.最终通过元数分析云提供的指标应用程序和故事仪表板，将指标用于分析和评估公司业务和财务数据。</p><p>本篇将使用元数分析云的指标管理功能为 AdventureWorks Sales 数据模型定义一套完善的指标管理体系。</p><figure class="Middle"><img loading="lazy" src="/img/blog/adv/business-area-sales.png" alt="销售业务域" class="img_ev3q"><figcaption>销售业务域</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="指标体系设计">指标体系设计<a class="hash-link" href="#指标体系设计" title="标题的直接链接">​</a></h2><p>接下来我们将为 AdventureWorks Sales 数据集创建指标体系以演示元数分析云指标管理的功能。上一篇 <a href="/blog/2023/06/14/sample-adv-1-modeling">范例：AdventureWorks Sales - 1. 建模</a> 创建了 AdventureWorks Sales 多维数据集，包含了维度：</p><ul><li>经销商 Reseller;</li><li>客户 Customer;</li><li>销售区域 Sales Territory;</li><li>日期 Date;</li><li>产品 Product;</li><li>销售订单 Sales Order;</li></ul><p>以及度量：</p><ul><li>销售数量 Sales Quantity;</li><li>销售额 Sales Amount;</li><li>成本 Total Product Cost;</li><li>单价 Unit Price;</li><li>利润 Profit;</li></ul><p>以下是一套比较完整的指标体系的示例，涵盖了销售、经销商、客户和产品等方面：</p><p>销售指标：</p><ol><li>销售额(Sales Amount)：总销售金额</li><li>销售数量(Sales Quantity)：总销售数量</li><li>总订单量(Sales Volume): 总订单数量</li><li>平均销售单价(Average Unit Price)：销售金额除以销售数量的平均值</li><li>每笔订单平均销售额(Sales Amount PerOrder)：总销售金额除以订单数量的平均值</li><li>互联网销售额(Internet Sales Amount): 互联网渠道的销售金额</li><li>经销商销售额(Reseller Sales Amount): 经销商渠道的销售金额</li></ol><p>客户指标：</p><ol><li>客户数量(Customer Count)：总客户数量</li><li>累计客户数量(Customer Grand Count)：截止到当前时间的累计客户总数量</li><li>客户购买频率(Customer Purchase Frequency)：平均每位客户的订单数量</li><li>客户平均销售额(Sales Amount per Customer)：平均每位客户的订单购买金额</li></ol><p>产品指标：</p><ol><li>产品销售数量(Product Quantity)：各产品的销售数量</li><li>畅销产品数量(Best Selling Product Quantity)：指定时间范围内销售数量最高的产品数量</li><li>产品销售额增长率(Product Sales Growth Rate)：相邻时间段内产品销售额的增长率</li><li>产品销售额占比(Product Sales Percentage)：每个产品销售额在总销售额中的占比</li></ol><p>区域指标：</p><ol><li>区域销售额(Region Sales Amount)：按区域划分的销售额</li><li>区域销售数量(Region Sales Quantity)：按区域划分的销售数量</li><li>区域销售额增长率(Region Sales Growth Rate)：相邻时间段内区域销售额的增长率</li><li>区域销售额占比(Region Sales Percentage)：每个区域销售额在总销售额中的占比</li></ol><p>经销商指标：</p><ol><li>经销商销售额(Reseller Sales Amount)：经销商的总销售金额</li><li>经销商销售数量(Reseller Sales Quantity)：经销商的总销售数量</li><li>经销商平均销售额(Sales Amount per Reseller)：经销商的平均销售金额</li><li>经销商订单数量(Reseller Order Count)：经销商的订单数量</li><li>经销商销售额占比(Reseller Sales Percentage)：经销商的销售额在总销售额中的占比</li><li>经销商活跃客户数量(Reseller Active Customer Count)：经销商在指定时间范围内有交易记录的客户数量</li></ol><p>这些指标将帮助你了解经销商在销售方面的表现、市场份额、客户活动等关键指标。你可以根据具体的需求和分析目标进行调整和扩展，以满足你的业务需求。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="业务域">业务域<a class="hash-link" href="#业务域" title="标题的直接链接">​</a></h3><p><a href="/docs/indicators/business-area/">业务域</a> 是指业务领域或业务功能的划分和组织。它代表了企业的不同业务部门、业务流程或业务功能，例如销售、采购、生产、人力资源等。每个业务域通常包含一组相关的指标和模型，用于衡量和监控该业务领域的业绩和绩效。业务域是一种有效的方式来组织和划分指标体系，通常将逻辑上相关的指标集合划分到同一个业务域。</p><p>根据上面的指标体系设计，如下图所示我们将销售业务域分为以下几个子业务域：</p><figure class="Middle"><img loading="lazy" src="/img/blog/adv/business-area-sales.png" alt="销售业务域" class="img_ev3q"><figcaption>销售业务域</figcaption></figure><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_S0QG"><p>关于业务域的更多信息，请参考 <a href="/docs/server/organization/business-area/">业务域</a>。</p></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="管理指标">管理指标<a class="hash-link" href="#管理指标" title="标题的直接链接">​</a></h2><p>接下来我们将在元数分析云系统中演示如何为以上指标体系创建相关的指标。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="项目">项目<a class="hash-link" href="#项目" title="标题的直接链接">​</a></h3><p>在元数分析云中指标的创建和维护等管理工作是以 <a href="/docs/stories/project/">🧰项目</a> 为单位进行的。在创建指标之前，你需要先创建一个项目（或使用默认项目），然后在项目中创建指标。</p><p>如下图所示，点击网站导航菜单中的“项目”-〉“指标”菜单，转到指标管理页面，项目使用默认项目。在指标管理工具栏中可以注册指标，批量导入指标，道出指标。</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/project-indicators.png" alt="项目指标管理" class="Shadow img_ev3q"><figcaption>项目指标管理</figcaption></figure><h3 class="anchor anchorWithStickyNavbar_LWe7" id="时间维度">时间维度<a class="hash-link" href="#时间维度" title="标题的直接链接">​</a></h3><p>在指标管理中指标通常需要定义时间维度，以帮助用户更方便地分析和比较指标的变化趋势。例如，你可以定义指标的时间维度为“年”、“季度”、“月”、“周”、“日”等，以便用户可以按照不同的时间维度来分析指标的变化趋势。</p><p>转到之前创建好的 AdventureWorks Sales 语义模型，打开 <strong>日期</strong> 维度界面，编辑维度属性：</p><ul><li>设置维度类型为 <strong>Time</strong></li><li>设置语义类型为 <strong>Calendar</strong></li></ul><figure class="Large"><img loading="lazy" src="/img/blog/adv/model-time-dimension.png" alt="语义模型时间维度" class="Shadow img_ev3q"><figcaption>语义模型时间维度</figcaption></figure><p>还要为时间维度下所有的层次结构的层级设置时间相关属性：</p><ul><li>层级时间类型为 <strong>Year</strong>, <strong>Quarter</strong>, <strong>Month</strong>, <strong>Week</strong>, <strong>Day</strong> 之一</li><li>语义类型为 <strong>Calendar Year</strong>, <strong>Calendar Quarter</strong>, <strong>Calendar Month</strong>, <strong>Calendar Week</strong>, <strong>Calendar Day</strong> 之一</li><li>语义格式化 <code>[yyyy]</code>, <code>[yyyy].[yyyyMM]</code>, <code>[yyyy].[yyyyMM].[yyyy-MM-dd]</code> 类似的格式字符串，根据实际成员的键值格式设置</li></ul><figure class="Large"><img loading="lazy" src="/img/blog/adv/model-time-dimension-level.png" alt="语义模型时间维度层级" class="Shadow img_ev3q"><figcaption>语义模型时间维度层级</figcaption></figure><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_S0QG"><p>关于时间维度的详细信息，请参考 <a href="/docs/models/mdx-modeling/calendar-dimension">📆日历维度</a>。</p></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="注册指标">注册指标<a class="hash-link" href="#注册指标" title="标题的直接链接">​</a></h3><p>转到项目中的指标管理页面，点击 <strong>注册</strong> 按钮，打开指标注册界面，输入指标的基础信息，如下图所示：</p><figure class="Middle"><img loading="lazy" src="/img/blog/adv/new-indicator-basic-info.png" alt="注册指标基础信息" class="img_ev3q"><figcaption>注册指标基础信息</figcaption></figure><ul><li>指标编码：指标的唯一标识，用于在系统中唯一标识指标，编码规则由用户自行规定，但需要保证组织内唯一。</li><li>指标名称：指标的名称，用于在系统中显示指标的名称。</li><li>认证：是组织内一个数据质量得到专业认可的过程。</li></ul><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_S0QG"><p>关于指标的更多信息，请参考 <a href="/docs/indicators/">💹指标管理</a>。</p></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="模型信息">模型信息<a class="hash-link" href="#模型信息" title="标题的直接链接">​</a></h3><p>定了指标的基础信息后，接下来该定义指标的模型信息了。如下图所示，选择语义模型后，选择模型实体：</p><figure class="Middle"><img loading="lazy" src="/img/blog/adv/new-indicator-model-info.png" alt="注册指标模型信息" class="img_ev3q"><figcaption>注册指标模型信息</figcaption></figure><ul><li>是否可见：指标是否可见，如果不可见，用户将无法在分析工具中看到该指标。</li><li>指标类型<ul><li>基础指标：指标为基础指标，指标的度量值将直接从模型实体的度量中选择之一。</li><li>衍生指标：指标为衍生指标，指标的度量值将通过公式计算得到。</li></ul></li><li>度量：基础指标的度量字段</li><li>日历维度：指标的日历维度，用于指标的时间分析，包括趋势，同环比等。</li><li>自由维度：指标的模型实体中非限定的维度，用于指标的分析，包括维度切片，维度下钻等。</li><li>限定条件：指标的限定条件，限定指标的数据范围。</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="限定条件">限定条件<a class="hash-link" href="#限定条件" title="标题的直接链接">​</a></h3><p><a href="/docs/indicators/restrictive-condition/">🔪限定条件</a> 是通过对多维数据集进行<em>切片</em>,<em>切块</em>和<em>组合切片</em>操作来减少数据集的维度数量进而降低数据分析的复杂度. 指标定义通过添加限定条件进行指标的细化定义，添加限定条件可以减少指标的自由维度数量以降低指标分析的复杂度。</p><p>如下图所示，通过添加<em>客户</em>和<em>产品</em>两个限定条件细化了指标的定义，通过减少了此指标的自由维度数量：</p><figure class="Middle"><img loading="lazy" src="/img/blog/adv/indicator-restrictive-conditions.png" alt="指标限定条件" class="img_ev3q"><figcaption>指标限定条件</figcaption></figure><h3 class="anchor anchorWithStickyNavbar_LWe7" id="衍生指标">衍生指标<a class="hash-link" href="#衍生指标" title="标题的直接链接">​</a></h3><p><a href="/docs/indicators/derivative-indicator/">💹衍生指标</a> 是指从原始度量值计算出来的值的指标。所以在指标注册时衍生指标需要设置类型为衍生指标并为其定义计算公式，如下图所示，
我们定义了一个衍生指标 <strong>平均销售单价</strong>，其计算公式为 <code>[Measures].[Sales Amount] / [Measures].[Sales Quantity]</code>，即为销售金额除以销售数量的平均值：</p><figure class="Middle"><img loading="lazy" src="/img/blog/adv/derivative-indicator.png" alt="衍生指标模型信息" class="img_ev3q"><figcaption>衍生指标模型信息</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="附录">附录<a class="hash-link" href="#附录" title="标题的直接链接">​</a></h2><iframe src="//player.bilibili.com/player.html?aid=998091682&amp;bvid=BV1Ys4y1671u&amp;cid=1187478679&amp;page=1" width="100%" height="500px" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe><p>以下是所有的指标数据</p><table><thead><tr><th>业务域</th><th>指标名称</th><th>指标编码</th><th>类型</th><th>度量或公式</th><th>限定条件</th></tr></thead><tbody><tr><td>销售指标</td><td>总销售额</td><td>ADV_Sales_Amount</td><td>基础</td><td>销售额</td><td></td></tr><tr><td></td><td>总销售数量</td><td>ADV_Sales_Quantity</td><td>基础</td><td>销售数量</td><td></td></tr><tr><td></td><td>总订单量</td><td>ADV_Sales_Volume</td><td>衍生</td><td><code>Count([Sales Order.Orders].[Sales Order].Members, EXCLUDEEMPTY)</code></td><td></td></tr><tr><td></td><td>平均销售单价</td><td>ADV_Average_Unit_Price</td><td>衍生</td><td><code>[Measures].[Sales Amount] / [Measures].[Sales Quantity]</code></td><td></td></tr><tr><td></td><td>平均销售额</td><td>ADV_Average_Sales_Amount</td><td>衍生</td><td><code>[Measures].[Sales Amount] / [Measures].[Volume]</code></td><td></td></tr><tr><td></td><td>互联网销售额</td><td>ADV_Internet_Sales_Amount</td><td>基础</td><td>销售额</td><td>Channel = Internet</td></tr><tr><td></td><td>经销商销售额</td><td>ADV_Reseller_Sales_Amount</td><td>基础</td><td>销售额</td><td>Channel = Reseller</td></tr><tr><td>客户指标</td><td>客户数量</td><td>ADV_Customer_Count</td><td>衍生</td><td><code>Count([Customer].[Customer].Members, ExcludeEmpty)</code></td><td></td></tr><tr><td></td><td>累计客户数量</td><td>ADV_Customer_Grand_Count</td><td>衍生</td><td><code>Count(    Extract(        Filter(           PeriodsToDate(               [Order Date].[(All)],               [Order Date].CurrentMember            ) * {[Customer].[Customer].Members},            NOT [Measures].[Sales Amount] is Empty        ),        [Customer]    ))</code></td><td></td></tr><tr><td></td><td>客户平均销售额</td><td>ADV_Sales_Amount_per_Customer</td><td>衍生</td><td><code>[Measures].[ADV_Internet_Sales_Amount] / [Measures].[Customer Count]</code></td><td></td></tr><tr><td></td><td>客户购买频率</td><td>ADV_Customer_Purchase_Frequency</td><td>衍生</td><td><code>[Measures].[Sales Quantity] / [Measures].[Customer Count]</code></td><td></td></tr><tr><td>产品指标</td><td>服装销售数量</td><td>ADV_Sales_Quantity_Clothing</td><td>基础</td><td>销售数量</td><td>Product = Clothing</td></tr><tr><td></td><td>自行车销售数量</td><td>ADV_Sales_Quantity_Bikes</td><td>基础</td><td>销售数量</td><td>Product = Bikes</td></tr><tr><td></td><td>自行车销售额</td><td>ADV_Sales_Amount_Bikes</td><td>基础</td><td>销售额</td><td>Product = Bikes</td></tr><tr><td></td><td>自行车销售额增长率</td><td>ADV_Sales_Growth_Rate_Bikes</td><td>衍生</td><td><code>([Measures].[Sales Amount] - CoalesceEmpty((Measures.[Sales Amount], [Order Date].PrevMember), Measures.[Sales Amount])) / CoalesceEmpty((Measures.[Sales Amount], [Order Date].PrevMember), Measures.[Sales Amount])</code></td><td>Product = Bikes</td></tr><tr><td></td><td>服装销售额占比</td><td>ADV_Sales_Percentage_Clothing</td><td>衍生</td><td><code>([Product.Products].CurrentMember, [Measures].[Sales Amount]) / ([Product.Products].[All Product.Productss], [Measures].[Sales Amount])</code></td><td>Product = Clothing</td></tr><tr><td></td><td>服装销售额增长率</td><td>ADV_Sales_Growth_Rate_Clothing</td><td>衍生</td><td><code>([Measures].[Sales Amount] - CoalesceEmpty((Measures.[Sales Amount], [Order Date].PrevMember), Measures.[Sales Amount])) / CoalesceEmpty((Measures.[Sales Amount], [Order Date].PrevMember), Measures.[Sales Amount])</code></td><td>Product = Clothing</td></tr><tr><td>区域指标</td><td>北美区销售额</td><td>ADV_Sales_Amount_North_America</td><td>基础</td><td>销售额</td><td>Sales Territory = North America</td></tr><tr><td>经销商指标</td><td>经销商数量</td><td>ADV_Reseller_Count</td><td>衍生</td><td><code>Count([Reseller].[Reseller].Members, ExcludeEmpty)</code></td><td></td></tr><tr><td></td><td>经销商平均销售额</td><td>ADV_Sales_Amount_per_Reseller</td><td>衍生</td><td><code>[Measures].[ADV_Reseller_Sales_Amount] / [Measures].[ADV_Reseller_Count]</code></td><td></td></tr></tbody></table>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="metad" term="metad"/>
        <category label="BI" term="BI"/>
        <category label="AdventureWorks Sales" term="AdventureWorks Sales"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[范例：AdventureWorks Sales - 2. 角色 & 访问控制]]></title>
        <id>/2023/06/21/sample-adv-2-roles</id>
        <link href="https://xpertai.cn/blog/2023/06/21/sample-adv-2-roles"/>
        <updated>2023-06-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[元数分析云中的语义模型提供了丰富的角色权限控制功能，以确保数据的安全性和访问控制。这些角色权限控制可以应用于多维数据集、维度、层级和成员，以满足用户的特定需求。]]></summary>
        <content type="html"><![CDATA[<p>元数分析云中的语义模型提供了丰富的角色权限控制功能，以确保数据的安全性和访问控制。这些角色权限控制可以应用于多维数据集、维度、层级和成员，以满足用户的特定需求。</p><p>在元数分析云中，可以创建两种类型的角色：单一角色和复合角色。</p><ol><li><p>单一角色：
单一角色是指拥有特定权限的独立角色。可以为单一角色指定访问多维数据集、维度、层级和成员的权限。这样，可以控制角色对数据模型中不同层次的访问和操作。</p></li><li><p>复合角色：
复合角色是由多个单一角色组合而成的角色。例如，可以为区域经理创建一个复合角色，允许其访问销售数据集中的子区域的合集。</p></li></ol><p>通过这些角色权限控制功能，元数分析云提供了灵活的 <a href="/docs/models/mdx-modeling/access-control/">🔐访问控制机制</a>，使管理员能够根据用户角色和需求，精确地管理数据的访问权限。这不仅保护了敏感数据的安全性，还确保了数据的合规性和隐私保护。</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/role-product-manager.png" alt="角色产品经理" class="Shadow img_ev3q"><figcaption>角色产品经理</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="角色设计">角色设计<a class="hash-link" href="#角色设计" title="标题的直接链接">​</a></h2><p>接下来我们将为 AdventureWorks Sales 数据集创建示例角色以演示元数分析云语义模型的角色权限控制的功能。上一篇 <a href="/blog/2023/06/14/sample-adv-1-modeling">范例：AdventureWorks Sales - 1. 建模</a> 创建了 AdventureWorks Sales 多维数据集，包含了维度：</p><ul><li>经销商 Reseller;</li><li>客户 Customer;</li><li>销售区域 Sales Territory;</li><li>日期 Date;</li><li>产品 Product;</li><li>销售订单 Sales Order;</li></ul><p>以及度量：</p><ul><li>订单数量 Order Quantity;</li><li>销售额 Sales Amount;</li><li>成本 Total Product Cost;</li><li>单价 Unit Price;</li><li>利润 Profit;</li></ul><p>首先我们为 Sales 数据集创建四个可能的单一角色的例子：</p><ol><li><p>销售经理：</p><ul><li>具有对销售数据集的完全访问权限，可以查看销售订单、产品销售情况等详细信息。</li><li>可以访问所有维度，包括时间、地区、产品等，以便进行全面的销售分析和报告。</li></ul></li><li><p>区域销售经理：</p><ul><li>可以访问销售数据集的部分内容，限定在特定区域的销售数据。</li><li>可以查看和分析特定地区的销售趋势、客户行为等数据。</li></ul></li><li><p>产品经理：</p><ul><li>具有对销售数据集除客户维度外的完全访问权限，但仅限于产品相关的信息。</li><li>可以查看产品销售情况、产品分类、产品属性等数据，并进行产品分析和比较。</li></ul></li><li><p>销售代表：</p><ul><li>具有有限的访问权限，仅能查看和分析与自己相关的客户信息。</li><li>可以查看个人销售业绩、客户反馈、订单状态等数据，以便跟踪和管理自己的销售业务。</li></ul></li></ol><p>接下来我们将为这些角色在系统中创建相应的角色定义。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="创建标准角色">创建标准角色<a class="hash-link" href="#创建标准角色" title="标题的直接链接">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="销售经理">销售经理<a class="hash-link" href="#销售经理" title="标题的直接链接">​</a></h3><p>销售经理 (Sales Manager) 具有对销售数据集的完全访问权限，所以我们创建一个标准角色并命名为 Sales Manager，然后为其分配 Sales 数据集的完全访问权限。</p><ul><li>角色概览<ul><li>默认访问：所有，权限包括所有维度和多维数据集</li><li>用户：分配给销售经理角色的用户账号</li></ul></li><li>多维数据集：销售<ul><li>默认访问：所有，权限包括所有维度和度量</li></ul></li></ul><figure class="Large flex flex-col justify-start items-center"><video controls="" width="100%" autoplay="true" loop=""><source src="/img/blog/adv/create-role.webm" type="video/webm"></video><figcaption>创建新角色</figcaption></figure><p>语义模型管理员可以在角色概览界面添加用户，即为用户分配角色。也可以在访问控制概览界面里的用户管理中为用户分配角色。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="区域销售经理">区域销售经理<a class="hash-link" href="#区域销售经理" title="标题的直接链接">​</a></h3><p>区域销售经理 (Regional Sales Manager) 的访问权限被限定在特定区域的销售数据，我们将使用 Sales 数据集的销售区域 (Sales Territory) 维度成员来对不同的区域销售经理角色进行区分。</p><p>例如，我们为区域销售经理创建了两个角色：</p><ul><li>北美区域销售经理 (Regional Sales Manager - North America)</li><li>欧洲区域销售经理 (Regional Sales Manager - Europe)</li></ul><p>如下图所示，为北美区域销售经理创建一个标准角色，角色的默认访问权限设置为 <strong>所有</strong> 代表除了特殊限制的销售区域成员外其他维度可以自由访问</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/role-regional-sales-manager.png" alt="角色区域销售经理" class="Shadow img_ev3q"><figcaption>角色区域销售经理</figcaption></figure><p>添加多维数据集 Sales 到此角色内，并转到此数据集的角色设置界面，并设置属性</p><ul><li>默认访问：所有，代表除了特殊限制的销售区域成员外其他维度可以自由访问</li></ul><p>然后为该角色添加限制条件，限制条件为销售区域 (Sales Territory) 维度的成员，将维度 Sales Territory 拖至右侧区域以添加维度限定条件，并设置维度的权限配置：</p><ul><li>汇总策略：隐藏，代表禁止访问除允许的成员外的总数据。</li><li>默认访问：自定义，代表使用显式方式设置成员权限。</li></ul><p>然后展开销售区域的层级大区的成员，将 <strong>North America</strong> 拖至维度限定的成员区域，即此角色用户只能访问北美区域的销售数据。</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/role-regional-sales-manager-cube.png" alt="角色区域销售经理多维数据集" class="Shadow img_ev3q"><figcaption>角色区域销售经理多维数据集</figcaption></figure><p>最终设置了此角色的用户将只能访问销售区域为北美的及其子成员的销售数据。</p><p>同理创建欧洲区域销售经理的角色，将销售区域的限定条件设置为 <strong>Europe</strong>。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="产品经理">产品经理<a class="hash-link" href="#产品经理" title="标题的直接链接">​</a></h3><p>产品经理 (Product Manager) 是限于访问特定产品相关的信息，并且不能访问客户维度的信息的角色，除此之外其他维度可以自由访问。</p><p>例如我们为产品经理创建了三个角色：</p><ul><li>产品经理 (Product Manager)</li><li>产品经理 - 自行车 (Product Manager - Bikes)</li><li>产品经理 - 服装 (Product Manager - Clothing)</li></ul><p>如下图所示，创建了 <strong>产品经理 - 服装</strong> 的产品经理角色，其在产品维度上只能访问 <strong>Clothing</strong> 成员及其子成员的数据，并且不能访问客户维度的数据：</p><ul><li>产品维度：<ul><li>汇总策略：隐藏，代表禁止访问除允许的成员外的总数据。</li><li>默认访问：自定义，代表使用显式方式设置成员权限。<ul><li>Clothing：允许访问</li></ul></li></ul></li><li>客户维度：<ul><li>默认访问：无，代表禁止访问客户维度的数据。</li></ul></li></ul><figure class="Large"><img loading="lazy" src="/img/blog/adv/role-product-manager.png" alt="角色产品经理" class="Shadow img_ev3q"><figcaption>角色产品经理</figcaption></figure><p>其他两个角色的设置类似，只是产品经理 (Product Manager) 在产品维度上能访问所有数据，产品经理 - 自行车 (Product Manager - Bikes)在产品维度上只能访问 <strong>Bikes</strong> 成员及其子成员的数据。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="销售代表">销售代表<a class="hash-link" href="#销售代表" title="标题的直接链接">​</a></h3><p>销售代表 (Sales Representative) 角色具有可以查看包括销售数据、客户信息和销售业绩指标的能力，</p><p>例如我们为这两个城市的销售代表分别创建两个角色：</p><ul><li>销售代表 - 旧金山 (Sales Representative - San Francisco)</li><li>销售代表 - 伦敦 (Sales Representative - London)</li></ul><figure class="Large"><img loading="lazy" src="/img/blog/adv/role-sales-representative.png" alt="角色销售代表" class="Shadow img_ev3q"><figcaption>角色销售代表</figcaption></figure><p>其他的销售代表也可以按照具体客户或者更大的负责范围进行创建角色，如 Germany (Country 层级) 或 California (State 层级)。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="复合角色">复合角色<a class="hash-link" href="#复合角色" title="标题的直接链接">​</a></h2><p>复合角色 (Composite Role) 是由多个角色组合而成的角色，复合角色可以包含其他复合角色，但是不能包含自身。 例如，我们可以创建一个复合角色，将产品经理 (Product Manager) 和销售代表 (Sales Representative) 组合成一个角色，这样的话，这个角色的用户就可以同时访问产品经理和销售代表的数据。</p><p>如下图所示，创建一个复合角色，创建角色时选择类型为 <strong>复合角色</strong>，然后将需要组合的角色拖至右侧角色管理区域即可：</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/composite-role.png" alt="复合角色" class="Shadow img_ev3q"><figcaption>复合角色</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="授权用户">授权用户<a class="hash-link" href="#授权用户" title="标题的直接链接">​</a></h2><p>角色和权限设置完成后，您可以将用户授权到相应的角色上。这可以通过将用户与角色关联来实现。您可以在角色的用户管理中添加用户账号来关联。</p><p>如下图所示，在角色的用户管理中添加用户账号来关联：</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/role-authorization-add-user.png" alt="角色添加用户" class="Shadow img_ev3q"><figcaption>角色添加用户</figcaption></figure><p>或者在访问控制概览界面的用户管理里添加用户账号并分配角色来关联权限：</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/role-authorization-overview.png" alt="角色概览管理用户" class="Shadow img_ev3q"><figcaption>角色概览管理用户</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="验证权限">验证权限<a class="hash-link" href="#验证权限" title="标题的直接链接">​</a></h2><p>分配角色给用户之后我们可以验证用户的权限是否正确。如果是模型编辑者自己可以将角色分配给自己账号，然后转到多维数据集的计算界面，通过数据预览验证数据是否受角色权限的限制了。</p><p>如下图所示，当前账号分配了 <strong>Product Manager &amp; Representative London</strong> 角色，那么此账号在客户维度上只能访问到 <strong>London</strong> 的客户数据并且在产品维度上能访问所有产品数据：</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/verify-role-permissions.png" alt="验证权限" class="Shadow img_ev3q"><figcaption>验证权限</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a class="hash-link" href="#总结" title="标题的直接链接">​</a></h2><p>元数分析云的语义模型提供了强大的角色管理和权限控制功能。通过角色管理，用户可以创建和定义不同的角色，并将用户授权到这些角色上。每个角色可以具有特定的数据访问权限，包括对维度、层级和成员的访问控制。角色的权限可以是单一角色或复合角色，允许灵活地定义数据的可见性和操作权限。通过这种方式，元数分析云的语义模型确保了安全性和数据隔离，同时使得用户能够根据其角色的权限访问和操作相应的数据，从而提升数据分析和决策的效率和准确性。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="附录">附录<a class="hash-link" href="#附录" title="标题的直接链接">​</a></h2><iframe src="//player.bilibili.com/player.html?aid=272671391&amp;bvid=BV1nF411d71G&amp;cid=1175381647&amp;page=1" width="100%" height="500px" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="metad" term="metad"/>
        <category label="BI" term="BI"/>
        <category label="AdventureWorks Sales" term="AdventureWorks Sales"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[范例：AdventureWorks Sales - 1. 建模]]></title>
        <id>/2023/06/14/sample-adv-1-modeling</id>
        <link href="https://xpertai.cn/blog/2023/06/14/sample-adv-1-modeling"/>
        <updated>2023-06-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[在当今数据驱动的时代，对于企业来说，充分利用数据进行深入分析和洞察已成为取得竞争优势的关键。PowerBI 是一款广受欢迎的商业智能工具，而元数分析云作为一种功能强大的数据分析平台，提供了与 PowerBI 相当的建模能力。本文将探讨如何利用元数分析云的语义模型实现与 PowerBI 相似的功能效果，并使用 AdventureWorks Sales 的数据表进行演示。]]></summary>
        <content type="html"><![CDATA[<p>在当今数据驱动的时代，对于企业来说，充分利用数据进行深入分析和洞察已成为取得竞争优势的关键。PowerBI 是一款广受欢迎的商业智能工具，而元数分析云作为一种功能强大的数据分析平台，提供了与 PowerBI 相当的建模能力。本文将探讨如何利用元数分析云的语义模型实现与 PowerBI 相似的功能效果，并使用 AdventureWorks Sales 的数据表进行演示。</p><p>如下图所示 AdventureWorks Sales 数据集在 PowerBI 中的数据关系模型：</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/sample-adv-modeling.png" alt="模型" class="img_ev3q"><figcaption>AdventureWorks Sales 模型</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="演示数据">演示数据<a class="hash-link" href="#演示数据" title="标题的直接链接">​</a></h2><p>PowerBI Samples 数据集中的 AdventureWorks Sales 是一个常用的示例数据集，用于展示 PowerBI 的数据建模和可视化功能。AdventureWorks Sales 数据集模拟了一个销售业务场景，包含了多个表格，如下所示：</p><ol><li>Customer（客户）：包含有关客户的信息，如客户ID、姓名、地址等。这个表格用于跟踪和分析不同客户的销售情况，例如客户的购买历史和地理位置分布。</li><li>Date（日期）：记录了日期和与之相关的信息，如年份、季度、月份等。这个表格可以用于时间维度的分析，例如按年度、季度或月度对销售数据进行趋势分析和比较。</li><li>Product（产品）：描述了公司提供的产品，包括产品ID、名称、描述等。这个表格用于对不同产品的销售情况进行分析，例如畅销产品、产品类别分布等。</li><li>Reseller（经销商）：记录了经销商的详细信息，如经销商ID、名称、地址等。这个表格用于分析不同经销商的销售绩效和市场份额。</li><li>Sales（销售）：包含有关销售事务的信息，如销售ID、销售日期、销售金额等。这个表格是 AdventureWorks Sales 数据集的核心，用于分析销售业务的各个方面，例如销售额、销售趋势、销售地区等。</li><li>Sales Order（销售订单）：记录了销售订单的详细信息，如订单ID、客户ID、产品ID等。这个表格用于跟踪和分析销售订单的状态、订单量和订单周期等。</li><li>Sales Territory（销售地区）：描述了销售地区的详细信息，如地区ID、名称、国家/地区等。这个表格用于分析不同地区的销售业绩和市场份额。</li></ol><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>信息</div><div class="admonitionContent_S0QG"><p>AdventureWorks Sales 数据集下载请参考 <a href="https://github.com/microsoft/powerbi-desktop-samples/blob/main/AdventureWorks%20Sales%20Sample/AdventureWorks%20Sales.xlsx" target="_blank" rel="noopener noreferrer">powerbi-desktop-samples/AdventureWorks Sales Sample</a>。</p></div></div><p>本文我们将演示通过使用 AdventureWorks Sales 数据集，在数据模型中创建适当的关系，定义维度和度量，并运用元数分析云的可视化功能来展示和探索数据。用户可以通过创建交互式报表、仪表盘和图表来分析销售数据，发现趋势、模式和关联，并从中获取同使用 PowerBI 同样有价值的洞察和决策支持。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="创建语义模型">创建语义模型<a class="hash-link" href="#创建语义模型" title="标题的直接链接">​</a></h2><p>在创建语义模型之前假设我们已经将 AdventureWorks Sales 数据导入了数据库，假设数据表都以 <code>adv_</code> 开头。</p><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_S0QG"><p>元数分析云个人用户可以使用元数分析云的内置数据源 <strong>Demo - PG DB</strong> 的 <strong>public</strong> 目录下的 <code>adv_</code> 开头的数据表。</p></div></div><p>为 AdventureWorks Sales 数据集新建语义模型，选择<strong>使用 MDX 建模</strong>：</p><figure class="Middle"><img loading="lazy" src="/img/blog/adv/create-semantic-model.png" alt="创建语义模型" class="Shadow img_ev3q"><figcaption>创建 AdventureWorks Sales 语义模型</figcaption></figure><p>创建成功后打开此语义模型的工作空间。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="创建维度">创建维度<a class="hash-link" href="#创建维度" title="标题的直接链接">​</a></h2><p>我们需要先创建维度，维度是用于描述事实的属性，例如产品、客户、时间等。在 AdventureWorks Sales 数据集中，我们可以从 <code>adv_product</code>、<code>adv_customer</code> 和 <code>adv_date</code> 等数据表中创建维度。</p><p>以创建 Reseller 维度为例，如下图所示将物理表 <code>adv_reseller</code> 拖放至实体区域便会弹出创建维度的对话框，选择类型为 <strong>维度</strong>；输入维度名称和标签；在右侧表字段列表中设定一个字段为维度<strong>主键</strong>，并选择默认<strong>显示</strong>的字段；点击<strong>应用</strong>按钮即可创建维度。</p><figure class="Large flex flex-col justify-start items-center"><video controls="" width="100%" autoplay="true" loop=""><source src="/img/blog/adv/create-shared-dimension.webm" type="video/webm"></video><figcaption>创建维度</figcaption></figure><p>打开维度设计器界面后，可以详细修改维度的结构和属性。例如下图所示修改经销商维度的业务类型层级属性，名称改为 <strong>Business Type</strong>, 文本标签改为 <strong>业务类型</strong>，选中<strong>成员唯一</strong>。</p><figure class="Large flex flex-col justify-start items-center"><video controls="" width="100%" autoplay="true" loop=""><source src="/img/blog/adv/edit-level-name-caption.webm" type="video/webm"></video><figcaption>编辑维度层级属性</figcaption></figure><p>修改经销商层级的属性，并设置其 <strong>说明字段</strong> 为 <strong>reseller</strong>，这样就表示该层级成员的技术 ID 为 <code>reseller_id</code> 字段的值，而显示文本名称为 <code>reseller</code> 字段的值。按实际情况对层级设置 <strong>成员唯一</strong> 有利于 OLAP 引擎对查询性能进行优化。</p><figure class="Large flex flex-col justify-start items-center"><video controls="" width="100%" autoplay="true" loop=""><source src="/img/blog/adv/edit-level-caption-column.webm" type="video/webm"></video><figcaption>编辑维度层级说明字段</figcaption></figure><h3 class="anchor anchorWithStickyNavbar_LWe7" id="创建层次结构">创建层次结构<a class="hash-link" href="#创建层次结构" title="标题的直接链接">​</a></h3><p>上述创建的经销商维度只是默认层次结构，我们还可以为其创建多个层次结构，例如按经销商区域地理信息创建层次结构。如下图所示，添加层次结构按钮新建一个层次结构，将数据表拖放至维度表区域，并在层次结构属性中设置层次结构名称和标签和 <strong>维度主键</strong>：</p><figure class="Large flex flex-col justify-start items-center"><video controls="" width="100%" autoplay="true" loop=""><source src="/img/blog/adv/new-hierarchy.webm" type="video/webm"></video><figcaption>新建层次结构</figcaption></figure><p>添加层级，如下图所示，将经销商区域字段（<code>country_region</code>, <code>state_province</code>, <code>city</code>, <code>postal_code</code>）拖放至层级区域，并设置层级的详细属性，这里不再赘述。</p><figure class="Large flex flex-col justify-start items-center"><video controls="" width="100%" autoplay="true" loop=""><source src="/img/blog/adv/add-hierarchy-levels.webm" type="video/webm"></video><figcaption>添加层次结构的层级字段</figcaption></figure><p>在维度的数据预览区域我们可以看到维度按层级顺序显示的维度成员详细数据。</p><p>其他维度 <strong>Customer</strong>、<strong>Date</strong>、<strong>Product</strong>、<strong>Sales Order</strong> 和 <strong>Sales Territory</strong> 的创建过程类似，这里不再赘述。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="创建多维数据集">创建多维数据集<a class="hash-link" href="#创建多维数据集" title="标题的直接链接">​</a></h2><p>接下来我们将使用事实表 <code>adv_sales</code> 创建多维数据集，如下图所示将 <code>adv_sales</code> 拖放至实体区域便会弹出创建多维数据集的对话框，选择类型为 <strong>多维数据集</strong>；输入维度名称和标签；在右侧表字段列表设置度量字段和维度字段关联的共享维度；点击<strong>应用</strong>按钮即可创建多维数据集。</p><figure class="Large flex flex-col justify-start items-center"><video controls="" width="100%" autoplay="true" loop=""><source src="/img/blog/adv/create-cube.webm" type="video/webm"></video><figcaption>创建多维数据集</figcaption></figure><p>打开 Sales 多维数据集的设计器界面，如下图所示，我们可以看到多维数据集的结构，包括维度、度量和计算成员。在多维数据集设计器中，我们可以对多维数据集的结构和属性进行详细修改。</p><ul><li>为多维数据集设置默认度量；</li><li>修改多维数据集、度量的名称和标签；</li></ul><figure class="Large"><img loading="lazy" src="/img/blog/adv/cube-designer.png" alt="多维数据集设计器" class="Shadow img_ev3q"><figcaption>Sales 多维数据集设计器</figcaption></figure><h3 class="anchor anchorWithStickyNavbar_LWe7" id="多对一维度">多对一维度<a class="hash-link" href="#多对一维度" title="标题的直接链接">​</a></h3><p>对于日期这个维度，销售多维数据集上有多个维度都会关联此维度，例如下单日期、截止日期和发货日期，那么我们需要为这些共用相同维度的关系设置不同的名称。</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/shared-dimension-nx1.png" alt="共用维度" class="Shadow img_ev3q"><figcaption>共用维度</figcaption></figure><p>维度名称分别修改为 <strong>Order Date</strong>, <strong>Due Date</strong> 和 <strong>Ship Date</strong>，这样这些维度就不会因为共用一个共享维度而重名了。</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="计算成员">计算成员<a class="hash-link" href="#计算成员" title="标题的直接链接">​</a></h3><p>在语义模型中，计算成员（Calculated Members）是一种由用户定义的、基于已有数据和计算逻辑生成的虚拟成员。计算成员允许用户在数据模型中执行自定义计算和聚合操作，以提供更丰富和灵活的分析和洞察。</p><p>以下是关于语义模型中计算成员的一些重要信息：</p><ol><li><p>定义和创建：计算成员可以在语义模型中通过公式或表达式的方式进行定义和创建。用户可以使用MDX（多维表达式）查询语言来编写计算成员的逻辑。这些表达式可以包括数学运算、条件判断、函数调用等，以根据需要计算和衍生出新的数据。</p></li><li><p>应用范围：计算成员可以应用于维度和度量两个层面。在维度层面，计算成员可以为维度添加新的分类、层次结构或层级成员。在度量层面，计算成员可以通过对现有度量进行计算、聚合或重定义，生成新的度量指标。</p></li><li><p>自定义聚合：计算成员可以用于定义自定义聚合操作。用户可以使用计算成员来创建新的聚合规则，例如计算平均值、总和、百分比等。这使得用户能够根据特定的业务需求和分析要求，灵活地对数据进行聚合和汇总。</p></li><li><p>动态和交互式：计算成员可以根据用户的查询和上下文动态地计算和展示数据。这意味着在用户进行数据分析和探索时，计算成员可以根据当前的选择和过滤条件实时更新结果，提供与数据交互的能力。</p></li><li><p>高级计算：计算成员还可以用于实现更复杂的分析和计算需求。用户可以利用计算成员来进行高级数据建模，例如创建时间相关的计算、比较分析、预测模型等。这扩展了语义模型的功能，使用户能够进行更深入的数据挖掘和洞察。</p></li></ol><p>例如我们需要计算 Profit，那么我们可以在计算成员区域中添加一个计算成员，如下图所示编辑其计算公式为</p><div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token maybe-class-name">Measures</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">[</span><span class="token maybe-class-name">Sales</span><span class="token plain"> </span><span class="token maybe-class-name">Amount</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token maybe-class-name">Measures</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">[</span><span class="token maybe-class-name">Total</span><span class="token plain"> </span><span class="token maybe-class-name">Product</span><span class="token plain"> </span><span class="token maybe-class-name">Cost</span><span class="token punctuation" style="color:#393A34">]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><figure class="Large flex flex-col justify-start items-center"><video controls="" width="100%" autoplay="true" loop=""><source src="/img/blog/adv/calculated-member.webm" type="video/webm"></video><figcaption>编辑计算成员公式</figcaption></figure><p>同理再添加一个计算成员 Profit Margin 计算公式为</p><div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token maybe-class-name">Measures</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">[</span><span class="token maybe-class-name">Profit</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token maybe-class-name">Measures</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">[</span><span class="token maybe-class-name">Sales</span><span class="token plain"> </span><span class="token maybe-class-name">Amount</span><span class="token punctuation" style="color:#393A34">]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_S0QG"><p>这里的 Profit Margin 计算公式属于百分比计算，需要设置<strong>单位</strong>属性为 <code>%</code>，这样在可视化组件中展示时会自动转换为百分比格式。</p></div></div><p>通过使用计算成员，语义模型提供了灵活性和可扩展性，使用户能够根据具体的业务需求和分析目标，创建定制化的计算和度量指标。这有助于用户更全面地理解和解释数据，发现潜在的关联和模式，并支持更准确的决策和业务优化。</p><p>更多关于计算成员的文档请参考 <a href="/docs/models/mdx-modeling/calculated-member">🧮计算成员</a></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="数据预览">数据预览<a class="hash-link" href="#数据预览" title="标题的直接链接">​</a></h3><p>数据预览功能允许用户通过拖拽维度、度量和计算成员到行列或过滤器上，以预览多维数据集的查询结果。这种交互式的方式让用户可以快速了解和探索数据，从而更好地理解数据的结构、分布和关系。</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/cube-calculation-preview.png" alt="数据预览" class="Shadow img_ev3q"><figcaption>数据预览</figcaption></figure><p>关于多维数据集的预览功能参考 <a href="/docs/models/cube-designer/#%E8%AE%A1%E7%AE%97">🧊多维数据集设计器 - 计算</a></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="查询语句">查询语句<a class="hash-link" href="#查询语句" title="标题的直接链接">​</a></h2><p>多维数据集的自定义查询语句功能允许用户通过编写 MDX（多维表达式）查询语句，以自定义的方式进行数据分析和探索。MDX 是一种用于多维数据分析的查询语言，常用于访问和操作 OLAP（联机分析处理）数据源。</p><figure class="Large"><img loading="lazy" src="/img/blog/adv/cube-query.png" alt="查询语句" class="Shadow img_ev3q"><figcaption>查询语句</figcaption></figure><h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a class="hash-link" href="#总结" title="标题的直接链接">​</a></h2><p>在当今数据驱动的时代，充分利用数据进行深入分析和洞察已成为企业获取竞争优势的关键。本文介绍了如何利用元数分析云的语义模型实现与 PowerBI 相似的建模功能效果，并以 AdventureWorks Sales 数据表为例进行演示。AdventureWorks Sales 数据集包含了客户、日期、产品、经销商、销售订单和销售地区等多个表格，通过创建维度和多维数据集，我们可以构建完整的数据关系模型。语义模型的创建过程包括定义维度、创建层次结构、设置共享维度以及添加计算成员，这些功能可以帮助用户更好地理解和分析数据，从而支持更准确的决策和业务优化。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="附录">附录<a class="hash-link" href="#附录" title="标题的直接链接">​</a></h2><iframe src="//player.bilibili.com/player.html?aid=700061780&amp;bvid=BV1Hm4y1e7po&amp;cid=1170116263&amp;page=1" width="100%" height="500px" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe><iframe src="//player.bilibili.com/player.html?aid=572552293&amp;bvid=BV1wz4y1H7WZ&amp;cid=1171348779&amp;page=1" width="100%" height="500px" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="metad" term="metad"/>
        <category label="BI" term="BI"/>
        <category label="AdventureWorks Sales" term="AdventureWorks Sales"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[元数分析云与 Doris 的集成]]></title>
        <id>use-metad-with-doris</id>
        <link href="https://xpertai.cn/blog/use-metad-with-doris"/>
        <updated>2023-06-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[摘要]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="摘要">摘要<a class="hash-link" href="#摘要" title="标题的直接链接">​</a></h2><p>本文将详细介绍元数分析云与 Doris 集群的集成，探讨如何利用元数分析云的多维建模和指标管理功能，充分发挥 Doris 集群 MPP 架构的数据并行计算能力，为用户提供强大的数据分析和查询解决方案。</p><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>信息</div><div class="admonitionContent_S0QG"><p>关于如何本地化部署元数分析云和 Doris 集群请参考文档 <a href="/docs/getting-started/docker/">部署 Docker 集群</a> 中的 <code>with-doris</code> 两个 docker compose 配置文件。</p></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="背景">背景<a class="hash-link" href="#背景" title="标题的直接链接">​</a></h2><p><a href="https://doris.apache.org/" target="_blank" rel="noopener noreferrer">Apache Doris</a> 是一个开源的大数据存储与计算引擎，专注于海量数据的高性能查询和实时分析。它采用分布式、列式存储的方式，支持并行计算和水平扩展，具备出色的查询性能和数据处理能力。Doris集群通过MPP（Massively Parallel Processing）引擎，可以同时处理大规模数据集上的复杂查询，并提供实时的查询结果。</p><p>将元数分析云与 Doris 集群进行集成, 首先，可以充分发挥 Doris 集群的数据计算能力，利用其并行计算和高性能查询的优势，加速数据分析和决策过程。其次，可以将元数分析云的多维建模和指标管理能力与Doris 集群的数据存储和计算能力相结合，实现数据的全面管理和分析，提高数据的可用性和质量。此外，集成还可以简化数据流程和操作，提升数据处理的效率和准确性。最重要的是，集成后的元数分析云和 Doris 集群组合将为企业提供更强大、高效和可靠的数据分析平台，支持更深入的业务洞察和智能决策。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="多维建模">多维建模<a class="hash-link" href="#多维建模" title="标题的直接链接">​</a></h2><p>多维建模是一种高效地组织和管理数仓数据的方法，通过以维度为中心构建模型，将数据按照事实表和维度表的结构进行组织。</p><p>多维建模使用业务系统原始表进行建模的方法可以显著降低业务复杂度并提高模型灵活度。</p><ol><li><p>简化数据模型：多维建模将复杂的业务数据模型转化为简单的维度模型。它通过识别业务事实和维度，并将它们映射到事实表和维度表的结构中。这种模型更贴近业务用户的认知，使他们能够更轻松地理解和查询数据，减少了对复杂SQL查询的依赖。</p></li><li><p>聚焦业务指标：多维建模侧重于业务指标的定义和分析。它将业务指标作为事实表中的度量，并将维度属性作为维度表中的描述性属性。这种方式使得用户可以更加专注于关注的指标，而不需要深入理解原始表之间的复杂关系和连接操作。</p></li><li><p>提供灵活的数据分析：多维建模通过将数据切分为维度和度量，为用户提供了灵活的数据分析能力。用户可以根据需要选择和组合不同的维度，进行切片和钻取分析，从不同角度观察业务指标的变化。这种灵活性使用户能够根据具体业务需求快速进行数据探索和分析，提高决策的准确性和效率。</p></li><li><p>数据冗余和预计算：多维建模中常用的一种优化技术是通过数据冗余和预计算来提高查询性能。通过在维度表和事实表中存储冗余的汇总数据和预计算的指标，可以加速查询过程，减少对原始表的访问次数。这种方式降低了查询的复杂度，并提高了数据查询的响应速度。</p></li></ol><p>相较于传统的数仓 SQL 建模方式，多维建模能够更好地发挥 Doris 集群的并行计算能力：</p><ol><li><p>维度模型：多维建模使用维度模型来组织数据，并用来关联事实表。事实表存储了业务指标数据，而维度表存储了与事实表相关的维度属性。这种模型使得查询变得更加简单和高效，可以通过连接维度表和事实表来实现复杂的查询和聚合操作。Doris 集群通过并行处理维度表和事实表之间的连接操作，能够快速计算出准确的结果。</p></li><li><p>聚合和汇总：多维建模中常用的一种优化技术是聚合和汇总。通过预先计算和存储一些常用的聚合指标，可以加速查询过程。Doris 集群在执行聚合查询时，能够利用其并行计算能力，同时处理多个聚合操作，从而提高查询的响应速度。</p></li><li><p>查询优化：多维建模中，通过定义合适的维度和度量，以及使用合适的聚合和汇总策略，可以优化查询性能。Doris 集群具有智能的查询优化器，能够根据查询语句和数据分布等信息，选择最优的执行计划，充分发挥并行计算的能力，提高查询效率。</p></li></ol><p>多维建模能够更好地发挥 Doris 集群的并行计算能力，通过合适的数据存储格式、维度模型、聚合和汇总策略，以及查询优化，实现高效的数据分析和查询。与传统的数仓 SQL 建模方式相比，多维建模更适合与 Doris 集群集成，充分发挥其并行计算能力，提升数据处理和分析的性能。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="安装部署">安装部署<a class="hash-link" href="#安装部署" title="标题的直接链接">​</a></h2><p>至此客户想要本地化部署安装元数分析云与 Doris 集群的集成有两种方式：</p><ul><li>安装元数分析云与 Doris 集成版。适合还没有自己的大数据平台的用户们，可以直接安装元数分析云与 Doris 集成版，一键安装，快速上手。</li><li>安装元数分析云标准版。适合已经有自己的 Doris 大数据平台的用户们，可以单独安装元数分析云标准版，然后通过元数分析云的数据源管理功能，连接到自己的 Doris 集群。</li></ul><p>元数分析云标准版的安装请参考文档 <a href="/docs/getting-started/">🚀安装部署</a>, 元数分析云与 Doris 集成版的安装请参考文档 <a href="/docs/getting-started/docker#%E9%9B%86%E6%88%90-doris-%E9%9B%86%E7%BE%A4">部署 Docker 集群 #集成 Doris 集群</a>.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="综述">综述<a class="hash-link" href="#综述" title="标题的直接链接">​</a></h2><p>多维建模使用业务系统原始表进行建模可以降低业务复杂度和提高灵活度。它通过简化数据模型、聚焦业务指标、提供灵活的数据分析和利用数据冗余和预计算等方式，使用户能够更轻松地理解和查询数据，快速进行数据分析，从而提高业务决策的准确性和效率。</p><p>元数分析云提供了免费的安装包，可以与 Doris 集群进行集成使用。用户可以充分利用Doris集群的数据计算能力和元数分析云的多维建模和指标管理功能，实现高效的数据分析和查询。用户可以放心地部署和使用元数分析云，满足他们的数据分析需求。</p>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="metad" term="metad"/>
        <category label="doris" term="doris"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[让 ChatGPT 帮助分析指标数据]]></title>
        <id>use-chatgpt-in-indicator-system</id>
        <link href="https://xpertai.cn/blog/use-chatgpt-in-indicator-system"/>
        <updated>2023-03-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[最近两周，由 OpenAI 推出的自然语言处理模型 ChatGPT-4 在业界引起了极大的关注和讨论。这一模型不仅具有前所未有的规模和性能，还具有更高的准确性和更强的智能化。ChatGPT-4 的推出，将极大地推动自然语言处理技术的发展，改变人机交互的方式，为人类创造更多的机会和价值。Metad 分析云非常关注 ChatGPT 的发展，将其引入到自己的数据分析平台中，为企业用户提供更为智能、高效的数据分析和决策支持。]]></summary>
        <content type="html"><![CDATA[<p>最近两周，由 OpenAI 推出的自然语言处理模型 ChatGPT-4 在业界引起了极大的关注和讨论。这一模型不仅具有前所未有的规模和性能，还具有更高的准确性和更强的智能化。ChatGPT-4 的推出，将极大地推动自然语言处理技术的发展，改变人机交互的方式，为人类创造更多的机会和价值。Metad 分析云非常关注 ChatGPT 的发展，将其引入到自己的数据分析平台中，为企业用户提供更为智能、高效的数据分析和决策支持。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="指标管理">指标管理<a class="hash-link" href="#指标管理" title="标题的直接链接">​</a></h2><p>在企业运营过程中，指标管理是一个非常重要的环节。通过指标管理，企业能够深入了解自身的业务状况，提高决策效率和业务绩效。Metad 分析云中的指标管理系统，为企业提供了一种高效、灵活、可扩展的指标管理解决方案。</p><figure class="Small"><img loading="lazy" src="/img/indicator/indicator-app-iphone.png" alt="手机端指标应用程序" class="img_ev3q"><figcaption>iPhone 13 指标应用程序</figcaption></figure><p>Metad 分析云中的指标管理系统具有以下几个方面的优势：</p><ul><li><p><strong>易用性</strong>：Metad 分析云中的指标管理系统拥有友好的用户界面，易于使用。无需专业的数据分析和编程知识，用户可以方便地设置和管理自己的指标体系。</p></li><li><p><strong>数据可视化</strong>：Metad 分析云中的指标管理系统拥有强大的数据可视化能力。用户可以通过自定义图表、报表等方式，将数据展现得更加直观、生动，方便用户更深入地了解业务状况。</p></li><li><p><strong>多维度分析</strong>：Metad 分析云中的指标管理系统支持多维度分析，用户可以通过不同的维度对指标进行深入分析，挖掘更多的业务信息，支持复杂的业务分析和决策。</p></li><li><p><strong>实时监控和预警</strong>：Metad 分析云中的指标管理系统支持实时数据监控和预警功能。当指标出现异常时，系统可以及时进行预警，帮助用户快速定位问题，提高业务反应速度和质量。</p></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="chatgpt">ChatGPT<a class="hash-link" href="#chatgpt" title="标题的直接链接">​</a></h2><p>在<a href="/docs/indicators/app/">指标应用</a>中用户可以使用 ChatGPT 对指标数据进行智能分析，提供深度的数据洞察力，自动发现数据之间的联系和规律，帮助企业深入了解业务状况，提升决策质量和效率。</p><div class="flex"><figure class="Small" style="margin-right:5px"><img loading="lazy" src="/img/indicator/indicator-app-free-dimensions.png" alt="指标自由维度设置过滤条件" class="img_ev3q"><figcaption>指标应用</figcaption></figure><figure class="Small"><img loading="lazy" src="/img/indicator/indicator-app-ask-ai-copilot.jpeg" alt="指标询问 AI 副驾驶" class="img_ev3q"><figcaption>询问 AI 副驾驶</figcaption></figure></div><p>通过 Metad 分析云中的指标管理系统，企业可以实现对业务状况的全面了解和分析，进一步提高业务决策效率和质量。同时，Metad 分析云还拥有内置 OLAP 引擎，还可以直接连接客户自己的数据库或数仓 OLAP 引擎，保证数据的安全性和完整性，避免数据传输过程中的风险和降低数据管理复杂度。</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="永久免费使用">永久免费使用<a class="hash-link" href="#永久免费使用" title="标题的直接链接">​</a></h2><p>如果您对 Metad 分析云中的指标管理系统感兴趣，可以注册我们的<a href="https://app.xpertai.cn" target="_blank" rel="noopener noreferrer" title="Metad official website">分析云账号</a>免费使用，和其他更多平台的功能和优势。我们相信，Metad 分析云的指标管理系统将会是您企业指标管理的好帮手。</p><a href="https://app.xpertai.cn/" target="_blank" rel="noopener noreferrer" class="w-full flex-none rounded-lg border border-transparent bg-slate-100 text-slate-900 py-3 px-6 text-lg font-semibold leading-6 transition hover:bg-slate-300 focus:ring-2 focus:ring-offset-2 focus:ring-offset-white dark:bg-slate-800 dark:text-white dark:hover:bg-slate-700 sm:w-auto">注册账号</a>]]></content>
        <author>
            <name>Tiven Wang</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="metad" term="metad"/>
        <category label="ocap" term="ocap"/>
        <category label="ChatGPT" term="ChatGPT"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[首版发布]]></title>
        <id>/2023/02/12/get-started</id>
        <link href="https://xpertai.cn/blog/2023/02/12/get-started"/>
        <updated>2023-02-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[🎉我们很高兴宣布经过一年的潜心研发元数(Metad)分析云正式上线, 欢迎免费使用.]]></summary>
        <content type="html"><![CDATA[<p>🎉我们很高兴宣布经过一年的潜心研发<a href="https://app.xpertai.cn/" target="_blank" rel="noopener noreferrer"><strong>元数(Metad)分析云</strong></a>正式上线, 欢迎免费使用.</p><p>元数分析云是一款免费的在线数据分析功能, 她可以通过代理连接用户内网数据源, 帮住用户进行多维数据建模和分析.</p><p>元数分析云还支持多维数据源(XMLA), 用户可以使用比 SQL 更专业的 MDX 语言进行数据查询和建模分析.</p><p>元数分析云的故事拥有丰富的组件类型, 使得用户可以进行灵活的数据展示.</p>]]></content>
        <author>
            <name>Metad</name>
            <uri>https://github.com/meta-d</uri>
        </author>
        <category label="metad" term="metad"/>
        <category label="ocap" term="ocap"/>
    </entry>
</feed>