wordpress 手机版主题/河南seo优化

wordpress 手机版主题,河南seo优化,网站会过期吗,wordpress 开发 表单颠覆语言认知的革命!神经概率语言模型如何突破人类思维边界? 一、传统模型的世纪困境:当n-gram遇上"月光族难题" 令人震惊的案例:2012年Google语音识别系统将 用户说:“我要还信用卡” 系统识别&#xff…

颠覆语言认知的革命!神经概率语言模型如何突破人类思维边界?

一、传统模型的世纪困境:当n-gram遇上"月光族难题"

令人震惊的案例:2012年Google语音识别系统将

用户说:“我要还信用卡”
系统识别:“我要环信用开”

三大困境解析

  1. 维度灾难:当n=3时,词表大小10万 → 需要存储10^15个组合
  2. 数据稀疏:"量子计算融资"在10亿语料库中出现0次
  3. 长程依赖:无法捕捉"虽然…但是…"的超距离关联

二、神经概率语言模型:NPLM

NPLM的结构包括3个主要部分:输⼊层、隐藏层和输出层。

输⼊层将词汇映射到连续的词向量空间,隐藏层通过⾮线性激活函数学习词与词之间的复杂关系,输出层通过softmax函数产⽣下⼀个单词的概率分布。

image-20250309184522370

数学之美
P ( w t ∣ w t − 1 , . . . , w t − n + 1 ) = s o f t m a x ( C ⋅ t a n h ⁡ ( W x + b ) ) P ( w t ∣ w t − 1 , . . . , w t − n + 1 ) = softmax ( C ⋅ tanh ⁡ ( W x + b ) ) P(wt∣wt−1,...,wt−n+1)=softmax(C⋅tanh⁡(Wx+b))P(w_t|w_{t-1},...,w_{t-n+1}) = \text{softmax}(C \cdot \tanh(Wx + b)) P(wtwt1,...,wtn+1)=softmax(Ctanh(Wx+b))P(wtwt1,...,wtn+1)=softmax(Ctanh(Wx+b))
其中:

  • C C C:词向量到输出的连接矩阵
  • W W W:上下文词向量组合矩阵
  • x x x:上下文词向量拼接

2.1 NPLM的实现

image-20250309184711801

2.1.1 建立语料库
# 构建一个非常简单的数据集
sentences = ["我 喜欢 玩具", "我 爱 爸爸", "我 讨厌 挨打"] 
# 将所有句子连接在一起,用空格分隔成多个词,再将重复的词去除,构建词汇表
word_list = list(set(" ".join(sentences).split())) 
# 创建一个字典,将每个词映射到一个唯一的索引
word_to_idx = {word: idx for idx, word in enumerate(word_list)} 
# 创建一个字典,将每个索引映射到对应的词
idx_to_word = {idx: word for idx, word in enumerate(word_list)} 
voc_size = len(word_list) # 计算词汇表的大小
print(' 词汇表:', word_to_idx) # 打印词汇到索引的映射字典
print(' 词汇表大小:', voc_size) # 打印词汇表大小
 词汇表: {'爸爸': 0, '讨厌': 1, '我': 2, '玩具': 3, '爱': 4, '喜欢': 5, '挨打': 6}词汇表大小: 7
2.1.2 生成NPLM训练数据
# 构建批处理数据
import torch # 导入 PyTorch 库
import random # 导入 random 库
batch_size = 2 # 每批数据的大小
def make_batch():input_batch = []  # 定义输入批处理列表target_batch = []  # 定义目标批处理列表selected_sentences = random.sample(sentences, batch_size) # 随机选择句子for sen in selected_sentences:  # 遍历每个句子word = sen.split()  # 用空格将句子分隔成多个词# 将除最后一个词以外的所有词的索引作为输入input = [word_to_idx[n] for n in word[:-1]]  # 创建输入数据# 将最后一个词的索引作为目标target = word_to_idx[word[-1]]  # 创建目标数据input_batch.append(input)  # 将输入添加到输入批处理列表target_batch.append(target)  # 将目标添加到目标批处理列表input_batch = torch.LongTensor(input_batch) # 将输入数据转换为张量target_batch = torch.LongTensor(target_batch) # 将目标数据转换为张量return input_batch, target_batch  # 返回输入批处理和目标批处理数据
input_batch, target_batch = make_batch() # 生成批处理数据
print(" 输入批处理数据:",input_batch)  # 打印输入批处理数据
# 将输入批处理数据中的每个索引值转换为对应的原始词
input_words = []
for input_idx in input_batch:input_words.append([idx_to_word[idx.item()] for idx in input_idx])
print(" 输入批处理数据对应的原始词:",input_words)
print(" 目标批处理数据:",target_batch) # 打印目标批处理数据
# 将目标批处理数据中的每个索引值转换为对应的原始词
target_words = [idx_to_word[idx.item()] for idx in target_batch]
print(" 目标批处理数据对应的原始词:",target_words)
 输入批处理数据: tensor([[2, 1], [2, 4]])输入批处理数据对应的原始词: [['我', '讨厌'], ['我', '爱']]目标批处理数据: tensor([6, 0])目标批处理数据对应的原始词: ['挨打', '爸爸']

batch_size = 2 # 每批数据的大小

image-20250310194259986

即为整理好数据集,及其对应的结果,接下来只等构建网络和训练

2.1.3 定义NPLM
import torch.nn as nn # 导入神经网络模块
# 定义神经概率语言模型(NPLM)
class NPLM(nn.Module):def __init__(self):super(NPLM, self).__init__() self.C = nn.Embedding(voc_size, embedding_size) # 定义一个词嵌入层# 第一个线性层,其输入大小为 n_step * embedding_size,输出大小为 n_hiddenself.linear1 = nn.Linear(n_step * embedding_size, n_hidden) # 第二个线性层,其输入大小为 n_hidden,输出大小为 voc_size,即词汇表大小self.linear2 = nn.Linear(n_hidden, voc_size) def forward(self, X):  # 定义前向传播过程# 输入数据 X 张量的形状为 [batch_size, n_step]X = self.C(X)  # 将 X 通过词嵌入层,形状变为 [batch_size, n_step, embedding_size]        X = X.view(-1, n_step * embedding_size) # 形状变为 [batch_size, n_step * embedding_size]# 通过第一个线性层并应用 ReLU 激活函数hidden = torch.tanh(self.linear1(X)) # hidden 张量形状为 [batch_size, n_hidden]# 通过第二个线性层得到输出 output = self.linear2(hidden) # output 形状为 [batch_size, voc_size]return output # 返回输出结果

image-20250310194659088

进一部的说明我们结合以下代码

2.1.4 实例化NPLM
n_step = 2 # 时间步数,表示每个输入序列的长度,也就是上下文长度 
n_hidden = 2 # 隐藏层大小
embedding_size = 2 # 词嵌入大小
model = NPLM() # 创建神经概率语言模型实例
print(' NPLM 模型结构:', model) # 打印模型的结构

输入数据[[1,3], [1,6]](对应句子片段[“我 爱”, “我 讨厌”])

处理流程

  1. 嵌入层转为形状 [2,2,2] 的张量
  2. 展平为 [2,4]
  3. 第一线性层压缩到 [2,2]
  4. 第二线性层扩展到 [2,7](每个样本对应7个词的概率)

image-20250310195024069

2.1.5 训练NPLM
import torch.optim as optim # 导入优化器模块
criterion = nn.CrossEntropyLoss() # 定义损失函数为交叉熵损失
optimizer = optim.Adam(model.parameters(), lr=0.1) # 定义优化器为 Adam,学习率为 0.1
# 训练模型
for epoch in range(5000): # 设置训练迭代次数optimizer.zero_grad() # 清除优化器的梯度input_batch, target_batch = make_batch() # 创建输入和目标批处理数据output = model(input_batch) # 将输入数据传入模型,得到输出结果loss = criterion(output, target_batch) # 计算损失值if (epoch + 1) % 1000 == 0: # 每 1000 次迭代,打印损失值print('Epoch:', '%04d' % (epoch + 1), 'cost =', '{:.6f}'.format(loss))loss.backward() # 反向传播计算梯度optimizer.step() # 更新模型参数

是不是中一段训练的设定看着挺抽象,接下来举一个简单的栗子:

for epoch in range(5000):optimizer.zero_grad()          # 清空炒锅残留(重置梯度)input_batch, target = make_batch()  # 随机选菜谱(数据采样)output = model(input_batch)    # 学生试做菜品(前向传播)loss = criterion(output, target) # 老师试吃评分(计算损失)loss.backward()                # 分析哪里做错了(反向传播)optimizer.step()               # 根据建议改进(参数更新)
image-20250310195240344
2.1.6 用NPLM预测新词
# 进行预测
input_strs = [['我', '讨厌'], ['我', '喜欢']]  # 需要预测的输入序列
# 将输入序列转换为对应的索引
input_indices = [[word_to_idx[word] for word in seq] for seq in input_strs]
# 将输入序列的索引转换为张量
input_batch = torch.LongTensor(input_indices) 
# 对输入序列进行预测,取输出中概率最大的类别
predict = model(input_batch).data.max(1)[1]  
# 将预测结果的索引转换为对应的词
predict_strs = [idx_to_word[n.item()] for n in predict.squeeze()]  
for input_seq, pred in zip(input_strs, predict_strs):print(input_seq, '->', pred)  # 打印输入序列和预测结果
['我', '讨厌'] -> 挨打['我', '喜欢'] -> 玩具

image-20250310195543613

2.2 完整手撕

最开始的学习中容易对NPLM建立中纬度的变化中产生疑惑,接下来进行具体得分析。

image-20250310195740161

其结构可以拆分为一个三明治结构

输入词索引 → 嵌入层 → 全连接层1+激活 → 全连接层2 → 词汇概率分布

让我们用具体数值示例(假设参数如下)逐步解析:

voc_size = 7        # 词汇表大小(示例数据实际值)
n_step = 2          # 用前2个词预测第3个词
embedding_size = 2  # 词向量维度(示例设定)
n_hidden = 2        # 隐藏层维度(示例设定)

2.2.1 输入数据示例

假设输入批处理数据为:

input_batch = [[1,3], [1,6]]  # 对应句子片段:"我 爱"、"我 讨厌"
# 转换为张量后形状:[batch_size=2, n_step=2]

2.2.2 前向传播逐层分解

1. 嵌入层(Embedding Layer)
self.C = nn.Embedding(7, 2)  # 参数:7词→2维向量
X = self.C(input_batch)      # 输入:[2,2] → 输出:[2,2,2]

相当于把索引中的七个词转化为二维的向量,转化过程如下

计算过程

  • 每个词索引查表获取对应向量
# 假设嵌入矩阵(随机初始化示例):
[[0.1, 0.2],  # 索引0:'挨打'[0.3, 0.4],  # 索引1:'我'[0.5, 0.6],  # 索引2:'爸爸' [0.7, 0.8],  # 索引3:'爱'[0.9, 1.0],  # 索引4:'喜欢'[1.1, 1.2],  # 索引5:'玩具'[1.3, 1.4]   # 索引6:'讨厌'
]# 输入[[1,3], [1,6]]的嵌入结果:
[[[0.3,0.4], [0.7,0.8]],  # "我 爱"[[0.3,0.4], [1.3,1.4]]   # "我 讨厌"
]

数学本质
将离散的词索引映射为连续可训练的向量空间中的点,公式:
E = EmbeddingLookup ( X ) \mathbf{E} = \text{EmbeddingLookup}(\mathbf{X}) E=EmbeddingLookup(X)
其中 X ∈ Z b a t c h × n _ s t e p \mathbf{X} \in \mathbb{Z}^{batch×n\_step} XZbatch×n_step, E ∈ R b a t c h × n _ s t e p × e m b e d d i n g _ s i z e \mathbf{E} \in \mathbb{R}^{batch×n\_step×embedding\_size} ERbatch×n_step×embedding_size


2. 特征拼接(Flatten)
X = X.view(-1, n_step*embedding_size)  # [2,2,2] → [2,4]

具体变换

# 第一个样本:"我 爱"  
原始嵌入 → [0.3,0.4], [0.7,0.8]  
拼接后 → [0.3, 0.4, 0.7, 0.8]# 第二个样本:"我 讨厌"  
原始嵌入 → [0.3,0.4], [1.3,1.4]  
拼接后 → [0.3, 0.4, 1.3, 1.4]

技术意义
将序列的时序信息转换为空间特征,为全连接层提供固定长度的输入。


3. 第一全连接层(Feature Projection)
self.linear1 = nn.Linear(4, 2)  # 输入4维 → 输出2维
hidden = torch.tanh(self.linear1(X))  # [2,4] → [2,2]

参数示例
假设权重和偏置为(点乘):
W 1 = [ 0.1 − 0.2 0.3 0.4 − 0.5 0.6 0.7 − 0.8 ] , b 1 = [ 0.1 − 0.2 ] W_1 = \begin{bmatrix} 0.1 & -0.2 & 0.3 & 0.4 \\ -0.5 & 0.6 & 0.7 & -0.8 \end{bmatrix}, \quad b_1 = \begin{bmatrix} 0.1 \\ -0.2 \end{bmatrix} W1=[0.10.50.20.60.30.70.40.8],b1=[0.10.2]

计算演示

# 第一个样本计算:
[0.3, 0.4, 0.7, 0.8] × W1 + b1
= (0.3*0.1 + 0.4*(-0.2) + 0.7*0.3 + 0.8*0.4) + 0.1 = 0.54 → tanh(0.54)0.49  
= (0.3*(-0.5) + 0.4*0.6 + 0.7*0.7 + 0.8*(-0.8)) + (-0.2) = -0.56 → tanh(-0.56)-0.51
输出 → [0.49, -0.51]

数学表达式
h = tanh ⁡ ( X f l a t W 1 ⊤ + b 1 ) \mathbf{h} = \tanh(\mathbf{X}_{flat}W_1^\top + \mathbf{b}_1) h=tanh(XflatW1+b1)
其中 W 1 ∈ R n _ h i d d e n × ( n _ s t e p × e m b e d d i n g _ s i z e ) W_1 \in \mathbb{R}^{n\_hidden×(n\_step×embedding\_size)} W1Rn_hidden×(n_step×embedding_size)


4. 第二全连接层(Output Projection)
self.linear2 = nn.Linear(2,7)  # 2维→7分类
output = self.linear2(hidden)  # [2,2] → [2,7]

相当于将第一层的输入进行线性变换后(上下文特征的抽象提取),通过激活函数得出的结果分别再与第二层的参数进行线性变换(语义到词汇的概率映射),通过结果可以判断出哪一个词语为预测词的概率更大。

参数示例
假设:
W 2 = [ 0.2 − 0.3 0.4 0.1 − 0.5 0.6 0.7 − 0.8 − 0.9 0.2 1.0 0.3 0.1 − 0.4 ] , b 2 = [ 0.1 , 0.2 , − 0.3 , 0.4 , − 0.5 , 0.6 , − 0.7 ] W_2 = \begin{bmatrix} 0.2 & -0.3 \\ 0.4 & 0.1 \\ -0.5 & 0.6 \\ 0.7 & -0.8 \\ -0.9 & 0.2 \\ 1.0 & 0.3 \\ 0.1 & -0.4 \end{bmatrix}, \quad b_2 = [0.1, 0.2, -0.3, 0.4, -0.5, 0.6, -0.7] W2= 0.20.40.50.70.91.00.10.30.10.60.80.20.30.4 ,b2=[0.1,0.2,0.3,0.4,0.5,0.6,0.7]

计算演示

# 第一个样本隐藏值 [0.49, -0.51]
计算每个输出单元:
0.49*0.2 + (-0.51)*(-0.3) + 0.10.098 + 0.153 + 0.1 = 0.351 → 输出单元0  
0.49*0.4 + (-0.51)*0.1 + 0.20.196 - 0.051 + 0.2 = 0.345 → 输出单元1  
...以此类推所有7个单元

数学表达式
o = h W 2 ⊤ + b 2 \mathbf{o} = \mathbf{h}W_2^\top + \mathbf{b}_2 o=hW2+b2
其中 W 2 ∈ R v o c _ s i z e × n _ h i d d e n W_2 \in \mathbb{R}^{voc\_size×n\_hidden} W2Rvoc_size×n_hidden


2.2.3 输出结果解读

最终得到形状为 [batch_size, voc_size]未归一化概率(logits),例如:

output = [[0.35, 0.34, -1.2, 0.8, 2.1, -0.3, 0.5],  # 样本1:预测"喜欢"(索引4)概率最高[1.2, -0.5, 0.7, 0.3, -0.8, 0.9, 2.3]     # 样本2:预测"讨厌"(索引6)概率最高
]

要得到概率分布,需应用Softmax:

probs = torch.softmax(output, dim=1)
# probs ≈ [
#   [0.05, 0.05, 0.01, 0.10, 0.60, 0.09, 0.10], 
#   [0.15, 0.03, 0.08, 0.07, 0.02, 0.10, 0.55]
# ]

2.2.4 参数计算详解

1. 嵌入层参数

参数数 = v o c _ s i z e × e m b e d d i n g _ s i z e = 7 × 2 = 14 \text{参数数} = voc\_size × embedding\_size = 7×2 = 14 参数数=voc_size×embedding_size=7×2=14

2. 第一全连接层

参数数 = ( n _ s t e p × e m b e d d i n g _ s i z e ) × n _ h i d d e n + n _ h i d d e n = 4 × 2 + 2 = 10 \text{参数数} = (n\_step×embedding\_size) × n\_hidden + n\_hidden = 4×2 + 2 = 10 参数数=(n_step×embedding_size)×n_hidden+n_hidden=4×2+2=10

3. 第二全连接层

参数数 = n _ h i d d e n × v o c _ s i z e + v o c _ s i z e = 2 × 7 + 7 = 21 \text{参数数} = n\_hidden × voc\_size + voc\_size = 2×7 + 7 = 21 参数数=n_hidden×voc_size+voc_size=2×7+7=21

总参数:14 + 10 + 21 = 45个可训练参数

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

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

相关文章

【Linux】详谈 基础I/O

目录 一、理解文件 狭义的理解: 广义理解: 文件操作的归类认知 系统角度 二、系统文件I/O 2.1 标志位的传递 系统级接口open ​编辑 open返回值 写入文件 读文件 三、文件描述符 3.1(0 & 1 & 2) 3.2 文件描…

超分之DeSRA

Desra: detect and delete the artifacts of gan-based real-world super-resolution models.DeSRA:检测并消除基于GAN的真实世界超分辨率模型中的伪影Xie L, Wang X, Chen X, et al.arXiv preprint arXiv:2307.02457, 2023. 摘要 背景: GAN-SR模型虽然…

Vue3 Pinia 符合直觉的Vue.js状态管理库

Pinia 符合直觉的Vue.js状态管理库 什么时候使用Pinia 当两个关系非常远的组件,要传递参数时使用Pinia组件的公共参数使用Pinia

Javaweb后端文件上传@value注解

文件本地存储磁盘 阿里云oss准备工作 阿里云oss入门程序 要重启一下idea,上面有cmd 阿里云oss案例集成 优化 用spring中的value注解

DeepSeek大语言模型下几个常用术语

昨天刷B站看到复旦赵斌老师说的一句话“科幻电影里在人脑中植入芯片或许在当下无法实现,但当下可以借助AI人工智能实现人类第二脑”(大概是这个意思) 💞更多内容,可关注公众号“ 一名程序媛 ”,我们一起从 …

MYSQL之创建数据库和表

创建数据库db_ck (下面的创建是最好的创建方法,如果数据库存在也不会报错,并且指定使用utf8mb4) show databases命令可以查看所有的数据库名,可以找到刚刚创建的db_ck数据库 使用该数据库时,发现里面没有…

[pytest] 配置

这里写目录标题 PytestInitRun3. 根据命令行选项将不同的值传递给测试函数 Report1. 向测试报告标题添加信息2. 分析测试持续时间 pytest --durations33. 增量测试 - 测试步骤--junitxml{report}.xml1. testsuite1.1 在测试套件级别添加属性节点 record_testsuite_property 2. …

初始化E9环境,安装Sqlserver数据库

title: 初始化E9环境,安装Sqlserver数据库 date: 2025-03-10 19:27:19 tags: E9SqlServer初始化E9环境,安装Sqlserver数据库 安装E9本地环境安装Sql server 数据库1、检查SQL Server服务是否开启2、检查SQL Server网络网络配置是否开启创建一个ecology数据库点击初始化数据库…

在WSL2-Ubuntu中安装CUDA12.8、cuDNN、Anaconda、Pytorch并验证安装

#记录工作 提示:整个过程最好先开启系统代理,也可以用镜像源,确保有官方发布的最新特性和官方库的完整和兼容性支持。 期间下载会特别慢,需要在系统上先开启代理,然后WSL设置里打开网络模式“Mirrored”,以设置WSL自动…

SQLAlchemy系列教程:如何执行原生SQL

Python中的数据库交互提供了高级API。但是,有时您可能需要执行原始SQL以提高效率或利用数据库特定的特性。本指南介绍在SQLAlchemy框架内执行原始SQL。 在SQLAlchemy中执行原生SQL SQLAlchemy虽然以其对象-关系映射(ORM)功能而闻名&#xff…

基于SpringBoot的手机销售网站设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

Spring(五)容器-依赖注入的三种方式

目录 总结:通用的三种注入方式 1 字段注入 2 构造器注入 3 set注入 总结:通用的三种注入方式 优先使用构造器注入谨慎使用 Setter 注入避免滥用字段注入 通过构造器传入依赖,确保对象创建时即完成初始化。通过 Setter 方法注入依赖&#x…

Python贝壳网二手小区数据爬取(2025年3月更)

文章目录 一、代码整体架构解析二、各部分代码详解1. main()主函数解析2. 会话初始化(伪装浏览器身份)3. 动态参数生成(反爬虫核心机制)4. 列表页抓取(获取小区列表)5. 列表页解析(提取小区信息…

使用服务器搭建一个专属的密码管理工具Vaultwarden

一、服务器配置与Docker环境 ‌实例选型与系统准备‌ ‌推荐配置‌:‌1核2GB内存‌(莱卡云L1型实例),Vaultwarden资源占用低,适合轻量级部署‌34。‌操作系统‌:选择 ‌Ubuntu 22.04 LTS‌,兼容…

IO学习---->线程

1.创建两个线程&#xff0c;分支线程1拷贝文件的前一部分&#xff0c;分支线程2拷贝文件的后一部分 #include <head.h> sem_t sem; long half_size 0; // 全局变量&#xff0c;供所有线程共享void* product(void *arg) {FILE *src fopen("IO.text", "…

深度学习分词器char-level实战详解

一、三种分词器基本介绍 word-level&#xff1a;将文本按照空格或者标点分割成单词&#xff0c;但是词典大小太大 subword-level&#xff1a;词根分词&#xff08;主流&#xff09; char-level&#xff1a;将文本按照字母级别分割成token 二、charlevel代码 导包&#xff1…

基于SpringBoot实现旅游酒店平台功能六

一、前言介绍&#xff1a; 1.1 项目摘要 随着社会的快速发展和人民生活水平的不断提高&#xff0c;旅游已经成为人们休闲娱乐的重要方式之一。人们越来越注重生活的品质和精神文化的追求&#xff0c;旅游需求呈现出爆发式增长。这种增长不仅体现在旅游人数的增加上&#xff0…

git规范提交之commitizen conventional-changelog-cli 安装

一、引言 使用规范的提交信息可以让项目更加模块化、易于维护和理解&#xff0c;同时也便于自动化工具&#xff08;如发布工具或 Changelog 生成器&#xff09;解析和处理提交记录。 通过编写符合规范的提交消息&#xff0c;可以让团队和协作者更好地理解项目的变更历史和版本…

前端实现版本更新自动检测✅

&#x1f916; 作者简介&#xff1a;水煮白菜王&#xff0c;一位资深前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧和知识归纳总结✍。 感谢支持&#x1f495;&#x1f495;&a…

postman接口请求中的 Raw是什么

前言 在现代的网络开发中&#xff0c;API 的使用已经成为数据交换的核心方式之一。然而&#xff0c;在与 API 打交道时&#xff0c;关于如何发送请求体&#xff08;body&#xff09;内容类型的问题常常困扰着开发者们&#xff0c;尤其是“raw”和“json”这两个术语之间的区别…