news 2026/10/21 16:35:01

DIY发烧级DAC设计:USB异步传输、I²S时序控制与全平衡模拟输出

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DIY发烧级DAC设计:USB异步传输、I²S时序控制与全平衡模拟输出

简介:这是一份面向电子DIY爱好者与Hi-Fi音响发烧友的专业学习资料,聚焦高性能DAC音频解码器的完整硬件设计与制作实践,解决市售数字音源内置DAC音质生硬、供电简陋、抗干扰弱等痛点,助力动手玩家打造高保真音频重放系统。资源为单文件Word文档(.docx),全文约3.47MB,系统阐述了从数字信号接收(CS8412-CP)、8×超采样数字滤波(DF1700P)、R-2R架构D/A转换(PCM1702-K)、发烧级I/V与GIC低通滤波,到电子管校音(和田茂氏线路)及甲类并联稳压供电(LM317+TL431)的全流程电路设计、芯片选型依据、关键参数设置与信号流分析,并附有原理图说明、引脚功能表及典型应用配置。目前已有237人学习下载,内容兼具理论深度与实操指导性,可直接用于电路复现、器件替代参考与音质调校思路拓展。

1. 为什么用分立运放+双晶振+全平衡架构做DAC,比买现成的“旗舰板”更值得折腾?

这不是一篇教你怎么焊一块USB声卡的入门指南。如果你正盯着某款标价四位数的商用DAC模块发呆,纠结它标称的120dB动态范围是不是真能在你那套老功放上听出来;或者你刚在某个音频论坛看到“ES9038Q2M方案实测THD+N仅0.0003%”,却翻遍资料也找不到它在44.1kHz整数倍采样下时钟抖动怎么测——那你就是这篇笔记最该读的人。

这款“发烧DAC音频解码器”的核心,不是堆料,而是可验证的信号链控制权:从USB接收端的异步FIFO深度,到I²S总线的布线阻抗匹配;从晶振负载电容的手工微调,到运放偏置电流在PCB热梯度下的漂移补偿。它解决的不是“能不能播音乐”,而是“当输入一个-60dBFS的1kHz正弦波叠加-100dBFS的25kHz谐波时,你的输出里到底有没有多出那个不该存在的-92dBFS边带”。目标用户很具体:有示波器(哪怕只有100MHz带宽)、能看懂LTspice仿真波形、愿意为0.5dB通道增益误差重铺一次顶层地平面的硬件实践者。它不承诺“声音变甜”,但能让你亲手把Jitter从2.1ps RMS压到0.8ps RMS——而且你知道每一步怎么来的。


2. 从USB Audio Class 2.0协议栈到I²S物理层:如何让电脑不“乱给”时钟

2.1 为什么必须放弃UAC1.0 + 软件重采样这条路

很多初学者会直接拿现成的XMOS XUF216开发板配Cypress CY7C68013A,走UAC1.0协议+ASIO驱动重采样。这在Windows上看似简单,但埋了三个硬伤:
第一,UAC1.0强制要求主机端提供同步时钟(ISO IN endpoint),一旦USB总线有DMA冲突(比如同时插着NVMe硬盘盒),时钟就会跳变,实测Jitter峰值飙升至15ps以上;
第二,所有重采样算法(包括SoX的libsamplerate)都会引入相位噪声,在192kHz频段生成镜像杂散;
第三,Windows内核音频栈的缓冲区管理不可见,你无法确认DMA传输是否真的与本地晶振锁相。

提示:别信“驱动优化后无感”的说法。用RME ADI-2 Pro FS做参考,其UAC2.0异步模式下1kHz FFT底噪是-142dBFS,而同配置UAC1.0重采样是-128dBFS——差14dB,就是16倍的本底噪声能量。

2.2 选用XMOS XU316实现真正异步USB Audio Class 2.0

我们选XU316而非XUF216,原因很实际:XU316内置双PLL(一个锁USB帧时钟,一个锁本地晶振),且支持硬件级FIFO深度可配(最小16字节,最大2048字节)。关键参数如下:

参数值说明
USB PHY模式Full-speed only (12Mbps)避免HS模式带来的EMI干扰,实测对模拟地噪声影响降低8dB
异步FIFO深度512 samples @ 24bit/2ch对应约10.7ms缓冲,足够吸收主机端USB调度抖动
I²S输出格式Left-justified, MSB first与ESS ES9038Q2M的默认模式一致,省去格式转换逻辑
时钟源选择外部10MHz TCXO经PLL倍频至24.576MHz比板载RC振荡器相位噪声低40dBc/Hz@1kHz

下面是XU316初始化USB Audio Class 2.0的关键代码段(基于xcore.ai SDK 15.2.0):

// usb_audio.xc #include <xs1.h> #include <print.h> #include <audio_hw_20.h> // 定义异步FIFO深度:512 samples × 2 channels × 3 bytes = 3072 bytes #define ASYNC_FIFO_DEPTH 3072 void configure_usb_audio() { // 启用双PLL:PLL0锁USB帧时钟,PLL1锁外部10MHz晶振 configure_pll(PLL0, PLL_SRC_USB_FRAME, 1); // 锁USB帧 configure_pll(PLL1, PLL_SRC_EXT_CLK, 24576); // 倍频至24.576MHz // 配置I²S输出:24bit左对齐,主模式,BCLK=3.072MHz(48kHz×64) audio_i2s_config_t i2s_cfg = { .format = AUDIO_I2S_FORMAT_LEFT_JUSTIFIED, .word_length = AUDIO_I2S_WORD_LENGTH_24BIT, .master = AUDIO_I2S_MASTER, .bclk_div = 2, // 由PLL1输出24.576MHz经2分频得12.288MHz,再经4分频得3.072MHz }; audio_i2s_init(&i2s_cfg); // 设置异步FIFO:深度512 samples,启用自动流控 audio_async_fifo_config_t fifo_cfg = { .depth = ASYNC_FIFO_DEPTH, .flow_control = AUDIO_ASYNC_FIFO_FLOW_CONTROL_AUTO, }; audio_async_fifo_init(&fifo_cfg); }

这段代码的核心逻辑是:让XU316彻底放弃“听主机的话”,转而用本地高稳晶振作为I²S时钟源,只把USB当成数据管道。audio_async_fifo_init()启动后,XU316会持续从USB端读取PCM数据填入FIFO,同时以本地PLL1锁定的24.576MHz为基准,按精确的采样率(44.1k/48k/88.2k/96k等)从FIFO匀速取数输出I²S。此时USB总线哪怕丢一帧数据,FIFO也够撑10ms以上,完全不影响I²S输出连续性。

2.3 I²S物理层布线:为什么差分走线长度差必须<0.5mm

很多人以为I²S只是几根线,其实它的时序容错极低。以ES9038Q2M为例,其I²S接口建立时间(tSU)为2.5ns,保持时间(tH)为1.8ns。这意味着:

  • BCLK上升沿到SDATA有效的时间窗口仅4.3ns;
  • 若MCLK(主时钟)与BCLK走线长度差1mm(FR4板材中信号传播速度≈15cm/ns),则引入67ps延时偏差;
  • 当采样率升至192kHz(BCLK=24.576MHz,周期40.67ns),67ps已占周期1.65%,极易导致setup violation。

我们实测过三种布线方式在192kHz下的眼图张开度:

布线方式差分线长差眼图张开度(%)Jitter RMS(ps)
单端走线,未匹配>3mm42%3.2
差分对内等长,但BCLK/WS/SDATA组间差1.2mm1.2mm68%1.9
全组差分等长(BCLK±0.3mm,WS±0.3mm,SDATA±0.3mm)<0.5mm91%0.8

注意:不要迷信“自动等长工具”。Altium Designer的Length Tuning在差分对内有效,但对BCLK/WS/SDATA三组之间的等长需手动拖拽+实时测量。建议在PCB设计阶段就导出Gerber钻孔文件,用坐标法在CAM350中量取各网络末端焊盘中心距参考点的距离,确保三组差值≤0.45mm。


3. ES9038Q2M DAC芯片的底层配置:寄存器级精度控制

3.1 为什么必须禁用ES9038Q2M的内部PLL

ES9038Q2M内置PLL可将MCLK倍频至所需DAC时钟(如MCLK=12.288MHz → DAC_CLK=368.64MHz),但实测其相位噪声在10kHz~100kHz频段比外部晶振高22dBc/Hz。根本原因是:

  • 内部PLL采用电荷泵结构,其参考时钟路径经过数字逻辑门,开关噪声耦合严重;
  • 芯片内部电源域未做隔离,PLL供电与数字IO共用LDO,纹波直接调制VCO;
  • 数据手册Table 12明确标注:“Internal PLL Jitter: 1.2ps RMS typical”,而外部100MHz晶振+低噪声分频器实测仅0.3ps RMS。

因此,我们必须绕过内部PLL,走外部时钟直驱模式(External Clock Mode)。关键配置步骤如下:

  1. 将REG_0x02[7](CLKSEL)设为0,强制使用外部MCLK;
  2. 将REG_0x03[6:4](MCLK_DIV)设为000,禁用MCLK分频;
  3. 将REG_0x04[3:0](DAC_CLK_DIV)设为对应值(如MCLK=24.576MHz → DAC_CLK=368.64MHz需设为0100即4分频);
  4. 最后写REG_0x01[0](SOFT_RESET)触发软复位,使配置生效。

下面是用I²C初始化ES9038Q2M的Python脚本(基于Raspberry Pi Pico + MicroPython):

# es9038q2m_init.py from machine import I2C, Pin import time class ES9038Q2M: def __init__(self, i2c_bus, addr=0x30): self.i2c = i2c_bus self.addr = addr def write_reg(self, reg_addr, value): # ES9038Q2M寄存器地址为16位,需拆成MSB+LSB msb = (reg_addr >> 8) & 0xFF lsb = reg_addr & 0xFF data = bytes([msb, lsb, value]) self.i2c.writeto(self.addr, data) def init_external_clock_mode(self): # 步骤1:CLKSEL=0 → 使用外部MCLK self.write_reg(0x0002, 0x00) # REG_0x02[7]=0 # 步骤2:MCLK_DIV=000 → 禁用MCLK分频 self.write_reg(0x0003, 0x00) # REG_0x03[6:4]=000 # 步骤3:DAC_CLK_DIV=0100 → MCLK=24.576MHz → DAC_CLK=368.64MHz self.write_reg(0x0004, 0x04) # REG_0x04[3:0]=0100 # 步骤4:SOFT_RESET=1 → 触发复位 self.write_reg(0x0001, 0x01) time.sleep_ms(10) # 复位后清零SOFT_RESET位 self.write_reg(0x0001, 0x00) # 初始化示例 i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000) dac = ES9038Q2M(i2c) dac.init_external_clock_mode()

这段代码的玄学在于:必须严格按顺序写寄存器,且SOFT_RESET必须最后写、并等待10ms后再清零。我们曾因把REG_0x01写在REG_0x04之前,导致DAC始终输出直流电平——因为复位时寄存器状态未稳定,新值被冲掉。

3.2 数字滤波器选择:为什么不用“超慢滚降”而选“Sharp Roll-off”

ES9038Q2M提供4种数字滤波器(Digital Filter Mode),常被误认为“越慢滚降音质越柔美”。实测数据打脸:

  • “Slow Roll-off”(REG_0x05[3:0]=0001):-3dB点在0.45×fs,但带外衰减仅-60dB@0.55×fs,易受开关电源噪声调制;
  • “Sharp Roll-off”(REG_0x05[3:0]=0010):-3dB点在0.495×fs,-80dB@0.55×fs,对DAC后级模拟滤波器负担最小;
  • “Super Slow”(REG_0x05[3:0]=0011):相位响应非线性严重,1kHz方波测试出现明显过冲。

我们用APx555测得不同滤波器下的192kHz满量程输出THD+N:

滤波器模式THD+N(20Hz–20kHz)主要失真成分
Slow Roll-off-102.3dB3rd谐波主导(-105dB)
Sharp Roll-off-114.7dB宽带噪声基底(-118dB)
Super Slow-98.1dB相位失真引发互调(IMD CCIF)

结论很残酷:所谓“柔美”其实是失真掩盖了细节。Sharp Roll-off在保证通带平坦度的同时,把带外能量压到最低,让后级模拟滤波器真正只做“抗混叠”,而不是“救火队”。


4. 全平衡模拟输出级:OPA1612 vs LME49720的实测抉择

4.1 为什么必须用全平衡架构,而非单端转平衡

很多方案用单端DAC输出+TI DRV134做平衡转换,这在技术上可行,但存在两个致命缺陷:

  • DRV134的共模抑制比(CMRR)典型值仅75dB@1kHz,而真实环境中PCB地弹噪声可达100mVpp,意味着共模噪声被放大10倍进入后级;
  • 单端路径的电源抑制比(PSRR)比平衡路径低20dB,开关电源纹波直接调制输出零点。

我们坚持全平衡设计,即ES9038Q2M的左右声道各接一对独立运放(IN+/IN-),构成真正的差分→差分放大。关键指标对比:

运放型号噪声密度(nV/√Hz)GBW(MHz)SR(V/μs)推荐供电
OPA16121.14527±15V(实测±12V亦可)
LME497202.75520±15V(必须)
NE55325.0109±15V

初看LME49720参数更优,但实测发现其在±12V供电下输出摆幅仅±10.2V,而OPA1612在±12V下仍能输出±11.6V(接近轨到轨)。考虑到我们目标输出电平为2.5Vrms(≈±3.5Vpp),OPA1612留有更大裕量。

4.2 OPA1612外围电路设计:反馈电阻为何必须用0.1%精度金属膜

OPA1612的失调电压温漂仅0.2μV/°C,但若反馈网络用1%碳膜电阻,则25°C到60°C温升导致增益漂移达0.8%,直接造成左右声道电平差。我们实测过:

  • 用1% 10kΩ碳膜电阻(Rf)+ 1% 1kΩ碳膜电阻(Rg):35°C环境静置2小时后,左右声道DC offset差达12mV;
  • 改用0.1% 10kΩ金属膜(Rf)+ 0.1% 1kΩ金属膜(Rg):同一条件DC offset差<0.3mV。

电路图如下(单声道):

ES9038Q2M OUT+ ──┬───┬── Rf (10kΩ, 0.1%) ────┬── OPA1612 OUT+ │ │ │ │ └── Rg (1kΩ, 0.1%) ────┤ │ │ GND ─────────────┼────────────────────────┤ │ │ ES9038Q2M OUT- ──┴───┬── Rf (10kΩ, 0.1%) ────┴── OPA1612 OUT- │ └── Rg (1kΩ, 0.1%) ──── GND

提示:Rf与Rg必须成对采购同批次,避免温度系数(TCR)差异。我们用的是Vishay RN55D1002FB14(10kΩ)与RN55D1001FB14(1kΩ),TCR均为±25ppm/°C。

4.3 平衡输出LC滤波器:为何电感必须用屏蔽式铁氧体磁芯

DAC后级必须加LC低通滤波器抑制镜像频率(如192kHz采样时,镜像在384kHz±fs)。常见错误是用普通贴片电感(如SDCL1005C系列),其饱和电流小、Q值高,易与PCB寄生电容形成谐振峰。

我们实测某款非屏蔽电感在200kHz处Q值达85,导致输出频谱在210kHz出现+8dB尖峰,直接污染FM收音头。改用TDK VLS201610HBX-100M(10μH,屏蔽式,饱和电流1.5A,Q值<25),尖峰消失,-3dB点稳定在85kHz。

滤波器参数计算(针对192kHz采样):

  • 截止频率 fc = 0.45 × fs = 86.4kHz
  • 取标准值 fc = 85kHz
  • 选用 C = 220pF(NP0材质,温漂±30ppm/°C)
  • 则 L = 1 / (2πfc)²C = 1 / (2×3.1416×85e3)² × 220e-12 ≈ 10.2μH → 选10μH标准值

最终PCB布局要求:LC滤波器必须紧贴OPA1612输出引脚,走线长度<2mm,地平面完整覆盖底部。


5. 避坑指南:那些让调试持续两周的“幽灵问题”

5.1 现象:I²S数据正常,但DAC无输出,示波器测OUT+/-均为2.5V DC

原因:ES9038Q2M的REG_0x06[7](DAC_EN)默认为0,即DAC核心断电。很多开发者只配了时钟和滤波器,忘了使能DAC。
解决:在初始化末尾添加self.write_reg(0x0006, 0x80),确保bit7=1。

5.2 现象:1kHz正弦波FFT显示-60dB处有固定杂散,频率=USB帧率(1ms间隔)

原因:XU316的USB FIFO未启用流控(flow control),导致主机端批量发送数据时FIFO溢出,触发内部重传机制,引入周期性数据丢弃。
解决:确认audio_async_fifo_config_t.flow_control = AUDIO_ASYNC_FIFO_FLOW_CONTROL_AUTO,且XU316固件中调用audio_async_fifo_set_flow_control()。

5.3 现象:左右声道电平差>0.5dB,且随音量调节变化

原因:OPA1612的电源去耦电容ESR过高。我们曾用10μF钽电容(ESR≈1.2Ω)替代推荐的10μF陶瓷电容(ESR<0.02Ω),导致电源纹波在运放输出端被放大,形成共模→差模转换。
解决:全部更换为Murata GRM32ER7YA106KA12L(10μF, X7R, 0.02Ω ESR),并在每个运放V+、V-引脚就近放置100nF陶瓷电容。

5.4 现象:播放高电平瞬态(如鼓点)时,输出短暂削波,恢复后底噪升高

原因:ES9038Q2M的REG_0x07[4:0](Digital Gain)被误设为>0。数字增益虽提升信噪比,但压缩了可用动态范围,瞬态峰值直接触碰数字满量程,引发后续模拟级过载。
解决:将REG_0x07设为0x00,全程使用模拟增益控制(即OPA1612的Rf/Rg比值)。

5.5 现象:室温25°C时正常,升温至35°C后THD+N恶化10dB

原因:PCB顶层地平面未分割,数字地(XU316、ES9038Q2M)与模拟地(OPA1612、LC滤波器)共用同一铜箔,温升导致地阻抗变化,引入共模噪声。
解决:在PCB中严格分割DGND与AGND,仅在电源入口单点连接(0Ω电阻或0.1mm宽桥连),并确保所有模拟器件的地焊盘直接连AGND覆铜。


6. 验证你的DAC是否真“发烧”:三步可复现的客观测试法

6.1 用APx555测Jitter:为什么必须用“Jitter Swept-Tone”而非“Jitter Spectrum”

很多工程师用APx555的Jitter Spectrum功能,结果看到一堆杂散就慌了。其实那是频谱泄露伪影。正确做法是:

  1. 输入1kHz正弦波(-60dBFS),采样率设为48kHz;
  2. 在APx555中选择Jitter Swept-Tone测试项;
  3. 扫描频率范围设为10Hz–100kHz,分辨率带宽(RBW)设为1Hz;
  4. 关键看Jitter RMS数值,而非峰值杂散。

我们实测某版PCB的Jitter RMS从2.1ps(初版)压到0.78ps(终版),过程如下:

  • 初版:USB线缆靠近模拟地,BCLK走线跨分割,Jitter RMS=2.1ps;
  • 二版:USB线缆远离模拟区,BCLK改为内层差分,Jitter RMS=1.3ps;
  • 终版:增加BCLK屏蔽层(GND包络),ES9038Q2M供电加LC滤波,Jitter RMS=0.78ps。

提示:Jitter RMS <1ps是“发烧级”门槛,<0.5ps属实验室级。别信“听感无区别”——APx555的Jitter Swept-Tone能分辨0.1ps差异,而人耳在安静环境下对1kHz正弦波的Jitter感知阈值约0.3ps(IEEE TAS 2018论文)。

6.2 用示波器抓I²S眼图:三个必看位置

没有APx555?用100MHz示波器也能做有效验证。重点观察三处:

位置正常现象异常表现排查方向
BCLK上升沿边沿陡峭,过冲<5%过冲>15%或振铃检查BCLK终端匹配(应为100Ω并联到3.3V)
WS边沿与BCLK上升沿对齐,抖动<0.5nsWS滞后BCLK>1ns检查WS走线长度是否比BCLK短太多
SDATA建立时间BCLK上升沿前≥2.5ns数据已稳定建立时间<1.8ns检查ES9038Q2M的REG_0x08[7:0](SDATA延迟)是否需微调

我们曾靠这个方法发现ES9038Q2M的SDATA输出延时比手册标称值大0.3ns,通过写REG_0x08 = 0x03(+0.3ns补偿)完美对齐。

6.3 实战技巧:如何用手机录音反向验证DAC性能

这是我在某高校音频实验室带学生时总结的土办法,成本为0:

  1. 用DAC输出1kHz/0dBFS正弦波;
  2. 用iPhone 13(自带录音App,采样率44.1kHz)紧贴扬声器录音10秒;
  3. 将录音导入Audacity,执行Analyze → Plot Spectrum,设置:
    • Size: 65536
    • Window: Blackman-Harris
    • Zero padding: 4×
  4. 正常结果:基波峰值在-0.1dB,-60dB以下应为平滑噪声基底;异常结果:若在2kHz、3kHz处有-70dB杂散,说明DAC后级存在交调失真(IMD)。

这个方法的原理是:iPhone麦克风本身THD+N约-75dB,但它对1kHz基波的灵敏度极高,能放大DAC输出中的微弱非线性产物。我们用此法揪出过OPA1612供电电容ESR过高导致的2nd/3rd谐波再生。

最后说句血泪经验:我做过7版PCB,前4版都在纠结“哪个运放声音更暖”,直到第5版用APx555测出Jitter RMS是2.8ps,才明白——所有“音色”争议,本质都是失真形态不同。先让数字链路干净,再谈模拟韵味。否则你调了三个月的RC网络,可能只是在给0.5ps的Jitter擦脂抹粉。

希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/21 16:33:43

litellm 统一多模型调用:适配层设计与工程实践

1. 为什么一个“模型调用中间层”值得单独拿出来聊第一次看到 litellm 这个名字&#xff0c;很多人会以为它又是一个新的模型或者推理框架。其实不是。它解决的是一个特别接地气的问题&#xff1a;当你手里同时有好几家的模型服务要调用时&#xff0c;代码会迅速变成一团乱麻。…

作者头像 李华
网站建设 2026/10/21 16:33:24

VBA开发者福音:SeleniumBasic实现浏览器自动化实战指南

前段时间有个老朋友找我&#xff0c;他在公司里维护着一整套基于 VBA 的办公自动化系统&#xff0c;平时处理 Excel 报表、Word 文档批量生成都驾轻就熟。结果前阵子领导丢给他一个需求&#xff1a;每天登录某个业务后台&#xff0c;把当天的新增订单数据抓下来&#xff0c;整理…

作者头像 李华
网站建设 2026/10/21 16:32:07

Mamba时序预测有效性评估:关键结论与实操建议

Mamba这个名字&#xff0c;做序列建模的人应该都不陌生。2024年它几乎成了“Transformer替代者”话题里曝光率最高的模型之一&#xff0c;各种论文都在往Mamba上靠。但做时间序列预测的人&#xff0c;心里大概率会有一个更务实的疑问&#xff1a;Mamba的声势再大&#xff0c;真…

作者头像 李华
网站建设 2026/10/21 16:31:56

比较器输出PWM的硬件联动机制与过流保护设计实战

"比较器输出PWM"这个标题乍一看有点反直觉。PWM不都是定时器或者专用PWM模块产生的吗&#xff1f;拿比较器去"输出PWM"&#xff0c;算哪门子做法&#xff1f;我第一次在选型表上看到这个功能也没太当回事&#xff0c;直到真在项目里用上&#xff0c;才意识…

作者头像 李华
网站建设 2026/10/21 16:31:07

10/100M以太网PHY实战剖析:从编码、自协商到MII调试

拿到“深入剖析10/100Mbps 10BASE-T ETHERNET PHY”这个项目时&#xff0c;我第一反应不是翻原理图&#xff0c;而是先把项目名拆开看。10/100Mbps代表双速自适应能力&#xff0c;10BASE-T代表10M双绞线以太网&#xff0c;PHY代表物理层收发器。项目名里那个ETHERENT其实就是ET…

作者头像 李华
网站建设 2026/10/21 16:28:55

为什么大模型普遍转向Decoder-only?架构选型与工程实践解析

Decoder-only架构现在几乎成了大模型的默认选项。翻看最近对外公开的模型技术报告&#xff0c;绝大多数团队都选了纯解码器的自回归路线&#xff1b;闭源API背后的基座设计也在往同一个方向收敛。很多刚入行的朋友会觉得奇怪&#xff1a;NLP教科书里明明写着编码器-解码器模型才…

作者头像 李华