当前位置: 首页 > news >正文

【DeepSeek原理学习2】MLA 多头隐变量注意力

解决的问题

Multi-Head Latent Attention,MLA——解决的问题:KV cache带来的计算效率低和内存需求大以及上下文长度扩展问题。

MLA原理

MLA原理:其核心思想是将键(Key)和值(Value)矩阵压缩到一个低维的"潜在"空间中,从而显著减少KV缓存的内存占用。与传统MHA相比,MLA不直接存储完整的键值矩阵,而是存储一个维度更小的压缩向量。在需要进行注意力计算时,再通过解压缩重构出所需的键和值(减少了权重矩阵要学习的参数量)。这种压缩-解压缩机制使得模型可以在显著减少内存占用的同时,保持甚至提升性能。DeepSeek-V2的技术报告显示,MLA使KV缓存减少了93.3%,训练成本节省了42.5%,生成吞吐量提高了5.76倍。在8个H800 GPU上实际部署时,实现了超过50,000令牌每秒的生成速度,这一数据充分证明了MLA的高效性。

步骤

首先压缩Q即公式(37)。

从5120先降维再升维,好处是相比直接使用大小为 [5120, 24576] 的矩阵# [5120, 1536] * [1536, 24576] 这样的低秩分解在存储空间和计算量上都大幅度降低维降到1536维 。也就是(37)-(40)模型所要学习的矩阵。

 # 对隐藏状态进行线性投影和归一化,生成查询张量q = self.q_b_proj(self.q_a_layernorm(self.q_a_proj(hidden_states)))  # 调整查询张量的形状q = q.view(bsz, q_len, self.num_heads, self.q_head_dim).transpose(1, 2) 

 解压缩C并拆分,即(38)、(39)和(40)

q_nope, q_pe = torch.split(# 将查询张量拆分为不包含位置嵌入的部分和包含位置嵌入的部分q, [self.qk_nope_head_dim, self.qk_rope_head_dim], dim=-1  )

 对KV张量的降维、分裂K、拆分KV且升维

具体的代码涉及公式(41) kv_a_proj_with_mqa 和 公式(42)kv_b_proj 两个参数矩阵。 

升维之后计算注意力 

 给q_pe, k_pe给加上rope且合并,然后做标准注意力计算。

这一部分也涉及一个权重矩阵: o_proj,大小 [num_heads * v_head_dim, hidden_size] = [128*128, 5120]

 将查询和键张量 `q_pe` 和 `k_pe` 进行旋转

 # 计算旋转位置嵌入的余弦和正弦值cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len)  # 应用旋转位置嵌入q_pe, k_pe = apply_rotary_pos_emb(q_pe, k_pe, cos, sin, position_ids)

 接着,方法创建新的查询状态张量 `query_states` ,然后将旋转后的部分和不包含位置嵌入的部分合并便可得到最终的Q向量

# 创建新的查询状态张量query_states = k_pe.new_empty(bsz, self.num_heads, q_len, self.q_head_dim)# 将不包含位置嵌入的部分赋值给查询状态张量query_states[:, :, :, : self.qk_nope_head_dim] = q_nope# 将包含位置嵌入的部分赋值给查询状态张量query_states[:, :, :, self.qk_nope_head_dim :] = q_pe

 K相似操作。

关于矩阵吸收十倍提速

这里不用展开计算的意思我理解为就是不需要再单独升维计算,UK矩阵被吸收后直接与降维压缩的K相乘即可。 这样减少了中间变量的存储,提高了计算效率。

 # 以下和原本实现相同bsz, q_len, _ = hidden_states_q.size()q = self.q_b_proj(self.q_a_layernorm(self.q_a_proj(hidden_states_q)))q = q.view(bsz, q_len, self.num_heads, self.q_head_dim).transpose(1, 2)q_nope, q_pe = torch.split(q, [self.qk_nope_head_dim, self.qk_rope_head_dim], dim=-1)kv_seq_len = compressed_kv.size(1)compressed_kv, k_pe = torch.split(compressed_kv, [self.kv_lora_rank, self.qk_rope_head_dim], dim=-1)k_pe = k_pe.view(bsz, 1, kv_seq_len, self.qk_rope_head_dim)# 从 kv_b_proj 中分离的 W^{UK} 和 W^{UV} 两部分,他们要分别在不同的地方吸收kv_b_proj = self.kv_b_proj.weight.view(self.num_heads, -1, self.kv_lora_rank)q_absorb = kv_b_proj[:, :self.qk_nope_head_dim,:]#W^{UK}out_absorb = kv_b_proj[:, self.qk_nope_head_dim:, :]#W^{UV}cos, sin = self.rotary_emb(q_pe)q_pe = apply_rotary_pos_emb(q_pe, cos, sin, q_position_ids)# !!! 关键点,W^{UK} 即 q_absorb 被 q_nope(W^{UQ}) 吸收q_nope = torch.einsum('hdc,bhqd->bhqc', q_absorb, q_nope) # 吸收后 attn_weights 直接基于 compressed_kv 计算不用展开。attn_weights = torch.matmul(q_pe, k_pe.transpose(2, 3)) + torch.einsum('bhqc,blc->bhql', q_nope, compressed_kv)attn_weights *= self.softmax_scale

 

#原始顺序
v_t = einsum('hdc,blc->blhd', W_UV, c_t_KV) # (1)
o   = einsum('bqhl,blhd->bqhd', attn_weights, v_t)     # (2)
u   = einsum('hdD,bhqd->bhD', W_o, o)       # (3)# 将上述三式合并,得到总的计算过程
u   = einsum('hdc,blc,bqhl,hdD->bhD', W_UV, c_t_KV, attn_weights, W_o)
#改变顺序
# 利用结合律改变计算顺序
o_  = einsum('bhql,blc->bhqc', attn_weights, c_t_KV) # (4)#将注意力权重attn_weights与压缩的键-值矩阵c_t_KV相乘,直接得到一个更紧凑的中间结果o_。
o   = einsum('bhqc,hdc->bhqd', o_, W_UV)  # (5)#将中间结果o_与权重矩阵W_UV相乘,得到o
u   = einsum('hdD,bhqd->bqD', W_o, o)     # (6)#将权重矩阵W_o与o相乘,得到最终输出u

总结

MLA不直接存储完整的键值矩阵,而是存储一个维度更小的压缩向量。在需要进行注意力计算时,再通过解压缩重构出所需的键和值

1.减少了权重矩阵要学习的参数量。2.通过矩阵吸收减少了中间需要解压后的K和V的矩阵,减少了中间存储数据量提高了计算效率。

与其他注意力机制的比较

参考说明

[1]  ​​​​​​[深度剖析Deepseek 多头潜在注意力(MLA) - 知乎

[2]MLA实现及其推理上的十倍提速——逐行解读DeepSeek V2中多头潜在注意力MLA的源码(图、公式、代码逐一对应)_mla加速 csdn-CSDN博客

[3]DeepSeek-V2 高性能推理 (1):通过矩阵吸收十倍提速 MLA 算子 - 知乎

相关文章:

【DeepSeek原理学习2】MLA 多头隐变量注意力

解决的问题 Multi-Head Latent Attention,MLA——解决的问题:KV cache带来的计算效率低和内存需求大以及上下文长度扩展问题。 MLA原理 MLA原理:其核心思想是将键(Key)和值(Value)矩阵压缩到…...

2024年RAG大赛

2024 CCF国际AIOps挑战赛赛题与赛制解读-CSDN博客 自动化测评也比较有意思,分数为 关键字 语义相似度,分值比为6:4. 2024 CCF AIOPS国际挑战赛优秀奖方案分享 https://zhuanlan.zhihu.com/p/7444390758 【大模型RAG获奖方案分享】如何提高RAG系统在…...

2025-4-6-C++ 学习 有序数组、set()的一些内置函数与求和函数

C的学习必须更加精进一些,对于好多的函数和库的了解必须深入一些。 文章目录 3510. 移除最小数对使数组有序 II(有序数组)题目参考代码(1)auto it idx.lower_bound(i);功能解释可能的使用场景常见错误 (2&…...

Flutter:Flutter SDK版本控制,fvm安装使用

1、首先已经安装了Dart,cmd中执行 dart pub global activate fvm2、windows配置系统环境变量 fvm --version3、查看本地已安装的 Flutter 版本 fvm releases4、验证当前使用的 Flutter 版本: fvm flutter --version5、切换到特定版本的 Flutter fvm use …...

GPT-4o 的“图文合体”是怎么做到的

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

PyTorch教程:如何读写张量与模型参数

本文演示了PyTorch中张量(Tensor)和模型参数的保存与加载方法,并提供完整的代码示例及输出结果,帮助读者快速掌握数据持久化的核心操作。 1. 保存和加载单个张量 通过torch.save和torch.load可以直接保存和读取张量。 import to…...

MySQL8.0.31安装教程,附pdf资料和压缩包文件

参考资料:黑马程序员 一、下载 点开下面的链接:https://dev.mysql.com/downloads/mysql/ 点击Download 就可以下载对应的安装包了, 安装包如下: 我用夸克网盘分享了「mysql」,链接:https://pan.quark.cn/s/ab7b7acd572b 二、解…...

Linux 系统中对存储设备(/dev/mmcblk、/dev/sd、/dev/nvme)进行分区、格式化或挂载的操作

在 Linux 系统中对存储设备(/dev/mmcblk、/dev/sd、/dev/nvme)进行分区、格式化或挂载的操作步骤如下: 一、确认设备信息 首先明确要操作的设备名称(如 /dev/sdb、/dev/nvme0n1),避免误操作导致数据丢失&a…...

【Kafka基础】topics命令行操作大全:高级命令解析(1)

1 创建压缩主题(Log Compaction) /export/home/kafka_zk/kafka_2.13-2.7.1/bin/kafka-topics.sh --create \--bootstrap-server 192.168.10.33:9092 \--topic comtopic \--partitions 3 \--replication-factor 2 \--config cleanup.policycompact \--con…...

springboot集成spring loadbalancer实现客户端负载均衡

在 Spring Boot 中实现负载均衡,通常需要结合 Spring Cloud 组件,比如 Spring Cloud LoadBalancer。Spring Cloud LoadBalancer 是一个客户端负载均衡器,可以与 Spring Boot 集成,实现微服务之间的负载均衡。 以下是一个简单的示…...

什么是 k8s Affinity(亲和性)

在 Kubernetes(K8s)中,Affinity(亲和性) 是一种 Pod 调度策略,它用于控制 Pod 在什么条件下可以被调度到特定的节点上。它比 Taints 和 Tolerations 更灵活,可以基于 节点属性 或 Pod 之间的关系…...

深度探索:策略学习与神经网络在强化学习中的应用

深度探索:策略学习与神经网络在强化学习中的应用 策略学习(Policy-Based Reinforcement Learning)一、策略函数1.1 策略函数输出的例子 二、使用神经网络来近似策略函数:Policy Network ,策略网络2.1 策略网络运行的例子2.2需要的几个概念2.3神经网络近似…...

用VAE作为标题显示标题过短,所以标题变成了这样

VAE (Variational Autoencoder / 变分自编码器) 基本概念: VAE 是一种生成模型 (Generative Model),属于自编码器 (Autoencoder) 家族。 它的目标是学习数据的潜在表示 (Latent Representation),并利用这个表示来生成新的、与原始数据相似的数据。 与标…...

【day27】测试策略升级方案:需求阶段介入与业务规则覆盖矩阵设计

测试策略升级方案:需求阶段介入与业务规则覆盖矩阵设计 一、需求评审阶段:主动识别业务逻辑问题 在需求评审时,测试团队应通过结构化提问提前暴露潜在风险,避免后期返工。以下为提问框架与示例: 1. 业务逻辑澄清提问模…...

AI烘焙大赛中的算法:理解PPO、GRPO与DPO的罪简单的方式

🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…...

二分 —— 基本算法刷题路程

一、1.求阶乘 - 蓝桥云课 算法代码&#xff1a; #include <bits/stdc.h> using namespace std; #define ll long long ll check(ll n) {ll cnt0;while(n){cnt(n/5);}return cnt; }int main() {ll k;cin>>k;ll L0,R1e19;while(L<R){ll mid(LR)>>1;if(che…...

内存序问题排查

1 内存序 2 简介 std::memory_order 是 C11 引入的一个枚举类型&#xff0c;用于和 <atomic> 原子操作一起使用&#xff0c;控制多线程环境下内存的可见性和执行顺序。 它的主要作用是&#xff1a;告诉编译器和 CPU&#xff0c;在执行某个原子操作时&#xff0c;哪些内…...

历年跨链合约恶意交易详解(四)——Chainswap20210711

漏洞合约函数 function receive(uint256 fromChainId, address to, uint256 nonce, uint256 volume, Signature[] memory signatures) virtual external payable {_chargeFee();require(received[fromChainId][to][nonce] 0, withdrawn already);uint N signatures.length;r…...

Johnson

理论 全源最短路算法 Floyd 算法&#xff0c;时间复杂度为 O(n)跑 n 次 Bellman - Ford 算法&#xff0c;时间复杂度是 O(nm)跑 n 次 Heap - Dijkstra 算法&#xff0c;时间复杂度是 O(nmlogm) 第 3 种算法被 Johnson 做了改造&#xff0c;可以求解带负权边的全源最短路。 J…...

spring boot + Prometheus + Grafana 实现项目监控

一、引入依赖 <dependencies><!-- Spring Boot Starter Actuator --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- Micrometer Reg…...

Mythical Beings:第八季即将回归,探索新的神话传承

Mythical Beings是由Tarasca Art & Games开发的、基于Ignis区块链的卡牌收集游戏。自发布以来&#xff0c;这款游戏以其独特的玩法和深厚的神话背景吸引了大量玩家的关注。每张卡牌不仅代表着独特的游戏属性&#xff0c;还融合了丰富的文化和神话故事&#xff0c;使玩家不仅…...

Linux中查看占用端口号的进程信息的方法

在 Linux 中查看占用 ** 端口&#xff08;eg:1717&#xff09;**的进程号&#xff08;PID&#xff09;&#xff0c;可以通过以下命令实现&#xff1a; 方法 1&#xff1a;使用 netstat 命令 sudo netstat -tulnp | grep :1717参数解释&#xff1a; -t&#xff1a;查看 TCP 端口…...

批量将 txt/html/json/xml/csv 等文本拆分成多个文件

我们的文本文件太大的时候&#xff0c;我们通常需要对文本文件进行拆分&#xff0c;比如按多少行一个文件将一个大的文本文件拆分成多个小的文本文件。这样我们在打开或者传输的时候都比较方便。今天就给大家介绍一种同时对多个文本文件进行批量拆分的方法&#xff0c;可以快速…...

爱普生高精度车规晶振助力激光雷达自动驾驶

在自动驾驶技术快速落地的今天&#xff0c;激光雷达作为车辆的“智慧之眼”&#xff0c;其测距精度与可靠性直接决定了自动驾驶系统的安全上限。而在这双“眼睛”的核心&#xff0c;爱普生&#xff08;EPSON&#xff09;的高精度车规晶振以卓越性能成为激光雷达实现毫米级感知的…...

Spring Boot 自定义 Redis Starter 开发指南(附动态 TTL 实现)

一、功能概述 本 Starter 基于 Spring Boot 2.7 实现以下核心能力&#xff1a; Redis 增强&#xff1a;标准化 RedisTemplate 配置&#xff08;JSON 序列化 LocalDateTime 支持&#xff09;缓存扩展&#xff1a;支持 Cacheable(value “key#60s”) 语法动态设置 TTL配置集中…...

区分CRI、OCI、containerd、Docker、CRI-O、runc等名词概念

这些概念可以分为&#xff1a; 一、容器运行时Container Runtimes a、规范OCI (Open Container Initiative) 定义&#xff1a;OCI 是一个开放标准&#xff0c;用于定义容器格式和运行时的规范。它旨在确保容器镜像的格式和容器运行时的操作方式在不同的实现之间保持兼容性。 •…...

#关于process.env.NODE_ENV 与 import.meta.env 相关了解

process.env.NODE_ENV 在前端 Vue 项目中非常重要&#xff0c;但它其实是个“假象”&#xff0c;在前端它并不是原生就有的变量。下面我从多个角度来给你通俗讲明白它的由来和使用方式 &#x1f447; &#x1f310; 一、process.env.NODE_ENV 是干嘛用的&#xff1f; 这是 一个…...

R语言赋能气象水文科研:从多维数据处理到学术级可视化

全球气候变化加剧了极端天气与水文事件的复杂性&#xff0c;气象卫星、雷达、地面观测站及水文传感器每天产生TB级‌时空异质数据‌。传统研究常面临四大瓶颈&#xff1a; ‌数据清洗低效‌&#xff1a;缺失值、异常值处理耗时&#xff1b;‌时空分析模型构建复杂‌&#xff1…...

MySQL 约束(入门版)

目录 一、约束的基本概念 二、约束演示 三、外键约束 &#xff08;一&#xff09;介绍 &#xff08;二&#xff09;外键约束语法 &#xff08;三&#xff09;删除/更新行为 一、约束的基本概念 1、概念&#xff1a;约束是作用于表中字段上的规则&#xff0c;用于限制存储…...

【go】类型断言

接口-类型断言 Type Assertion Type Assertion&#xff08;中文名叫&#xff1a;类型断言&#xff09;&#xff0c;通过它可以做到以下几件事情 检查 i 是否为 nil&#xff08;是nil直接抛出panic&#xff09;检查 i 存储的值是否为某个类型 具体的使用方式有两种&#xff…...

(复看)CExercise_06_1指针和数组_2 给定一个double数组,求平均值,并且返回

题目&#xff1a; 求平均值&#xff0c;给定一个double数组&#xff0c;求平均值&#xff0c;并且返回。 要求使用while循环遍历数组&#xff0c;然后配合"*p"的语法实现。 函数的声明如下&#xff1a; double get_ave(double *arr, int len); 关键点 分析&#xff1…...

Ubuntu 服务器上运行相关命令,关闭终端就停止服务,怎么才能启动后在后台运行?

环境&#xff1a; Ubuntu 20.04 LTS 问题描述&#xff1a; Ubuntu 服务器上运行相关命令&#xff0c;关闭终端就停止服务&#xff0c;怎么才能启动后在后台运行&#xff1f; bash docker/entrypoint.sh解决方案&#xff1a; bash docker/entrypoint.sh 脚本在后台运行&…...

ffmpeg提取字幕

使用ffmpeg -i test.mkv 获取视频文件的字幕流信息如下 Stream #0:4(chi): Subtitle: subrip (srt) (default) Metadata: title : chs Stream #0:5(chi): Subtitle: subrip (srt) Metadata: title : cht Stream #0:6(jpn)…...

深入理解Socket编程:构建简单的计算器服务器

一、Socket通信基础 1. Socket通信基本流程 服务器端流程&#xff1a; 创建Socket (socket()) 绑定地址和端口 (bind()) 监听连接 (listen()) 接受连接 (accept()) 数据通信 (read()/write()) 关闭连接 (close()) 客户端流程&#xff1a; 创建Socket (socket()) 连接…...

CPU狂飙900%,该怎么处理

首先&#xff0c;说明一下问题&#xff1a;CPU飙升200% 以上是生产容易发生的场景 场景:1&#xff1a;MySQL进程飙升900% 大家在使用MySQL过程&#xff0c;想必都有遇到过CPU突然过高&#xff0c;或者达到200%以上的情况。 数据库执行查询或数据修改操作时&#xff0c;系统需…...

C++继承完全指南:从语法到设计模式----图解原理+工业级代码示例+陷阱规避

&#x1f52e;✨⚡️&#x1f30c; 欢迎来到张有志的量子编程次元 &#x1f30c;⚡️✨&#x1f52e; ▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂ &#x1f6f8; 核心探索舱 &#x1f6f8; ⇩⇩⇩ 正在加载未来代码 ⇩⇩⇩ ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔…...

使用Pholcus编写Go爬虫示例

想用Pholcus库来写一个Go的爬虫程序。首先&#xff0c;我得确认Pholcus的当前状态&#xff0c;因为之前听说过它可能已经不再维护了。不过用户可能还是需要基于这个库的示例&#xff0c;所以得先提供一个基本的框架。 首先&#xff0c;我应该回忆一下Pholcus的基本用法。Pholc…...

R Excel 文件:高效数据处理与可视化工具的完美结合

R Excel 文件&#xff1a;高效数据处理与可视化工具的完美结合 引言 在数据分析和处理领域&#xff0c;R语言因其强大的数据处理能力和丰富的可视化功能而备受青睐。而Excel作为最常用的电子表格软件&#xff0c;其广泛的应用也使得R与Excel的结合成为数据处理与可视化的理想…...

Python设计模式:适配模式

1. 适配模式&#xff08;Adapter Pattern&#xff09;详解 适配模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户端所期望的另一种接口。适配模式使得原本由于接口不兼容而无法一起工作的类可以协同工作。换句话说…...

Python设计模式:策略模式

1. 什么是策略模式 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;将每个算法封装起来&#xff0c;并使它们可以互换。策略模式使得算法的变化独立于使用算法的客户。换句话说&#xff0c;策略模式允许在运…...

Unity Internal-ScreenSpaceShadows 分析

一、代码结构 // Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)Shader "Hidden/Internal-ScreenSpaceShadows" {Properties {_ShadowMapTexture ("", any) "" {} // 阴影贴图纹理&…...

nginx配置oss代理

工作中会有一些时候需要将图片,视频,音频等文件放到oss这种对象存储中进行存储,实现高性能的访问,这种情况叫做动静分离.这里只做了图片的配置,视频以及音频的配置是一样的. 以下是nginx.conf的配置信息,其中还有ssl的加密配置,以及后端服务器的代理模块配置,(这里不用的话可以…...

UML对象图

UML对象图 一、对象图核心概念 对象图&#xff08;Object Diagram&#xff09;描述的是系统在某一时刻对象&#xff08;实例&#xff09;的状态快照。它关注的是实际对象之间的实例关系&#xff0c;而不是类与类之间的静态结构。主要特点有&#xff1a; ​对象&#xff08;Ob…...

手机不同App音量自动调节软件

软件介绍 在日常使用手机的过程中&#xff0c;大家是不是经常会遇到在不同App之间切换时&#xff0c;需要频繁调整音量的情况呢&#xff1f;这样真的很不方便。而一款名为App Volume Control的软件就能很好地解决这个问题。 App Volume Control借助辅助功能服务&#xff0c;能…...

模板方法模式详解

模板方法模式详解及真实场景解决方案 推荐学习完策略模式和模板方法模式看这个案例&#xff1a; 策略与模板方法模式组合详解 模式定义 模板方法模式是一种行为设计模式&#xff0c;在父类中定义算法的骨架&#xff0c;允许子类在不改变算法结构的情况下重写特定步骤。核心思…...

基于SSM邮件收发管理系统(带源码、论文)

摘要 随着互联网技术的迅速发展和普及&#xff0c;网络通信已经成了人们离不开的通信手段。作为最早出现的网络通信方式还有世界上应用最为广泛的网络服务之一&#xff0c;电子邮件综合了电话通信和传统邮件的特点&#xff0c;具有传播速度快、价格低廉的优良特性。随着技术发…...

1990-2019年各地级市GDP数据

1990-2019年各地级市GDP数据 1、时间&#xff1a;1990-2019年 2、来源&#xff1a;城市年鉴 3、指标&#xff1a;行政区划代码、年份、省份、城市、经度、纬度、地区生产总值(万元) 4、范围&#xff1a;250地级市 5、指标解释&#xff1a;地区生产总值&#xff08;Gross R…...

Scala相关知识学习总结5

1、多维数组 定义&#xff1a; val arr Array.ofDim[Double](3,4) 表示二维数组中有三个一维数组&#xff0c;每个一维数组有四个元素。 2、列表 List 不可变 List&#xff1a;默认不可变&#xff0c;可创建有序且可重复的列表&#xff0c;可使用:从右向左增加数据&#xf…...

【LangChain Agent 】详解,构建自主决策的 LLM 应用

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是 Lang Chain 2、什么是 Agent 二、LangChain …...

Scala基础知识7

一&#xff0c;可变数组和不可变数组的转换方法: 不可变数组转换为可变数组使用 toBuffer 函数. 可变数组转换为不可变数组使用 toArray 函数。 转换过程中原始数组不会发生变化&#xff0c;而是返回一个新的数组。 二&#xff0c;多维数组 使用 Array of 函数创建多维数组&am…...