尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

基于Kubernetes的Agentic Runtime编排实战:从CRD设计到可观测性

发布时间:2026/9/29 19:40:57

资讯中心
01
ARTICLE

基于Kubernetes的Agentic Runtime编排实战:从CRD设计到可观测性

基于Kubernetes的Agentic Runtime编排实战:从CRD设计到可观测性
1. 从“ax”这个标题说起一个被低估的运行时编排切口第一次看到“ax”这个标题我脑子里蹦出来的不是某个具体产品而是一类问题的缩写。结合热搜词里的 agentic、orchestration、runtime、Kubernetes我基本能判断出这大概率是在讲一套面向智能体Agent场景的运行时编排方案名字取了个极简的“ax”像是“agent execution”或者“agent orchestration axis”的缩写。这类项目最近一年冒出来特别多原因很简单大模型能力上来了但把模型真正跑成一个稳定、可观测、可扩展的生产系统中间的坑比想象中多得多。我过去两年一直在做云原生和 AI 基础设施的交叉地带从最早的把模型塞进容器里跑到后来用 Kubernetes 调度推理服务再到最近折腾 agentic 工作流踩过的坑能写一本小册子。所以看到“ax”这个标题我第一反应不是去查它到底是谁家的项目而是想把它当成一个典型样本拆一拆一个 agentic runtime 在 Kubernetes 上到底该怎么设计、怎么落地、怎么排错。这篇文章就是基于这个思路展开的适合两类人看一类是已经在用 Kubernetes 跑服务、想往 agent 方向延伸的运维和平台工程师另一类是刚接触 agentic 概念、想知道底层运行时到底在干什么的开发者。我会尽量把原理讲透把操作步骤写细把踩过的坑摊开来说。先给个整体判断agentic runtime 和传统微服务 runtime 最大的区别在于它的执行单元不是无状态的请求-响应而是带状态、带工具调用、带多轮决策的“任务”。这就导致调度、隔离、超时、重试、可观测性这些维度的设计逻辑全变了。Kubernetes 本身是为无状态和有状态服务设计的直接拿来跑 agent 不是不行但需要一层编排层去补足语义。ax 这类项目要解决的就是这个“补足”的问题。2. 核心概念拆解agentic、orchestration、runtime 到底指什么2.1 agentic 不是“更聪明的 API”而是执行范式的切换很多人第一次听到 agentic 这个词会把它理解成“带函数调用的 LLM”。这个理解不算错但太浅了。我习惯用一个类比传统 API 像自动售货机你投币、选商品、出货流程固定agentic 更像你雇了一个助理你告诉他“帮我订一张明天去上海的票预算 800 以内靠窗”他会自己拆解任务、查航班、比价、下单中间可能还会回来问你“高铁行不行”。这个“自己拆解、自己决策、必要时回头确认”的过程就是 agentic 的核心。落到技术层面agentic 系统通常包含几个要素一个决策核心通常是 LLM、一组可调用的工具搜索、数据库、代码执行、外部 API、一个记忆或状态存储、以及一个控制循环loop。这个循环会反复执行“观察-思考-行动”的步骤直到任务完成或触发终止条件。理解这一点很关键因为它直接决定了 runtime 的设计你不能假设一次调用就结束你得为“长时间运行、多次交互、可能失败重试”做好准备。2.2 orchestration 在 agent 场景下的特殊含义Orchestration 这个词在云原生里一般指容器编排Kubernetes 就是代表。但在 agentic 语境下它多了一层含义不只是编排容器还要编排“决策流程”。我把它拆成三个层次来看。第一层是基础设施编排也就是把 agent 的各个组件决策服务、工具服务、记忆存储调度到合适的节点上保证资源隔离和弹性伸缩。这一层 Kubernetes 很擅长不用重新造轮子。第二层是任务编排指的是一个复杂任务如何拆成子任务、子任务之间如何传递上下文、失败后如何回滚或重试。这一层是 agentic runtime 真正要发力的地方因为 Kubernetes 原生并不理解“任务”这个概念它只理解 Pod 和 Job。第三层是工具编排也就是 agent 在运行过程中动态选择和调用工具。这一层往往和决策核心耦合在一起但 runtime 需要提供工具注册、权限控制、调用审计的能力。三层叠在一起才是完整的 agentic orchestration。很多项目只做了第一层就宣称自己是 agent 平台实际用起来会发现任务一复杂就乱套根因就在这里。2.3 runtime 是“执行环境”还是“执行协议”Runtime 这个词被用得很泛。Java 有 JVM runtime浏览器有 WebView2 runtime容器有 container runtime。在 agentic 场景下我更愿意把 runtime 理解成“执行协议 执行环境”的组合。协议部分定义了 agent 如何被启动、如何接收输入、如何上报状态、如何被终止环境部分提供了它运行所需的依赖、隔离和资源。为什么强调协议因为 agent 的执行是长时的、有状态的如果没有一套清晰的协议编排层就不知道一个 agent 到底是“还在思考”还是“已经卡死”。我见过太多项目agent 跑着跑着就挂在那里日志里什么都没有排查起来极其痛苦。根因就是 runtime 没有定义心跳和状态上报机制。3. 为什么选 Kubernetes 作为底座优势与需要补的课3.1 Kubernetes 能直接给 agentic runtime 带来什么先说优势这部分是实打实的。Kubernetes 经过这么多年发展在以下几个方面已经非常成熟直接拿来用能省掉大量重复建设。资源调度和隔离方面Kubernetes 的 requests/limits、命名空间、NetworkPolicy、SecurityContext 这套组合拳能保证不同 agent 任务之间互不干扰。尤其是当你的 agent 会执行代码或者访问敏感数据时隔离不是可选项而是必选项。弹性伸缩方面HPA 和 Cluster Autoscaler 能根据负载自动调整副本数。Agent 任务的负载波动往往比传统服务更大因为一个复杂任务可能瞬间拉起几十个工具调用这时候弹性能力就体现出价值了。可观测性方面Kubernetes 生态里的 Prometheus、Grafana、OpenTelemetry 已经形成了事实标准。Agent 的运行指标、日志、链路追踪都可以接入这套体系不用自己从头搭。声明式管理方面YAML 描述期望状态、控制器负责收敛这个模式对于管理大量 agent 配置非常友好。你可以把 agent 的定义、工具清单、权限策略都写成 CRD用 GitOps 的方式管理。3.2 Kubernetes 原生能力覆盖不到的地方但 Kubernetes 不是万能的在 agentic 场景下它有几个明显的短板这也是 ax 这类 runtime 存在的意义。第一个短板是任务语义缺失。Kubernetes 的 Job 适合批处理但 agent 任务往往是“长时运行 多次交互 可能中途改变目标”Job 的完成语义对不上。你需要一层抽象把 agent 任务映射成 Kubernetes 资源同时保留任务级别的状态管理。第二个短板是状态管理薄弱。Agent 需要记忆需要跨轮次保持上下文。Kubernetes 的 Pod 是无状态的或者说状态需要外挂你得自己接一个状态存储并且处理好并发访问和一致性。第三个短板是工具调用的动态性。Agent 在运行时才决定调用哪个工具而 Kubernetes 的资源配置是静态的。你没法在 YAML 里预先声明“这个 agent 可能会调用搜索工具”只能通过 sidecar 或者服务网格的方式动态注入。第四个短板是超时和重试的粒度。Kubernetes 的 liveness/readiness probe 是给服务用的agent 的“健康”定义完全不同。一个 agent 可能正在等一个慢速工具返回这时候它不该被重启。你需要自定义健康判断逻辑。3.3 一个务实的架构分层思路基于上面的分析我一般建议把 agentic runtime 分成四层来设计从下往上依次是基础设施层Kubernetes、运行时层容器 状态存储 工具代理、编排层任务调度 流程控制、应用层具体 agent 逻辑。ax 这类项目通常覆盖运行时层和编排层把基础设施层交给 Kubernetes把应用层留给业务开发者。这个分层的好处是职责清晰。基础设施层的问题找平台团队运行时层的问题找 runtime 维护者应用层的问题找业务方。我见过一些团队把所有逻辑揉在一起结果一个 agent 出问题从内核参数查到 prompt 写法效率极低。4. 实操落地从零搭一个最小可用的 agentic runtime4.1 环境准备与前置检查动手之前先把环境确认清楚。我踩过的第一个坑就是版本不匹配Kubernetes 版本、容器运行时版本、CRD 版本三者之间经常有兼容性问题。下面是我常用的检查清单。# 确认 Kubernetes 版本建议 1.26 及以上 kubectl version --short # 确认容器运行时正常这一步经常出问题 kubectl get nodes -o wide crictl info # 确认 CRD 可以正常创建 kubectl api-resources | grep customresourcedefinition # 确认存储类可用agent 状态需要持久化 kubectl get storageclass这里重点说一个高频报错container runtime is not running。这个错误通常出现在节点刚重启或者容器运行时配置被改动之后。排查顺序是先看systemctl status containerd或对应的运行时服务再看/etc/containerd/config.toml里的配置有没有语法错误最后看 kubelet 日志里有没有连接运行时的报错。我遇到过因为 cgroup 驱动不一致导致的这个问题kubelet 用 systemdcontainerd 用 cgroupfs两边对不上改一致就好了。还有一个容易忽略的点是 WebView2 runtime 这类依赖。如果你的 agent 需要跑浏览器自动化或者渲染任务容器镜像里得预装对应的 runtime否则运行时会报could not find the webview2 runtime。这个错误在 Windows 容器里更常见Linux 下一般是缺 Chromium 相关库。4.2 定义 agent 任务的 CRDKubernetes 原生资源不够用第一步是定义自己的 CRD。我设计了一个简化版的 AgentTask字段不多但够用。apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: agenttasks.ax.example.com spec: group: ax.example.com versions: - name: v1alpha1 served: true storage: true schema: openAPIV3Schema: type: object properties: spec: type: object properties: goal: type: string maxSteps: type: integer default: 20 timeoutSeconds: type: integer default: 600 tools: type: array items: type: string memoryRef: type: string status: type: object properties: phase: type: string currentStep: type: integer lastHeartbeat: type: string scope: Namespaced names: plural: agenttasks singular: agenttask kind: AgentTask shortNames: - at这里有几个设计决策值得说明。maxSteps是防止 agent 陷入死循环的硬性上限我建议默认值不要设太大20 步对于大多数任务够了设太大反而会让卡死的任务占用资源更久。timeoutSeconds是任务级超时和 Kubernetes 的 activeDeadlineSeconds 不同它由 runtime 自己控制因为 agent 的“超时”需要优雅处理不能直接杀进程。memoryRef指向一个 ConfigMap 或 Secret里面存的是记忆存储的连接信息这样可以把敏感配置和任务定义分开。status里的lastHeartbeat是我强烈建议加的字段。Agent 每隔几秒更新一次心跳编排层通过对比当前时间和心跳时间来判断任务是否卡死。没有这个字段你只能靠日志猜效率差十倍。4.3 编写控制器逻辑CRD 定义好了接下来是控制器。控制器负责监听 AgentTask 的创建然后拉起对应的 Pod并且持续同步状态。我用 Python 的 kopf 框架写一个骨架逻辑清晰适合快速验证。import kopf import kubernetes import time kopf.on.create(ax.example.com, v1alpha1, agenttasks) def create_fn(spec, name, namespace, logger, **kwargs): goal spec.get(goal) max_steps spec.get(maxSteps, 20) timeout spec.get(timeoutSeconds, 600) logger.info(fCreating agent task {name} with goal: {goal}) # 构造 Pod 定义 pod kubernetes.client.V1Pod( metadatakubernetes.client.V1ObjectMeta( namefagent-{name}, labels{app: ax-agent, task: name} ), speckubernetes.client.V1PodSpec( containers[ kubernetes.client.V1Container( nameagent, imageax/agent-runtime:latest, env[ kubernetes.client.V1EnvVar(nameGOAL, valuegoal), kubernetes.client.V1EnvVar(nameMAX_STEPS, valuestr(max_steps)), kubernetes.client.V1EnvVar(nameTIMEOUT, valuestr(timeout)), ], resourceskubernetes.client.V1ResourceRequirements( requests{cpu: 500m, memory: 1Gi}, limits{cpu: 2, memory: 4Gi} ) ) ], restart_policyNever ) ) api kubernetes.client.CoreV1Api() api.create_namespaced_pod(namespacenamespace, bodypod) return {phase: Running, currentStep: 0}这段代码里restart_policyNever是个关键选择。Agent 任务失败后不应该被 Kubernetes 自动重启因为重启意味着从头开始而 agent 可能已经执行了一半有副作用的操作。正确的做法是让 runtime 决定是否重试以及从哪一步重试。这一点和传统无状态服务完全不同很多人在这里踩坑。资源限制的设置也有讲究。Agent 的 CPU 消耗通常不高但内存消耗可能很大因为要维护上下文和记忆。我一般给 1Gi 起步复杂任务给到 4Gi。如果 agent 会执行代码还得考虑临时存储的限制避免把节点磁盘写满。4.4 状态存储与记忆管理Agent 的记忆我一般分三层来存。短期记忆放在内存里就是当前对话的上下文任务结束就释放。中期记忆放在 Redis 里跨轮次共享设置合理的过期时间。长期记忆放在向量数据库里用于检索增强这个可以持久化。Redis 的部署很简单但有几个参数要调。maxmemory-policy建议设成allkeys-lru避免内存打满。timeout设成 0因为 agent 的连接可能是长连接。持久化用 AOF 而不是 RDB因为 agent 的状态变化频繁RDB 的快照间隔可能导致数据丢失。向量数据库的选择要看规模。小规模用 pgvector 就够了和 PostgreSQL 复用一套运维体系。大规模再考虑专门的向量库。我见过一些团队一上来就上重型向量库结果运维成本比业务收益还高不划算。记忆的读写要注意并发。同一个 agent 任务可能有多个工具调用并行执行它们都要读写记忆。我的做法是给每个任务分配一个独立的 key 前缀然后用 Redis 的 WATCH/MULTI 做乐观锁。如果冲突频繁再考虑换成更细粒度的锁。5. 工具调用与安全隔离agentic runtime 最容易出事的地方5.1 工具注册与动态发现Agent 的工具不能写死在代码里得有一套注册机制。我的做法是用 ConfigMap 存工具清单runtime 启动时加载运行过程中可以热更新。apiVersion: v1 kind: ConfigMap metadata: name: ax-tools data: tools.json: | { tools: [ { name: web_search, endpoint: http://tool-search:8080/search, timeout: 30, retry: 2, scopes: [read] }, { name: code_exec, endpoint: http://tool-exec:8080/run, timeout: 120, retry: 0, scopes: [execute] } ] }scopes字段是权限控制的关键。Agent 在调用工具前runtime 会检查当前任务是否被授予了对应的 scope。这个检查必须在 runtime 层做不能只靠工具服务自己判断因为工具服务可能被绕过。我见过因为没做这层检查agent 意外调用了删除数据的工具后果很严重。retry字段也要小心设置。查询类工具可以重试执行类工具不能随便重试因为可能有副作用。code_exec我设成 0 次重试宁可失败让 agent 重新决策也不要盲目重试导致重复执行。5.2 网络隔离与出站控制Agent 调用外部工具意味着有出站流量这是安全风险的高发区。Kubernetes 的 NetworkPolicy 可以控制出站但默认是全部放行的你得显式收紧。apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: ax-agent-egress spec: podSelector: matchLabels: app: ax-agent policyTypes: - Egress egress: - to: - podSelector: matchLabels: app: ax-tool ports: - protocol: TCP port: 8080 - to: - namespaceSelector: matchLabels: name: kube-system ports: - protocol: UDP port: 53这段策略的意思是agent 只能访问带app: ax-tool标签的 Pod 的 8080 端口以及 kube-system 的 DNS。其他出站全部拒绝。这样即使 agent 被诱导去访问恶意地址也会被网络层拦住。实际部署时要注意很多工具服务需要访问外部 API这时候不能简单拒绝而应该通过一个统一的出口代理在代理层做审计和限流。出口代理的日志要保留出问题时这是唯一的追溯依据。5.3 资源配额与防滥用Agent 的一个特点是可能“想太多”反复调用工具消耗大量资源。除了 maxSteps 限制还得在资源层面做配额。我一般给每个命名空间设置 ResourceQuota限制总的 CPU、内存、Pod 数量。再给每个 agent 任务设置 LimitRange防止单个任务申请过多资源。这两层配合能有效防止一个失控的 agent 拖垮整个集群。apiVersion: v1 kind: ResourceQuota metadata: name: ax-quota namespace: ax-agents spec: hard: requests.cpu: 20 requests.memory: 40Gi limits.cpu: 40 limits.memory: 80Gi pods: 50配额设置要留有余量不能卡得太死。我一般按峰值负载的 1.5 倍来设这样正常波动不会触发配额限制真出问题时又能兜住。6. 可观测性建设让 agent 的“思考过程”可见6.1 指标采集与关键指标定义Agent 的指标和传统服务不一样不能只看 QPS 和延迟。我关注的核心指标有这么几个。任务成功率指的是最终完成目标的任务占比。这个指标反映 agent 的整体能力但要注意区分“任务本身无法完成”和“runtime 故障导致失败”两者要分开统计。平均步数指的是完成任务平均需要多少轮决策。步数突然升高往往意味着模型能力下降或者工具出了问题。工具调用失败率按工具维度统计。某个工具失败率飙升可能是它依赖的外部服务挂了。心跳延迟指的是任务上报心跳的间隔。延迟变大说明任务可能卡住或者资源不足。这些指标通过 OpenTelemetry 采集推到 Prometheus再用 Grafana 做面板。我建议给每个指标都加上 task_id 和 agent_version 标签方便下钻分析。6.2 日志规范与链路追踪Agent 的日志量很大因为每一轮决策都要记录输入输出。如果不加规范日志会变成一团乱麻。我的做法是结构化日志每条日志都带 trace_id、task_id、step、event_type 字段。import structlog logger structlog.get_logger() logger.info( agent_step, trace_idtrace_id, task_idtask_id, stepcurrent_step, event_typedecision, thoughtthought, actionaction, duration_msduration )链路追踪用 OpenTelemetry 的 span 来串。一个任务是一个 root span每一轮决策是一个子 span每次工具调用是一个更细的 span。这样在 Jaeger 里能看到完整的调用链哪一步慢、哪一步失败一目了然。这里有个坑要注意agent 的上下文可能很长如果把完整的 prompt 和 response 都塞进 span 属性里会导致追踪系统存储爆炸。我的做法是只存摘要和哈希值完整内容存到对象存储通过 ID 关联。这样既保留了可追溯性又控制了成本。6.3 告警策略与误报控制Agent 系统的告警很容易误报因为它的行为本身就有随机性。同一个任务这次成功下次可能失败这不一定是故障。所以告警策略要设计得保守一些。我一般设三条告警规则。第一条是任务成功率低于阈值但要求连续多个时间窗口都低才触发避免偶发波动。第二条是心跳超时这个比较硬超过预期时间没心跳基本就是卡死了。第三条是资源配额接近上限这是预防性的提前扩容比事后救火好。告警的接收人要分清。Runtime 层面的告警发给平台团队业务层面的告警发给业务方。我见过把所有告警都发给一个群的结果大家都不看真出事时没人响应。7. 常见问题与排查技巧实录7.1 任务卡死但没有任何报错这是最常见也最头疼的问题。Agent 跑着跑着就不动了日志停在某一步没有异常。排查思路是这样的。先看心跳。如果心跳还在更新说明进程活着可能是卡在某个工具调用上。去看工具服务的日志确认请求有没有到达、有没有返回。如果心跳停了说明进程可能挂了或者被 OOM kill 了去看 Pod 的事件和节点的 dmesg。再看资源。kubectl top pod看 CPU 和内存使用如果内存接近 limit很可能是 OOM。Agent 的内存泄漏往往来自上下文没有及时清理每一轮都把历史全量拼进去越拼越长。解决办法是设置上下文窗口上限超出部分做摘要压缩。最后看网络。如果 agent 在等一个永远不返回的 HTTP 请求而客户端没有设超时就会一直挂着。所有工具调用必须设超时这是铁律。我一般设 30 秒长任务设 120 秒绝不设无限。7.2 工具调用返回格式错误Agent 依赖工具返回的结构化数据做决策如果格式不对agent 可能会解析失败或者做出错误决策。这类问题的根因往往是工具服务的版本升级导致 schema 变了但 agent 侧的解析逻辑没跟上。我的做法是在 runtime 层加一个 schema 校验工具返回的数据先过校验再交给 agent。校验失败就返回一个标准错误让 agent 知道这次调用失败了可以重试或者换工具。这样比让 agent 拿到脏数据要好得多。Schema 定义用 JSON Schema放在 ConfigMap 里和工具清单一起管理。工具升级时同步更新 schema通过 CI 做兼容性检查避免不兼容的变更上线。7.3 并发任务互相干扰多个 agent 任务同时跑的时候可能会出现互相干扰。表现是任务 A 的数据出现在任务 B 的上下文里或者任务 A 把任务 B 的资源占满了。数据串扰一般是 key 冲突导致的。每个任务必须有独立的命名空间Redis key、数据库表、临时文件路径都要带 task_id 前缀。我见过因为用了全局的临时目录两个任务同时写同一个文件结果数据混在一起。资源争抢要靠配额和优先级解决。给重要任务设高优先级用 PriorityClass 保证它们能优先调度。给普通任务设低优先级资源紧张时可以被抢占。这样能保证关键业务不受影响。7.4 常见问题速查表现象可能原因排查方法解决方向任务卡死无日志工具调用无超时检查工具服务日志所有调用加超时心跳停止OOM 或进程崩溃kubectl top / dmesg调大内存限制查泄漏返回格式错误schema 不兼容对比工具版本加 schema 校验数据串扰key 冲突检查存储 key加 task_id 前缀资源争抢无配额限制看 ResourceQuota设配额和优先级启动失败镜像或依赖缺失看 Pod 事件补依赖改镜像网络不通NetworkPolicy 太严看策略和连接放行必要出站这张表是我从实际故障里总结出来的覆盖了八成以上的常见问题。遇到新问题先对照这张表能快速缩小排查范围。8. 性能调优与成本控制的一些实战心得8.1 减少不必要的模型调用Agent 的成本大头在模型调用上。每一轮决策都要调一次模型步数越多成本越高。优化方向有两个一是减少步数二是降低单次调用成本。减少步数靠更好的 prompt 和工具设计。把常用的工具组合封装成一个高层工具agent 一次调用就能完成多个步骤。比如“查天气并推荐穿搭”可以封装成一个工具而不是让 agent 先查天气再推理穿搭。降低单次成本靠模型分级。简单决策用小模型复杂推理用大模型。Runtime 可以根据任务类型动态选择模型。我实测下来分级策略能省 40% 左右的成本效果损失很小。8.2 缓存与复用Agent 的很多调用是可以缓存的。工具调用结果如果在一定时间内不变可以缓存。模型调用如果输入相同也可以缓存。缓存层用 Redis 做key 是输入的哈希value 是结果。缓存要注意失效策略。工具结果缓存时间短一些几分钟到几小时。模型结果缓存可以长一些但要注意模型版本变化时清空缓存。我一般给缓存加一个版本前缀模型升级时改前缀旧缓存自然失效。8.3 资源规格的持续调优Agent 的资源需求不是固定的会随着任务类型和负载变化。我建议定期 review 资源使用情况根据实际数据调整 requests 和 limits。调优的方法是看历史 P95 使用量requests 设成 P50limits 设成 P99 再加 20% 余量。这样既能保证大多数任务有足够资源又不会浪费太多。Kubernetes 的 VPA 可以自动做这件事但生产环境我建议先手动调几轮摸清规律再上自动。9. 后续可以扩展的方向这套 runtime 跑通之后还有几个方向可以继续深挖。一个是多 agent 协作让多个 agent 分工完成复杂任务这需要 runtime 支持 agent 之间的通信和协调。另一个是自适应编排根据任务执行情况动态调整策略比如发现某个工具经常失败就自动降级。还有一个是成本感知调度在满足 SLA 的前提下优先选择便宜的资源。我个人在实际操作中的体会是agentic runtime 这个领域变化太快今天的最佳实践明天可能就过时了。与其追求一步到位的完美架构不如先把最小可用版本跑起来在真实负载中发现问题、迭代改进。我见过太多团队花几个月设计“完美架构”结果上线时发现需求已经变了。先跑起来再优化这个顺序不能反。最后分享一个小技巧给每个 agent 任务打上完整的标签包括创建时间、任务类型、发起方、优先级。这些标签平时看着没用出问题时是排查的关键线索。我吃过亏早期没打标签后来想按任务类型分析成功率发现数据根本没法聚合只能重新埋点。这个成本很低收益很高建议一开始就做。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。