「TVM教程」理解 Relax 抽象层

TVM Relax抽象层:动态深度学习模型编译与部署新范式 深度学习编译器是连接算法模型与硬件执行的关键桥梁,其核心在于将高级框架描述的计算图转换为高效的底层代码。传统静态编译方案在处理动态形状、可变输入和控制流时面临挑战,这推动了支持动态性的中间表示设计。TVM Relax抽象层通过引入符号形状、动态类型系统和交互式编译流程,为动态模型提供了原生支持,显著提升了编译灵活性和开发体验。该技术特别适用于自然语言处理中可变序列长度、动态路由网络等场景,通过call_tir机制将高层图优化与底层性能调优解耦,实现了从动态图描述到高性能硬件代码的端到端编译。Relax与Re 阅读详情

TVM 现已更新到 0.21.0 版本,TVM 中文文档已经和新版本对齐。

Apache TVM 是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。

在线运行 TVM 学习教程→go.hyper.ai/PEh1Q

Relax 是 Apache TVM Unity 策略中使用的一种图抽象方式,用于对机器学习模型进行端到端的优化。Relax 的主要目标是描述机器学习模型的结构与数据流,包括模型不同部分之间的依赖关系与连接方式,以及如何在硬件上执行该模型。

端到端模型执行

在本章节中,我们将以一个两层神经网络模型为例进行说明。该模型由两个线性操作和 ReLU 激活函数组成。

图片

高层操作表示

我们先来看一个使用 Numpy 实现的高层模型代码:

def numpy_mlp(data, w0, b0, w1, b1):
    lv0 = data @ w0 + b0
    lv1 = np.maximum(lv0, 0)
    lv2 = lv1 @ w1 + b1
    return lv2

上述代码展示了如何使用数组操作进行端到端模型的执行。当然,我们也可以用 Relax 重写上述模型:

from tvm.script import relax as R

@R.function
def relax_mlp(
    data: R.Tensor(("n", 784), dtype="float32"),
    w0: R.Tensor((784, 128), dtype="float32"),
    b0: R.Tensor((128,), dtype="float32"),
    w1: R.Tensor((128, 10), dtype="float32"),
    b1: R.Tensor((10,), dtype="float32"),
) -> R.Tensor(("n", 10), dtype="float32"):
    with R.dataflow():
        lv0 = R.matmul(data, w0) + b0
        lv1 = R.nn.relu(lv0)
        lv2 = R.matmul(lv1, w1) + b1
        R.output(lv2)
    return lv2

底层集成

然而,从机器学习编译(MLC)的角度来看,我们还希望深入了解这些数组操作背后的底层细节。

为此,我们会使用更底层的 Numpy 实现方式进行说明:

我们将使用循环来代替数组函数,在必要时显式使用 numpy.empty 来分配数组,并进行传递。下面是该模型的底层 NumPy 实现示例:

def lnumpy_linear(X: np.ndarray, W: np.ndarray, B: np.ndarray, Z: np.ndarray):
    n, m, K = X.shape[0], W.shape[1], X.shape[1]
    Y = np.empty((n, m), dtype="float32")
    for i in range(n):
        for j in range(m):
            for k in range(K):
                if k == 0:
                    Y[i, j] = 0
                Y[i, j] = Y[i, j] + X[i, k] * W[k, j]

    for i in range(n):
        for j in range(m):
            Z[i, j] = Y[i, j] + B[j]


def lnumpy_relu0(X: np.ndarray, Y: np.ndarray):
    n, m = X.shape
    for i in range(n):
        for j in range(m):
            Y[i, j] = np.maximum(X[i, j], 0)

def lnumpy_mlp(data, w0, b0, w1, b1):
    n = data.shape[0]
    lv0 = np.empty((n, 128), dtype="float32")
    lnumpy_matmul(data, w0, b0, lv0)

    lv1 = np.empty((n, 128), dtype="float32")
    lnumpy_relu(lv0, lv1)

    out = np.empty((n, 10), dtype="float32")
    lnumpy_matmul(lv1, w1, b1, out)
    return out

了解了这个底层的 NumPy 示例后,我们现在可以介绍对应的 Relax 抽象形式,用于端到端模型的执行。以下代码展示了使用 TVMScript 实现的同一模型:

@I.ir_module
class Module:
    @T.prim_func(private=True)
    def linear(x: T.handle, w: T.handle, b: T.handle, z: T.handle):
        M, N, K = T.int64(), T.int64(), T.int64()
        X = T.match_buffer(x, (M, K), "float32")
        W = T.match_buffer(w, (K, N), "float32")
        B = T.match_buffer(b, (N,), "float32")
        Z = T.match_buffer(z, (M, N), "float32")
        Y = T.alloc_buffer((M, N), "float32")
        for i, j, k in T.grid(M, N, K):
            with T.block("Y"):
                v_i, v_j, v_k = T.axis.remap("SSR", [i, j, k])
                with T.init():
                    Y[v_i, v_j] = T.float32(0.0)
                Y[v_i, v_j] = Y[v_i, v_j] + X[v_i, v_k] * W[v_k, v_j]
        for i, j in T.grid(M, N):
            with T.block("Z"):
                v_i, v_j = T.axis.remap("SS", [i, j])
                Z[v_i, v_j] = Y[v_i, v_j] + B[v_j]

    @T.prim_func(private=True)
    def relu(x: T.handle, y: T.handle):
        M, N = T.int64(), T.int64()
        X = T.match_buffer(x, (M, N), "float32")
        Y = T.match_buffer(y, (M, N), "float32")
        for i, j in T.grid(M, N):
            with T.block("Y"):
                v_i, v_j = T.axis.remap("SS", [i, j])
                Y[v_i, v_j] = T.max(X[v_i, v_j], T.float32(0.0))

    @R.function
    def main(
        x: R.Tensor(("n", 784), dtype="float32"),
        w0: R.Tensor((784, 256), dtype="float32"),
        b0: R.Tensor((256,), dtype="float32"),
        w1: R.Tensor((256, 10), dtype="float32"),
        b1: R.Tensor((10,), dtype="float32")
    ) -> R.Tensor(("n", 10), dtype="float32"):
        cls = Module
        n = T.int64()
        with R.dataflow():
            lv = R.call_tir(cls.linear, (x, w0, b0), out_sinfo=R.Tensor((n, 256), dtype="float32"))
            lv1 = R.call_tir(cls.relu, (lv0,), out_sinfo=R.Tensor((n, 256), dtype="float32"))
            lv2 = R.call_tir(cls.linear, (lv1, w1, b1), out_sinfo=R.Tensor((b, 10), dtype="float32"))
            R.output(lv2)
        return lv2

上面的代码包括两类函数:原始张量函数(T.prim_func)和 Relax 函数(R.function)。Relax 函数是一种新型抽象,用于表示高层神经网络的执行过程。

请注意,上述 Relax 模块原生支持符号形状(symbolic shape),如 main 函数中张量形状里的"n",以及 linear 函数中的 M、N、K。这是 Relax 抽象层的一项关键特性,使得编译器能够在张量操作符和函数调用之间,全局追踪动态形状关系。

再次并排查看 TVMScript 代码与底层 numpy 代码,并检查它们之间的对应关系是非常有帮助的,我们将逐步详细地分析它们。由于我们已经学习了基本的张量函数,这里我们将重点关注高层执行部分。

Relax 的关键元素

本节将介绍 Relax 抽象的关键元素,以及它如何在机器学习编译器中实现优化。

结构信息

结构信息(Structure Info)是 Relax 中的一个新概念,用于表示 Relax 表达式的类型。它可以是 TensorStructInfo、TupleStructInfo 等等。在前面的例子中,我们使用 TensorStructInfo(在 TVMScript 中简写为 R.Tensor)来表示输入、输出和中间结果张量的形状和数据类型。

R.call_tir

R.call_tir 是 Relax 中的新抽象,用于在同一个 IRModule 中调用底层的原始张量函数(primitive tensor functions)。这是 Relax 支持跨层抽象的一个关键特性,它使得我们可以从高层的神经网络层调用到低层的张量操作。以下是一个来自上文代码的示例:

lv = R.call_tir(cls.linear, (x, w0, b0), out_sinfo=R.Tensor((n, 256), dtype="float32"))

为了说明 R.call_tir 是如何工作的,我们来看一个等效的低层 numpy 实现:

lv0 = np.empty((n, 256), dtype="float32")
lnumpy_linear(x, w0, b0, lv0)

具体来说,call_tir 会先分配一个输出张量 res,然后将输入和输出一起传入 prim_func。执行 prim_func 后,结果会被写入 res,然后返回该结果。

这种约定被称为destination passing(目标传递), 其思想是输入与输出张量都在外部显式分配,然后传入低层函数。这种风格在底层库设计中非常常见,便于高层框架自行控制内存的分配。需要注意的是,并非所有张量操作都适用于这种风格(特别是当输出形状依赖于输入时)。尽管如此,在实际使用中,尽量采用这种风格编写低层函数通常是很有益的。

数据流块

在 Relax 函数中另一个重要元素是 R.dataflow() 的作用域注解。

with R.dataflow():
    lv = R.call_tir(cls.linear, (x, w0, b0), out_sinfo=R.Tensor((n, 256), dtype="float32"))
    lv1 = R.call_tir(cls.relu, (lv0,), out_sinfo=R.Tensor((n, 256), dtype="float32"))
    lv2 = R.call_tir(cls.linear, (lv1, w1, b1), out_sinfo=R.Tensor((b, 10), dtype="float32"))
    R.output(lv2)

在讨论 dataflow block 之前,我们先介绍 纯函数(pure) 和 有副作用(side-effect) 的概念。

如果一个函数满足以下条件,就可以被认为是纯函数或无副作用的:

  • 它只读取输入,并通过输出返回结果;
  • 它不会更改程序的其他部分(例如增加全局计数器的值)。

例如,所有 R.call_tir 的函数都是纯函数,因为它们只从输入读取数据,并将结果写入新分配的输出张量中。然而,inplace 操作(就地修改) 则不属于纯函数,即具有副作用的函数,因为它们会修改已有的中间或输入张量。

数据流块(Dataflow block)是一种用于标记程序中计算图区域的方式。特别地,在数据流块中,所有操作都必须是无副作用的;而在数据流块之外的操作则可以具有副作用。

备注

一个常见问题是:为什么我们需要手动标记数据流块,而不是自动推断?

主要有两个原因:

  • 自动推断数据流块很困难,尤其是当涉及到对打包函数(如 cuBLAS 的集成调用)时容易出现不准确。手动标记数据流块可以帮助编译器更准确地理解程序的数据流结构并进行优化。
  • 许多优化只能在数据流块中进行。例如,算子融合(fusion)优化仅限于单个数据流块中的操作。如果编译器错误地推断了数据流边界,可能会错过关键的优化机会,从而影响程序性能。

通过手动标记数据流块,我们可以确保编译器拥有最准确的信息,从而实现更有效的优化。

TVM Relax抽象层:动态深度学习模型编译的新范式 深度学习编译器是连接神经网络模型与多样化硬件后端的关键技术,其核心在于通过中间表示(IR)实现计算图的高效优化与代码生成。传统基于静态计算图的IR(如TVM Relay)在处理动态形状、复杂控制流等场景时面临挑战。TVM Relax作为新一代IR抽象层,通过引入“符号形状”和程序式语义,将计算范式从“计算图”扩展到“计算程序”,支持显式的If-Then-Else条件分支和While循环结构。这一设计使编译器能够更自然地表达运行时数据依赖关系,为动态模型(如变长序列处理、条件计算图)提供原生支持,同时保持与底 阅读详情

相关推荐

TVM Relax抽象层深度解析:从动态形状到控制流的IR设计

编译器中间表示(IR)是机器学习编译优化的核心枢纽。传统静态图IR在处理动态形状、复杂控制流时往往捉襟见肘,难以兼顾表达灵活性与分析透明度。TVM团队为此设计了Relax,一个更贴近高层框架、支持符号形状与显式控制流的可解析IR。它通过函数式、数据流、张量三层抽象,将纯计算与控制流清晰分离,既保留了数据流块内的高效优化潜力,又允许运行时基于实际形状动态调度分支,从而显著简化了变长序列、多模态模型等场景的编译流程。本文从工程实践视角出发,解析Relax的设计动机与三级抽象机制,通过TVMScript示例展示如

weixin_33937778的博客 360

【TVM教程】理解 Relax 抽象层

TVM 现已更新到 0.21.0 版本,TVM 中文文档已经和新版本对齐。 Apache TVM 是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。

HyperAI超神经 425

mlc-llm:大语言模型跨平台高效部署的机器学习编译框架

机器学习编译(MLC)是一种将深度学习模型从高级框架表示转换为针对特定硬件优化的低级代码的技术。其核心原理在于通过中间表示(IR)实现硬件无关的抽象,再通过图级优化(如算子融合)和张量级优化(如循环变换)来最大化目标硬件的计算效率。这项技术的价值在于解决了模型部署中的硬件生态碎片化问题,使得单一模型能够在多种设备上高效运行,显著降低了多平台部署的复杂性和成本。其应用场景广泛,从云端服务器到边缘设备、移动终端乃至Web浏览器,都能通过编译优化获得接近原生的推理性能。本文聚焦的mlc-llm项目,正是这一技术在

weixin_42626599的博客 644

TVM Relax:重塑深度学习编译器的抽象层设计

深度学习编译器的发展,始终绕不开中间表示(IR)的设计——它决定了优化能走多远,表达能力能有多强。传统图IR擅长表达静态数据流,但在动态形状、复杂控制流和训练场景面前常显乏力。为此,TVM社区推出了Relax,一个重新审视机器学习编译抽象层次的新方案。Relax通过StructInfo统一类型、形状与存储信息,以dataflow块隔离纯计算与副作用,借助符号形状和运行时绑定机制应对动态形状难题。它将结构、算子和执行分层管理,既能描述计算图,也能表达闭包回调等高阶结构,配合Relax VM实现灵活高效的执行。

weixin_33957648的博客 470

ISCC练习题MISC

解题技巧:看最后括号应该是IceCTF,先用了一键解码啥也没有啊,不对不对!好像是字符频率统计,转换网站:http://quipqiup.com/有人给你发了一串信息,你能解开吗?

m0_62737381的博客 1119

Blender骨骼绑定实战:如何用IK控制器让角色动作更自然(附常见问题解决)

本文深入探讨了Blender中IK控制器的实战应用,旨在解决角色动作僵硬问题。通过对比IK与FK的核心差异,详细解析了IK链的构建、参数设置及极向目标的使用,并提供了控制器定制、IK/FK无缝切换等高级技巧,帮助动画师实现更自然、符合直觉的角色动画。

weixin_29243279的博客 438

TVM Relax抽象层深度解析:从Relay到下一代编译IR

中间表示(IR)是深度学习编译器的核心抽象层,它决定了图优化与代码生成的边界。传统静态图IR受限于变量不可变和粗粒度算子,难以高效表达复杂控制流与精细优化。TVM推出的Relax应运而生,通过引入可变变量、DataflowBlock与BindingBlock分层、纯度标注等机制,重新定义了计算意图与实现细节的边界。这种抽象不仅让图优化pass获得更安全的改写能力,还为算子融合、内存复用等场景提供了更大自由度。在实际部署中,Relax能够灵活处理动态shape、自定义融合策略以及与TensorIR的衔接(如c

weixin_33875839的博客 375

LiteOS | 基于LiteOS的智慧农业案例实验分享

分享一个基于小熊派+LiteOS+华为云的案例实验(智慧农业)。 实验框图 相关模块简介 1、STM32L431RCT6 2、LiteOS LiteOS是华为开发的轻量级实时操作系统: LiteOS源码GitHub仓库链接: https://github.com/LiteOS/LiteOS 其源码一级目录结构如下: 其内核包括任务管理、内存管理、时间管理、通信机制、中断管理、队列管...

嵌入式大杂烩 5990

TVM Relax 变换 Pass 体系全解析:tvm.relax.transform 模块指南

`tvm.relax.transform` 是 Apache TVM Relax 前端(面向大模型、可微分 IR 的下一代 IR)的核心变换模块,负责将高层级 Relax 程序逐级下探到可执行的 TIR PrimFunc,并承担算子融合、自动微分、布局转换、混合精度、内存规划、外部代码生成(BYOC)等关键优化。本文以仓库中 [docs/reference/api/python/relax/tra

gitblog_00375的博客 248

利用DRONEKIT-SITL + MAVPROXY + QGroundControl模拟飞行

dronekit: 一种用于无人机控制的python库。 dronekit-sitl:一种本地仿真工具,相当于本地虚拟化了一个无人机。 mavproxy:数据转发软件(类似于插线板的感觉,一个输入,多个相同的输出)。打开一个Anaconda prompt 首先激活相应的环境 然后运行如下命令: 保持2中的Anaconda prompt处于运行状态,另打开一个Anaconda prompt窗口,运行如下命令: tcp:127.0.0.1:5760: SITL默认端口,作为mavproxy的输入,把输入数据转发

Done___的博客 4344

做cellchat画图时自环的角度颠倒,如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 464

TVM Relax深度解析:从程序抽象到动态形状与多后端混编

在深度学习编译器领域,计算图的中间表示(IR)决定了优化能力的上限。传统图IR如Relay擅长表达静态的算子依赖关系,但在内存分配、控制流和动态形状等“执行语义”层面存在明显短板。TVM Relax的提出,正是将抽象层级从“数据流图”升级为带执行语义的“程序表示”,让编译器能显式处理内存生命周期、设备切换和运行时函数调用。它通过DataflowBlock保证无副作用优化,结合ShapeExpr实现动态维度推理,并借助call_packed实现多后端无缝混编。这项技术不仅适用于静态网络部署,更支撑起动态bat

weixin_34199405的博客 405

FPGA信号处理系列文章——分数倍插值抽取滤波器(一)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA信号处理系列文章——分数倍插值抽取滤波器(一)前言信号流matlab模型频谱示意图分析总结 前言 变采样率滤波器不仅仅存在整数倍插值和整数倍抽取的情况,还会存在分数倍插值抽取的情况。那这种情况下要怎么处理呢 信号流 分数倍插值抽取滤波器的信号流是什么?信号先进行插值,再进行FIR滤波,最后进行抽取 matlab模型 %signal 定点化数据输入 coeff_val_fir = importdata('fir.coe'); si

gzy0506的博客 1万+

TVM Relax BlockBuilder 完全指南:用 Python 构建 Relax IR 的开发者 API

本指南基于 Apache TVM 开源仓库中的 [docs/reference/api/python/relax/block_builder.rst](https://link.gitcode.com/i/744b70f62959583a2a594a3c8f25c74a) 文档,深入讲解 Relax 框架的核心开发者 API——`tvm.relax.block_builder`。它适合想要绕过 T

gitblog_00058的博客 363

RH850系列芯片深度剖析 1.5-链接(ld)文件解析

基础编译过程分为四个阶段:预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking)。执行这四个阶段的程序(预处理器、编译器、汇编器、和链接器)一起构成了编译系统。CONSTANTS接下来的内存空间定义部分会使用这些常量来定义内存空间的范围,理论上来说不定义常量也没有影响,直接用魔鬼数字代替,定义常量的主要目的就是方便理解以及方便修改;从示例中可以看出,常量的值可以为16进制或者10十进制,而且10进制支持数量级单位(k级,M级);

本博客专注于嵌入式软件领域技术分享。 1427

51单片机+L298驱动步进电机+L297测速+LCD1602显示+按键调试+Proteus仿真

51单片机+L298驱动步进电机+L297测速+LCD1602显示+按键调试+Proteus仿真 *Proteus仿真 L298N是双H桥式驱动器。 L297是步进电机控制集成芯片(包括环形分配器),可产生四相驱动信号,应用于微处理机控制两相双极性和四相单极性步进电机。电动机可由半阶梯、正常和斩波驱动模式驱动,同时设于晶片内的PWM斩波线路容许以开关形式控制线路的电流。此器件只需要时钟、方向和模式输入信号。相位是由内部产生的,因此可减轻微处理机和程序设计的负担。 实例代码 /************

perseverance51博客 4585

TVM Relax 算子融合架构全解析:FuseOps、FuseTIR 与 FuseOpsByPattern 的协同工作

算子融合(Operator Fusion)是 TVM 编译栈中收益最显著的优化之一:与其为 conv2d、bias_add、relu 每个算子各自启动一次内核,不如把它们合并进同一个内核,从而消除中间张量的内存分配与内核启动开销。本文以 [docs/arch/fusion.rst](https://link.gitcode.com/i/d44800b2cd4a3774a0aafd42c26bc20

gitblog_00023的博客 281

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Hermes 优化器设计解析:Pass 体系、Analysis 缓存与三类 IR 变换

> 本指南以 [doc/Optimizer.md](https://link.gitcode.com/i/5fbfb9496f8e0ec6cc81f3a205473ff0) 为核心,系统讲解 Hermes 编译器优化器的整体设计。Hermes 是专为 React Native 场景打造的 JavaScript 引擎,其优化器负责把 Hermes IR 变换为更高效、且严格保持程序语义的表示。读完本

gitblog_00085的博客 200

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 225

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

6 款电商 AI 图片生成软件实测|国内 + 跨境卖家工具清单

电商 AI 作图工具已经从 "能不能用" 进入了 "好不好用" 的阶段。对于绝大多数卖家而言,现在的 AI 工具已经可以覆盖 60%-80% 的基础商品图需求,显著降低拍摄和设计成本。选择工具的核心逻辑不是 "哪款最强",而是 "哪款最适配你的品类、平台规模和团队能力"。垂直电商工具胜在工作流效率,通用生图工具强在创意上限,模板类工具赢在上手速度。建议根据自身业务阶段,搭配 1-2 款主力工具 + 1 款辅助工具,形成适合自己的视觉生产流程。

Mardi_Ladin的博客 398

我用 GPUWorks 在 M1 Pro 上搭了个发票识别原型

公司里经常要看电子发票。我想先做个小原型:把 PDF 发给一个自己部署的图文模型,让它提取发票类型、日期、交易双方和金额,再把结果交给同事核对。这个原型不用先接财务系统,先看看从部署到调用要走多少步,模型返回的内容能不能帮上忙。

鸽芷咕的博客 2万+

您您这可以把问小白的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。AI导出鸭

第三层是格式编译层。这个决策背后的判断很清晰:一个批量导出工具的价值,不在于“试三次”,而在于你真正用它处理了几十份技术文档、访谈记录或课程讲义之后,它是否值得留在你的工作流里。问小白的会话列表通过分页接口加载,AI导出鸭 在页面运行时建立旁路监听,捕获每一次分页请求返回的完整对话清单,包括会话 ID、标题、时间戳和隐藏的元数据字段。让AI导出回归优雅——这句话说的是:导出不该是体力活,而应该是一次完整的、可预期的文件交付。注意:这里的“批量”指的是左侧列表里的多个独立会话,不是一条会话内的多轮对话。

laoyunsi的博客 246

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 501

河道漂浮物目标检测数据集

目标检测,yolo,河道漂浮物目标检测数据集

DL_data_set的博客 201

AI Agent之核心框架

A: 显式 Thought 有三类价值:可解释性(便于人类审计)、可调试性(定位哪一步选错工具)、学习信号(可做监督微调或评估中间步骤质量)。ReAct 把推理与 可执行行动 绑定,每一步行动后都有 真实 Observation 反馈,从而用工具结果约束生成,降低闭卷幻觉。做完不等于结束——还要 评估做得好不好,把 教训 记下来,下次 带着教训重试,反思作为 记忆,影响后续尝试的策略。工作流程:Action → Evaluation → Reflection → Retry。A: 普通 CoT 只在。

剑雨巍巍的博客 199

AI 应用开发工程师技术实践:大模型接入、通用组件封装与性能优化

本文提出AI应用从PoC到生产的核心挑战:模型调用的持续可用、可控与可优化。通过构建统一LLM网关实现多供应商路由与故障转移,封装对话、工具调用与RAG组件以解耦业务逻辑,结合前缀缓存、批处理与流式背压治理等性能优化手段,形成“接通→接稳→接快”的工程路径,最终以工程化能力决定AI应用的生产可用性。

2301_79189962的博客 558
上一篇: 27B AI 科学家论文复现能力超越 GPT-5.5/Claude Opus 4.8,Faraday 探索长程科学创新
下一篇: MiniMax H3 突破视频生成边界,音画内容一体生成;Ornith-1.5-35B-A3B 探索推理模型自进化训练新模式
HyperAI超神经
博客等级 码龄7年 8872粉丝 1753原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值