【LLM多模态】Cogvlm图生文模型结构和训练流程

news2024/12/26 13:28:13

note

  • Cogvlm的亮点:
    • 当前主流的浅层对齐方法不佳在于视觉和语言信息之间缺乏深度融合,而cogvlm在attention和FFN layers引入一个可训练的视觉专家模块,将图像特征与文本特征分别处理,并在每一层中使用新的QKV矩阵和MLP层。通过引入视觉专家模块弥补预训练语言模型和图像编码器之间的差距。
    • 保持原始语言模型的参数不变,虽然加入了视觉专家模块。

文章目录

  • note
  • 图生文:CogVLM-17B模型
  • 一、CogVLM模型
    • 1. 模型效果和特点
    • 2. 训练数据:CogVLM-SFT-311K
      • 数据集信息
      • 数据集数量
      • 数据集格式
    • 3. 处理的任务
  • 二、模型架构
    • 1. 模型架构
    • 2. 训练方式
      • (1)预训练阶段
        • 1)预训练第一阶段:图像描述损失函数
        • 2)预训练第二阶段:图像描述+REC任务
      • (2)SFT有监督微调
    • 3. 视觉专家模块
      • (1)工作模式
      • (2)相关步骤:
  • 三、Cogvlm模型训练中的数据增强
  • 四、Ablation Study消融实验
  • Reference

图生文:CogVLM-17B模型

多模态模型CogVLM-17B(开源):
Github:https://github.com/THUDM/CogVLM
Huggingface:https://huggingface.co/THUDM/CogVLM
魔搭社区:https://www.modelscope.cn/models/ZhipuAI/CogVLM
Paper:https://github.com/THUDM/CogVLM/blob/main/assets/cogvlm-paper.pdf

开源的对应模型:

模型名称输入分辨率介绍Huggingface modelSAT model
cogvlm-chat-v1.1490支持同时进行多轮聊天和视觉问答,支持自由的提示词。linklink
cogvlm-base-224224文本-图像预训练后的原始检查点。linklink
cogvlm-base-490490通过从 cogvlm-base-224 进行位置编码插值,将分辨率提升到490。linklink
cogvlm-grounding-generalist490此检查点支持不同的视觉定位任务,例如REC,定位字幕等。linklink

一、CogVLM模型

1. 模型效果和特点

CogVLM 可以在不牺牲任何 NLP 任务性能的情况下,实现视觉语言特征的深度融合。训练的 CogVLM-17B 是目前多模态权威学术榜单上综合成绩第一的模型,在14个数据集上取得了state-of-the-art或者第二名的成绩。这些基准大致分为三类(共 14 个),包括图像字幕(Image Captioning)、视觉问答(Visual QA)、视觉定位(Visual Grounding)。
在这里插入图片描述

2. 训练数据:CogVLM-SFT-311K

CogVLM-SFT-311K:CogVLM SFT 中的双语视觉指令数据集
链接: CogVLM-SFT-311K

CogVLM-SFT-311K 是在训练 CogVLM v1.0 最初版本时使用的主要对齐语料库。此数据集的构建过程如下:

  1. 从开源的 MiniGPT-4 中选取了大约3500个高质量数据样本,称为 minigpt4-3500。
  2. 将 minigpt4-3500 与 Llava-Instruct-150K 整合,并通过语言模型翻译获得中文部分。
  3. 发现在 minigpt4-3500 和 Llava-instruct 的详细描述部分存在许多噪声。因此,我们纠正了这两部分的中文语料,并将纠正后的语料重新翻译成英语。

数据集信息

数据集共有三个文件夹,分别对应混合 minigpt4-3500 与llava混合的一部分数据集,llava 单论对话和多轮对话数据集。其布局如下:

.CogVLM-SFT-311K
├── llava_details-minigpt4_3500_formate
├── llava_instruction_multi_conversations_formate
└── llava_instruction_single_conversation_formate

在开源的数据中,数据集按照以下格式分布

.llava_details-minigpt4_3500_formate
├── images
│   └── 00000001.jpg
└── labels
    └──  00000001.json

其中,images存储图像数据,而labels存储这张图像对应的描述或对话。

数据集数量

  • llava_details-minigpt4_3500_formate 22464 张图片和描述
  • llava_instruction_muti_conversations_formate 56673 张图片和多轮连续对话
  • llava_instruction_single_conversation_formate 76634 张图片和单轮对话

数据集格式

图像描述 Caption 格式:

{
  "captions": [
    {
      "role": "caption",
      "content": "这张照片展示了一男一女,他们都穿着红嘿色衣服,坐在桌子旁,在参加活动时面带微笑。这对情侣正在一起摆姿势,背景中还有其他人。在整个场景中可以看到另外几个人,一些人坐在附近的桌子旁,另一些人坐得离这对夫妇更近。各种餐桌设置,如酒杯和杯子,被放置在桌子上。排在最前面的男子打着领带。"
    }
  ]
}

图像对话 Json 格式:

{
    "conversations": [
      {
        "role": "user",
        "content": "在尝试保持这个浴室有序时可能会遇到哪些挑战?",
      },
      {
        "role": "assistant",
        "content": "在尝试保持这空间和各种物品的存在,例如杯子和手机占用了可用的空间。在图像中,浴室柜台上只有一个水槽可用,这导致多个用户可能必须共享空间放置自己的物品。这可能导致杂乱和混乱外的储物解决方案,如架子、橱柜或墙壁挂架,以保持浴室有序并最小化柜台上的杂乱。"
      },
    ]
}

3. 处理的任务

这些任务主要是基于图像理解和语言生成的任务:

  • 图像字幕任务(Image Captioning):根据给定的图片生成描述图片内容的自然语言句子。数据集包括COCO、Flickr30K等,这些数据集包含了数十万张图片,每张图片都有人工生成的多个描述。
  • 视觉问答任务(Visual Question Answering, VQA):根据给定的图片和关于图片内容的问题,生成回答问题的自然语言文本。数据集包括VQAv2、OKVQA等,这些数据集包含了数百万个图像-问题-答案三元组。
  • 视觉定位任务(Visual Grounding):确定文本中提到的目标和图像中的具体位置区域之间的对应关系。数据集包括Visual7W、RefCOCO系列等。例如,模型需要从给定的图像中定位出文本提到的对象。
  • 图像字幕任务(Grounded Captioning):生成图像的描述句子,其中每个名词短语的对应对象在图像中用边界框标注。数据集包括Flickr30K Entities。
  • 定位描述生成任务(Referring Expression Generation, REG):为图像中的每个边界框生成描述其内容的文本表达。数据集包括VisualGenome。
  • 定位描述理解任务(Referring Expression Comprehension, REC):根据文本描述的内容在图像中定位出对应区域。数据集包括RefCOCO系列。

这些任务在图像-语言建模的下游应用中扮演重要角色,需要模型理解深层的视觉语义信息。其中,视觉定位任务比较独特,需要确保文本描述与图像区域之间的对齐匹配。

二、模型架构

1. 模型架构

思想:视觉优先
之前的多模态模型:通常都是将图像特征直接对齐到文本特征的输入空间去,并且图像特征的编码器通常规模较小,这种情况下图像可以看成是文本的“附庸”,效果自然有限。
在这里插入图片描述
Cogvlm模型共包含四个基本组件:ViT 编码器,MLP 适配器,预训练大语言模型(GPT-style)和视觉专家模块。

  • ViT编码器:在 CogVLM-17B 中,采用预训练的 EVA2-CLIP-E。也就是上图将图片进入vit encoder编码。在CogVLM-17B中,移除了ViT编码器的最后一层,因为该层专注于整合[CLS]特征以用于对比学习。
  • MLP 适配器:MLP 适配器是一个两层的 MLP(SwiGLU),用于将 ViT 的输出映射到与词嵌入的文本特征相同的空间。注:所有的图像特征在语言模型中共享相同的position id。
  • 预训练大语言模型:CogVLM 的模型设计与任何现有的 GPT-style的预训练大语言模型兼容。具体来说,CogVLM-17B 采用 Vicuna-7B-v1.5 进行进一步训练;也选择了 GLM 系列模型和 Llama 系列模型做了相应的训练
  • 视觉专家模块:在每层添加一个视觉专家模块,以实现深度的视觉 - 语言特征对齐。在每个transformer层中,图像特征使用与文本特征不同的QKV矩阵和MLP层(都是可训练的)。
class CogVLMModel(LLaMAModel):
    def __init__(self, args, transformer=None, parallel_output=True, **kwargs):
        super().__init__(args, transformer=transformer, parallel_output=parallel_output, **kwargs)
        self.image_length = args.image_length
        self.add_mixin("eva", ImageMixin(args))
        self.del_mixin("mlp")
        self.add_mixin("mlp", LlamaVisionExpertFCMixin(args.hidden_size, args.inner_hidden_size, args.num_layers, 32))
        self.del_mixin("rotary")
        self.add_mixin("rotary", LlamaVisionExpertAttnMixin(args.hidden_size, args.num_attention_heads, args.num_layers, 32))

    @classmethod
    def add_model_specific_args(cls, parser):
        group = parser.add_argument_group('CogVLM', 'CogVLM Configurations')
        group.add_argument('--image_length', type=int, default=256)
        group.add_argument('--eva_args', type=json.loads, default={})
        return super().add_model_specific_args(parser)

    def forward(self, input_ids, vision_expert_mask, image_embed_mask, **kwargs):
        if input_ids.shape[1] > 1:
            return super().forward(input_ids=input_ids, vision_expert_mask=vision_expert_mask, image_embed_mask=image_embed_mask, **kwargs)
        return super().forward(input_ids=input_ids, **kwargs)


class FineTuneTrainCogVLMModel(CogVLMModel):
    def __init__(self, args, transformer=None, parallel_output=True, **kw_args):
        super().__init__(args, transformer=transformer, parallel_output=parallel_output, **kw_args)
        self.args = args
        # If you want to use model parallel with a mp_size=1 checkpoint, and meanwhile you also want to use lora,
        # you have to add_mixin after loading model checkpoint.
        
    @classmethod
    def add_model_specific_args(cls, parser):
        group = parser.add_argument_group('CogVLM-finetune', 'CogVLM finetune Configurations')
        group.add_argument('--pre_seq_len', type=int, default=8)
        group.add_argument('--lora_rank', type=int, default=10)
        group.add_argument('--use_ptuning', action="store_true")
        group.add_argument('--use_lora', action="store_true")
        group.add_argument('--use_qlora', action="store_true")
        group.add_argument('--layer_range', nargs='+', type=int, default=None)
        return super().add_model_specific_args(parser)

2. 训练方式

  • 模型在15亿张图文对上预训练了4096个A100*days,并在构造的视觉定位(visual grounding)数据集上进行二阶段预训练。
  • 在对齐阶段,CogVLM使用了各类公开的问答对和私有数据集进行监督微调,使得模型能回答各种不同类型的提问。

(1)预训练阶段

训练数据:图像文本对

  • 在CogVLM的预训练阶段,它使用了公开可用的图像文本对进行训练,包括LAION-2B和COYO-700M。在筛选过程中,移除了损坏的URL、含有不适当内容的图像、带有噪声字幕的图像、具有政治偏见的图像,以及长宽比大于6或小于1/6的图像。经过筛选后,大约还剩下15亿个图像文本对用于预训练。
  • 视觉定位数据集:作者还构建了一个包含4000万个图像的视觉定位数据集。在这个数据集中,每张图像的名词都与边界框相关联,以指示其在图像中的位置。构建过程遵循了Peng等人的方法,使用spaCy提取名词,使用GLIPv2预测边界框。这些图像文本对是从LAION-400M的子集LAION-115M中抽取的,LAION-115M是由Li等人进行了筛选的。筛选后,保留了4000万张图像的子集,以确保超过75%的图像至少包含两个边界框。

预训练超参数:
在这里插入图片描述

1)预训练第一阶段:图像描述损失函数

在预训练的第一阶段中,模型训练的是图像描述损失函数(image captioning loss),即对文本部分进行下一个标记的预测。预训练的第一阶段使用了上述提及的15亿个图像文本对,共进行了12万次迭代,批量大小为8192。

2)预训练第二阶段:图像描述+REC任务

预训练的第二阶段涉及图像描述(image captioning)和指代表达理解(REC)任务。REC任务是根据物体的文本描述来预测图像中的边界框位置。这个任务以VQA的形式进行训练,即"问题:物体在哪里?“和"答案:[[x0,y0,x1,y1]]”。其中,x和y坐标的取值范围从000到999,表示在图像中的归一化位置。在答案的部分,只考虑了下一个标记的预测损失。

预训练的第二阶段同时涵盖了图像描述和REC任务,进行了6万次迭代,批量大小为1024。在最后的3万次迭代中,将输入分辨率从224×224改变为490×490(分辨率提升,增加图片的大小和细节,提供模型对细节的捕捉能力、增强模型的泛化能力,适应各种尺寸的输入图像等)。整个预训练过程中可训练参数总数为65亿,预训练过程消耗了约4096个A100×天。

(2)SFT有监督微调

数据:可以参考1.2的 CogVLM-SFT-311K数据介绍。
在SFT期间:除VIT(Vision Transformer)编码器外,所有的参数都是可以训练的。

sft训练的超参数设置:
在这里插入图片描述

3. 视觉专家模块

(1)工作模式

在每一层中,视觉专家模块由两部分组成:一个QKV矩阵和一个MLP。这里的QKV代表“查询-键-数值”,是用于注意力计算的重要矩阵。其工作模式:

  • 首先,输入的隐藏状态被分成图像隐藏状态(XI)和文本隐藏状态(XT)。
  • 接着,利用QKV矩阵,对图像和文本的隐藏状态进行相应的注意力计算。这一步可以理解为模型决定在处理时应该关注图像和文本中的哪些部分。
  • 计算得到的注意力权重会影响到后续的处理过程,确保模型在处理过程中充分结合了图像和文本的信息。
  • 在FFN(FeedForward Network)层中,视觉专家模块也会进行类似的处理,保证了在深度处理过程中图像和文本特征的融合。

(2)相关步骤:

在这里插入图片描述

  • 首先定义:输入的input hidden states为 X ∈ R B × H × ( L I + L T ) × D X \in \mathbb{R}^{B \times H \times\left(L_I+L_T\right) \times D} XRB×H×(LI+LT)×D,其中:
    • B是batch_size
    • L I L_I LI L T L_T LT分别是图片和文本的sequence_len
    • H是多头注意力的头数
    • D是hidden size。
  • 这里视觉专家的注意力表示形式为: Attention ⁡ ( X , W I , W T ) = softmax ⁡ ( Tril ⁡ ( Q K T ) D ) V \operatorname{Attention}\left(X, W_I, W_T\right)=\operatorname{softmax}\left(\frac{\operatorname{Tril}\left(Q K^T\right)}{\sqrt{D}}\right) V Attention(X,WI,WT)=softmax(D Tril(QKT))V
    • 其中这里的 W I W_I WI W T W_T WT分别是视觉专家、original language model的QKV矩阵
    • Tril ⁡ ( ) \operatorname{Tril}() Tril()是取矩阵的下三角部分(自注意力机制常用的掩码操作)。
    • Q = concat ⁡ ( X I W I Q , X T W T Q ) Q=\operatorname{concat}\left(X_I W_I^Q, X_T W_T^Q\right) Q=concat(XIWIQ,XTWTQ)
    • K = concat ⁡ ( X I W I K , X T W T K ) K=\operatorname{concat}\left(X_I W_I^K, X_T W_T^K\right) K=concat(XIWIK,XTWTK)
    • V = concat ⁡ ( X I W I V , X T W T V ) V=\operatorname{concat}\left(X_I W_I^V, X_T W_T^V\right) V=concat(XIWIV,XTWTV)
  • 最后进行拼接操作: FFN ⁡ ( X ) = concat ⁡ ( FFN ⁡ I ( X I ) , FFN ⁡ T ( X T ) ) \operatorname{FFN}(X)=\operatorname{concat}\left(\operatorname{FFN}_I\left(X_I\right), \operatorname{FFN}_T\left(X_T\right)\right) FFN(X)=concat(FFNI(XI),FFNT(XT))
  • 特点:视觉专家模块在每个transformer层都对图像特征进行专门处理,使得模型更好理解和融合视觉信息。

三、Cogvlm模型训练中的数据增强

当面对特定场景(如路牌识别)且可用的图片数据集较小时,微调CogVLM前可以做的:

  1. 数据增强(Data Augmentation)

    • 对现有的图像数据应用各种变换,如旋转、缩放、裁剪、颜色调整等,以生成更多的训练样本。
    • 使用图像合成技术生成新的图像样本,例如,通过将路牌元素合成到不同背景中来增加数据多样性。
  2. 使用预训练任务:利用预训练阶段的数据集,这些数据集可能包含与路牌识别相关的图像,即使它们不是专门为路牌识别而设计的。

  3. 模型正则化:应用正则化技术,如Dropout或权重衰减,以防止模型在有限数据上过拟合。

四、Ablation Study消融实验

  • Model structure and tuned parameters(模型结构和调整后的参数) :作者研究了仅调整MLP Adapter层或调整所有LLM参数和Adapter而不添加VE的有效性,以及修改VE架构以在每个第四个LLM层添加完整VE或仅在所有层中添加配备了FFN的VE。结果显示,仅微调adapted layer(如BLIP2模型)可能导致较差的浅层对齐效果。
  • Initialization Method(初始化方法) :作者研究了从LLM初始化VE权重的有效性。结果表明,这种方法略微降低了性能,这表明了这种方法的积极影响。
  • Visual Attention Mask(视觉注意力掩码) :作者在视觉标记上使用因果掩码(causal mask)会产生比full mask更好的结果。作者假设这种现象的可能解释是因果掩码更好地适应了LLM的内在结构。
  • Image SSL Loss(图像自我监督损失) :作者还研究了图像特征上的自我监督学习损失,其中每个视觉特征预测下一个位置的CLIP特征以进行视觉自我监督。与观察到的来自PaLI-X的观察一致,我们发现它对下游任务没有改善,尽管我们在早期实验证明了在小模型中确实有所改善。
  • EMA(指数移动平均) :作者在预训练期间使用了EMA,通常在各种任务中带来了改善。

Reference

[1] CogVLM:深度融合引领视觉语言模型革新,多领域性能创新高
[2] 多模态融合新方向!21篇2024年最新顶会论文汇总!
[3] https://github.com/THUDM/CogVLM/blob/main/assets/cogvlm-paper.pdf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1549239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LED基础知识分享(三)

大家好,我是砖一。 今天给大家分享一下,LED的基础知识,有照明行业,或者对LED感兴趣的朋友,可以学习一下,希望对你有用~ 一、热扩散 物质本身或当物质与物质接触时,能量的传递就被称为热传导&a…

STM32串口收发单字节数据原理及程序实现

线路连接: 显示屏的SCA接在B11,SCL接在B10,串口的RX连接A9,TX连接A10。 程序编写: 在上一个博客中实现了串口的发送代码,这里实现串口的接收代码,在上一个代码的基础上增加程序功能。 Seiral.…

idea使用git笔记

1.创建分支和切换分支 创建分支 切换分支 2.把新创建的分支提交到远程服务器上(注:如果没有提交的,随便找个文件修改再提交) (1)切换到要提交的分支,add (2)commit (3)push 3.在自己分支修改代码及提交到自己的远…

MySQL - 高阶语句(二)

目录 6. 子查询 操作: EXISTS 关键字 别名 as 7. 视图 理论: 操作: 视图的优缺点 8. NULL 值 9. union 联级 9.1 union (合并后去重) 9.2 union all (合并后不去重) 9.3 取非交集值 10. case 条件选择查…

阿里云服务器租用价格表-2024最新(附明细报价)

2024年阿里云服务器优惠价格表,一张表整理阿里云服务器最新报价,阿里云服务器网aliyunfuwuqi.com整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单,大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新…

TCP重传机制详解——02SACK

文章目录 TCP重传机制详解——02 SACKSACK是什么?为什么要有SACK?实际场景抓包具体显示信息流程 实战抓包讲解SACK关闭场景下,三次重复ACK后会快速重传SACK打开但是不携带SACK块信息场景下,三次重复ACK也不会快速重传SACK打开并且…

YOLOv9改进策略:IoU优化 | Wasserstein Distance Loss,助力小目标涨点

💡💡💡本文独家改进:基于Wasserstein距离的小目标检测评估方法 Wasserstein Distance Loss | 亲测在多个数据集能够实现涨点,对小目标、遮挡物性能提升明显 💡💡💡MS COCO和PASC…

性价比高一点的diy台式主机怎么搭配?

怎么搭配一台性价比高一点的台式机 建议: 选择合适的CPU和GPU。根据实际需求选择相对较新的CPU和GPU型号,以确保能够运行目标应用程序和游戏。 合理选择内存和存储。根据预算选择适当的内存和存储容量。8GB或16GB内存对于一般计算和游戏使用足够了&…

USART发送单字节数据原理及程序实现

硬件接线: 显示屏的SCA接在B11,SCL接在B10,串口的RX连接A9,TX连接A10。 新建Serial.c和Serial.h文件 在Serial.c文件中,实现初始化函数,等需要的函数,首先对串口进行初始化,只需要…

全国地质灾害点shp崩塌滑坡泥石流空间分布地质灾害详查等数据集

地质灾害是指在自然或者人为因素的作用下形成的,对人类生命财产造成的损失、对环境造成破坏的地质作用或地质现象。地质灾害在时间和空间上的分布变化规律,既受制于自然环境,又与人类活动有关,往往是人类与自然界相互作用的结果。…

easyx查找算法可视化--顺序查找/二分查找/分块查找

💂 个人主页:pp不会算法^ v ^ 🤟 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 文章目录 概述演示源码获取 概述 #顺序存储的顺序查找 √ #链式存…

验证码/数组元素的复制.java

1,验证码 题目:定义方法实现随机产生一个5位的验证码,前面四位是大写或小写的英文字母,最后一位是数字 分析:定义一个包含所有大小写字母的数组,然后对数组随机抽取4个索引,将索引对应的字符拼…

Qt C++ | QTimer经验总结

QTimer Class QTimer类提供重复计时器和单次计时器 头文件: #include <QTimer> qmake: QT += core 继承自: QObject 定时器信号 void timeout() 公共函数 Qt::TimerType 枚举定义了 Qt 中不同类型的定时器。它包含以下值: **Qt::PreciseTimer:**高精度定时器,用…

WPF —— DockPanel、ProgressBar 控件详解

ProgressBar 控件详解 1Progress bar简介 ProgressBar&#xff1a;进度条控件。 WPF带有一个方便的控件用于显示进度&#xff0c;称ProgressBar。它的工作原理就是设置最小值和最大值然后通过递增一个值&#xff0c;这样就可以直观的显示当前进度情况。 2 Progress bar常用的…

腾讯VS网易:一场不见终局的游戏未来之战

国内游戏霸主腾讯最近赚足了眼球。 总体上看&#xff0c;腾讯手握“游戏社交”两大王牌&#xff0c;最近发布的财报十分亮眼&#xff0c;其2023年总营收和净利润分别同比增长10%和36%&#xff0c;展现了互联网巨头的强劲活力。 然而巨头亦有焦虑&#xff0c;增值服务营收同比…

AMEYA360代理 | 江苏长晶科技FST2.0高性能 IGBT产品介绍

江苏长晶科技股份有限公司是一家专业从事半导体产品研发、生产和销售的企业。自2019年起&#xff0c;连续4年被中国半导体行业协会评为 “功率器件十强企业”。2021年开始自主研发有着“工业CPU”之称的IGBT&#xff0c;截至2023年Q3在家电/工业/新能源等行业实现8款产品市场应…

Windows python多版本共享方案

1、先安装好python3.11 2、安装好python3.7 这时默认版本是python3.7&#xff0c; A、如果要切换回python3.11则修改环境变量即可 B、 如果想使用3.7&#xff0c;找到python3.7的安装路径 如果想使用3.7 C:\Users\用户\AppData\Local\Programs\Python\Python37 复制python…

Lua热更新(xlua)

发现错误时检查是否:冒号调用 只需要导入asset文件夹下的Plugins和Xlua这两个文件即可,别的不用导入 生成代码 和清空代码 C#调用lua using Xlua; 需要引入命名空间 解析器里面执行lua语法 lua解析器 LuaEnv 单引号是为了避免引号冲突 第二个参数是报错时显示什么提示…

点赋科技教你无人自助咖啡机选什么品牌?不选贵的,只选对的!

随着社会的发展和人们生活水平的提高&#xff0c;咖啡文化在全球范围内越来越受到重视。无人自助咖啡机作为一种便捷、高效的咖啡供应方式&#xff0c;逐渐受到了市场的青睐。在众多品牌中&#xff0c;我们为何应选择智能咖啡机呢&#xff1f;下面就让D咖带大家来一探究竟。 D咖…

Spring Cloud - Openfeign 实现原理分析

OpenFeign简介 OpenFeign 是一个声明式 RESTful 网络请求客户端。OpenFeign 会根据带有注解的函数信息构建出网络请求的模板,在发送网络请求之前,OpenFeign 会将函数的参数值设置到这些请求模板中。虽然 OpenFeign 只能支持基于文本的网络请求,但是它可以极大简化网络请求的…