Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
GolangRPC调用错误处理与重试策略_创想鸟

GolangRPC调用错误处理与重试策略

答案:Golang RPC中通过自定义错误类型、指数退避重试与熔断器组合提升系统弹性。首先定义实现error接口的RPCError结构体,携带错误码和消息,服务端返回具体错误,客户端用errors.As判断并处理;其次采用指数退毕加抖动策略,设置基础延迟、最大重试次数与延迟上限,避免惊群效应;最后引入熔断器(如gobreaker),在服务持续失败时进入开路状态,阻止无效请求,待恢复后半开试探,结合重试机制实现高可用。

golangrpc调用错误处理与重试策略

在Golang RPC的实践中,错误处理和重试策略是构建健壮分布式系统不可或缺的一环。说白了,网络环境复杂多变,服务总会出点小状况,我们得想办法让系统在这些“小状况”面前显得更从容、更坚韧。这不仅仅是技术细节,更是一种系统设计的哲学,确保我们的应用不会因为一时的风吹草动就全盘崩溃。

要搞定Golang RPC的错误处理和重试,我们得从几个维度入手。

错误处理:Golang的

error

接口是基石。但光有它还不够,我们需要更精细的错误分类。我的习惯是,对于可预期的业务错误,我会定义自定义错误类型,或者至少用

fmt.Errorf

配合

%w

来包装底层错误,这样客户端就能通过

errors.Is

errors.As

来判断错误的具体类型,然后采取不同的处理逻辑。比如,一个“用户不存在”的错误,和“数据库连接失败”的错误,客户端的处理方式肯定天差地别。服务端在返回RPC响应时,要确保这些自定义错误能被正确序列化和反序列化到客户端。同时,别忘了

context.Context

,它在RPC调用中承担着超时和取消请求的重要职责,如果RPC超时了,那也是一种错误,得及时响应。

重试策略:重试这事儿,核心在于处理那些“瞬时”的错误。比如网络抖动、目标服务暂时过载。但重试不是万能药,用不好反而会加剧问题。

简单的固定延迟重试:最直接,但效率不高,尤其是在目标服务持续过载时。指数退避(Exponential Backoff):这是我的首选。每次重试的间隔时间逐渐增长,可以有效缓解对故障服务的压力。更妙的是,加上一点“抖动”(Jitter),也就是在计算出的延迟时间上加一个随机量,能避免所有客户端在同一时间点重试,形成“惊群效应”。最大重试次数和超时:必须设置上限。无限重试只会拖垮系统。结合

context.WithTimeout

,给每次重试一个总体的时限。幂等性(Idempotency):这是重试策略里一个极其重要的考量。如果你的RPC操作不是幂等的(比如多次扣款),那重试就可能造成灾难性后果。务必确保只有幂等操作才进行重试。熔断器(Circuit Breaker):这和重试是黄金搭档。重试处理瞬时故障,熔断器则是在服务持续失败时,直接“断开”连接,避免客户端不断地向一个已经挂掉的服务发送请求,给它恢复的时间,也保护了调用方。当服务恢复后,熔断器会尝试“半开”,让少量请求通过,如果成功,就重新“闭合”。

这些策略的组合使用,才能真正让你的Golang RPC服务在风雨中屹立不倒。

在Golang RPC中,如何优雅地定义和传递自定义错误类型?

在Go语言里,

error

本身就是一个接口,这给了我们极大的灵活性去定义自己的错误类型。光是返回一个

errors.New("something failed")

或者

fmt.Errorf("failed: %w", err)

在很多场景下是不够的,尤其是在RPC调用中,客户端需要根据错误类型做不同的决策。

立即学习“go语言免费学习笔记(深入)”;

我的做法通常是定义一个结构体来承载更丰富的错误信息。比如:

package commonimport (    "fmt")// RPCError 定义了通用的RPC错误结构type RPCError struct {    Code    int    // 错误码,用于标识特定类型的错误    Message string // 错误消息,更具体的描述    // 内部错误,如果需要包装底层错误,可以加上这个字段    // 这里为了简化,暂时省略,但实际项目中可以考虑    // Inner error}// Error 实现 error 接口func (e *RPCError) Error() string {    return fmt.Sprintf("RPC Error %d: %s", e.Code, e.Message)}// 定义一些常用的错误常量var (    ErrNotFound      = &RPCError{Code: 404, Message: "资源未找到"}    ErrInvalidArgument = &RPCError{Code: 400, Message: "无效的请求参数"}    ErrInternal      = &RPCError{Code: 500, Message: "服务器内部错误"})// NewRPCError 方便创建自定义RPC错误func NewRPCError(code int, msg string) *RPCError {    return &RPCError{Code: code, Message: msg}}

在服务端,当出现特定业务错误时,我们就可以返回这些自定义错误:

// 服务端示例func (s *MyService) GetItem(ctx context.Context, req *ItemRequest) (*ItemResponse, error) {    if req.Id == "" {        return nil, common.ErrInvalidArgument // 直接返回预定义的错误    }    item, err := s.store.Get(req.Id)    if err != nil {        if errors.Is(err, storage.ErrItemNotFound) { // 假设storage层有自己的错误            return nil, common.ErrNotFound        }        // 包装其他底层错误,但返回自定义RPCError类型        return nil, common.NewRPCError(500, fmt.Sprintf("获取物品失败: %s", err.Error()))    }    return &ItemResponse{Item: item}, nil}

客户端接收到错误后,就能通过

errors.Is

errors.As

进行判断:

// 客户端示例resp, err := client.GetItem(context.Background(), &ItemRequest{Id: "123"})if err != nil {    var rpcErr *common.RPCError    if errors.As(err, &rpcErr) { // 尝试将错误转换为我们的RPCError类型        switch rpcErr.Code {        case common.ErrNotFound.Code:            fmt.Println("客户端:物品未找到,可能需要引导用户创建。")        case common.ErrInvalidArgument.Code:            fmt.Println("客户端:请求参数有问题,检查输入。")        default:            fmt.Printf("客户端:收到未知RPC错误: %sn", rpcErr.Error())        }    } else {        fmt.Printf("客户端:收到非RPC错误: %sn", err.Error())    }    return}fmt.Printf("客户端:获取到物品: %vn", resp.Item)

这样一来,客户端就能够根据具体的错误码和类型,做出更智能、更精细的错误处理,而不是简单地打印一句“调用失败”。这对于构建用户体验更好的应用至关重要。

Golang RPC重试策略中,指数退避算法(Exponential Backoff)的最佳实践是什么?

指数退避算法在分布式系统中简直是神器,尤其是在RPC重试场景。它的核心思想是:当一个请求失败时,我们不立即重试,而是等待一个逐渐增长的时间间隔再重试。这能有效避免在服务刚刚恢复或仍在过载时,所有客户端一窝蜂地发起重试,导致服务再次崩溃。

最佳实践通常包含以下几个要素:

基础延迟与指数增长:设置一个初始的基础延迟(比如100ms),每次重试时,延迟时间按指数级增长(例如,

delay = base * 2^n

,n是重试次数)。抖动(Jitter):这是指数退避的“灵魂伴侣”。如果所有客户端都按照严格的指数退避策略重试,它们可能仍然会在同一时刻再次尝试,形成“惊群效应”。加入抖动意味着在计算出的延迟时间上添加一个随机量。例如,将延迟时间限制在一个随机范围

[0, calculated_delay]

[calculated_delay / 2, calculated_delay]

。这能有效分散重试请求,降低峰值压力。最大延迟与最大重试次数:必须设定上限。指数增长虽然好,但不能无限增长。一个合理的上限可以防止重试时间过长,或者在服务确实无法恢复时,客户端不至于无限期等待。同时,总的重试次数也应有限制,避免资源浪费。幂等性考量:重申一下,这是重试的前提。只有幂等的操作(即执行多次与执行一次效果相同)才适合重试。非幂等操作的重试可能导致数据不一致甚至更严重的后果。瞬时错误判断:不是所有错误都适合重试。比如一个

ErrNotFound

或者

ErrInvalidArgument

,这些是业务逻辑错误,重试再多次结果也不会改变。我们应该只对那些表示临时性故障(如网络超时、连接断开、服务暂时不可用等)的错误进行重试。

这里提供一个简单的Go语言实现示例,包含了指数退避和抖动:

package mainimport (    "context"    "errors"    "fmt"    "math/rand"    "time")// SimulateRPCCall 模拟一个可能失败的RPC调用func SimulateRPCCall(attempt int) error {    // 假设前3次调用会失败,第4次成功    if attempt < 3 {        return errors.New("模拟RPC调用失败: 服务暂时不可用")    }    fmt.Printf("第 %d 次尝试:RPC调用成功!n", attempt+1)    return nil}func main() {    const (        maxRetries    = 5        baseDelay     = 100 * time.Millisecond        maxDelay      = 5 * time.Second    )    rand.Seed(time.Now().UnixNano()) // 初始化随机数种子    for i := 0; i < maxRetries; i++ {        err := SimulateRPCCall(i)        if err == nil {            fmt.Println("RPC调用最终成功。")            return        }        fmt.Printf("第 %d 次尝试失败: %sn", i+1, err.Error())        // 如果是最后一次重试,直接退出        if i == maxRetries-1 {            fmt.Println("达到最大重试次数,RPC调用最终失败。")            return        }        // 计算指数退避延迟        currentDelay := baseDelay * time.Duration(1< maxDelay {            currentDelay = maxDelay        }        // 添加抖动 (Full Jitter: 随机选择 0 到 currentDelay 之间的一个值)        jitter := time.Duration(rand.Int63n(int64(currentDelay)))        sleepTime := jitter        // 也可以使用 Equal Jitter: currentDelay/2 + rand(0, currentDelay/2)        // sleepTime := currentDelay/2 + time.Duration(rand.Int63n(int64(currentDelay/2)))        fmt.Printf("等待 %v 后进行第 %d 次重试...n", sleepTime, i+2)        time.Sleep(sleepTime)    }}

这段代码展示了一个基础的指数退避加抖动的重试逻辑。在实际项目中,我们通常会将其封装成一个通用的重试函数,并结合

context

的超时控制,让重试更加健壮。

如何结合熔断器模式(Circuit Breaker)提升Golang RPC服务的弹性?

熔断器模式是构建弹性分布式系统的另一个关键组件,它和重试策略是相辅相成的。重试主要处理瞬时、短期的错误,而熔断器则是在服务持续失败时,及时“断开”调用链路,防止故障蔓延,并给故障服务一个恢复的时间。

熔断器通常有三种状态:

关闭(Closed):这是正常状态。请求正常通过,熔断器会监控失败率。如果失败率超过设定的阈值,熔断器会切换到“打开”状态。打开(Open):当熔断器处于打开状态时,所有请求都会立即失败,不会真正发送到目标服务。这被称为“快速失败”(fail-fast)。在打开状态持续一段时间后(比如设置一个重置超时时间),熔断器会切换到“半开”状态。半开(Half-Open):在半开状态下,熔断器允许少量请求通过,以测试目标服务是否已经恢复。如果这些测试请求成功,熔断器就切换回“关闭”状态;如果仍然失败,则切换回“打开”状态,并重新开始计时。

熔断器和重试的结合点在于:当熔断器处于打开状态时,客户端根本不需要进行重试,因为熔断器会直接拦截请求并返回错误。只有当熔断器处于关闭或半开状态,且请求遇到瞬时错误时,才应该考虑重试。

在Go语言生态中,

sony/gobreaker

是一个非常流行且功能完善的熔断器库。

package mainimport (    "context"    "errors"    "fmt"    "time"    "github.com/sony/gobreaker")// SimulateExternalService 模拟一个外部RPC服务,可能失败var failureCount = 0func SimulateExternalService(ctx context.Context) (string, error) {    failureCount++    if failureCount = 3 && float64(counts.TotalFailures)/float64(counts.Requests) >= 0.6        },        OnStateChange: func(name string, from gobreaker.State, to gobreaker.State) {            fmt

以上就是GolangRPC调用错误处理与重试策略的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1406576.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Golang私有模块管理与访问方法
上一篇 2025年12月15日 22:22:23
Golangdefer延迟调用使用场景与示例
下一篇 2025年12月15日 22:22:37

相关推荐

  • 如何使用Ribbet的AI功能裁剪图片?快速实现精准图像裁剪

    答案:Ribbet的AI裁剪功能可快速智能识别主体并推荐裁剪方案,支持手动微调与多种比例选择,结合亮度、色彩等编辑工具优化效果,适用于制作符合社交媒体尺寸要求的封面图,操作简便且大部分功能免费,适合追求效率的普通用户。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepS…

    2026年9月21日
    400
  • 卢伟冰:功能手机、智能手机之后 手机行业正进入新周期

    9月4日,小米集团总裁卢伟冰表示,继功能机时代与智能机时代之后,全球手机产业正迈入一个全新时代。 卢伟冰今日在社交平台发文提到:“我从2002年进入手机行业,有幸完整见证了功能手机和智能手机两大发展阶段。如今,AI时代已经到来,整个行业正在酝酿深刻变革,步入全新的发展周期。” 回望过去,功能手机时期…

    2026年9月21日
    200
  • 谷歌浏览器官方主站入口 最新Chrome在线登录页面

    谷歌浏览器官方主站入口是https://www.google.com,该页面具备界面简洁、操作流畅、集成化服务入口和个性化推荐等特点,支持多设备访问且无广告干扰。 谷歌浏览器官方主站入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来谷歌浏览器最新Chrome在线登录页面相关信息,感兴趣的…

    2026年9月21日
    000
  • Java 正则表达式:查找双引号内所有指定字符串的出现次数

    本文旨在解决在 Java 中使用正则表达式查找双引号内特定字符串(例如 “variant”)的所有出现次数的问题。我们将提供一个完整的解决方案,包括正则表达式的构建、代码示例以及详细的解释,帮助开发者准确高效地完成此类任务。 在 Java 中,使用正则表达式查找字符串中特定模…

    2026年9月21日
    000
  • MySQL 大型历史数据表结构设计与优化指南

    本文旨在为处理大量客户历史交易数据的MySQL数据库设计提供专业指导。我们将探讨如何构建高效、可扩展的表结构,重点关注主键设计、数据分区、实时数据摄入以及性能优化策略,以确保系统能够稳定支持百万级乃至亿级数据量的查询需求。 MySQL大型历史数据表结构设计与优化 在处理大量历史数据,特别是涉及到多用…

    2026年9月21日
    000
  • 《如龙 极》《极2》 PS5、XSX|S版12月8日发售 支持中文

    《如龙 极》《极2》 PS5、XSX|S版12月8日发售 支持中文《如龙 极》《极2》 PS5、XSX|S版12月8日发售 支持中文《如龙 极》《极2》 PS5、XSX|S版12月8日发售 支持中文《如龙 极》《极2》 PS5、XSX|S版12月8日发售 支持中文

    来源:官方 Nintendo Switch™ 2平台游戏《人中之龙 极2》(预计2025年11月13日发售)数字版已于今日9月24日正式开启预购。 同时,《人中之龙 极》与《人中之龙 极2》的PlayStation®5及Xbox Series X|S版本将于2025年12月8日推出。此次新版本将新增…

    2026年9月21日 用户投稿
    000
  • MySQL重复数据检测与清理逻辑_Sublime脚本批量处理历史冗余记录

    MySQL重复数据检测与清理逻辑_Sublime脚本批量处理历史冗余记录MySQL重复数据检测与清理逻辑_Sublime脚本批量处理历史冗余记录MySQL重复数据检测与清理逻辑_Sublime脚本批量处理历史冗余记录MySQL重复数据检测与清理逻辑_Sublime脚本批量处理历史冗余记录

    处理mysql重复数据的核心步骤是识别并清理,可使用group by或窗口函数定位重复项,再通过分批删除或倒腾法安全清理;sublime text可用于高效生成和编辑sql语句。1. 识别重复数据常用group by+having或row_number()窗口函数;2. 清理策略包括分批删除、使用临…

    2026年9月21日 用户投稿
    100
  • 如何用PyTorch训练AI大模型?构建高效神经网络的完整教程

    如何用PyTorch训练AI大模型?构建高效神经网络的完整教程如何用PyTorch训练AI大模型?构建高效神经网络的完整教程如何用PyTorch训练AI大模型?构建高效神经网络的完整教程如何用PyTorch训练AI大模型?构建高效神经网络的完整教程

    PyTorch大模型训练需综合运用分布式训练、内存优化与高效计算策略。首先采用DistributedDataParallel实现多GPU并行,配合DistributedSampler确保数据均衡;通过混合精度训练、梯度累积和激活检查点缓解显存压力;使用torch.compile优化模型计算效率;选择…

    2026年9月21日 用户投稿
    100
  • MySQL自动化性能测试方案_MySQL持续监控调优数据库效率

    MySQL自动化性能测试方案_MySQL持续监控调优数据库效率MySQL自动化性能测试方案_MySQL持续监控调优数据库效率MySQL自动化性能测试方案_MySQL持续监控调优数据库效率MySQL自动化性能测试方案_MySQL持续监控调优数据库效率

    mysql自动化性能测试和持续监控的核心在于构建闭环反馈系统,包含模拟真实负载、全面数据采集、自动化执行与分析、数据驱动的持续调优四大环节。①测试环境需与生产一致并隔离,使用docker、虚拟机或云沙盒,解决数据同步与脱敏问题;②负载生成工具如sysbench、jmeter、locust或自定义脚本…

    2026年9月21日 用户投稿
    200
  • CyberLinkMediaSuite如何制作AI视频?多功能工具快速剪辑的方法

    CyberLinkMediaSuite如何制作AI视频?多功能工具快速剪辑的方法CyberLinkMediaSuite如何制作AI视频?多功能工具快速剪辑的方法CyberLinkMediaSuite如何制作AI视频?多功能工具快速剪辑的方法CyberLinkMediaSuite如何制作AI视频?多功能工具快速剪辑的方法

    答案:CyberLink MediaSuite(核心为PowerDirector)通过AI艺术风格转换、智能对象选取、AI天空替换、音频降噪与运动追踪等功能,显著提升视频制作效率与创意表现。结合模板应用、快捷键操作、媒体库管理及代理编辑等实战技巧,可实现快速剪辑与专业输出,适用于Vlog创作、教育视…

    2026年9月21日 用户投稿
    300
  • Win10与Ubuntu 18.04双系统安装。(Win10引导Linux)[通俗易懂]

    Win10与Ubuntu 18.04双系统安装。(Win10引导Linux)[通俗易懂]Win10与Ubuntu 18.04双系统安装。(Win10引导Linux)[通俗易懂]Win10与Ubuntu 18.04双系统安装。(Win10引导Linux)[通俗易懂]Win10与Ubuntu 18.04双系统安装。(Win10引导Linux)[通俗易懂]

    大家好,很高兴再次与大家见面,我是你们的老朋友全栈君。 作为一个初学者,为了满足自己的求知欲,我按照几位大神写的教程尝试了一遍安装过程,现在来和大家分享一下。 1、Win10安装(如果已经安装,请跳过) 1)制作系统U盘(参考微信公众号“软件安装管家”): https://www.php.cn/li…

    2026年9月21日 用户投稿
    400
  • 百家号视频怎么隐藏?百家号怎么设置仅自己可见

    随着短视频平台的快速发展,其已成为人们获取资讯和休闲娱乐的重要方式。作为国内知名的自媒体平台之一,百家号吸引了大量用户。然而,在享受便捷的同时,隐私安全问题也日益突出。本文将介绍百家号视频隐藏的方法,帮助用户更好地保护个人内容,维护隐私安全。 一、百家号视频隐藏方法 设置隐私权限 在百家号后台,用户…

    2026年9月21日
    200
  • MySQL数据库如何设计适合大数据量的表结构_案例分析?

    MySQL数据库如何设计适合大数据量的表结构_案例分析?MySQL数据库如何设计适合大数据量的表结构_案例分析?MySQL数据库如何设计适合大数据量的表结构_案例分析?MySQL数据库如何设计适合大数据量的表结构_案例分析?

    设计适合大数据量的mysql表结构,核心在于数据类型选对、索引用好、适当拆分。1. 合理选择字段类型,如根据数据范围选用tinyint/smallint代替bigint,固定值字段用enum类型,大文本字段单独拆表;2. 精准建立索引,高频查询字段建联合索引并遵循最左前缀原则,避免低区分度字段建索引…

    2026年9月21日 用户投稿
    100
  • windows10如何查看S.M.A.R.T.硬盘状态_windows10硬盘S.M.A.R.T.状态查看方法

    电脑运行慢、蓝屏或文件损坏可能是硬盘故障前兆,可通过S.M.A.R.T.技术检测健康状况。1、使用WMIC命令行工具输入“wmic diskdrive get model,status”查看状态,显示Pred Fail需立即备份数据;2、CrystalDiskInfo可深度分析S.M.A.R.T.参…

    2026年9月21日
    200
  • Photopea的AI功能怎么裁剪图片?快速实现高效图片裁剪技巧

    Photopea的AI功能怎么裁剪图片?快速实现高效图片裁剪技巧Photopea的AI功能怎么裁剪图片?快速实现高效图片裁剪技巧Photopea的AI功能怎么裁剪图片?快速实现高效图片裁剪技巧Photopea的AI功能怎么裁剪图片?快速实现高效图片裁剪技巧

    Photopea的AI功能通过智能选择工具与内容感知技术结合,实现高效图片裁剪。首先使用对象选择、快速选择或魔棒工具智能识别主体或背景,再通过“选择并遮住”精细调整边缘,尤其适用于复杂轮廓如发丝。随后可应用图层蒙版透明化背景,并用裁剪工具调整画布范围。结合内容感知填充可移除干扰元素并自动补全画面,内…

    2026年9月21日 用户投稿
    300
  • VSCode代码空格怎么解决_VSCode缩进与格式处理教程

    解决VSCode代码空格和缩进问题,需配置settings.json中的缩进规则并引入外部格式化工具。首先设置”editor.tabSize”、”editor.insertSpaces”和”editor.detectIndentation&…

    2026年9月21日
    200
  • PHP框架中间件有什么用处_PHP框架中间件设计与实现

    PHP框架中间件是处理请求和响应的过滤器,用于实现身份验证、日志记录、CORS等通用逻辑,核心价值在于解耦和提升可维护性。通过定义中间件接口、具体中间件类及管道调度器可实现自定义中间件,如身份验证或CORS处理。在Laravel中可通过Kernel.php配置全局、分组或路由级中间件,执行顺序按注册…

    2026年9月21日
    100
  • Java中字符到数字转换:解决for循环提前返回的常见陷阱

    本文探讨java中`for`循环在字符到数字转换时,因`return`语句放置不当导致程序提前终止、无法完整处理字符串的问题。我们将分析这种常见陷阱,并提供修正方案,演示如何正确利用循环填充数组,并在循环结束后统一返回最终结果,确保每个字符都能被准确映射和组合。 引言:字符到数字的映射需求 在编程实…

    2026年9月21日
    100
  • 三星 A55通知提醒不及时怎么办 Samsung A55消息设置

    三星A55消息通知不及时需检查后台管理设置:1. 进入【设置】-【电池】-【后台使用限制】,开启【自动运行】,将微信等应用关闭【深度睡眠】并加入【不受限制的应用】;2. 在【通知】设置中确保允许通知、锁屏显示等权限开启,且未被暂停或静音;3. 检查网络稳定性和Samsung Account同步状态,…

    2026年9月21日
    200
  • LLaVA-OneVision-1.5— EvolvingLMMS-Lab开源的多模态模型

    LLaVA-OneVision-1.5— EvolvingLMMS-Lab开源的多模态模型LLaVA-OneVision-1.5— EvolvingLMMS-Lab开源的多模态模型LLaVA-OneVision-1.5— EvolvingLMMS-Lab开源的多模态模型LLaVA-OneVision-1.5— EvolvingLMMS-Lab开源的多模态模型

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 百灵大模型 蚂蚁集团自研的多模态AI大模型系列 177 查看详情 llava-onevision-1.5 是一款开源的先进多模态大模型,凭借高效的训练策略与高质量的数据构建,在性能、成本控制和可…

    2026年9月21日 用户投稿
    100

发表回复

登录后才能评论
关注微信