沐泽淙 發表於 2025-9-20 10:43:00

AI智能体服务优秀的平台架构设计

<style>pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 14px !important; line-height: 1.6 !important; padding: 16px !important; margin: 16px 0 !important; background-color: rgba(248, 248, 248, 1) !important; border: 1px solid rgba(225, 228, 232, 1) !important; border-radius: 6px !important; tab-size: 4 !important; -moz-tab-size: 4 !important; max-width: 100% !important; box-sizing: border-box !important }
code { font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 14px !important; white-space: pre !important; word-wrap: normal !important; word-break: normal !important; overflow-wrap: normal !important; display: inline !important; background: rgba(0, 0, 0, 0) !important; border: none !important; padding: 0 !important; margin: 0 !important; line-height: inherit !important }
pre code { background: rgba(0, 0, 0, 0) !important; border: 0 !important; border-radius: 0 !important; display: block !important; line-height: 1.6 !important; margin: 0 !important; max-width: none !important; overflow: visible !important; padding: 0 !important; white-space: pre !important; word-wrap: normal !important; word-break: normal !important; color: inherit !important }
.token.comment, .token.prolog, .token.doctype, .token.cdata { color: rgba(112, 128, 144, 1) !important; font-style: italic !important }
.token.punctuation { color: rgba(153, 153, 153, 1) !important }
.token.atrule, .token.attr-value, .token.keyword { color: rgba(0, 119, 170, 1) !important; font-weight: bold !important }
.token.function, .token.class-name { color: rgba(221, 74, 104, 1) !important; font-weight: bold !important }
.token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: rgba(102, 153, 0, 1) !important }
.token.property, .token.tag, .token.boolean, .token.number, .token.constant, .token.symbol, .token.deleted { color: rgba(153, 0, 85, 1) !important }
.cnblogs-markdown pre, .cnblogs-post-body pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; background-color: rgba(248, 248, 248, 1) !important; border: 1px solid rgba(225, 228, 232, 1) !important; border-radius: 6px !important; padding: 16px !important; margin: 16px 0 !important }
pre, pre, pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important }</style>
      <style>pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 14px !important; line-height: 1.6 !important; padding: 16px !important; margin: 16px 0 !important; background-color: rgba(248, 248, 248, 1) !important; border: 1px solid rgba(225, 228, 232, 1) !important; border-radius: 6px !important; tab-size: 4 !important; -moz-tab-size: 4 !important; max-width: 100% !important; box-sizing: border-box !important }
code { font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 14px !important; white-space: pre !important; word-wrap: normal !important; word-break: normal !important; overflow-wrap: normal !important; display: inline !important; background: rgba(0, 0, 0, 0) !important; border: none !important; padding: 0 !important; margin: 0 !important; line-height: inherit !important }
pre code { background: rgba(0, 0, 0, 0) !important; border: 0 !important; border-radius: 0 !important; display: block !important; line-height: 1.6 !important; margin: 0 !important; max-width: none !important; overflow: visible !important; padding: 0 !important; white-space: pre !important; word-wrap: normal !important; word-break: normal !important; color: inherit !important }
.token.comment, .token.prolog, .token.doctype, .token.cdata { color: rgba(112, 128, 144, 1) !important; font-style: italic !important }
.token.punctuation { color: rgba(153, 153, 153, 1) !important }
.token.atrule, .token.attr-value, .token.keyword { color: rgba(0, 119, 170, 1) !important; font-weight: bold !important }
.token.function, .token.class-name { color: rgba(221, 74, 104, 1) !important; font-weight: bold !important }
.token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: rgba(102, 153, 0, 1) !important }
.token.property, .token.tag, .token.boolean, .token.number, .token.constant, .token.symbol, .token.deleted { color: rgba(153, 0, 85, 1) !important }
.cnblogs-markdown pre, .cnblogs-post-body pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; background-color: rgba(248, 248, 248, 1) !important; border: 1px solid rgba(225, 228, 232, 1) !important; border-radius: 6px !important; padding: 16px !important; margin: 16px 0 !important }
pre, pre, pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important }</style><div class="markdown_views prism-atom-one-light" id="content_views"><svg style="display: none" xmlns="http://www.w3.org/2000/svg"><path d="M5,0 0,2.5 5,5z" id="raphael-marker-block" stroke-linecap="round" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)"></path></svg><h4><strong>AI智能体服务平台架构设计</strong></h4><h5><strong>一、 设计原则与核心目标</strong></h5><p>在开始具体设计前,我们第一明确平台的构建原则:</p><ol><li><strong>智能体优先(Agent-First)</strong>:架构的核心是高效、灵活地支持多种智能体的生命周期管理(创建、运行、评估、迭代)。</li><li><strong>解耦与模块化</strong>:各组件职责单一,通过清晰定义的API进行通信,便于独立制作、部署、扩展和替换。</li><li><strong>高性能与高可用</strong>:支持高并发请求,具备负载均衡和故障转移机制,确保SLA(服务等级协议)。</li><li><strong>可观测性(Observability)</strong>:内置完善的日志、指标(Metrics)、追踪(Tracing)体系,让平台状态透明可视。</li><li><strong>安全与合规</strong>:贯穿始终的安全设计,包括身份认证、授权、数据加密、审计日志和隐私保护。</li><li><strong>成本可控</strong>:具备资源管理和成本核算能力,避免因意外流量或无效调用导致的经济损失。</li></ol><h5><strong>二、 整体服务架构</strong></h5><p>平台采用分层架构,从上至下分为:接入层、应用服务层、核心能力层、模型层与基础设施层。</p><div class="mermaid"><svg class="mermaid-svg" height="888" id="mermaid-svg-5vQXhTEPtb8RYcC6" viewBox="0 0 3905.46875 888" width="3905.46875" xmlns="http://www.w3.org/2000/svg"><g><g class="output"><g class="clusters"><g class="cluster" id="flowchart-基础设施层-564" style="opacity: 1" transform="translate(2554.638671875,590)"><rect height="96" width="1634.51171875" x="-817.255859375" y="-48"></rect><g class="label" id="mermaid-svg-5vQXhTEPtb8RYcC6Text" transform="translate(0, -34)"><g transform="translate(-40,-13)"><foreignObject height="26" width="80"><div style="display: inline-block; white-space: nowrap">基础设施层</div></foreignObject></g></g></g><g class="cluster" id="flowchart-模型层-565" style="opacity: 1" transform="translate(1337.96875,711)"><rect height="338" width="758.828125" x="-379.4140625" y="-169"></rect><g class="label" id="mermaid-svg-5vQXhTEPtb8RYcC6Text" transform="translate(0, -155)"><g transform="translate(-24,-13)"><foreignObject height="26" width="48"><div style="display: inline-block; white-space: nowrap">模型层</div></foreignObject></g></g></g><g class="cluster" id="flowchart-核心能力层-566" style="opacity: 1" transform="translate(473.27734375,577.5)"><rect height="363" width="930.5546875" x="-465.27734375" y="-181.5"></rect><g class="label" id="mermaid-svg-5vQXhTEPtb8RYcC6Text" transform="translate(0, -167.5)"><g transform="translate(-40,-13)"><foreignObject height="26" width="80"><div style="display: inline-block; white-space: nowrap">核心能力层</div></foreignObject></g></g></g><g class="cluster" id="flowchart-应用服务层-567" style="opacity: 1" transform="translate(2915.220703125,383.5)"><rect height="217" width="1290.73828125" x="-645.369140625" y="-108.5"></rect><g class="label" id="mermaid-svg-5vQXhTEPtb8RYcC6Text" transform="translate(0, -94.5)"><g transform="translate(-40,-13)"><foreignObject height="26" width="80"><div style="display: inline-block; white-space: nowrap">应用服务层</div></foreignObject></g></g></g><g class="cluster" id="flowchart-接入层-568" style="opacity: 1" transform="translate(3729.828125,396)"><rect height="484" width="298.4765625" x="-149.23828125" y="-242"></rect><g class="label" id="mermaid-svg-5vQXhTEPtb8RYcC6Text" transform="translate(0, -228)"><g transform="translate(-24,-13)"><foreignObject height="26" width="48"><div style="display: inline-block; white-space: nowrap">接入层</div></foreignObject></g></g></g><g class="cluster" id="flowchart-外部用户与系统-569" style="opacity: 1" transform="translate(3720.625,56)"><rect height="96" width="353.6875" x="-176.84375" y="-48"></rect><g class="label" id="mermaid-svg-5vQXhTEPtb8RYcC6Text" transform="translate(0, -34)"><g transform="translate(-56,-13)"><foreignObject height="26" width="112"><div style="display: inline-block; white-space: nowrap">外部用户与系统</div></foreignObject></g></g></g></g><g class="edgePaths"><g class="edgePath LS-E LE-F" id="L-E-F" style="opacity: 1"><path class="path" d="M3746.6918131510415,225L3749.8883599175347,229.16666666666666C3753.0849066840274,233.33333333333334,3759.4780002170137,241.66666666666666,3762.6745469835073,250C3765.87109375,258.3333333333333,3765.87109375,266.6666666666667,3765.87109375,275C3765.87109375,283.3333333333333,3765.87109375,291.6666666666667,3765.87109375,295.8333333333333L3765.87109375,300" marker-end="url(#arrowhead849)" style="fill: none"></path><defs><marker id="arrowhead849" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-F LE-G" id="L-F-G" style="opacity: 1"><path class="path" d="M3765.87109375,346L3765.87109375,350.1666666666667C3765.87109375,354.3333333333333,3765.87109375,362.6666666666667,3765.87109375,371C3765.87109375,379.3333333333333,3765.87109375,387.6666666666667,3765.87109375,396C3765.87109375,404.3333333333333,3765.87109375,412.6666666666667,3765.87109375,416.8333333333333L3765.87109375,421" marker-end="url(#arrowhead850)" style="fill: none"></path><defs><marker id="arrowhead850" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-G LE-H" id="L-G-H" style="opacity: 1"><path class="path" d="M3765.87109375,467L3765.87109375,471.1666666666667C3765.87109375,475.3333333333333,3765.87109375,483.6666666666667,3765.87109375,492C3765.87109375,500.3333333333333,3765.87109375,508.6666666666667,3765.87109375,517C3765.87109375,525.3333333333334,3765.87109375,533.6666666666666,3765.87109375,542C3765.87109375,550.3333333333334,3765.87109375,558.6666666666666,3765.87109375,562.8333333333334L3765.87109375,567" marker-end="url(#arrowhead851)" style="fill: none"></path><defs><marker id="arrowhead851" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-I LE-I1" id="L-I-I1" style="opacity: 1"><path class="path" d="M3166.69921875,331.59018546567665L3217.1647135416665,338.1584878880639C3267.6302083333335,344.7267903104511,3368.5611979166665,357.8633951552256,3419.0266927083335,368.5983642442795C3469.4921875,379.3333333333333,3469.4921875,387.6666666666667,3469.4921875,396C3469.4921875,404.3333333333333,3469.4921875,412.6666666666667,3469.4921875,416.8333333333333L3469.4921875,421" marker-end="url(#arrowhead852)" style="fill: none"></path><defs><marker id="arrowhead852" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-I LE-I2" id="L-I-I2" style="opacity: 1"><path class="path" d="M3166.69921875,336.73821421916557L3194.1321614583335,342.4485118493046C3221.5651041666665,348.15880947944373,3276.4309895833335,359.57940473972184,3303.8639322916665,369.4563690365276C3331.296875,379.3333333333333,3331.296875,387.6666666666667,3331.296875,396C3331.296875,404.3333333333333,3331.296875,412.6666666666667,3331.296875,416.8333333333333L3331.296875,421" marker-end="url(#arrowhead853)" style="fill: none"></path><defs><marker id="arrowhead853" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-I LE-I3" id="L-I-I3" style="opacity: 1"><path class="path" d="M3034.69921875,333.8570128114165L2997.0670572916665,340.0475106761804C2959.4348958333335,346.23800854094435,2884.1705729166665,358.6190042704722,2846.5384114583335,368.97616880190276C2808.90625,379.3333333333333,2808.90625,387.6666666666667,2808.90625,396C2808.90625,404.3333333333333,2808.90625,412.6666666666667,2808.90625,416.8333333333333L2808.90625,421" marker-end="url(#arrowhead854)" style="fill: none"></path><defs><marker id="arrowhead854" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-N LE-N1" id="L-N-N1" style="opacity: 1"><path class="path" d="M461.390625,450.6625700343394L504.8216145833333,457.55214169528284C548.2526041666666,464.4417133562263,635.1145833333334,478.2208566781131,678.5455729166666,489.2770950057232C721.9765625,500.3333333333333,721.9765625,508.6666666666667,721.9765625,517C721.9765625,525.3333333333334,721.9765625,533.6666666666666,721.9765625,542C721.9765625,550.3333333333334,721.9765625,558.6666666666666,721.9765625,562.8333333333334L721.9765625,567" marker-end="url(#arrowhead855)" style="fill: none"></path><defs><marker id="arrowhead855" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-N1 LE-N1a" id="L-N1-N1a" style="opacity: 1"><path class="path" d="M721.9765625,613L721.9765625,617.1666666666666C721.9765625,621.3333333333334,721.9765625,629.6666666666666,721.9765625,638C721.9765625,646.3333333333334,721.9765625,654.6666666666666,721.9765625,663C721.9765625,671.3333333333334,721.9765625,679.6666666666666,721.9765625,683.8333333333334L721.9765625,688" marker-end="url(#arrowhead856)" style="fill: none"></path><defs><marker id="arrowhead856" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-N LE-N2" id="L-N-N2" style="opacity: 1"><path class="path" d="M461.390625,456.58463789319677L481.08984375,462.4871982443306C500.7890625,468.38975859546446,540.1875,480.19487929773226,559.88671875,490.26410631553284C579.5859375,500.3333333333333,579.5859375,508.6666666666667,579.5859375,517C579.5859375,525.3333333333334,579.5859375,533.6666666666666,579.5859375,542C579.5859375,550.3333333333334,579.5859375,558.6666666666666,579.5859375,562.8333333333334L579.5859375,567" marker-end="url(#arrowhead857)" style="fill: none"></path><defs><marker id="arrowhead857" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-N2 LE-N2a" id="L-N2-N2a" style="opacity: 1"><path class="path" d="M579.5859375,613L579.5859375,617.1666666666666C579.5859375,621.3333333333334,579.5859375,629.6666666666666,579.5859375,638C579.5859375,646.3333333333334,579.5859375,654.6666666666666,579.5859375,663C579.5859375,671.3333333333334,579.5859375,679.6666666666666,579.5859375,683.8333333333334L579.5859375,688" marker-end="url(#arrowhead858)" style="fill: none"></path><defs><marker id="arrowhead858" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-N LE-N3" id="L-N-N3" style="opacity: 1"><path class="path" d="M426.0989583333333,467L427.3142361111111,471.1666666666667C428.52951388888886,475.3333333333333,430.9600694444444,483.6666666666667,432.17534722222223,492C433.390625,500.3333333333333,433.390625,508.6666666666667,433.390625,517C433.390625,525.3333333333334,433.390625,533.6666666666666,433.390625,542C433.390625,550.3333333333334,433.390625,558.6666666666666,433.390625,562.8333333333334L433.390625,567" marker-end="url(#arrowhead859)" style="fill: none"></path><defs><marker id="arrowhead859" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-N3 LE-N3a" id="L-N3-N3a" style="opacity: 1"><path class="path" d="M433.390625,613L433.390625,617.1666666666666C433.390625,621.3333333333334,433.390625,629.6666666666666,433.390625,638C433.390625,646.3333333333334,433.390625,654.6666666666666,433.390625,663C433.390625,671.3333333333334,433.390625,679.6666666666666,433.390625,683.8333333333334L433.390625,688" marker-end="url(#arrowhead860)" style="fill: none"></path><defs><marker id="arrowhead860" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-O LE-O1" id="L-O-O1" style="opacity: 1"><path class="path" d="M131,455.5732161277302L153.03255208333334,461.6443467731085C175.06510416666666,467.7154774184867,219.13020833333334,479.8577387092434,241.16276041666666,490.09553602128835C263.1953125,500.3333333333333,263.1953125,508.6666666666667,263.1953125,517C263.1953125,525.3333333333334,263.1953125,533.6666666666666,263.1953125,542C263.1953125,550.3333333333334,263.1953125,558.6666666666666,263.1953125,562.8333333333334L263.1953125,567" marker-end="url(#arrowhead861)" style="fill: none"></path><defs><marker id="arrowhead861" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-O LE-O2" id="L-O-O2" style="opacity: 1"><path class="path" d="M90.91666666666667,467L91.2638888888889,471.1666666666667C91.61111111111113,475.3333333333333,92.30555555555556,483.6666666666667,92.65277777777779,492C93,500.3333333333333,93,508.6666666666667,93,517C93,525.3333333333334,93,533.6666666666666,93,542C93,550.3333333333334,93,558.6666666666666,93,562.8333333333334L93,567" marker-end="url(#arrowhead862)" style="fill: none"></path><defs><marker id="arrowhead862" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-O2 LE-O2a" id="L-O2-O2a" style="opacity: 1"><path class="path" d="M93,613L93,617.1666666666666C93,621.3333333333334,93,629.6666666666666,93,638C93,646.3333333333334,93,654.6666666666666,93,663C93,671.3333333333334,93,679.6666666666666,93,683.8333333333334L93,688" marker-end="url(#arrowhead863)" style="fill: none"></path><defs><marker id="arrowhead863" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-P LE-P1" id="L-P-P1" style="opacity: 1"><path class="path" d="M829.226806640625,467L834.8166097005209,471.1666666666667C840.4064127604166,475.3333333333333,851.5860188802084,483.6666666666667,857.1758219401041,492C862.765625,500.3333333333333,862.765625,508.6666666666667,862.765625,517C862.765625,525.3333333333334,862.765625,533.6666666666666,862.765625,542C862.765625,550.3333333333334,862.765625,558.6666666666666,862.765625,562.8333333333334L862.765625,567" marker-end="url(#arrowhead864)" style="fill: none"></path><defs><marker id="arrowhead864" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-Q LE-R" id="L-Q-R" style="opacity: 1"><path class="path" d="M1048.3463541666667,613L1049.2144097222224,617.1666666666666C1050.0824652777778,621.3333333333334,1051.818576388889,629.6666666666666,1052.6866319444446,638C1053.5546875,646.3333333333334,1053.5546875,654.6666666666666,1059.7178819444446,663C1065.881076388889,671.3333333333334,1078.2074652777778,679.6666666666666,1084.3706597222224,683.8333333333334L1090.5338541666667,688" marker-end="url(#arrowhead865)" style="fill: none"></path><defs><marker id="arrowhead865" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-R LE-R1" id="L-R-R1" style="opacity: 1"><path class="path" d="M1190.5546875,716.8571758724289L1269.7005208333333,723.8809798936908C1348.8463541666667,730.9047839149525,1507.1380208333333,744.9523919574763,1586.2838541666667,756.1428626454048C1665.4296875,767.3333333333334,1665.4296875,775.6666666666666,1655.0807291666667,784.3085585585586C1644.7317708333333,792.9504504504504,1624.0338541666667,801.9009009009009,1613.6848958333333,806.3761261261261L1603.3359375,810.8513513513514" marker-end="url(#arrowhead866)" style="fill: none"></path><defs><marker id="arrowhead866" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-R LE-R2" id="L-R-R2" style="opacity: 1"><path class="path" d="M1190.5546875,718.004612115873L1254.93359375,724.8371767632275C1319.3125,731.669741410582,1448.0703125,745.334870705291,1512.44921875,756.3341020193121C1576.828125,767.3333333333334,1576.828125,775.6666666666666,1556.6106770833333,785.236613162817C1536.3932291666667,794.8065596589673,1495.9583333333333,805.6131193179348,1475.7408854166667,811.0163991474183L1455.5234375,816.419678976902" marker-end="url(#arrowhead867)" style="fill: none"></path><defs><marker id="arrowhead867" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-R LE-R3" id="L-R-R3" style="opacity: 1"><path class="path" d="M1190.5546875,719.9928146899672L1238.2682291666667,726.4940122416393C1285.9817708333333,732.9952097933115,1381.4088541666667,745.9976048966558,1429.1223958333333,756.6654691149946C1476.8359375,767.3333333333334,1476.8359375,775.6666666666666,1445.5182291666667,785.6241121945346C1414.2005208333333,795.5815577224029,1351.5651041666667,807.1631154448056,1320.2473958333333,812.953894306007L1288.9296875,818.7446731672084" marker-end="url(#arrowhead868)" style="fill: none"></path><defs><marker id="arrowhead868" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-R LE-R4" id="L-R-R4" style="opacity: 1"><path class="path" d="M1190.5546875,723.1641468682506L1222.9609375,729.1367890568754C1255.3671875,735.1094312455003,1320.1796875,747.0547156227502,1352.5859375,757.1940244780417C1384.9921875,767.3333333333334,1384.9921875,775.6666666666666,1336.7526041666667,786.819567540386C1288.5130208333333,797.9724684141053,1192.0338541666667,811.9449368282104,1143.7942708333333,818.9311710352631L1095.5546875,825.9174052423157" marker-end="url(#arrowhead869)" style="fill: none"></path><defs><marker id="arrowhead869" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-C LE-E" id="L-C-E" style="opacity: 1"><path class="path" d="M3645.625,79L3645.625,83.16666666666667C3645.625,87.33333333333333,3645.625,95.66666666666667,3645.625,104C3645.625,112.33333333333333,3645.625,120.66666666666667,3645.625,129C3645.625,137.33333333333334,3645.625,145.66666666666666,3652.8664822048613,154C3660.107964409722,162.33333333333334,3674.590928819444,170.66666666666666,3681.832411024305,174.83333333333334L3689.0738932291665,179" marker-end="url(#arrowhead870)" style="fill: none"></path><defs><marker id="arrowhead870" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-D LE-E" id="L-D-E" style="opacity: 1"><path class="path" d="M3812.46875,79L3812.46875,83.16666666666667C3812.46875,87.33333333333333,3812.46875,95.66666666666667,3812.46875,104C3812.46875,112.33333333333333,3812.46875,120.66666666666667,3812.46875,129C3812.46875,137.33333333333334,3812.46875,145.66666666666666,3805.2272677951387,154C3797.985785590278,162.33333333333334,3783.502821180556,170.66666666666666,3776.261338975695,174.83333333333334L3769.0198567708335,179" marker-end="url(#arrowhead871)" style="fill: none"></path><defs><marker id="arrowhead871" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-E LE-I" id="L-E-I" style="opacity: 1"><path class="path" d="M3737.1084798177085,225L3738.5689154730903,229.16666666666666C3740.0293511284726,233.33333333333334,3742.9502224392363,241.66666666666666,3744.4106580946177,250C3745.87109375,258.3333333333333,3745.87109375,266.6666666666667,3649.3424479166665,278.01494675998805C3552.8138020833335,289.3632268533094,3359.7565104166665,303.7264537066189,3263.2278645833335,310.90806713327356L3166.69921875,318.0896805599283" marker-end="url(#arrowhead872)" style="fill: none"></path><defs><marker id="arrowhead872" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-E LE-J" id="L-E-J" style="opacity: 1"><path class="path" d="M3697.135498046875,225L3691.354451497396,229.16666666666666C3685.5734049479165,233.33333333333334,3674.0113118489585,241.66666666666666,3668.230265299479,250C3662.44921875,258.3333333333333,3662.44921875,266.6666666666667,3485.849609375,278.4181570868504C3309.25,290.16964750703414,2956.05078125,305.3392950140682,2779.451171875,312.9241187675853L2602.8515625,320.50894252110237" marker-end="url(#arrowhead873)" style="fill: none"></path><defs><marker id="arrowhead873" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-E LE-K" id="L-E-K" style="opacity: 1"><path class="path" d="M3684.2822265625,225L3676.1726888020835,229.16666666666666C3668.0631510416665,233.33333333333334,3651.8440755208335,241.66666666666666,3643.7345377604165,250C3635.625,258.3333333333333,3635.625,266.6666666666667,3435.8294270833335,278.4158672604819C3236.0338541666665,290.16506785429704,2836.4427083333335,305.33013570859407,2636.6471354166665,312.9126696357426L2436.8515625,320.4952035628911" marker-end="url(#arrowhead874)" style="fill: none"></path><defs><marker id="arrowhead874" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-I LE-N" id="L-I-N" style="opacity: 1"><path class="path" d="M3034.69921875,332.59148483235765L2990.650390625,338.9929040269647C2946.6015625,345.39432322157177,2858.50390625,358.19716161078594,2814.455078125,368.7652474720596C2770.40625,379.3333333333333,2770.40625,387.6666666666667,2385.5703125,399.69041637590135C2000.734375,411.714166085136,1231.0625,427.42833217027214,846.2265625,435.2854152128402L461.390625,443.1424982554082" marker-end="url(#arrowhead875)" style="fill: none; stroke-width: 2px; stroke-dasharray: 3"></path><defs><marker id="arrowhead875" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-J LE-O" id="L-J-O" style="opacity: 1"><path class="path" d="M2602.8515625,345.8145587246711L2613.5227864583335,350.0121322705592C2624.1940104166665,354.2097058164474,2645.5364583333335,362.6048529082237,2656.2076822916665,370.9690931207785C2666.87890625,379.3333333333333,2666.87890625,387.6666666666667,2244.232421875,399.7029936190879C1821.5859375,411.7393205715091,976.29296875,427.4786411430182,553.646484375,435.3483014287728L131,443.2179617145273" marker-end="url(#arrowhead876)" style="fill: none; stroke-width: 2px; stroke-dasharray: 3"></path><defs><marker id="arrowhead876" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-K LE-N" id="L-K-N" style="opacity: 1"><path class="path" d="M2370.8515625,346L2370.8515625,350.1666666666667C2370.8515625,354.3333333333333,2370.8515625,362.6666666666667,2370.8515625,371C2370.8515625,379.3333333333333,2370.8515625,387.6666666666667,2052.6080729166665,399.6611546370841C1734.3645833333333,411.65564260750153,1097.8776041666667,427.3112852150032,779.6341145833334,435.139106518754L461.390625,442.9669278225048" marker-end="url(#arrowhead877)" style="fill: none; stroke-width: 2px; stroke-dasharray: 3"></path><defs><marker id="arrowhead877" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-N LE-Q" id="L-N-Q" style="opacity: 1"><path class="path" d="M390.1146647135417,467L384.8110487196181,471.1666666666667C379.5074327256945,475.3333333333333,368.90020073784723,483.6666666666667,363.59658474392364,492C358.29296875,500.3333333333333,358.29296875,508.6666666666667,358.29296875,517C358.29296875,525.3333333333334,358.29296875,533.6666666666666,465.5032552083333,545.3430097229426C572.7135416666666,557.0193527792187,787.1341145833334,572.0387055584374,894.3444010416666,579.5483819480468L1001.5546875,587.0580583376561" marker-end="url(#arrowhead878)" style="fill: none"></path><defs><marker id="arrowhead878" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-O LE-Y" id="L-O-Y" style="opacity: 1"><path class="path" d="M70.55208333333333,467L67.21006944444444,471.1666666666667C63.86805555555555,475.3333333333333,57.18402777777777,483.6666666666667,53.842013888888886,492C50.5,500.3333333333333,50.5,508.6666666666667,50.5,517C50.5,525.3333333333334,50.5,533.6666666666666,416.6471354166667,545.4135902308843C782.7942708333334,557.160513795102,1515.0885416666667,572.3210275902039,1881.2356770833333,579.9012844877549L2247.3828125,587.481541385306" marker-end="url(#arrowhead879)" style="fill: none"></path><defs><marker id="arrowhead879" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-P LE-Y" id="L-P-Y" style="opacity: 1"><path class="path" d="M800.2877604166666,467L800.6349826388888,471.1666666666667C800.982204861111,475.3333333333333,801.6766493055555,483.6666666666667,802.0238715277777,492C802.37109375,500.3333333333333,802.37109375,508.6666666666667,802.37109375,517C802.37109375,525.3333333333334,802.37109375,533.6666666666666,1043.2063802083333,545.2121472413033C1284.0416666666667,556.75762781594,1765.7122395833333,571.5152556318801,2006.5475260416667,578.8940695398502L2247.3828125,586.2728834478202" marker-end="url(#arrowhead880)" style="fill: none"></path><defs><marker id="arrowhead880" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-Q LE-R" id="L-Q-R" style="opacity: 1"><path class="path" d="M1029.8984375,613L1027.4244791666667,617.1666666666666C1024.9505208333333,621.3333333333334,1020.0026041666666,629.6666666666666,1017.5286458333334,638C1015.0546875,646.3333333333334,1015.0546875,654.6666666666666,1024.5598958333333,663C1034.0651041666667,671.3333333333334,1053.0755208333333,679.6666666666666,1062.5807291666667,683.8333333333334L1072.0859375,688" marker-end="url(#arrowhead881)" style="fill: none"></path><defs><marker id="arrowhead881" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-R LE-R1" id="L-R-R1" style="opacity: 1"><path class="path" d="M1190.5546875,730.4430379746835L1206.7109375,735.2025316455696C1222.8671875,739.9620253164558,1255.1796875,749.4810126582279,1271.3359375,758.4071729957806C1287.4921875,767.3333333333334,1287.4921875,775.6666666666666,1323.8307291666667,786.3676344337782C1360.1692708333333,797.0686022008898,1432.8463541666667,810.1372044017795,1469.1848958333333,816.6715055022242L1505.5234375,823.2058066026692" marker-end="url(#arrowhead882)" style="fill: none"></path><defs><marker id="arrowhead882" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-R LE-R2" id="L-R-R2" style="opacity: 1"><path class="path" d="M1160.1739908854167,734L1166.6267632378474,738.1666666666666C1173.0795355902778,742.3333333333334,1185.985080295139,750.6666666666666,1192.4378526475696,759C1198.890625,767.3333333333334,1198.890625,775.6666666666666,1222.23046875,785.4818936200942C1245.5703125,795.297120573522,1292.25,806.5942411470438,1315.58984375,812.2428014338047L1338.9296875,817.8913617205657" marker-end="url(#arrowhead883)" style="fill: none"></path><defs><marker id="arrowhead883" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-R LE-R3" id="L-R-R3" style="opacity: 1"><path class="path" d="M1112.2610677083333,734L1110.033962673611,738.1666666666666C1107.806857638889,742.3333333333334,1103.3526475694443,750.6666666666666,1101.1255425347222,759C1098.8984375,767.3333333333334,1098.8984375,775.6666666666666,1109.1713324652778,784C1119.4442274305557,792.3333333333334,1139.990017361111,800.6666666666666,1150.262912326389,804.8333333333334L1160.5358072916667,809" marker-end="url(#arrowhead884)" style="fill: none"></path><defs><marker id="arrowhead884" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-R LE-R4" id="L-R-R4" style="opacity: 1"><path class="path" d="M1068.2526041666667,734L1058.052951388889,738.1666666666666C1047.853298611111,742.3333333333334,1027.4539930555557,750.6666666666666,1017.2543402777778,759C1007.0546875,767.3333333333334,1007.0546875,775.6666666666666,1011.0911458333334,784C1015.1276041666666,792.3333333333334,1023.2005208333334,800.6666666666666,1027.2369791666667,804.8333333333334L1031.2734375,809" marker-end="url(#arrowhead885)" style="fill: none"></path><defs><marker id="arrowhead885" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-S LE-R" id="L-S-R" style="opacity: 1"><path class="path" d="M1382.4921875,613L1382.4921875,617.1666666666666C1382.4921875,621.3333333333334,1382.4921875,629.6666666666666,1382.4921875,638C1382.4921875,646.3333333333334,1382.4921875,654.6666666666666,1350.5026041666667,664.7863258218238C1318.5130208333333,674.9059849769809,1254.5338541666667,686.8119699539617,1222.5442708333333,692.7649624424521L1190.5546875,698.7179549309426" marker-end="url(#arrowhead886)" style="fill: none"></path><defs><marker id="arrowhead886" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-I LE-W" id="L-I-W" style="opacity: 1"><path class="path" d="M3034.69921875,331.59018546567665L2984.2337239583335,338.1584878880639C2933.7682291666665,344.7267903104511,2832.8372395833335,357.8633951552256,2782.3717447916665,368.5983642442795C2731.90625,379.3333333333333,2731.90625,387.6666666666667,2731.90625,399.8333333333333C2731.90625,412,2731.90625,428,2731.90625,444C2731.90625,460,2731.90625,476,2731.90625,488.1666666666667C2731.90625,500.3333333333333,2731.90625,508.6666666666667,2731.90625,517C2731.90625,525.3333333333334,2731.90625,533.6666666666666,2772.20703125,543.4929447619048C2812.5078125,553.3192228571429,2893.109375,564.6384457142857,2933.41015625,570.2980571428571L2973.7109375,575.9576685714286" marker-end="url(#arrowhead887)" style="fill: none"></path><defs><marker id="arrowhead887" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-J LE-X" id="L-J-X" style="opacity: 1"><path class="path" d="M2507.9557291666665,346L2501.2717013888887,350.1666666666667C2494.587673611111,354.3333333333333,2481.219618055555,362.6666666666667,2474.535590277778,371C2467.8515625,379.3333333333333,2467.8515625,387.6666666666667,2467.8515625,399.8333333333333C2467.8515625,412,2467.8515625,428,2467.8515625,444C2467.8515625,460,2467.8515625,476,2467.8515625,488.1666666666667C2467.8515625,500.3333333333333,2467.8515625,508.6666666666667,2467.8515625,517C2467.8515625,525.3333333333334,2467.8515625,533.6666666666666,2505.8072916666665,543.163619047619C2543.7630208333335,552.6605714285714,2619.6744791666665,563.3211428571428,2657.6302083333335,568.6514285714285L2695.5859375,573.9817142857142" marker-end="url(#arrowhead888)" style="fill: none"></path><defs><marker id="arrowhead888" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-M LE-X" id="L-M-X" style="opacity: 1"><path class="path" d="M3173.296875,467L3173.296875,471.1666666666667C3173.296875,475.3333333333333,3173.296875,483.6666666666667,3173.296875,492C3173.296875,500.3333333333333,3173.296875,508.6666666666667,3173.296875,517C3173.296875,525.3333333333334,3173.296875,533.6666666666666,3131.69921875,543.3240416496587C3090.1015625,552.9814166326508,3006.90625,563.9628332653018,2965.30859375,569.4535415816272L2923.7109375,574.9442498979527" marker-end="url(#arrowhead889)" style="fill: none"></path><defs><marker id="arrowhead889" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-N LE-V" id="L-N-V" style="opacity: 1"><path class="path" d="M380.5313313802083,467L373.4916042751736,471.1666666666667C366.45187717013886,475.3333333333333,352.3724229600694,483.6666666666667,345.3326958550347,492C338.29296875,500.3333333333333,338.29296875,508.6666666666667,338.29296875,517C338.29296875,525.3333333333334,338.29296875,533.6666666666666,705.357421875,545.6472336415246C1072.421875,557.6278006163825,1806.55078125,573.2556012327649,2173.615234375,581.0695015409561L2540.6796875,588.8834018491474" marker-end="url(#arrowhead890)" style="fill: none"></path><defs><marker id="arrowhead890" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g><g class="edgePath LS-P LE-V" id="L-P-V" style="opacity: 1"><path class="path" d="M790.7044270833334,467L789.3155381944445,471.1666666666667C787.9266493055557,475.3333333333333,785.1488715277778,483.6666666666667,783.759982638889,492C782.37109375,500.3333333333333,782.37109375,508.6666666666667,782.37109375,517C782.37109375,525.3333333333334,782.37109375,533.6666666666666,1075.4225260416667,545.6015938417951C1368.4739583333333,557.5365210169235,1954.5768229166667,573.0730420338472,2247.6282552083335,580.8413025423089L2540.6796875,588.6095630507707" marker-end="url(#arrowhead891)" style="fill: none"></path><defs><marker id="arrowhead891" orient="auto" viewBox="0 0 10 10"><path class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z" style="stroke-width: 1"></path></marker></defs></g></g><g class="edgeLabels"><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-E' L-LE-F" id="L-L-E-F"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-F' L-LE-G" id="L-L-F-G"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-G' L-LE-H" id="L-L-G-H"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-I' L-LE-I1" id="L-L-I-I1"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-I' L-LE-I2" id="L-L-I-I2"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-I' L-LE-I3" id="L-L-I-I3"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-N' L-LE-N1" id="L-L-N-N1"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-N1' L-LE-N1a" id="L-L-N1-N1a"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-N' L-LE-N2" id="L-L-N-N2"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-N2' L-LE-N2a" id="L-L-N2-N2a"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-N' L-LE-N3" id="L-L-N-N3"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-N3' L-LE-N3a" id="L-L-N3-N3a"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-O' L-LE-O1" id="L-L-O-O1"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-O' L-LE-O2" id="L-L-O-O2"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-O2' L-LE-O2a" id="L-L-O2-O2a"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-P' L-LE-P1" id="L-L-P-P1"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-Q' L-LE-R" id="L-L-Q-R"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-R' L-LE-R1" id="L-L-R-R1"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-R' L-LE-R2" id="L-L-R-R2"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-R' L-LE-R3" id="L-L-R-R3"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-R' L-LE-R4" id="L-L-R-R4"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-C' L-LE-E" id="L-L-C-E"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-D' L-LE-E" id="L-L-D-E"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-E' L-LE-I" id="L-L-E-I"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-E' L-LE-J" id="L-L-E-J"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-E' L-LE-K" id="L-L-E-K"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-I' L-LE-N" id="L-L-I-N"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-J' L-LE-O" id="L-L-J-O"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-K' L-LE-N" id="L-L-K-N"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-N' L-LE-Q" id="L-L-N-Q"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-O' L-LE-Y" id="L-L-O-Y"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-P' L-LE-Y" id="L-L-P-Y"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-Q' L-LE-R" id="L-L-Q-R"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-R' L-LE-R1" id="L-L-R-R1"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-R' L-LE-R2" id="L-L-R-R2"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-R' L-LE-R3" id="L-L-R-R3"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-R' L-LE-R4" id="L-L-R-R4"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-S' L-LE-R" id="L-L-S-R"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-I' L-LE-W" id="L-L-I-W"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-J' L-LE-X" id="L-L-J-X"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-M' L-LE-X" id="L-L-M-X"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-N' L-LE-V" id="L-L-N-V"></span></div></foreignObject></g></g><g class="edgeLabel" style="opacity: 1" transform=""><g class="label" transform="translate(0,0)"><rect height="0" rx="0" ry="0" width="0"></rect><foreignObject height="0" width="0"><div style="display: inline-block; white-space: nowrap"><span class="edgeLabel L-LS-P' L-LE-V" id="L-L-P-V"></span></div></foreignObject></g></g></g><g class="nodes"><g class="node default" id="flowchart-T-514" style="opacity: 1" transform="translate(1856.9609375,590)"><rect class="label-container" height="46" rx="0" ry="0" width="169.15625" x="-84.578125" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-74.578125,-13)"><foreignObject height="26" width="149.15625"><div style="display: inline-block; white-space: nowrap">容器编排 Kubernetes</div></foreignObject></g></g></g><g class="node default" id="flowchart-U-515" style="opacity: 1" transform="translate(2094.4609375,590)"><rect class="label-container" height="46" rx="0" ry="0" width="205.84375" x="-102.921875" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-92.921875,-13)"><foreignObject height="26" width="185.84375"><div style="display: inline-block; white-space: nowrap">消息队列 Kafka/RabbitMQ</div></foreignObject></g></g></g><g class="node default" id="flowchart-V-516" style="opacity: 1" transform="translate(2593.1328125,590)"><rect class="label-container" height="46" rx="0" ry="0" width="104.90625" x="-52.453125" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-42.453125,-13)"><foreignObject height="26" width="84.90625"><div style="display: inline-block; white-space: nowrap">对象存储 S3</div></foreignObject></g></g></g><g class="node default" id="flowchart-W-517" style="opacity: 1" transform="translate(3073.703125,590)"><rect class="label-container" height="46" rx="0" ry="0" width="199.984375" x="-99.9921875" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-89.9921875,-13)"><foreignObject height="26" width="179.984375"><div style="display: inline-block; white-space: nowrap">关系型数据库 PostgreSQL</div></foreignObject></g></g></g><g class="node default" id="flowchart-X-518" style="opacity: 1" transform="translate(2809.6484375,590)"><rect class="label-container" height="46" rx="0" ry="0" width="228.125" x="-114.0625" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-104.0625,-13)"><foreignObject height="26" width="208.125"><div style="display: inline-block; white-space: nowrap">NoSQL数据库 Redis/MongoDB</div></foreignObject></g></g></g><g class="node default" id="flowchart-Y-519" style="opacity: 1" transform="translate(2369.03125,590)"><rect class="label-container" height="46" rx="0" ry="0" width="243.296875" x="-121.6484375" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-111.6484375,-13)"><foreignObject height="26" width="223.296875"><div style="display: inline-block; white-space: nowrap">向量数据库 Pinecone/Weaviate</div></foreignObject></g></g></g><g class="node default" id="flowchart-R1-506" style="opacity: 1" transform="translate(1554.4296875,832)"><rect class="label-container" height="46" rx="0" ry="0" width="97.8125" x="-48.90625" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-38.90625,-13)"><foreignObject height="26" width="77.8125"><div style="display: inline-block; white-space: nowrap">OpenAI API</div></foreignObject></g></g></g><g class="node default" id="flowchart-R-505" style="opacity: 1" transform="translate(1124.5546875,711)"><rect class="label-container" height="46" rx="0" ry="0" width="132" x="-66" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-56,-13)"><foreignObject height="26" width="112"><div style="display: inline-block; white-space: nowrap">多云多模型网关</div></foreignObject></g></g></g><g class="node default" id="flowchart-Q-504" style="opacity: 1" transform="translate(1043.5546875,590)"><rect class="label-container" height="46" rx="0" ry="0" width="84" x="-42" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-32,-13)"><foreignObject height="26" width="64"><div style="display: inline-block; white-space: nowrap">模型路由</div></foreignObject></g></g></g><g class="node default" id="flowchart-R2-508" style="opacity: 1" transform="translate(1397.2265625,832)"><rect class="label-container" height="46" rx="0" ry="0" width="116.59375" x="-58.296875" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-48.296875,-13)"><foreignObject height="26" width="96.59375"><div style="display: inline-block; white-space: nowrap">Azure OpenAI</div></foreignObject></g></g></g><g class="node default" id="flowchart-R3-510" style="opacity: 1" transform="translate(1217.2421875,832)"><rect class="label-container" height="46" rx="0" ry="0" width="143.375" x="-71.6875" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-61.6875,-13)"><foreignObject height="26" width="123.375"><div style="display: inline-block; white-space: nowrap">Anthropic Claude</div></foreignObject></g></g></g><g class="node default" id="flowchart-R4-512" style="opacity: 1" transform="translate(1053.5546875,832)"><rect class="label-container" height="46" rx="0" ry="0" width="84" x="-42" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-32,-13)"><foreignObject height="26" width="64"><div style="display: inline-block; white-space: nowrap">开源模型</div></foreignObject></g></g></g><g class="node default" id="flowchart-S-513" style="opacity: 1" transform="translate(1382.4921875,590)"><rect class="label-container" height="46" rx="0" ry="0" width="100" x="-50" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-40,-13)"><foreignObject height="26" width="80"><div style="display: inline-block; white-space: nowrap">模型缓存层</div></foreignObject></g></g></g><g class="node default" id="flowchart-N1a-490" style="opacity: 1" transform="translate(721.9765625,711)"><rect class="label-container" height="46" rx="0" ry="0" width="92.390625" x="-46.1953125" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-36.1953125,-13)"><foreignObject height="26" width="72.390625"><div style="display: inline-block; white-space: nowrap">模板/变量</div></foreignObject></g></g></g><g class="node default" id="flowchart-N1-489" style="opacity: 1" transform="translate(721.9765625,590)"><rect class="label-container" height="46" rx="0" ry="0" width="100" x="-50" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-40,-13)"><foreignObject height="26" width="80"><div style="display: inline-block; white-space: nowrap">提示词管理</div></foreignObject></g></g></g><g class="node default" id="flowchart-N-488" style="opacity: 1" transform="translate(419.390625,444)"><rect class="label-container" height="46" rx="0" ry="0" width="84" x="-42" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-32,-13)"><foreignObject height="26" width="64"><div style="display: inline-block; white-space: nowrap">推理引擎</div></foreignObject></g></g></g><g class="node default" id="flowchart-N2a-493" style="opacity: 1" transform="translate(579.5859375,711)"><rect class="label-container" height="46" rx="0" ry="0" width="92.390625" x="-46.1953125" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-36.1953125,-13)"><foreignObject height="26" width="72.390625"><div style="display: inline-block; white-space: nowrap">思维链/树</div></foreignObject></g></g></g><g class="node default" id="flowchart-N2-492" style="opacity: 1" transform="translate(579.5859375,590)"><rect class="label-container" height="46" rx="0" ry="0" width="84" x="-42" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-32,-13)"><foreignObject height="26" width="64"><div style="display: inline-block; white-space: nowrap">推理逻辑</div></foreignObject></g></g></g><g class="node default" id="flowchart-N3a-496" style="opacity: 1" transform="translate(433.390625,711)"><rect class="label-container" height="46" rx="0" ry="0" width="100" x="-50" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-40,-13)"><foreignObject height="26" width="80"><div style="display: inline-block; white-space: nowrap">验证与执行</div></foreignObject></g></g></g><g class="node default" id="flowchart-N3-495" style="opacity: 1" transform="translate(433.390625,590)"><rect class="label-container" height="46" rx="0" ry="0" width="84" x="-42" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-32,-13)"><foreignObject height="26" width="64"><div style="display: inline-block; white-space: nowrap">工具调用</div></foreignObject></g></g></g><g class="node default" id="flowchart-O1-498" style="opacity: 1" transform="translate(263.1953125,590)"><rect class="label-container" height="46" rx="0" ry="0" width="156.390625" x="-78.1953125" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-68.1953125,-13)"><foreignObject height="26" width="136.390625"><div style="display: inline-block; white-space: nowrap">短期记忆/会话记忆</div></foreignObject></g></g></g><g class="node default" id="flowchart-O-497" style="opacity: 1" transform="translate(89,444)"><rect class="label-container" height="46" rx="0" ry="0" width="84" x="-42" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-32,-13)"><foreignObject height="26" width="64"><div style="display: inline-block; white-space: nowrap">记忆系统</div></foreignObject></g></g></g><g class="node default" id="flowchart-O2a-501" style="opacity: 1" transform="translate(93,711)"><rect class="label-container" height="46" rx="0" ry="0" width="100" x="-50" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-40,-13)"><foreignObject height="26" width="80"><div style="display: inline-block; white-space: nowrap">向量数据库</div></foreignObject></g></g></g><g class="node default" id="flowchart-O2-500" style="opacity: 1" transform="translate(93,590)"><rect class="label-container" height="46" rx="0" ry="0" width="84" x="-42" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-32,-13)"><foreignObject height="26" width="64"><div style="display: inline-block; white-space: nowrap">长期记忆</div></foreignObject></g></g></g><g class="node default" id="flowchart-P1-503" style="opacity: 1" transform="translate(862.765625,590)"><rect class="label-container" height="46" rx="0" ry="0" width="81.578125" x="-40.7890625" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-30.7890625,-13)"><foreignObject height="26" width="61.578125"><div style="display: inline-block; white-space: nowrap">RAG引擎</div></foreignObject></g></g></g><g class="node default" id="flowchart-P-502" style="opacity: 1" transform="translate(798.37109375,444)"><rect class="label-container" height="46" rx="0" ry="0" width="100" x="-50" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-40,-13)"><foreignObject height="26" width="80"><div style="display: inline-block; white-space: nowrap">知识库服务</div></foreignObject></g></g></g><g class="node default" id="flowchart-I1-479" style="opacity: 1" transform="translate(3469.4921875,444)"><rect class="label-container" height="46" rx="0" ry="0" width="92.390625" x="-46.1953125" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-36.1953125,-13)"><foreignObject height="26" width="72.390625"><div style="display: inline-block; white-space: nowrap">创建/配置</div></foreignObject></g></g></g><g class="node default" id="flowchart-I-478" style="opacity: 1" transform="translate(3100.69921875,323)"><rect class="label-container" height="46" rx="0" ry="0" width="132" x="-66" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-56,-13)"><foreignObject height="26" width="112"><div style="display: inline-block; white-space: nowrap">智能体管理服务</div></foreignObject></g></g></g><g class="node default" id="flowchart-I2-481" style="opacity: 1" transform="translate(3331.296875,444)"><rect class="label-container" height="46" rx="0" ry="0" width="84" x="-42" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-32,-13)"><foreignObject height="26" width="64"><div style="display: inline-block; white-space: nowrap">版本控制</div></foreignObject></g></g></g><g class="node default" id="flowchart-I3-483" style="opacity: 1" transform="translate(2808.90625,444)"><rect class="label-container" height="46" rx="0" ry="0" width="84" x="-42" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-32,-13)"><foreignObject height="26" width="64"><div style="display: inline-block; white-space: nowrap">沙箱环境</div></foreignObject></g></g></g><g class="node default" id="flowchart-J-484" style="opacity: 1" transform="translate(2544.8515625,323)"><rect class="label-container" height="46" rx="0" ry="0" width="116" x="-58" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-48,-13)"><foreignObject height="26" width="96"><div style="display: inline-block; white-space: nowrap">会话管理服务</div></foreignObject></g></g></g><g class="node default" id="flowchart-K-485" style="opacity: 1" transform="translate(2370.8515625,323)"><rect class="label-container" height="46" rx="0" ry="0" width="132" x="-66" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-56,-13)"><foreignObject height="26" width="112"><div style="display: inline-block; white-space: nowrap">工作流编排服务</div></foreignObject></g></g></g><g class="node default" id="flowchart-L-486" style="opacity: 1" transform="translate(2979.1015625,444)"><rect class="label-container" height="46" rx="0" ry="0" width="156.390625" x="-78.1953125" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-68.1953125,-13)"><foreignObject height="26" width="136.390625"><div style="display: inline-block; white-space: nowrap">技能/工具管理服务</div></foreignObject></g></g></g><g class="node default" id="flowchart-M-487" style="opacity: 1" transform="translate(3173.296875,444)"><rect class="label-container" height="46" rx="0" ry="0" width="132" x="-66" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-56,-13)"><foreignObject height="26" width="112"><div style="display: inline-block; white-space: nowrap">评估与监控服务</div></foreignObject></g></g></g><g class="node default" id="flowchart-H-477" style="opacity: 1" transform="translate(3765.87109375,590)"><rect class="label-container" height="46" rx="0" ry="0" width="156.390625" x="-78.1953125" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-68.1953125,-13)"><foreignObject height="26" width="136.390625"><div style="display: inline-block; white-space: nowrap">请求路由/负载均衡</div></foreignObject></g></g></g><g class="node default" id="flowchart-G-476" style="opacity: 1" transform="translate(3765.87109375,444)"><rect class="label-container" height="46" rx="0" ry="0" width="84" x="-42" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-32,-13)"><foreignObject height="26" width="64"><div style="display: inline-block; white-space: nowrap">速率限制</div></foreignObject></g></g></g><g class="node default" id="flowchart-F-475" style="opacity: 1" transform="translate(3765.87109375,323)"><rect class="label-container" height="46" rx="0" ry="0" width="92.390625" x="-46.1953125" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-36.1953125,-13)"><foreignObject height="26" width="72.390625"><div style="display: inline-block; white-space: nowrap">认证/鉴权</div></foreignObject></g></g></g><g class="node default" id="flowchart-E-474" style="opacity: 1" transform="translate(3729.046875,202)"><rect class="label-container" height="46" rx="0" ry="0" width="110.140625" x="-55.0703125" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-45.0703125,-13)"><foreignObject height="26" width="90.140625"><div style="display: inline-block; white-space: nowrap">API Gateway</div></foreignObject></g></g></g><g class="node default" id="flowchart-C-472" style="opacity: 1" transform="translate(3645.625,56)"><rect class="label-container" height="46" rx="0" ry="0" width="133.6875" x="-66.84375" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-56.84375,-13)"><foreignObject height="26" width="113.6875"><div style="display: inline-block; white-space: nowrap">Web/App Client</div></foreignObject></g></g></g><g class="node default" id="flowchart-D-473" style="opacity: 1" transform="translate(3812.46875,56)"><rect class="label-container" height="46" rx="0" ry="0" width="100" x="-50" y="-23"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-40,-13)"><foreignObject height="26" width="80"><div style="display: inline-block; white-space: nowrap">第三方系统</div></foreignObject></g></g></g></g></g></g></svg></div><hr><h5><strong>三、 核心组件详细说明</strong></h5><p><strong>1. 接入层 (API Gateway)</strong></p><ul><li><strong>功能</strong>:所有流量的统一入口。</li><li><strong>关键职责</strong>: <ul><li><strong>身份认证与授权</strong>:验证API Key、JWT Token,并与IAM(身份识别与访问管理)系统集成。</li><li><strong>速率限制(Rate Limiting)</strong>:基于用户、智能体或API Key进行限流,防止滥用。</li><li><strong>请求路由与负载均衡</strong>:将请求路由到正确的后端服务实例。</li><li><strong>日志与审计</strong>:记录所有入站请求的基本信息。</li><li><strong>SSL终止</strong>:处理HTTPS加解密。</li></ul></li></ul><p><strong>2. 应用服务层 (微服务集合)</strong></p><ul><li><strong>智能体管理服务 (Agent Management Service)</strong>: <ul><li>智能体的CRUD(增删改查)、安装(如系统提示词、模型选择、参数设置、工具绑定)。</li><li>版本管理:支持智能体配置的版本回溯和灰度发布。</li><li>沙箱环境:提供隔离环境供用户测试和调试智能体配置。</li></ul></li><li><strong>会话管理服务 (Session Management Service)</strong>: <ul><li>维护有状态智能体的对话上下文(Conversation Context)。</li><li>处理多轮对话的会话保持和超时销毁。</li></ul></li><li><strong>工作流编排服务 (Workflow Orchestration Service)</strong>: <ul><li>允许用户通过Low-Code/DSL(领域特定语言)定义复杂的多智能体协作流程或顺序执行链。</li><li>集成类似Temporal或Airflow的编排引擎。</li></ul></li><li><strong>技能/工具管理服务 (Skill/Tool Management Service)</strong>: <ul><li>注册、发现和管理智能体可调用的外部工具(如API、函数)。</li><li>应用执行前进行参数验证和安全检查。</li></ul></li><li><strong>评估与监控服务 (Evaluation &amp; Monitoring Service)</strong>: <ul><li>收集智能体的交互数据(脱敏后)。</li><li>提供基于LLM的自动评估(Auto-Eval)和人工评估平台。</li><li>监控智能体的性能指标(延迟、错误率、Token消耗)和质量指标(回答相关性、准确性)。</li></ul></li></ul><p><strong>3. 核心能力层 (智能体运行时核心)</strong></p><ul><li><strong>推理引擎 (Inference Engine)</strong>: <ul><li><strong>提示词管理</strong>:支持模板化、变量替换、少样本示例(Few-shot)注入。</li><li><strong>推理逻辑</strong>:完成智能体的决策循环,如ReAct(Reason-Act)、CoT(Chain-of-Thought)、ToT(Tree-of-Thought)等框架。</li><li><strong>工具调用</strong>:解析模型的工具调用请求,分发给工具管理服务执行,并将结果格式化后返回给模型。</li></ul></li><li><strong>记忆系统 (Memory System)</strong>: <ul><li><strong>短期记忆</strong>:存储在会话管理中,维护当前对话上下文。</li><li><strong>长期记忆</strong>:利用向量数据库存储和检索历史对话中的关键信息,实现智能体的“个性化”和“持续学习”。</li></ul></li><li><strong>知识库服务 (Knowledge Base Service)</strong>: <ul><li>基于RAG(检索增强生成)技术,允许用户上传私有文档(PDF、Word等)。</li><li>为智能体提供准确、最新的外部知识源,减少模型幻觉。</li></ul></li></ul><p><strong>4. 模型层 (Model Layer)</strong></p><ul><li><strong>多云多模型网关 (Multi-Cloud Model Gateway)</strong>: <ul><li><strong>统一抽象</strong>:将不同厂商(OpenAI、Anthropic、Cohere、Azure、本地部署模型)的API抽象为一套统一的调用接口。</li><li><strong>智能路由</strong>:根据成本、性能、地域或模型能力,将请求路由到最合适的模型提供商。</li><li><strong>故障转移与降级</strong>:当一个模型端点不可用时,自动切换到备份模型。</li><li><strong>缓存</strong>:对频繁出现的类似提示词进行结果缓存,显著降低成本和延迟。</li></ul></li></ul><p><strong>5. 基础设施层</strong></p><ul><li><strong>容器化与编排</strong>:所有服务都部署为Docker容器,由Kubernetes统一编排管理,实现弹性伸缩和自我修复。</li><li><strong>数据库</strong>: <ul><li><strong>关系型数据库 (PostgreSQL)</strong>:存储结构化数据,如用户信息、智能体元信息、工具设置、审计日志。</li><li><strong>NoSQL数据库 (Redis/MongoDB)</strong>:Redis用于缓存和会话存储;MongoDB用于存储非结构化的会话日志和评估数据。</li><li><strong>向量数据库 (Pinecone/Weaviate/Qdrant)</strong>:为记忆系统和RAG提供高速向量相似性检索。</li></ul></li><li><strong>消息队列 (Kafka/RabbitMQ)</strong>:用于异步处理耗时任务,如日志处理、异步工具调用、事件驱动的工作流。</li><li><strong>对象存储 (S3)</strong>:存储知识库文档、上传的文件、生成的图片/音频等非结构化数据。</li></ul><h5><strong>四、 关键技术与选型建议</strong></h5><ul><li><strong>开发语言</strong>:后端服务建议使用<strong>Python</strong>(AI生态丰富)和<strong>Go</strong>(高并发、性能好)的组合。</li><li><strong>模型网关</strong>:可基于 <strong>OpenAI的Python库</strong>进行封装,或使用开源项目如<strong>OpenLLMetry</strong>、** LiteLLM**。</li><li><strong>工作流编排</strong>:<strong>Temporal</strong>(强一致性)或<strong>Prefect</strong>(数据工程强大)是比Airflow更现代的选择。</li><li><strong>向量数据库</strong>:<strong>Pinecone</strong>(全托管,省心)或<strong>Weaviate</strong>(开源,功能强大)。</li><li><strong>监控体系</strong>:<strong>Prometheus</strong>(指标收集)+<strong>Grafana</strong>(可视化)+<strong>Loki</strong>(日志聚合)+<strong>Tempo/Jaeger</strong>(分布式追踪)。</li></ul><h5><strong>五、 安全与合规考量</strong></h5><ol><li><strong>数据安全</strong>: <ul><li><strong>传输加密</strong>:全链路HTTPS/TLS。</li><li><strong>静态加密</strong>:数据库和对象存储的静态数据加密。</li><li><strong>隐私保护</strong>:帮助敏感信息脱敏,避免PII(个人身份信息)数据传入模型。</li></ul></li><li><strong>访问控制</strong>: <ul><li><strong>RBAC(基于角色的访问控制)</strong>:精细控制用户对智能体、工具、知识的访问权限。</li></ul></li><li><strong>工具调用安全</strong>: <ul><li>建立严格的工具允许列表(Allowlist)。</li><li>对软件调用参数进行严格的校验和沙箱隔离(如需要),防止SSRF(服务器端请求伪造)和代码注入。</li></ul></li><li><strong>审计与合规</strong>: <ul><li>记录所有智能体的输入输出(需获得用户授权),以满足合规性要求。</li><li>提供数据导出和删除机制,支持GDPR等法规。</li></ul></li></ol><hr><p>这套架构设计提供了一个坚实的基础,您可以根据业务优先级和资源情况分阶段实施。例如,先从最核心的<strong>模型网关</strong>和<strong>推理引擎</strong>开始,再逐步构建<strong>记忆系统</strong>、<strong>工作流编排</strong>等高级功能。</p></div><br><br>
来源:https://www.cnblogs.com/yxysuanfa/p/19102088
頁: [1]
查看完整版本: AI智能体服务优秀的平台架构设计